You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

40921 lines
1.4 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 globals = {};
  3570. var jsonpRequests = 0;
  3571. function Request(requestOptions) {
  3572. var globalsNoCallbacks = Utils.extend({}, globals);
  3573. ('beforeCreate beforeOpen beforeSend error complete success statusCode').split(' ').forEach(function (callbackName) {
  3574. delete globalsNoCallbacks[callbackName];
  3575. });
  3576. var defaults = Utils.extend({
  3577. url: win.location.toString(),
  3578. method: 'GET',
  3579. data: false,
  3580. async: true,
  3581. cache: true,
  3582. user: '',
  3583. password: '',
  3584. headers: {},
  3585. xhrFields: {},
  3586. statusCode: {},
  3587. processData: true,
  3588. dataType: 'text',
  3589. contentType: 'application/x-www-form-urlencoded',
  3590. timeout: 0,
  3591. }, globalsNoCallbacks);
  3592. var options = Utils.extend({}, defaults, requestOptions);
  3593. var proceedRequest;
  3594. // Function to run XHR callbacks and events
  3595. function fireCallback(callbackName) {
  3596. var data = [], len = arguments.length - 1;
  3597. while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];
  3598. /*
  3599. Callbacks:
  3600. beforeCreate (options),
  3601. beforeOpen (xhr, options),
  3602. beforeSend (xhr, options),
  3603. error (xhr, status, message),
  3604. complete (xhr, status),
  3605. success (response, status, xhr),
  3606. statusCode ()
  3607. */
  3608. var globalCallbackValue;
  3609. var optionCallbackValue;
  3610. if (globals[callbackName]) {
  3611. globalCallbackValue = globals[callbackName].apply(globals, data);
  3612. }
  3613. if (options[callbackName]) {
  3614. optionCallbackValue = options[callbackName].apply(options, data);
  3615. }
  3616. if (typeof globalCallbackValue !== 'boolean') { globalCallbackValue = true; }
  3617. if (typeof optionCallbackValue !== 'boolean') { optionCallbackValue = true; }
  3618. return (globalCallbackValue && optionCallbackValue);
  3619. }
  3620. // Before create callback
  3621. proceedRequest = fireCallback('beforeCreate', options);
  3622. if (proceedRequest === false) { return undefined; }
  3623. // For jQuery guys
  3624. if (options.type) { options.method = options.type; }
  3625. // Parameters Prefix
  3626. var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';
  3627. // UC method
  3628. var method = options.method.toUpperCase();
  3629. // Data to modify GET URL
  3630. if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
  3631. var stringData;
  3632. if (typeof options.data === 'string') {
  3633. // Should be key=value string
  3634. if (options.data.indexOf('?') >= 0) { stringData = options.data.split('?')[1]; }
  3635. else { stringData = options.data; }
  3636. } else {
  3637. // Should be key=value object
  3638. stringData = Utils.serializeObject(options.data);
  3639. }
  3640. if (stringData.length) {
  3641. options.url += paramsPrefix + stringData;
  3642. if (paramsPrefix === '?') { paramsPrefix = '&'; }
  3643. }
  3644. }
  3645. // JSONP
  3646. if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
  3647. var callbackName = "f7jsonp_" + (Date.now() + ((jsonpRequests += 1)));
  3648. var abortTimeout;
  3649. var callbackSplit = options.url.split('callback=');
  3650. var requestUrl = (callbackSplit[0]) + "callback=" + callbackName;
  3651. if (callbackSplit[1].indexOf('&') >= 0) {
  3652. var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');
  3653. if (addVars.length > 0) { requestUrl += "&" + addVars; }
  3654. }
  3655. // Create script
  3656. var script = doc.createElement('script');
  3657. script.type = 'text/javascript';
  3658. script.onerror = function onerror() {
  3659. clearTimeout(abortTimeout);
  3660. fireCallback('error', null, 'scripterror', 'scripterror');
  3661. fireCallback('complete', null, 'scripterror');
  3662. };
  3663. script.src = requestUrl;
  3664. // Handler
  3665. win[callbackName] = function jsonpCallback(data) {
  3666. clearTimeout(abortTimeout);
  3667. fireCallback('success', data);
  3668. script.parentNode.removeChild(script);
  3669. script = null;
  3670. delete win[callbackName];
  3671. };
  3672. doc.querySelector('head').appendChild(script);
  3673. if (options.timeout > 0) {
  3674. abortTimeout = setTimeout(function () {
  3675. script.parentNode.removeChild(script);
  3676. script = null;
  3677. fireCallback('error', null, 'timeout', 'timeout');
  3678. }, options.timeout);
  3679. }
  3680. return undefined;
  3681. }
  3682. // Cache for GET/HEAD requests
  3683. if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
  3684. if (options.cache === false) {
  3685. options.url += paramsPrefix + "_nocache" + (Date.now());
  3686. }
  3687. }
  3688. // Create XHR
  3689. var xhr = new XMLHttpRequest();
  3690. // Save Request URL
  3691. xhr.requestUrl = options.url;
  3692. xhr.requestParameters = options;
  3693. // Before open callback
  3694. proceedRequest = fireCallback('beforeOpen', xhr, options);
  3695. if (proceedRequest === false) { return xhr; }
  3696. // Open XHR
  3697. xhr.open(method, options.url, options.async, options.user, options.password);
  3698. // Create POST Data
  3699. var postData = null;
  3700. if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
  3701. if (options.processData) {
  3702. var postDataInstances = [ArrayBuffer, Blob, Document, FormData];
  3703. // Post Data
  3704. if (postDataInstances.indexOf(options.data.constructor) >= 0) {
  3705. postData = options.data;
  3706. } else {
  3707. // POST Headers
  3708. var boundary = "---------------------------" + (Date.now().toString(16));
  3709. if (options.contentType === 'multipart/form-data') {
  3710. xhr.setRequestHeader('Content-Type', ("multipart/form-data; boundary=" + boundary));
  3711. } else {
  3712. xhr.setRequestHeader('Content-Type', options.contentType);
  3713. }
  3714. postData = '';
  3715. var data$1 = Utils.serializeObject(options.data);
  3716. if (options.contentType === 'multipart/form-data') {
  3717. data$1 = data$1.split('&');
  3718. var newData = [];
  3719. for (var i = 0; i < data$1.length; i += 1) {
  3720. newData.push(("Content-Disposition: form-data; name=\"" + (data$1[i].split('=')[0]) + "\"\r\n\r\n" + (data$1[i].split('=')[1]) + "\r\n"));
  3721. }
  3722. postData = "--" + boundary + "\r\n" + (newData.join(("--" + boundary + "\r\n"))) + "--" + boundary + "--\r\n";
  3723. } else if (options.contentType === 'application/json') {
  3724. postData = JSON.stringify(options.data);
  3725. } else {
  3726. postData = data$1;
  3727. }
  3728. }
  3729. } else {
  3730. postData = options.data;
  3731. xhr.setRequestHeader('Content-Type', options.contentType);
  3732. }
  3733. }
  3734. if (options.dataType === 'json' && (!options.headers || !options.headers.Accept)) {
  3735. xhr.setRequestHeader('Accept', 'application/json');
  3736. }
  3737. // Additional headers
  3738. if (options.headers) {
  3739. Object.keys(options.headers).forEach(function (headerName) {
  3740. if (typeof options.headers[headerName] === 'undefined') { return; }
  3741. xhr.setRequestHeader(headerName, options.headers[headerName]);
  3742. });
  3743. }
  3744. // Check for crossDomain
  3745. if (typeof options.crossDomain === 'undefined') {
  3746. // eslint-disable-next-line
  3747. options.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== win.location.host;
  3748. }
  3749. if (!options.crossDomain) {
  3750. xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  3751. }
  3752. if (options.xhrFields) {
  3753. Utils.extend(xhr, options.xhrFields);
  3754. }
  3755. // Handle XHR
  3756. xhr.onload = function onload() {
  3757. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
  3758. var responseData;
  3759. if (options.dataType === 'json') {
  3760. var parseError;
  3761. try {
  3762. responseData = JSON.parse(xhr.responseText);
  3763. } catch (err) {
  3764. parseError = true;
  3765. }
  3766. if (!parseError) {
  3767. fireCallback('success', responseData, xhr.status, xhr);
  3768. } else {
  3769. fireCallback('error', xhr, 'parseerror', 'parseerror');
  3770. }
  3771. } else {
  3772. responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
  3773. fireCallback('success', responseData, xhr.status, xhr);
  3774. }
  3775. } else {
  3776. fireCallback('error', xhr, xhr.status, xhr.statusText);
  3777. }
  3778. if (options.statusCode) {
  3779. if (globals.statusCode && globals.statusCode[xhr.status]) { globals.statusCode[xhr.status](xhr); }
  3780. if (options.statusCode[xhr.status]) { options.statusCode[xhr.status](xhr); }
  3781. }
  3782. fireCallback('complete', xhr, xhr.status);
  3783. };
  3784. xhr.onerror = function onerror() {
  3785. fireCallback('error', xhr, xhr.status, xhr.status);
  3786. fireCallback('complete', xhr, 'error');
  3787. };
  3788. // Timeout
  3789. if (options.timeout > 0) {
  3790. xhr.timeout = options.timeout;
  3791. xhr.ontimeout = function () {
  3792. fireCallback('error', xhr, 'timeout', 'timeout');
  3793. fireCallback('complete', xhr, 'timeout');
  3794. };
  3795. }
  3796. // Ajax start callback
  3797. proceedRequest = fireCallback('beforeSend', xhr, options);
  3798. if (proceedRequest === false) { return xhr; }
  3799. // Send XHR
  3800. xhr.send(postData);
  3801. // Return XHR object
  3802. return xhr;
  3803. }
  3804. function RequestShortcut(method) {
  3805. var assign, assign$1;
  3806. var args = [], len = arguments.length - 1;
  3807. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  3808. var ref = [];
  3809. var url = ref[0];
  3810. var data = ref[1];
  3811. var success = ref[2];
  3812. var error = ref[3];
  3813. var dataType = ref[4];
  3814. if (typeof args[1] === 'function') {
  3815. (assign = args, url = assign[0], success = assign[1], error = assign[2], dataType = assign[3]);
  3816. } else {
  3817. (assign$1 = args, url = assign$1[0], data = assign$1[1], success = assign$1[2], error = assign$1[3], dataType = assign$1[4]);
  3818. }
  3819. [success, error].forEach(function (callback) {
  3820. if (typeof callback === 'string') {
  3821. dataType = callback;
  3822. if (callback === success) { success = undefined; }
  3823. else { error = undefined; }
  3824. }
  3825. });
  3826. dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
  3827. var requestOptions = {
  3828. url: url,
  3829. method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
  3830. data: data,
  3831. success: success,
  3832. error: error,
  3833. dataType: dataType,
  3834. };
  3835. if (method === 'postJSON') {
  3836. Utils.extend(requestOptions, {
  3837. contentType: 'application/json',
  3838. processData: false,
  3839. crossDomain: true,
  3840. data: typeof data === 'string' ? data : JSON.stringify(data),
  3841. });
  3842. }
  3843. return Request(requestOptions);
  3844. }
  3845. function RequestShortcutPromise(method) {
  3846. var args = [], len = arguments.length - 1;
  3847. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  3848. var url = args[0];
  3849. var data = args[1];
  3850. var dataType = args[2];
  3851. return new Promise(function (resolve, reject) {
  3852. RequestShortcut(
  3853. method,
  3854. url,
  3855. data,
  3856. function (responseData, status, xhr) {
  3857. resolve({ data: responseData, status: status, xhr: xhr });
  3858. },
  3859. function (xhr, status, message) {
  3860. // eslint-disable-next-line
  3861. reject({ xhr: xhr, status: status, message: message });
  3862. },
  3863. dataType
  3864. );
  3865. });
  3866. }
  3867. Object.assign(Request, {
  3868. get: function () {
  3869. var args = [], len = arguments.length;
  3870. while ( len-- ) args[ len ] = arguments[ len ];
  3871. return RequestShortcut.apply(void 0, [ 'get' ].concat( args ));
  3872. },
  3873. post: function () {
  3874. var args = [], len = arguments.length;
  3875. while ( len-- ) args[ len ] = arguments[ len ];
  3876. return RequestShortcut.apply(void 0, [ 'post' ].concat( args ));
  3877. },
  3878. json: function () {
  3879. var args = [], len = arguments.length;
  3880. while ( len-- ) args[ len ] = arguments[ len ];
  3881. return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
  3882. },
  3883. getJSON: function () {
  3884. var args = [], len = arguments.length;
  3885. while ( len-- ) args[ len ] = arguments[ len ];
  3886. return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
  3887. },
  3888. postJSON: function () {
  3889. var args = [], len = arguments.length;
  3890. while ( len-- ) args[ len ] = arguments[ len ];
  3891. return RequestShortcut.apply(void 0, [ 'postJSON' ].concat( args ));
  3892. },
  3893. });
  3894. Request.promise = function requestPromise(requestOptions) {
  3895. return new Promise(function (resolve, reject) {
  3896. Request(Object.assign(requestOptions, {
  3897. success: function success(data, status, xhr) {
  3898. resolve({ data: data, status: status, xhr: xhr });
  3899. },
  3900. error: function error(xhr, status, message) {
  3901. // eslint-disable-next-line
  3902. reject({ xhr: xhr, status: status, message: message });
  3903. },
  3904. }));
  3905. });
  3906. };
  3907. Object.assign(Request.promise, {
  3908. get: function () {
  3909. var args = [], len = arguments.length;
  3910. while ( len-- ) args[ len ] = arguments[ len ];
  3911. return RequestShortcutPromise.apply(void 0, [ 'get' ].concat( args ));
  3912. },
  3913. post: function () {
  3914. var args = [], len = arguments.length;
  3915. while ( len-- ) args[ len ] = arguments[ len ];
  3916. return RequestShortcutPromise.apply(void 0, [ 'post' ].concat( args ));
  3917. },
  3918. json: function () {
  3919. var args = [], len = arguments.length;
  3920. while ( len-- ) args[ len ] = arguments[ len ];
  3921. return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
  3922. },
  3923. getJSON: function () {
  3924. var args = [], len = arguments.length;
  3925. while ( len-- ) args[ len ] = arguments[ len ];
  3926. return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
  3927. },
  3928. postJSON: function () {
  3929. var args = [], len = arguments.length;
  3930. while ( len-- ) args[ len ] = arguments[ len ];
  3931. return RequestShortcutPromise.apply(void 0, [ 'postJSON' ].concat( args ));
  3932. },
  3933. });
  3934. Request.setup = function setup(options) {
  3935. if (options.type && !options.method) {
  3936. Utils.extend(options, { method: options.type });
  3937. }
  3938. Utils.extend(globals, options);
  3939. };
  3940. var DeviceModule = {
  3941. name: 'device',
  3942. proto: {
  3943. device: Device,
  3944. },
  3945. static: {
  3946. device: Device,
  3947. },
  3948. on: {
  3949. init: function init() {
  3950. var classNames = [];
  3951. var html = doc.querySelector('html');
  3952. var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
  3953. if (!html) { return; }
  3954. if (Device.standalone && Device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
  3955. classNames.push('device-full-viewport');
  3956. }
  3957. // Pixel Ratio
  3958. classNames.push(("device-pixel-ratio-" + (Math.floor(Device.pixelRatio))));
  3959. // OS classes
  3960. if (Device.os && !Device.desktop) {
  3961. classNames.push(
  3962. ("device-" + (Device.os))
  3963. );
  3964. } else if (Device.desktop) {
  3965. classNames.push('device-desktop');
  3966. if (Device.os) {
  3967. classNames.push(("device-" + (Device.os)));
  3968. }
  3969. }
  3970. if (Device.cordova || Device.phonegap) {
  3971. classNames.push('device-cordova');
  3972. }
  3973. // Add html classes
  3974. classNames.forEach(function (className) {
  3975. html.classList.add(className);
  3976. });
  3977. },
  3978. },
  3979. };
  3980. var SupportModule = {
  3981. name: 'support',
  3982. proto: {
  3983. support: Support,
  3984. },
  3985. static: {
  3986. support: Support,
  3987. },
  3988. };
  3989. var UtilsModule = {
  3990. name: 'utils',
  3991. proto: {
  3992. utils: Utils,
  3993. },
  3994. static: {
  3995. utils: Utils,
  3996. },
  3997. };
  3998. var ResizeModule = {
  3999. name: 'resize',
  4000. instance: {
  4001. getSize: function getSize() {
  4002. var app = this;
  4003. if (!app.root[0]) { return { width: 0, height: 0, left: 0, top: 0 }; }
  4004. var offset = app.root.offset();
  4005. var ref = [app.root[0].offsetWidth, app.root[0].offsetHeight, offset.left, offset.top];
  4006. var width = ref[0];
  4007. var height = ref[1];
  4008. var left = ref[2];
  4009. var top = ref[3];
  4010. app.width = width;
  4011. app.height = height;
  4012. app.left = left;
  4013. app.top = top;
  4014. return { width: width, height: height, left: left, top: top };
  4015. },
  4016. },
  4017. on: {
  4018. init: function init() {
  4019. var app = this;
  4020. // Get Size
  4021. app.getSize();
  4022. // Emit resize
  4023. win.addEventListener('resize', function () {
  4024. app.emit('resize');
  4025. }, false);
  4026. // Emit orientationchange
  4027. win.addEventListener('orientationchange', function () {
  4028. app.emit('orientationchange');
  4029. });
  4030. },
  4031. orientationchange: function orientationchange() {
  4032. var app = this;
  4033. // Fix iPad weird body scroll
  4034. if (app.device.ipad) {
  4035. doc.body.scrollLeft = 0;
  4036. setTimeout(function () {
  4037. doc.body.scrollLeft = 0;
  4038. }, 0);
  4039. }
  4040. },
  4041. resize: function resize() {
  4042. var app = this;
  4043. app.getSize();
  4044. },
  4045. },
  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 HistoryModule = {
  9201. name: 'history',
  9202. static: {
  9203. history: History,
  9204. },
  9205. on: {
  9206. init: function init() {
  9207. History.init(this);
  9208. },
  9209. },
  9210. };
  9211. var SW = {
  9212. registrations: [],
  9213. register: function register(path, scope) {
  9214. var app = this;
  9215. if (!('serviceWorker' in win.navigator) || !app.serviceWorker.container) {
  9216. return new Promise(function (resolve, reject) {
  9217. reject(new Error('Service worker is not supported'));
  9218. });
  9219. }
  9220. return new Promise(function (resolve, reject) {
  9221. app.serviceWorker.container.register(path, (scope ? { scope: scope } : {}))
  9222. .then(function (reg) {
  9223. SW.registrations.push(reg);
  9224. app.emit('serviceWorkerRegisterSuccess', reg);
  9225. resolve(reg);
  9226. }).catch(function (error) {
  9227. app.emit('serviceWorkerRegisterError', error);
  9228. reject(error);
  9229. });
  9230. });
  9231. },
  9232. unregister: function unregister(registration) {
  9233. var app = this;
  9234. if (!('serviceWorker' in win.navigator) || !app.serviceWorker.container) {
  9235. return new Promise(function (resolve, reject) {
  9236. reject(new Error('Service worker is not supported'));
  9237. });
  9238. }
  9239. var registrations;
  9240. if (!registration) { registrations = SW.registrations; }
  9241. else if (Array.isArray(registration)) { registrations = registration; }
  9242. else { registrations = [registration]; }
  9243. return Promise.all(registrations.map(function (reg) { return new Promise(function (resolve, reject) {
  9244. reg.unregister()
  9245. .then(function () {
  9246. if (SW.registrations.indexOf(reg) >= 0) {
  9247. SW.registrations.splice(SW.registrations.indexOf(reg), 1);
  9248. }
  9249. app.emit('serviceWorkerUnregisterSuccess', reg);
  9250. resolve();
  9251. })
  9252. .catch(function (error) {
  9253. app.emit('serviceWorkerUnregisterError', reg, error);
  9254. reject(error);
  9255. });
  9256. }); }));
  9257. },
  9258. };
  9259. var ServiceWorkerModule = {
  9260. name: 'sw',
  9261. params: {
  9262. serviceWorker: {
  9263. path: undefined,
  9264. scope: undefined,
  9265. },
  9266. },
  9267. create: function create() {
  9268. var app = this;
  9269. Utils.extend(app, {
  9270. serviceWorker: {
  9271. container: ('serviceWorker' in win.navigator) ? win.navigator.serviceWorker : undefined,
  9272. registrations: SW.registrations,
  9273. register: SW.register.bind(app),
  9274. unregister: SW.unregister.bind(app),
  9275. },
  9276. });
  9277. },
  9278. on: {
  9279. init: function init() {
  9280. if (!('serviceWorker' in win.navigator)) { return; }
  9281. var app = this;
  9282. if (!app.serviceWorker.container) { return; }
  9283. var paths = app.params.serviceWorker.path;
  9284. var scope = app.params.serviceWorker.scope;
  9285. if (!paths || (Array.isArray(paths) && !paths.length)) { return; }
  9286. var toRegister = Array.isArray(paths) ? paths : [paths];
  9287. toRegister.forEach(function (path) {
  9288. app.serviceWorker.register(path, scope);
  9289. });
  9290. },
  9291. },
  9292. };
  9293. var Statusbar = {
  9294. hide: function hide() {
  9295. if (Device.cordova && win.StatusBar) {
  9296. win.StatusBar.hide();
  9297. }
  9298. },
  9299. show: function show() {
  9300. if (Device.cordova && win.StatusBar) {
  9301. win.StatusBar.show();
  9302. }
  9303. },
  9304. onClick: function onClick() {
  9305. var app = this;
  9306. var pageContent;
  9307. if ($('.popup.modal-in').length > 0) {
  9308. // Check for opened popup
  9309. pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  9310. } else if ($('.panel.panel-in').length > 0) {
  9311. // Check for opened panel
  9312. pageContent = $('.panel.panel-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  9313. } else if ($('.views > .view.tab-active').length > 0) {
  9314. // View in tab bar app layout
  9315. pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  9316. } else if ($('.views').length > 0) {
  9317. pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  9318. } else {
  9319. pageContent = app.root.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  9320. }
  9321. if (pageContent && pageContent.length > 0) {
  9322. // Check for tab
  9323. if (pageContent.hasClass('tab')) {
  9324. pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
  9325. }
  9326. if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
  9327. }
  9328. },
  9329. setTextColor: function setTextColor(color) {
  9330. if (Device.cordova && win.StatusBar) {
  9331. if (color === 'white') {
  9332. win.StatusBar.styleLightContent();
  9333. } else {
  9334. win.StatusBar.styleDefault();
  9335. }
  9336. }
  9337. },
  9338. setBackgroundColor: function setBackgroundColor(color) {
  9339. if (Device.cordova && win.StatusBar) {
  9340. win.StatusBar.backgroundColorByHexString(color);
  9341. }
  9342. },
  9343. isVisible: function isVisible() {
  9344. if (Device.cordova && win.StatusBar) {
  9345. return win.StatusBar.isVisible;
  9346. }
  9347. return false;
  9348. },
  9349. overlaysWebView: function overlaysWebView(overlays) {
  9350. if ( overlays === void 0 ) overlays = true;
  9351. if (Device.cordova && win.StatusBar) {
  9352. win.StatusBar.overlaysWebView(overlays);
  9353. }
  9354. },
  9355. init: function init() {
  9356. var app = this;
  9357. var params = app.params.statusbar;
  9358. if (!params.enabled) { return; }
  9359. if (Device.cordova && win.StatusBar) {
  9360. if (params.scrollTopOnClick) {
  9361. $(win).on('statusTap', Statusbar.onClick.bind(app));
  9362. }
  9363. if (Device.ios) {
  9364. if (params.iosOverlaysWebView) {
  9365. win.StatusBar.overlaysWebView(true);
  9366. } else {
  9367. win.StatusBar.overlaysWebView(false);
  9368. }
  9369. if (params.iosTextColor === 'white') {
  9370. win.StatusBar.styleLightContent();
  9371. } else {
  9372. win.StatusBar.styleDefault();
  9373. }
  9374. }
  9375. if (Device.android) {
  9376. if (params.androidOverlaysWebView) {
  9377. win.StatusBar.overlaysWebView(true);
  9378. } else {
  9379. win.StatusBar.overlaysWebView(false);
  9380. }
  9381. if (params.androidTextColor === 'white') {
  9382. win.StatusBar.styleLightContent();
  9383. } else {
  9384. win.StatusBar.styleDefault();
  9385. }
  9386. }
  9387. }
  9388. if (params.iosBackgroundColor && Device.ios) {
  9389. Statusbar.setBackgroundColor(params.iosBackgroundColor);
  9390. }
  9391. if (params.androidBackgroundColor && Device.android) {
  9392. Statusbar.setBackgroundColor(params.androidBackgroundColor);
  9393. }
  9394. },
  9395. };
  9396. var Statusbar$1 = {
  9397. name: 'statusbar',
  9398. params: {
  9399. statusbar: {
  9400. enabled: true,
  9401. scrollTopOnClick: true,
  9402. iosOverlaysWebView: true,
  9403. iosTextColor: 'black',
  9404. iosBackgroundColor: null,
  9405. androidOverlaysWebView: false,
  9406. androidTextColor: 'black',
  9407. androidBackgroundColor: null,
  9408. },
  9409. },
  9410. create: function create() {
  9411. var app = this;
  9412. Utils.extend(app, {
  9413. statusbar: {
  9414. hide: Statusbar.hide,
  9415. show: Statusbar.show,
  9416. overlaysWebView: Statusbar.overlaysWebView,
  9417. setTextColor: Statusbar.setTextColor,
  9418. setBackgroundColor: Statusbar.setBackgroundColor,
  9419. isVisible: Statusbar.isVisible,
  9420. init: Statusbar.init.bind(app),
  9421. },
  9422. });
  9423. },
  9424. on: {
  9425. init: function init() {
  9426. var app = this;
  9427. Statusbar.init.call(app);
  9428. },
  9429. },
  9430. };
  9431. function getCurrentView(app) {
  9432. var $popoverView = $('.popover.modal-in .view');
  9433. var $popupView = $('.popup.modal-in .view');
  9434. var $panelView = $('.panel.panel-in .view');
  9435. var $viewsEl = $('.views');
  9436. if ($viewsEl.length === 0) { $viewsEl = app.root; }
  9437. // Find active view as tab
  9438. var $viewEl = $viewsEl.children('.view');
  9439. if ($viewEl.length === 0) {
  9440. $viewEl = $viewsEl.children('.tabs').children('.view');
  9441. }
  9442. // Propably in tabs or split view
  9443. if ($viewEl.length > 1) {
  9444. if ($viewEl.hasClass('tab')) {
  9445. // Tabs
  9446. $viewEl = $viewsEl.children('.view.tab-active');
  9447. if ($viewEl.length === 0) {
  9448. $viewEl = $viewsEl.children('.tabs').children('.view.tab-active');
  9449. }
  9450. }
  9451. }
  9452. if ($popoverView.length > 0 && $popoverView[0].f7View) { return $popoverView[0].f7View; }
  9453. if ($popupView.length > 0 && $popupView[0].f7View) { return $popupView[0].f7View; }
  9454. if ($panelView.length > 0 && $panelView[0].f7View) { return $panelView[0].f7View; }
  9455. if ($viewEl.length > 0) {
  9456. if ($viewEl.length === 1 && $viewEl[0].f7View) { return $viewEl[0].f7View; }
  9457. if ($viewEl.length > 1) {
  9458. return app.views.main;
  9459. }
  9460. }
  9461. return undefined;
  9462. }
  9463. var View$1 = {
  9464. name: 'view',
  9465. params: {
  9466. view: {
  9467. name: undefined,
  9468. main: false,
  9469. router: true,
  9470. linksView: null,
  9471. stackPages: false,
  9472. xhrCache: true,
  9473. xhrCacheIgnore: [],
  9474. xhrCacheIgnoreGetParameters: false,
  9475. xhrCacheDuration: 1000 * 60 * 10, // Ten minutes
  9476. componentCache: true,
  9477. preloadPreviousPage: true,
  9478. allowDuplicateUrls: false,
  9479. reloadPages: false,
  9480. reloadDetail: false,
  9481. masterDetailBreakpoint: 0,
  9482. masterDetailResizable: false,
  9483. removeElements: true,
  9484. removeElementsWithTimeout: false,
  9485. removeElementsTimeout: 0,
  9486. restoreScrollTopOnBack: true,
  9487. unloadTabContent: true,
  9488. passRouteQueryToRequest: true,
  9489. passRouteParamsToRequest: false,
  9490. loadInitialPage: true,
  9491. // Swipe Back
  9492. iosSwipeBack: true,
  9493. iosSwipeBackAnimateShadow: true,
  9494. iosSwipeBackAnimateOpacity: true,
  9495. iosSwipeBackActiveArea: 30,
  9496. iosSwipeBackThreshold: 0,
  9497. mdSwipeBack: false,
  9498. mdSwipeBackAnimateShadow: true,
  9499. mdSwipeBackAnimateOpacity: false,
  9500. mdSwipeBackActiveArea: 30,
  9501. mdSwipeBackThreshold: 0,
  9502. auroraSwipeBack: false,
  9503. auroraSwipeBackAnimateShadow: false,
  9504. auroraSwipeBackAnimateOpacity: true,
  9505. auroraSwipeBackActiveArea: 30,
  9506. auroraSwipeBackThreshold: 0,
  9507. // Push State
  9508. pushState: false,
  9509. pushStateRoot: undefined,
  9510. pushStateAnimate: true,
  9511. pushStateAnimateOnLoad: false,
  9512. pushStateSeparator: '#!',
  9513. pushStateOnLoad: true,
  9514. // Animate Pages
  9515. animate: true,
  9516. // iOS Dynamic Navbar
  9517. iosDynamicNavbar: true,
  9518. // Animate iOS Navbar Back Icon
  9519. iosAnimateNavbarBackIcon: true,
  9520. // Delays
  9521. iosPageLoadDelay: 0,
  9522. mdPageLoadDelay: 0,
  9523. auroraPageLoadDelay: 0,
  9524. // Routes hooks
  9525. routesBeforeEnter: null,
  9526. routesBeforeLeave: null,
  9527. },
  9528. },
  9529. static: {
  9530. View: View,
  9531. },
  9532. create: function create() {
  9533. var app = this;
  9534. Utils.extend(app, {
  9535. views: Utils.extend([], {
  9536. create: function create(el, params) {
  9537. return new View(app, el, params);
  9538. },
  9539. get: function get(viewEl) {
  9540. var $viewEl = $(viewEl);
  9541. if ($viewEl.length && $viewEl[0].f7View) { return $viewEl[0].f7View; }
  9542. return undefined;
  9543. },
  9544. }),
  9545. });
  9546. Object.defineProperty(app.views, 'current', {
  9547. enumerable: true,
  9548. configurable: true,
  9549. get: function get() {
  9550. return getCurrentView(app);
  9551. },
  9552. });
  9553. // Alias
  9554. app.view = app.views;
  9555. },
  9556. on: {
  9557. init: function init() {
  9558. var app = this;
  9559. $('.view-init').each(function (index, viewEl) {
  9560. if (viewEl.f7View) { return; }
  9561. var viewParams = $(viewEl).dataset();
  9562. app.views.create(viewEl, viewParams);
  9563. });
  9564. },
  9565. 'modalOpen panelOpen': function onOpen(instance) {
  9566. var app = this;
  9567. instance.$el.find('.view-init').each(function (index, viewEl) {
  9568. if (viewEl.f7View) { return; }
  9569. var viewParams = $(viewEl).dataset();
  9570. app.views.create(viewEl, viewParams);
  9571. });
  9572. },
  9573. 'modalBeforeDestroy panelBeforeDestroy': function onClose(instance) {
  9574. if (!instance || !instance.$el) { return; }
  9575. instance.$el.find('.view-init').each(function (index, viewEl) {
  9576. var view = viewEl.f7View;
  9577. if (!view) { return; }
  9578. view.destroy();
  9579. });
  9580. },
  9581. },
  9582. vnode: {
  9583. 'view-init': {
  9584. insert: function insert(vnode) {
  9585. var app = this;
  9586. var viewEl = vnode.elm;
  9587. if (viewEl.f7View) { return; }
  9588. var viewParams = $(viewEl).dataset();
  9589. app.views.create(viewEl, viewParams);
  9590. },
  9591. destroy: function destroy(vnode) {
  9592. var viewEl = vnode.elm;
  9593. var view = viewEl.f7View;
  9594. if (!view) { return; }
  9595. view.destroy();
  9596. },
  9597. },
  9598. },
  9599. };
  9600. var Navbar = {
  9601. size: function size(el) {
  9602. var app = this;
  9603. var $el = $(el);
  9604. if ($el.hasClass('navbars')) {
  9605. $el = $el.children('.navbar').each(function (index, navbarEl) {
  9606. app.navbar.size(navbarEl);
  9607. });
  9608. return;
  9609. }
  9610. var $innerEl = $el.children('.navbar-inner');
  9611. if (!$innerEl.length) { return; }
  9612. var needCenterTitle = (
  9613. $innerEl.hasClass('navbar-inner-centered-title')
  9614. || app.params.navbar[((app.theme) + "CenterTitle")]
  9615. );
  9616. var needLeftTitle = app.theme === 'ios' && !app.params.navbar[((app.theme) + "CenterTitle")];
  9617. if (!needCenterTitle && !needLeftTitle) { return; }
  9618. if (
  9619. $el.hasClass('stacked')
  9620. || $el.parents('.stacked').length > 0
  9621. || $el.parents('.tab:not(.tab-active)').length > 0
  9622. || $el.parents('.popup:not(.modal-in)').length > 0
  9623. ) {
  9624. return;
  9625. }
  9626. if (app.theme !== 'ios' && app.params.navbar[((app.theme) + "CenterTitle")]) {
  9627. $innerEl.addClass('navbar-inner-centered-title');
  9628. }
  9629. if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
  9630. $innerEl.addClass('navbar-inner-left-title');
  9631. }
  9632. var $viewEl = $el.parents('.view').eq(0);
  9633. var left = app.rtl ? $innerEl.children('.right') : $innerEl.children('.left');
  9634. var right = app.rtl ? $innerEl.children('.left') : $innerEl.children('.right');
  9635. var title = $innerEl.children('.title');
  9636. var subnavbar = $innerEl.children('.subnavbar');
  9637. var noLeft = left.length === 0;
  9638. var noRight = right.length === 0;
  9639. var leftWidth = noLeft ? 0 : left.outerWidth(true);
  9640. var rightWidth = noRight ? 0 : right.outerWidth(true);
  9641. var titleWidth = title.outerWidth(true);
  9642. var navbarStyles = $innerEl.styles();
  9643. var navbarWidth = $innerEl[0].offsetWidth;
  9644. var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
  9645. var isPrevious = $el.hasClass('navbar-previous');
  9646. var sliding = $innerEl.hasClass('sliding');
  9647. var router;
  9648. var dynamicNavbar;
  9649. if ($viewEl.length > 0 && $viewEl[0].f7View) {
  9650. router = $viewEl[0].f7View.router;
  9651. dynamicNavbar = router && router.dynamicNavbar;
  9652. }
  9653. var currLeft;
  9654. var diff;
  9655. if (noRight) {
  9656. currLeft = navbarInnerWidth - titleWidth;
  9657. }
  9658. if (noLeft) {
  9659. currLeft = 0;
  9660. }
  9661. if (!noLeft && !noRight) {
  9662. currLeft = ((navbarInnerWidth - rightWidth - titleWidth) + leftWidth) / 2;
  9663. }
  9664. var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
  9665. if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
  9666. if (requiredLeft < leftWidth) {
  9667. requiredLeft = leftWidth;
  9668. }
  9669. if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
  9670. requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
  9671. }
  9672. diff = requiredLeft - currLeft;
  9673. } else {
  9674. diff = 0;
  9675. }
  9676. // RTL inverter
  9677. var inverter = app.rtl ? -1 : 1;
  9678. if (dynamicNavbar && app.theme === 'ios') {
  9679. if (title.hasClass('sliding') || (title.length > 0 && sliding)) {
  9680. var titleLeftOffset = -(currLeft + diff) * inverter;
  9681. var titleRightOffset = (navbarInnerWidth - currLeft - diff - titleWidth) * inverter;
  9682. if (isPrevious) {
  9683. if (router && router.params.iosAnimateNavbarBackIcon) {
  9684. var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
  9685. if (activeNavbarBackLink.length > 0) {
  9686. titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
  9687. }
  9688. }
  9689. }
  9690. title[0].f7NavbarLeftOffset = titleLeftOffset;
  9691. title[0].f7NavbarRightOffset = titleRightOffset;
  9692. }
  9693. if (!noLeft && (left.hasClass('sliding') || sliding)) {
  9694. if (app.rtl) {
  9695. left[0].f7NavbarLeftOffset = (-(navbarInnerWidth - left[0].offsetWidth) / 2) * inverter;
  9696. left[0].f7NavbarRightOffset = leftWidth * inverter;
  9697. } else {
  9698. left[0].f7NavbarLeftOffset = -leftWidth;
  9699. left[0].f7NavbarRightOffset = ((navbarInnerWidth - left[0].offsetWidth) / 2);
  9700. if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
  9701. if (left.find('.back .icon ~ span').length) {
  9702. var leftOffset = left[0].f7NavbarLeftOffset;
  9703. var rightOffset = left[0].f7NavbarRightOffset;
  9704. left[0].f7NavbarLeftOffset = 0;
  9705. left[0].f7NavbarRightOffset = 0;
  9706. left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
  9707. left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
  9708. }
  9709. }
  9710. }
  9711. }
  9712. if (!noRight && (right.hasClass('sliding') || sliding)) {
  9713. if (app.rtl) {
  9714. right[0].f7NavbarLeftOffset = -rightWidth * inverter;
  9715. right[0].f7NavbarRightOffset = ((navbarInnerWidth - right[0].offsetWidth) / 2) * inverter;
  9716. } else {
  9717. right[0].f7NavbarLeftOffset = -(navbarInnerWidth - right[0].offsetWidth) / 2;
  9718. right[0].f7NavbarRightOffset = rightWidth;
  9719. }
  9720. }
  9721. if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
  9722. subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : -subnavbar[0].offsetWidth;
  9723. subnavbar[0].f7NavbarRightOffset = -subnavbar[0].f7NavbarLeftOffset;
  9724. }
  9725. }
  9726. // Center title
  9727. if (needCenterTitle) {
  9728. var titleLeft = diff;
  9729. if (app.rtl && noLeft && noRight && title.length > 0) { titleLeft = -titleLeft; }
  9730. title.css({ left: (titleLeft + "px") });
  9731. }
  9732. },
  9733. hide: function hide(el, animate, hideStatusbar) {
  9734. if ( animate === void 0 ) animate = true;
  9735. if ( hideStatusbar === void 0 ) hideStatusbar = false;
  9736. var app = this;
  9737. var $el = $(el);
  9738. var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length;
  9739. if (isDynamic) { $el = $el.parents('.navbars'); }
  9740. if (!$el.length) { return; }
  9741. if ($el.hasClass('navbar-hidden')) { return; }
  9742. var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
  9743. var currentIsLarge = isDynamic
  9744. ? $el.find('.navbar-current .title-large').length
  9745. : $el.find('.title-large').length;
  9746. if (currentIsLarge) {
  9747. className += ' navbar-large-hidden';
  9748. }
  9749. if (hideStatusbar) {
  9750. className += ' navbar-hidden-statusbar';
  9751. }
  9752. $el.transitionEnd(function () {
  9753. $el.removeClass('navbar-transitioning');
  9754. });
  9755. $el.addClass(className);
  9756. if (isDynamic) {
  9757. $el.children('.navbar').each(function (index, subEl) {
  9758. $(subEl).trigger('navbar:hide');
  9759. app.emit('navbarHide', subEl);
  9760. });
  9761. } else {
  9762. $el.trigger('navbar:hide');
  9763. app.emit('navbarHide', $el[0]);
  9764. }
  9765. },
  9766. show: function show(el, animate) {
  9767. if ( el === void 0 ) el = '.navbar-hidden';
  9768. if ( animate === void 0 ) animate = true;
  9769. var app = this;
  9770. var $el = $(el);
  9771. var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length;
  9772. if (isDynamic) { $el = $el.parents('.navbars'); }
  9773. if (!$el.length) { return; }
  9774. if (!$el.hasClass('navbar-hidden')) { return; }
  9775. if (animate) {
  9776. $el.addClass('navbar-transitioning');
  9777. $el.transitionEnd(function () {
  9778. $el.removeClass('navbar-transitioning');
  9779. });
  9780. }
  9781. $el.removeClass('navbar-hidden navbar-large-hidden navbar-hidden-statusbar');
  9782. if (isDynamic) {
  9783. $el.children('.navbar').each(function (index, subEl) {
  9784. $(subEl).trigger('navbar:show');
  9785. app.emit('navbarShow', subEl);
  9786. });
  9787. } else {
  9788. $el.trigger('navbar:show');
  9789. app.emit('navbarShow', $el[0]);
  9790. }
  9791. },
  9792. getElByPage: function getElByPage(page) {
  9793. var $pageEl;
  9794. var $navbarEl;
  9795. var pageData;
  9796. if (page.$navbarEl || page.$el) {
  9797. pageData = page;
  9798. $pageEl = page.$el;
  9799. } else {
  9800. $pageEl = $(page);
  9801. if ($pageEl.length > 0) { pageData = $pageEl[0].f7Page; }
  9802. }
  9803. if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
  9804. $navbarEl = pageData.$navbarEl;
  9805. } else if ($pageEl) {
  9806. $navbarEl = $pageEl.children('.navbar');
  9807. }
  9808. if (!$navbarEl || ($navbarEl && $navbarEl.length === 0)) { return undefined; }
  9809. return $navbarEl[0];
  9810. },
  9811. getPageByEl: function getPageByEl(navbarEl) {
  9812. var $navbarEl = $(navbarEl);
  9813. if ($navbarEl.parents('.page').length) {
  9814. return $navbarEl.parents('.page')[0];
  9815. }
  9816. var pageEl;
  9817. $navbarEl.parents('.view').find('.page').each(function (index, el) {
  9818. if (el && el.f7Page && el.f7Page.navbarEl && $navbarEl[0] === el.f7Page.navbarEl) {
  9819. pageEl = el;
  9820. }
  9821. });
  9822. return pageEl;
  9823. },
  9824. collapseLargeTitle: function collapseLargeTitle(navbarEl) {
  9825. var app = this;
  9826. var $navbarEl = $(navbarEl);
  9827. if ($navbarEl.hasClass('navbars')) {
  9828. $navbarEl = $navbarEl.find('.navbar');
  9829. if ($navbarEl.length > 1) {
  9830. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  9831. }
  9832. if ($navbarEl.length > 1 || !$navbarEl.length) {
  9833. return;
  9834. }
  9835. }
  9836. var $pageEl = $(app.navbar.getPageByEl($navbarEl));
  9837. $navbarEl.addClass('navbar-large-collapsed');
  9838. $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
  9839. app.emit('pageNavbarLargeCollapsed', $pageEl[0]);
  9840. $navbarEl.trigger('navbar:collapse');
  9841. app.emit('navbarCollapse', $navbarEl[0]);
  9842. },
  9843. expandLargeTitle: function expandLargeTitle(navbarEl) {
  9844. var app = this;
  9845. var $navbarEl = $(navbarEl);
  9846. if ($navbarEl.hasClass('navbars')) {
  9847. $navbarEl = $navbarEl.find('.navbar-large');
  9848. if ($navbarEl.length > 1) {
  9849. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  9850. }
  9851. if ($navbarEl.length > 1 || !$navbarEl.length) {
  9852. return;
  9853. }
  9854. }
  9855. var $pageEl = $(app.navbar.getPageByEl($navbarEl));
  9856. $navbarEl.removeClass('navbar-large-collapsed');
  9857. $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
  9858. app.emit('pageNavbarLargeExpanded', $pageEl[0]);
  9859. $navbarEl.trigger('navbar:expand');
  9860. app.emit('navbarExpand', $navbarEl[0]);
  9861. },
  9862. toggleLargeTitle: function toggleLargeTitle(navbarEl) {
  9863. var app = this;
  9864. var $navbarEl = $(navbarEl);
  9865. if ($navbarEl.hasClass('navbars')) {
  9866. $navbarEl = $navbarEl.find('.navbar-large');
  9867. if ($navbarEl.length > 1) {
  9868. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  9869. }
  9870. if ($navbarEl.length > 1 || !$navbarEl.length) {
  9871. return;
  9872. }
  9873. }
  9874. if ($navbarEl.hasClass('navbar-large-collapsed')) {
  9875. app.navbar.expandLargeTitle($navbarEl);
  9876. } else {
  9877. app.navbar.collapseLargeTitle($navbarEl);
  9878. }
  9879. },
  9880. initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarEl, needHide, needCollapse, needTransparent) {
  9881. var app = this;
  9882. var $pageEl = $(pageEl);
  9883. var $navbarEl = $(navbarEl);
  9884. var $titleLargeEl = $navbarEl.find('.title-large');
  9885. var isLarge = $titleLargeEl.length || $navbarEl.hasClass('.navbar-large');
  9886. var navbarHideHeight = 44;
  9887. var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
  9888. var snapPageScrollToTransparentNavbar = app.params.navbar.snapPageScrollToTransparentNavbar;
  9889. var previousScrollTop;
  9890. var currentScrollTop;
  9891. var scrollHeight;
  9892. var offsetHeight;
  9893. var reachEnd;
  9894. var action;
  9895. var navbarHidden;
  9896. var navbarCollapsed;
  9897. var navbarTitleLargeHeight;
  9898. var navbarOffsetHeight;
  9899. if (needCollapse || (needHide && isLarge)) {
  9900. navbarTitleLargeHeight = $navbarEl.css('--f7-navbar-large-title-height');
  9901. if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
  9902. navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
  9903. if (Number.isNaN(navbarTitleLargeHeight) && $titleLargeEl.length) {
  9904. navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
  9905. } else if (Number.isNaN(navbarTitleLargeHeight)) {
  9906. if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
  9907. else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
  9908. else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
  9909. }
  9910. } else if ($titleLargeEl.length) {
  9911. navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
  9912. } else { // eslint-disable-next-line
  9913. if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
  9914. else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
  9915. else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
  9916. }
  9917. }
  9918. if (needHide && isLarge) {
  9919. navbarHideHeight += navbarTitleLargeHeight;
  9920. }
  9921. var scrollChanged;
  9922. var scrollContent;
  9923. var scrollTimeoutId;
  9924. var touchEndTimeoutId;
  9925. var touchSnapTimeout = 70;
  9926. var desktopSnapTimeout = 300;
  9927. function snapLargeNavbar() {
  9928. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  9929. if (inSearchbarExpanded) { return; }
  9930. if (!scrollContent || currentScrollTop < 0) { return; }
  9931. if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
  9932. $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
  9933. } else if (currentScrollTop < navbarTitleLargeHeight) {
  9934. $(scrollContent).scrollTop(0, 200);
  9935. }
  9936. }
  9937. function snapTransparentNavbar() {
  9938. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  9939. if (inSearchbarExpanded) { return; }
  9940. if (!scrollContent || currentScrollTop < 0) { return; }
  9941. if (currentScrollTop >= navbarOffsetHeight / 2 && currentScrollTop < navbarOffsetHeight) {
  9942. $(scrollContent).scrollTop(navbarOffsetHeight, 100);
  9943. } else if (currentScrollTop < navbarOffsetHeight) {
  9944. $(scrollContent).scrollTop(0, 200);
  9945. }
  9946. }
  9947. function handleNavbarTransparent() {
  9948. var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  9949. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  9950. if (inSearchbarExpanded || isHidden) { return; }
  9951. if (!navbarOffsetHeight) {
  9952. navbarOffsetHeight = navbarEl.offsetHeight;
  9953. }
  9954. var opacity = currentScrollTop / navbarOffsetHeight;
  9955. var notTransparent = $navbarEl.hasClass('navbar-transparent-visible');
  9956. opacity = Math.max(Math.min(opacity, 1), 0);
  9957. if ((notTransparent && opacity === 1) || (!notTransparent && opacity === 0)) {
  9958. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  9959. return;
  9960. }
  9961. if (notTransparent && opacity === 0) {
  9962. $navbarEl.trigger('navbar:transparenthide');
  9963. app.emit('navbarTransparentHide', $navbarEl[0]);
  9964. $navbarEl.removeClass('navbar-transparent-visible');
  9965. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  9966. return;
  9967. }
  9968. if (!notTransparent && opacity === 1) {
  9969. $navbarEl.trigger('navbar:transparentshow');
  9970. app.emit('navbarTransparentShow', $navbarEl[0]);
  9971. $navbarEl.addClass('navbar-transparent-visible');
  9972. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  9973. return;
  9974. }
  9975. $navbarEl.find('.navbar-bg, .title').css('opacity', opacity);
  9976. if (snapPageScrollToTransparentNavbar) {
  9977. if (!Support.touch) {
  9978. clearTimeout(scrollTimeoutId);
  9979. scrollTimeoutId = setTimeout(function () {
  9980. snapTransparentNavbar();
  9981. }, desktopSnapTimeout);
  9982. } else if (touchEndTimeoutId) {
  9983. clearTimeout(touchEndTimeoutId);
  9984. touchEndTimeoutId = null;
  9985. touchEndTimeoutId = setTimeout(function () {
  9986. snapTransparentNavbar();
  9987. clearTimeout(touchEndTimeoutId);
  9988. touchEndTimeoutId = null;
  9989. }, touchSnapTimeout);
  9990. }
  9991. }
  9992. }
  9993. var previousCollapseProgress = null;
  9994. var collapseProgress = null;
  9995. function handleLargeNavbarCollapse() {
  9996. var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  9997. if (isHidden) { return; }
  9998. var isLargeTransparent = $navbarEl.hasClass('navbar-large-transparent')
  9999. || (
  10000. $navbarEl.hasClass('navbar-large')
  10001. && $navbarEl.hasClass('navbar-transparent')
  10002. );
  10003. previousCollapseProgress = collapseProgress;
  10004. collapseProgress = Math.min(Math.max((currentScrollTop / navbarTitleLargeHeight), 0), 1);
  10005. var previousCollapseWasInMiddle = previousCollapseProgress > 0 && previousCollapseProgress < 1;
  10006. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  10007. if (inSearchbarExpanded) { return; }
  10008. navbarCollapsed = $navbarEl.hasClass('navbar-large-collapsed');
  10009. if (collapseProgress === 0 && navbarCollapsed) {
  10010. app.navbar.expandLargeTitle($navbarEl[0]);
  10011. } else if (collapseProgress === 1 && !navbarCollapsed) {
  10012. app.navbar.collapseLargeTitle($navbarEl[0]);
  10013. }
  10014. if (
  10015. (collapseProgress === 0 && navbarCollapsed)
  10016. || (collapseProgress === 0 && previousCollapseWasInMiddle)
  10017. || (collapseProgress === 1 && !navbarCollapsed)
  10018. || (collapseProgress === 1 && previousCollapseWasInMiddle)
  10019. ) {
  10020. if (app.theme === 'md') {
  10021. $navbarEl.find('.navbar-inner').css('overflow', '');
  10022. }
  10023. $navbarEl.find('.title').css('opacity', '');
  10024. $navbarEl.find('.title-large-text, .subnavbar').css('transform', '');
  10025. if (isLargeTransparent) {
  10026. $navbarEl.find('.navbar-bg').css('opacity', '');
  10027. } else {
  10028. $navbarEl.find('.navbar-bg').css('transform', '');
  10029. }
  10030. } else if (collapseProgress > 0 && collapseProgress < 1) {
  10031. if (app.theme === 'md') {
  10032. $navbarEl.find('.navbar-inner').css('overflow', 'visible');
  10033. }
  10034. $navbarEl.find('.title').css('opacity', collapseProgress);
  10035. $navbarEl.find('.title-large-text, .subnavbar').css('transform', ("translate3d(0px, " + (-1 * collapseProgress * navbarTitleLargeHeight) + "px, 0)"));
  10036. if (isLargeTransparent) {
  10037. $navbarEl.find('.navbar-bg').css('opacity', collapseProgress);
  10038. } else {
  10039. $navbarEl.find('.navbar-bg').css('transform', ("translate3d(0px, " + (-1 * collapseProgress * navbarTitleLargeHeight) + "px, 0)"));
  10040. }
  10041. }
  10042. if (snapPageScrollToLargeTitle) {
  10043. if (!Support.touch) {
  10044. clearTimeout(scrollTimeoutId);
  10045. scrollTimeoutId = setTimeout(function () {
  10046. snapLargeNavbar();
  10047. }, desktopSnapTimeout);
  10048. } else if (touchEndTimeoutId) {
  10049. clearTimeout(touchEndTimeoutId);
  10050. touchEndTimeoutId = null;
  10051. touchEndTimeoutId = setTimeout(function () {
  10052. snapLargeNavbar();
  10053. clearTimeout(touchEndTimeoutId);
  10054. touchEndTimeoutId = null;
  10055. }, touchSnapTimeout);
  10056. }
  10057. }
  10058. }
  10059. function handleTitleHideShow() {
  10060. if ($pageEl.hasClass('page-with-card-opened')) { return; }
  10061. scrollHeight = scrollContent.scrollHeight;
  10062. offsetHeight = scrollContent.offsetHeight;
  10063. reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
  10064. navbarHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  10065. if (reachEnd) {
  10066. if (app.params.navbar.showOnPageScrollEnd) {
  10067. action = 'show';
  10068. }
  10069. } else if (previousScrollTop > currentScrollTop) {
  10070. if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
  10071. action = 'show';
  10072. } else {
  10073. action = 'hide';
  10074. }
  10075. } else if (currentScrollTop > navbarHideHeight) {
  10076. action = 'hide';
  10077. } else {
  10078. action = 'show';
  10079. }
  10080. if (action === 'show' && navbarHidden) {
  10081. app.navbar.show($navbarEl);
  10082. navbarHidden = false;
  10083. } else if (action === 'hide' && !navbarHidden) {
  10084. app.navbar.hide($navbarEl);
  10085. navbarHidden = true;
  10086. }
  10087. previousScrollTop = currentScrollTop;
  10088. }
  10089. function handleScroll(e) {
  10090. scrollContent = this;
  10091. if (e && e.target && e.target !== scrollContent) {
  10092. return;
  10093. }
  10094. currentScrollTop = scrollContent.scrollTop;
  10095. scrollChanged = currentScrollTop;
  10096. if (needCollapse) {
  10097. handleLargeNavbarCollapse();
  10098. } else if (needTransparent) {
  10099. handleNavbarTransparent();
  10100. }
  10101. if ($pageEl.hasClass('page-previous')) { return; }
  10102. if (needHide) {
  10103. handleTitleHideShow();
  10104. }
  10105. }
  10106. function handeTouchStart() {
  10107. scrollChanged = false;
  10108. }
  10109. function handleTouchEnd() {
  10110. clearTimeout(touchEndTimeoutId);
  10111. touchEndTimeoutId = null;
  10112. touchEndTimeoutId = setTimeout(function () {
  10113. if (scrollChanged !== false) {
  10114. if (needTransparent && !needCollapse) {
  10115. snapTransparentNavbar();
  10116. } else {
  10117. snapLargeNavbar();
  10118. }
  10119. clearTimeout(touchEndTimeoutId);
  10120. touchEndTimeoutId = null;
  10121. }
  10122. }, touchSnapTimeout);
  10123. }
  10124. $pageEl.on('scroll', '.page-content', handleScroll, true);
  10125. if (Support.touch && ((needCollapse && snapPageScrollToLargeTitle) || (needTransparent && snapPageScrollToTransparentNavbar))) {
  10126. app.on('touchstart:passive', handeTouchStart);
  10127. app.on('touchend:passive', handleTouchEnd);
  10128. }
  10129. if (needCollapse) {
  10130. $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
  10131. if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
  10132. });
  10133. } else if (needTransparent) {
  10134. $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
  10135. if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
  10136. });
  10137. }
  10138. $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
  10139. delete $pageEl[0].f7DetachNavbarScrollHandlers;
  10140. $pageEl.off('scroll', '.page-content', handleScroll, true);
  10141. if (Support.touch && ((needCollapse && snapPageScrollToLargeTitle) || (needTransparent && snapPageScrollToTransparentNavbar))) {
  10142. app.off('touchstart:passive', handeTouchStart);
  10143. app.off('touchend:passive', handleTouchEnd);
  10144. }
  10145. };
  10146. },
  10147. };
  10148. var Navbar$1 = {
  10149. name: 'navbar',
  10150. create: function create() {
  10151. var app = this;
  10152. Utils.extend(app, {
  10153. navbar: {
  10154. size: Navbar.size.bind(app),
  10155. hide: Navbar.hide.bind(app),
  10156. show: Navbar.show.bind(app),
  10157. getElByPage: Navbar.getElByPage.bind(app),
  10158. getPageByEl: Navbar.getPageByEl.bind(app),
  10159. collapseLargeTitle: Navbar.collapseLargeTitle.bind(app),
  10160. expandLargeTitle: Navbar.expandLargeTitle.bind(app),
  10161. toggleLargeTitle: Navbar.toggleLargeTitle.bind(app),
  10162. initNavbarOnScroll: Navbar.initNavbarOnScroll.bind(app),
  10163. },
  10164. });
  10165. },
  10166. params: {
  10167. navbar: {
  10168. scrollTopOnTitleClick: true,
  10169. iosCenterTitle: true,
  10170. mdCenterTitle: false,
  10171. auroraCenterTitle: true,
  10172. hideOnPageScroll: false,
  10173. showOnPageScrollEnd: true,
  10174. showOnPageScrollTop: true,
  10175. collapseLargeTitleOnScroll: true,
  10176. snapPageScrollToLargeTitle: true,
  10177. snapPageScrollToTransparentNavbar: true,
  10178. },
  10179. },
  10180. on: {
  10181. 'panelBreakpoint panelCollapsedBreakpoint panelResize viewResize resize viewMasterDetailBreakpoint': function onPanelResize() {
  10182. var app = this;
  10183. $('.navbar').each(function (index, navbarEl) {
  10184. app.navbar.size(navbarEl);
  10185. });
  10186. },
  10187. pageBeforeRemove: function pageBeforeRemove(page) {
  10188. if (page.$el[0].f7DetachNavbarScrollHandlers) {
  10189. page.$el[0].f7DetachNavbarScrollHandlers();
  10190. }
  10191. },
  10192. pageBeforeIn: function pageBeforeIn(page) {
  10193. var app = this;
  10194. if (app.theme !== 'ios') { return; }
  10195. var $navbarsEl;
  10196. var view = page.$el.parents('.view')[0].f7View;
  10197. var navbarEl = app.navbar.getElByPage(page);
  10198. if (!navbarEl) {
  10199. $navbarsEl = page.$el.parents('.view').children('.navbars');
  10200. } else {
  10201. $navbarsEl = $(navbarEl).parents('.navbars');
  10202. }
  10203. if (page.$el.hasClass('no-navbar') || (view.router.dynamicNavbar && !navbarEl)) {
  10204. var animate = !!(page.pageFrom && page.router.history.length > 0);
  10205. app.navbar.hide($navbarsEl, animate);
  10206. } else {
  10207. app.navbar.show($navbarsEl);
  10208. }
  10209. },
  10210. pageReinit: function pageReinit(page) {
  10211. var app = this;
  10212. var $navbarEl = $(app.navbar.getElByPage(page));
  10213. if (!$navbarEl || $navbarEl.length === 0) { return; }
  10214. app.navbar.size($navbarEl);
  10215. },
  10216. pageInit: function pageInit(page) {
  10217. var app = this;
  10218. var $navbarEl = $(app.navbar.getElByPage(page));
  10219. if (!$navbarEl || $navbarEl.length === 0) { return; }
  10220. // Size
  10221. app.navbar.size($navbarEl);
  10222. // Need Collapse On Scroll
  10223. var needCollapseOnScrollHandler;
  10224. if ($navbarEl.find('.title-large').length > 0) {
  10225. $navbarEl.addClass('navbar-large');
  10226. }
  10227. if ($navbarEl.hasClass('navbar-large')) {
  10228. if (app.params.navbar.collapseLargeTitleOnScroll) { needCollapseOnScrollHandler = true; }
  10229. page.$el.addClass('page-with-navbar-large');
  10230. }
  10231. // Need transparent on scroll
  10232. var needTransparentOnScroll;
  10233. if (!needCollapseOnScrollHandler && $navbarEl.hasClass('navbar-transparent')) {
  10234. needTransparentOnScroll = true;
  10235. }
  10236. // Need Hide On Scroll
  10237. var needHideOnScrollHandler;
  10238. if (
  10239. app.params.navbar.hideOnPageScroll
  10240. || page.$el.find('.hide-navbar-on-scroll').length
  10241. || page.$el.hasClass('hide-navbar-on-scroll')
  10242. || page.$el.find('.hide-bars-on-scroll').length
  10243. || page.$el.hasClass('hide-bars-on-scroll')
  10244. ) {
  10245. if (
  10246. page.$el.find('.keep-navbar-on-scroll').length
  10247. || page.$el.hasClass('keep-navbar-on-scroll')
  10248. || page.$el.find('.keep-bars-on-scroll').length
  10249. || page.$el.hasClass('keep-bars-on-scroll')
  10250. ) {
  10251. needHideOnScrollHandler = false;
  10252. } else {
  10253. needHideOnScrollHandler = true;
  10254. }
  10255. }
  10256. if (needCollapseOnScrollHandler || needHideOnScrollHandler || needTransparentOnScroll) {
  10257. app.navbar.initNavbarOnScroll(page.el, $navbarEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler, needTransparentOnScroll);
  10258. }
  10259. },
  10260. 'panelOpen panelSwipeOpen modalOpen': function onPanelModalOpen(instance) {
  10261. var app = this;
  10262. instance.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
  10263. app.navbar.size(navbarEl);
  10264. });
  10265. },
  10266. tabShow: function tabShow(tabEl) {
  10267. var app = this;
  10268. $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
  10269. app.navbar.size(navbarEl);
  10270. });
  10271. },
  10272. },
  10273. clicks: {
  10274. '.navbar .title': function onTitleClick($clickedEl) {
  10275. var app = this;
  10276. if (!app.params.navbar.scrollTopOnTitleClick) { return; }
  10277. if ($clickedEl.closest('a').length > 0) {
  10278. return;
  10279. }
  10280. var $pageContentEl;
  10281. // Find active page
  10282. var $navbarEl = $clickedEl.parents('.navbar');
  10283. var $navbarsEl = $navbarEl.parents('.navbars');
  10284. // Static Layout
  10285. $pageContentEl = $navbarEl.parents('.page-content');
  10286. if ($pageContentEl.length === 0) {
  10287. // Fixed Layout
  10288. if ($navbarEl.parents('.page').length > 0) {
  10289. $pageContentEl = $navbarEl.parents('.page').find('.page-content');
  10290. }
  10291. // Through Layout iOS
  10292. if ($pageContentEl.length === 0 && $navbarsEl.length) {
  10293. if ($navbarsEl.nextAll('.page-current:not(.stacked)').length > 0) {
  10294. $pageContentEl = $navbarsEl.nextAll('.page-current:not(.stacked)').find('.page-content');
  10295. }
  10296. }
  10297. // Through Layout
  10298. if ($pageContentEl.length === 0) {
  10299. if ($navbarEl.nextAll('.page-current:not(.stacked)').length > 0) {
  10300. $pageContentEl = $navbarEl.nextAll('.page-current:not(.stacked)').find('.page-content');
  10301. }
  10302. }
  10303. }
  10304. if ($pageContentEl && $pageContentEl.length > 0) {
  10305. // Check for tab
  10306. if ($pageContentEl.hasClass('tab')) {
  10307. $pageContentEl = $pageContentEl.parent('.tabs').children('.page-content.tab-active');
  10308. }
  10309. if ($pageContentEl.length > 0) { $pageContentEl.scrollTop(0, 300); }
  10310. }
  10311. },
  10312. },
  10313. vnode: {
  10314. navbar: {
  10315. postpatch: function postpatch(vnode) {
  10316. var app = this;
  10317. app.navbar.size(vnode.elm);
  10318. },
  10319. },
  10320. },
  10321. };
  10322. var Toolbar = {
  10323. setHighlight: function setHighlight(tabbarEl) {
  10324. var app = this;
  10325. if (app.theme !== 'md') { return; }
  10326. var $tabbarEl = $(tabbarEl);
  10327. if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) { return; }
  10328. var $highlightEl = $tabbarEl.find('.tab-link-highlight');
  10329. var tabLinksCount = $tabbarEl.find('.tab-link').length;
  10330. if (tabLinksCount === 0) {
  10331. $highlightEl.remove();
  10332. return;
  10333. }
  10334. if ($highlightEl.length === 0) {
  10335. $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
  10336. $highlightEl = $tabbarEl.find('.tab-link-highlight');
  10337. } else if ($highlightEl.next().length) {
  10338. $tabbarEl.children('.toolbar-inner').append($highlightEl);
  10339. }
  10340. var $activeLink = $tabbarEl.find('.tab-link-active');
  10341. var highlightWidth;
  10342. var highlightTranslate;
  10343. if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
  10344. highlightWidth = ($activeLink[0].offsetWidth) + "px";
  10345. highlightTranslate = ($activeLink[0].offsetLeft) + "px";
  10346. } else {
  10347. var activeIndex = $activeLink.index();
  10348. highlightWidth = (100 / tabLinksCount) + "%";
  10349. highlightTranslate = ((app.rtl ? -activeIndex : activeIndex) * 100) + "%";
  10350. }
  10351. Utils.nextFrame(function () {
  10352. $highlightEl
  10353. .css('width', highlightWidth)
  10354. .transform(("translate3d(" + highlightTranslate + ",0,0)"));
  10355. });
  10356. },
  10357. init: function init(tabbarEl) {
  10358. var app = this;
  10359. app.toolbar.setHighlight(tabbarEl);
  10360. },
  10361. hide: function hide(el, animate) {
  10362. if ( animate === void 0 ) animate = true;
  10363. var app = this;
  10364. var $el = $(el);
  10365. if ($el.hasClass('toolbar-hidden')) { return; }
  10366. var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
  10367. $el.transitionEnd(function () {
  10368. $el.removeClass('toolbar-transitioning');
  10369. });
  10370. $el.addClass(className);
  10371. $el.trigger('toolbar:hide');
  10372. app.emit('toolbarHide', $el[0]);
  10373. },
  10374. show: function show(el, animate) {
  10375. if ( animate === void 0 ) animate = true;
  10376. var app = this;
  10377. var $el = $(el);
  10378. if (!$el.hasClass('toolbar-hidden')) { return; }
  10379. if (animate) {
  10380. $el.addClass('toolbar-transitioning');
  10381. $el.transitionEnd(function () {
  10382. $el.removeClass('toolbar-transitioning');
  10383. });
  10384. }
  10385. $el.removeClass('toolbar-hidden');
  10386. $el.trigger('toolbar:show');
  10387. app.emit('toolbarShow', $el[0]);
  10388. },
  10389. initToolbarOnScroll: function initToolbarOnScroll(pageEl) {
  10390. var app = this;
  10391. var $pageEl = $(pageEl);
  10392. var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  10393. if ($toolbarEl.length === 0) {
  10394. $toolbarEl = $pageEl.find('.toolbar');
  10395. }
  10396. if ($toolbarEl.length === 0) {
  10397. $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
  10398. }
  10399. if ($toolbarEl.length === 0) {
  10400. return;
  10401. }
  10402. var previousScrollTop;
  10403. var currentScrollTop;
  10404. var scrollHeight;
  10405. var offsetHeight;
  10406. var reachEnd;
  10407. var action;
  10408. var toolbarHidden;
  10409. function handleScroll(e) {
  10410. if ($pageEl.hasClass('page-with-card-opened')) { return; }
  10411. if ($pageEl.hasClass('page-previous')) { return; }
  10412. var scrollContent = this;
  10413. if (e && e.target && e.target !== scrollContent) {
  10414. return;
  10415. }
  10416. currentScrollTop = scrollContent.scrollTop;
  10417. scrollHeight = scrollContent.scrollHeight;
  10418. offsetHeight = scrollContent.offsetHeight;
  10419. reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
  10420. toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
  10421. if (reachEnd) {
  10422. if (app.params.toolbar.showOnPageScrollEnd) {
  10423. action = 'show';
  10424. }
  10425. } else if (previousScrollTop > currentScrollTop) {
  10426. if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
  10427. action = 'show';
  10428. } else {
  10429. action = 'hide';
  10430. }
  10431. } else if (currentScrollTop > 44) {
  10432. action = 'hide';
  10433. } else {
  10434. action = 'show';
  10435. }
  10436. if (action === 'show' && toolbarHidden) {
  10437. app.toolbar.show($toolbarEl);
  10438. toolbarHidden = false;
  10439. } else if (action === 'hide' && !toolbarHidden) {
  10440. app.toolbar.hide($toolbarEl);
  10441. toolbarHidden = true;
  10442. }
  10443. previousScrollTop = currentScrollTop;
  10444. }
  10445. $pageEl.on('scroll', '.page-content', handleScroll, true);
  10446. $pageEl[0].f7ScrollToolbarHandler = handleScroll;
  10447. },
  10448. };
  10449. var Toolbar$1 = {
  10450. name: 'toolbar',
  10451. create: function create() {
  10452. var app = this;
  10453. Utils.extend(app, {
  10454. toolbar: {
  10455. hide: Toolbar.hide.bind(app),
  10456. show: Toolbar.show.bind(app),
  10457. setHighlight: Toolbar.setHighlight.bind(app),
  10458. initToolbarOnScroll: Toolbar.initToolbarOnScroll.bind(app),
  10459. init: Toolbar.init.bind(app),
  10460. },
  10461. });
  10462. },
  10463. params: {
  10464. toolbar: {
  10465. hideOnPageScroll: false,
  10466. showOnPageScrollEnd: true,
  10467. showOnPageScrollTop: true,
  10468. },
  10469. },
  10470. on: {
  10471. pageBeforeRemove: function pageBeforeRemove(page) {
  10472. if (page.$el[0].f7ScrollToolbarHandler) {
  10473. page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
  10474. }
  10475. },
  10476. pageBeforeIn: function pageBeforeIn(page) {
  10477. var app = this;
  10478. var $toolbarEl = page.$el.parents('.view').children('.toolbar');
  10479. if ($toolbarEl.length === 0) {
  10480. $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
  10481. }
  10482. if ($toolbarEl.length === 0) {
  10483. $toolbarEl = page.$el.find('.toolbar');
  10484. }
  10485. if ($toolbarEl.length === 0) {
  10486. return;
  10487. }
  10488. if (page.$el.hasClass('no-toolbar')) {
  10489. app.toolbar.hide($toolbarEl);
  10490. } else {
  10491. app.toolbar.show($toolbarEl);
  10492. }
  10493. },
  10494. pageInit: function pageInit(page) {
  10495. var app = this;
  10496. page.$el.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
  10497. app.toolbar.init(tabbarEl);
  10498. });
  10499. if (
  10500. app.params.toolbar.hideOnPageScroll
  10501. || page.$el.find('.hide-toolbar-on-scroll').length
  10502. || page.$el.hasClass('hide-toolbar-on-scroll')
  10503. || page.$el.find('.hide-bars-on-scroll').length
  10504. || page.$el.hasClass('hide-bars-on-scroll')
  10505. ) {
  10506. if (
  10507. page.$el.find('.keep-toolbar-on-scroll').length
  10508. || page.$el.hasClass('keep-toolbar-on-scroll')
  10509. || page.$el.find('.keep-bars-on-scroll').length
  10510. || page.$el.hasClass('keep-bars-on-scroll')
  10511. ) {
  10512. return;
  10513. }
  10514. app.toolbar.initToolbarOnScroll(page.el);
  10515. }
  10516. },
  10517. init: function init() {
  10518. var app = this;
  10519. app.root.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
  10520. app.toolbar.init(tabbarEl);
  10521. });
  10522. },
  10523. },
  10524. vnode: {
  10525. tabbar: {
  10526. insert: function insert(vnode) {
  10527. var app = this;
  10528. app.toolbar.init(vnode.elm);
  10529. },
  10530. },
  10531. },
  10532. };
  10533. var Subnavbar = {
  10534. name: 'subnavbar',
  10535. on: {
  10536. pageInit: function pageInit(page) {
  10537. if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
  10538. page.$el.addClass('page-with-subnavbar');
  10539. }
  10540. if (page.$el.find('.subnavbar').length) {
  10541. page.$el.addClass('page-with-subnavbar');
  10542. }
  10543. },
  10544. },
  10545. };
  10546. var TouchRipple = function TouchRipple($el, x, y) {
  10547. var ripple = this;
  10548. if (!$el) { return undefined; }
  10549. var box = $el[0].getBoundingClientRect();
  10550. var center = {
  10551. x: x - box.left,
  10552. y: y - box.top,
  10553. };
  10554. var width = box.width;
  10555. var height = box.height;
  10556. var diameter = Math.max((Math.pow( ((Math.pow( height, 2 )) + (Math.pow( width, 2 ))), 0.5 )), 48);
  10557. 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>"));
  10558. $el.prepend(ripple.$rippleWaveEl);
  10559. ripple.rippleTransform = "translate3d(" + (-center.x + (width / 2)) + "px, " + (-center.y + (height / 2)) + "px, 0) scale(1)";
  10560. Utils.nextFrame(function () {
  10561. if (!ripple || !ripple.$rippleWaveEl) { return; }
  10562. ripple.$rippleWaveEl.transform(ripple.rippleTransform);
  10563. });
  10564. return ripple;
  10565. };
  10566. TouchRipple.prototype.destroy = function destroy () {
  10567. var ripple = this;
  10568. if (ripple.$rippleWaveEl) {
  10569. ripple.$rippleWaveEl.remove();
  10570. }
  10571. Object.keys(ripple).forEach(function (key) {
  10572. ripple[key] = null;
  10573. delete ripple[key];
  10574. });
  10575. ripple = null;
  10576. };
  10577. TouchRipple.prototype.remove = function remove () {
  10578. var ripple = this;
  10579. if (ripple.removing) { return; }
  10580. var $rippleWaveEl = this.$rippleWaveEl;
  10581. var rippleTransform = this.rippleTransform;
  10582. var removeTimeout = Utils.nextTick(function () {
  10583. ripple.destroy();
  10584. }, 400);
  10585. ripple.removing = true;
  10586. $rippleWaveEl
  10587. .addClass('ripple-wave-fill')
  10588. .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))
  10589. .transitionEnd(function () {
  10590. clearTimeout(removeTimeout);
  10591. Utils.nextFrame(function () {
  10592. $rippleWaveEl
  10593. .addClass('ripple-wave-out')
  10594. .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));
  10595. removeTimeout = Utils.nextTick(function () {
  10596. ripple.destroy();
  10597. }, 700);
  10598. $rippleWaveEl.transitionEnd(function () {
  10599. clearTimeout(removeTimeout);
  10600. ripple.destroy();
  10601. });
  10602. });
  10603. });
  10604. };
  10605. var TouchRipple$1 = {
  10606. name: 'touch-ripple',
  10607. static: {
  10608. TouchRipple: TouchRipple,
  10609. },
  10610. create: function create() {
  10611. var app = this;
  10612. app.touchRipple = {
  10613. create: function create() {
  10614. var args = [], len = arguments.length;
  10615. while ( len-- ) args[ len ] = arguments[ len ];
  10616. return new (Function.prototype.bind.apply( TouchRipple, [ null ].concat( args) ));
  10617. },
  10618. };
  10619. },
  10620. };
  10621. var openedModals = [];
  10622. var dialogsQueue = [];
  10623. function clearDialogsQueue() {
  10624. if (dialogsQueue.length === 0) { return; }
  10625. var dialog = dialogsQueue.shift();
  10626. dialog.open();
  10627. }
  10628. var Modal = /*@__PURE__*/(function (Framework7Class) {
  10629. function Modal(app, params) {
  10630. Framework7Class.call(this, params, [app]);
  10631. var modal = this;
  10632. var defaults = {};
  10633. // Extend defaults with modules params
  10634. modal.useModulesParams(defaults);
  10635. modal.params = Utils.extend(defaults, params);
  10636. modal.opened = false;
  10637. // Install Modules
  10638. modal.useModules();
  10639. return this;
  10640. }
  10641. if ( Framework7Class ) Modal.__proto__ = Framework7Class;
  10642. Modal.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  10643. Modal.prototype.constructor = Modal;
  10644. Modal.prototype.onOpen = function onOpen () {
  10645. var modal = this;
  10646. modal.opened = true;
  10647. openedModals.push(modal);
  10648. $('html').addClass(("with-modal-" + (modal.type.toLowerCase())));
  10649. modal.$el.trigger(("modal:open " + (modal.type.toLowerCase()) + ":open"));
  10650. modal.emit(("local::open modalOpen " + (modal.type) + "Open"), modal);
  10651. };
  10652. Modal.prototype.onOpened = function onOpened () {
  10653. var modal = this;
  10654. modal.$el.trigger(("modal:opened " + (modal.type.toLowerCase()) + ":opened"));
  10655. modal.emit(("local::opened modalOpened " + (modal.type) + "Opened"), modal);
  10656. };
  10657. Modal.prototype.onClose = function onClose () {
  10658. var modal = this;
  10659. modal.opened = false;
  10660. if (!modal.type || !modal.$el) { return; }
  10661. openedModals.splice(openedModals.indexOf(modal), 1);
  10662. $('html').removeClass(("with-modal-" + (modal.type.toLowerCase())));
  10663. modal.$el.trigger(("modal:close " + (modal.type.toLowerCase()) + ":close"));
  10664. modal.emit(("local::close modalClose " + (modal.type) + "Close"), modal);
  10665. };
  10666. Modal.prototype.onClosed = function onClosed () {
  10667. var modal = this;
  10668. if (!modal.type || !modal.$el) { return; }
  10669. modal.$el.removeClass('modal-out');
  10670. modal.$el.hide();
  10671. modal.$el.trigger(("modal:closed " + (modal.type.toLowerCase()) + ":closed"));
  10672. modal.emit(("local::closed modalClosed " + (modal.type) + "Closed"), modal);
  10673. };
  10674. Modal.prototype.open = function open (animateModal) {
  10675. var modal = this;
  10676. var app = modal.app;
  10677. var $el = modal.$el;
  10678. var $backdropEl = modal.$backdropEl;
  10679. var type = modal.type;
  10680. var animate = true;
  10681. if (typeof animateModal !== 'undefined') { animate = animateModal; }
  10682. else if (typeof modal.params.animate !== 'undefined') {
  10683. animate = modal.params.animate;
  10684. }
  10685. if (!$el || $el.hasClass('modal-in')) {
  10686. return modal;
  10687. }
  10688. if (type === 'dialog' && app.params.modal.queueDialogs) {
  10689. var pushToQueue;
  10690. if ($('.dialog.modal-in').length > 0) {
  10691. pushToQueue = true;
  10692. } else if (openedModals.length > 0) {
  10693. openedModals.forEach(function (openedModal) {
  10694. if (openedModal.type === 'dialog') { pushToQueue = true; }
  10695. });
  10696. }
  10697. if (pushToQueue) {
  10698. dialogsQueue.push(modal);
  10699. return modal;
  10700. }
  10701. }
  10702. var $modalParentEl = $el.parent();
  10703. var wasInDom = $el.parents(doc).length > 0;
  10704. if (app.params.modal.moveToRoot && !$modalParentEl.is(app.root)) {
  10705. app.root.append($el);
  10706. modal.once((type + "Closed"), function () {
  10707. if (wasInDom) {
  10708. $modalParentEl.append($el);
  10709. } else {
  10710. $el.remove();
  10711. }
  10712. });
  10713. }
  10714. // Show Modal
  10715. $el.show();
  10716. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  10717. modal._clientLeft = $el[0].clientLeft;
  10718. // Modal
  10719. function transitionEnd() {
  10720. if ($el.hasClass('modal-out')) {
  10721. modal.onClosed();
  10722. } else if ($el.hasClass('modal-in')) {
  10723. modal.onOpened();
  10724. }
  10725. }
  10726. if (animate) {
  10727. if ($backdropEl) {
  10728. $backdropEl.removeClass('not-animated');
  10729. $backdropEl.addClass('backdrop-in');
  10730. }
  10731. $el
  10732. .animationEnd(function () {
  10733. transitionEnd();
  10734. });
  10735. $el
  10736. .transitionEnd(function () {
  10737. transitionEnd();
  10738. });
  10739. $el
  10740. .removeClass('modal-out not-animated')
  10741. .addClass('modal-in');
  10742. modal.onOpen();
  10743. } else {
  10744. if ($backdropEl) {
  10745. $backdropEl.addClass('backdrop-in not-animated');
  10746. }
  10747. $el.removeClass('modal-out').addClass('modal-in not-animated');
  10748. modal.onOpen();
  10749. modal.onOpened();
  10750. }
  10751. return modal;
  10752. };
  10753. Modal.prototype.close = function close (animateModal) {
  10754. var modal = this;
  10755. var $el = modal.$el;
  10756. var $backdropEl = modal.$backdropEl;
  10757. var animate = true;
  10758. if (typeof animateModal !== 'undefined') { animate = animateModal; }
  10759. else if (typeof modal.params.animate !== 'undefined') {
  10760. animate = modal.params.animate;
  10761. }
  10762. if (!$el || !$el.hasClass('modal-in')) {
  10763. if (dialogsQueue.indexOf(modal) >= 0) {
  10764. dialogsQueue.splice(dialogsQueue.indexOf(modal), 1);
  10765. }
  10766. return modal;
  10767. }
  10768. // backdrop
  10769. if ($backdropEl) {
  10770. var needToHideBackdrop = true;
  10771. if (modal.type === 'popup') {
  10772. modal.$el.prevAll('.popup.modal-in').each(function (index, popupEl) {
  10773. var popupInstance = popupEl.f7Modal;
  10774. if (!popupInstance) { return; }
  10775. if (
  10776. popupInstance.params.closeByBackdropClick
  10777. && popupInstance.params.backdrop
  10778. && popupInstance.backdropEl === modal.backdropEl
  10779. ) {
  10780. needToHideBackdrop = false;
  10781. }
  10782. });
  10783. }
  10784. if (needToHideBackdrop) {
  10785. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  10786. $backdropEl.removeClass('backdrop-in');
  10787. }
  10788. }
  10789. // Modal
  10790. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  10791. function transitionEnd() {
  10792. if ($el.hasClass('modal-out')) {
  10793. modal.onClosed();
  10794. } else if ($el.hasClass('modal-in')) {
  10795. modal.onOpened();
  10796. }
  10797. }
  10798. if (animate) {
  10799. $el
  10800. .animationEnd(function () {
  10801. transitionEnd();
  10802. });
  10803. $el
  10804. .transitionEnd(function () {
  10805. transitionEnd();
  10806. });
  10807. $el
  10808. .removeClass('modal-in')
  10809. .addClass('modal-out');
  10810. // Emit close
  10811. modal.onClose();
  10812. } else {
  10813. $el
  10814. .addClass('not-animated')
  10815. .removeClass('modal-in')
  10816. .addClass('modal-out');
  10817. // Emit close
  10818. modal.onClose();
  10819. modal.onClosed();
  10820. }
  10821. if (modal.type === 'dialog') {
  10822. clearDialogsQueue();
  10823. }
  10824. return modal;
  10825. };
  10826. Modal.prototype.destroy = function destroy () {
  10827. var modal = this;
  10828. if (modal.destroyed) { return; }
  10829. modal.emit(("local::beforeDestroy modalBeforeDestroy " + (modal.type) + "BeforeDestroy"), modal);
  10830. if (modal.$el) {
  10831. modal.$el.trigger(("modal:beforedestroy " + (modal.type.toLowerCase()) + ":beforedestroy"));
  10832. if (modal.$el.length && modal.$el[0].f7Modal) {
  10833. delete modal.$el[0].f7Modal;
  10834. }
  10835. }
  10836. Utils.deleteProps(modal);
  10837. modal.destroyed = true;
  10838. };
  10839. return Modal;
  10840. }(Framework7Class));
  10841. var CustomModal = /*@__PURE__*/(function (Modal) {
  10842. function CustomModal(app, params) {
  10843. var extendedParams = Utils.extend({
  10844. backdrop: true,
  10845. closeByBackdropClick: true,
  10846. on: {},
  10847. }, params);
  10848. // Extends with open/close Modal methods;
  10849. Modal.call(this, app, extendedParams);
  10850. var customModal = this;
  10851. customModal.params = extendedParams;
  10852. // Find Element
  10853. var $el;
  10854. if (!customModal.params.el) {
  10855. $el = $(customModal.params.content);
  10856. } else {
  10857. $el = $(customModal.params.el);
  10858. }
  10859. if ($el && $el.length > 0 && $el[0].f7Modal) {
  10860. return $el[0].f7Modal;
  10861. }
  10862. if ($el.length === 0) {
  10863. return customModal.destroy();
  10864. }
  10865. var $backdropEl;
  10866. if (customModal.params.backdrop) {
  10867. $backdropEl = app.root.children('.custom-modal-backdrop');
  10868. if ($backdropEl.length === 0) {
  10869. $backdropEl = $('<div class="custom-modal-backdrop"></div>');
  10870. app.root.append($backdropEl);
  10871. }
  10872. }
  10873. function handleClick(e) {
  10874. if (!customModal || customModal.destroyed) { return; }
  10875. if ($backdropEl && e.target === $backdropEl[0]) {
  10876. customModal.close();
  10877. }
  10878. }
  10879. customModal.on('customModalOpened', function () {
  10880. if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
  10881. app.on('click', handleClick);
  10882. }
  10883. });
  10884. customModal.on('customModalClose', function () {
  10885. if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
  10886. app.off('click', handleClick);
  10887. }
  10888. });
  10889. Utils.extend(customModal, {
  10890. app: app,
  10891. $el: $el,
  10892. el: $el[0],
  10893. $backdropEl: $backdropEl,
  10894. backdropEl: $backdropEl && $backdropEl[0],
  10895. type: 'customModal',
  10896. });
  10897. $el[0].f7Modal = customModal;
  10898. return customModal;
  10899. }
  10900. if ( Modal ) CustomModal.__proto__ = Modal;
  10901. CustomModal.prototype = Object.create( Modal && Modal.prototype );
  10902. CustomModal.prototype.constructor = CustomModal;
  10903. return CustomModal;
  10904. }(Modal));
  10905. var Modal$1 = {
  10906. name: 'modal',
  10907. static: {
  10908. Modal: Modal,
  10909. CustomModal: CustomModal,
  10910. },
  10911. create: function create() {
  10912. var app = this;
  10913. app.customModal = {
  10914. create: function create(params) {
  10915. return new CustomModal(app, params);
  10916. },
  10917. };
  10918. },
  10919. params: {
  10920. modal: {
  10921. moveToRoot: true,
  10922. queueDialogs: true,
  10923. },
  10924. },
  10925. };
  10926. var Appbar = {
  10927. name: 'appbar',
  10928. };
  10929. var Dialog = /*@__PURE__*/(function (Modal) {
  10930. function Dialog(app, params) {
  10931. var extendedParams = Utils.extend({
  10932. title: app.params.dialog.title,
  10933. text: undefined,
  10934. content: '',
  10935. buttons: [],
  10936. verticalButtons: false,
  10937. onClick: undefined,
  10938. cssClass: undefined,
  10939. destroyOnClose: false,
  10940. on: {},
  10941. }, params);
  10942. if (typeof extendedParams.closeByBackdropClick === 'undefined') {
  10943. extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
  10944. }
  10945. if (typeof extendedParams.backdrop === 'undefined') {
  10946. extendedParams.backdrop = app.params.dialog.backdrop;
  10947. }
  10948. // Extends with open/close Modal methods;
  10949. Modal.call(this, app, extendedParams);
  10950. var dialog = this;
  10951. var title = extendedParams.title;
  10952. var text = extendedParams.text;
  10953. var content = extendedParams.content;
  10954. var buttons = extendedParams.buttons;
  10955. var verticalButtons = extendedParams.verticalButtons;
  10956. var cssClass = extendedParams.cssClass;
  10957. var backdrop = extendedParams.backdrop;
  10958. dialog.params = extendedParams;
  10959. // Find Element
  10960. var $el;
  10961. if (!dialog.params.el) {
  10962. var dialogClasses = ['dialog'];
  10963. if (buttons.length === 0) { dialogClasses.push('dialog-no-buttons'); }
  10964. if (buttons.length > 0) { dialogClasses.push(("dialog-buttons-" + (buttons.length))); }
  10965. if (verticalButtons) { dialogClasses.push('dialog-buttons-vertical'); }
  10966. if (cssClass) { dialogClasses.push(cssClass); }
  10967. var buttonsHTML = '';
  10968. if (buttons.length > 0) {
  10969. 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 ";
  10970. }
  10971. 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 ";
  10972. $el = $(dialogHtml);
  10973. } else {
  10974. $el = $(dialog.params.el);
  10975. }
  10976. if ($el && $el.length > 0 && $el[0].f7Modal) {
  10977. return $el[0].f7Modal;
  10978. }
  10979. if ($el.length === 0) {
  10980. return dialog.destroy();
  10981. }
  10982. var $backdropEl;
  10983. if (backdrop) {
  10984. $backdropEl = app.root.children('.dialog-backdrop');
  10985. if ($backdropEl.length === 0) {
  10986. $backdropEl = $('<div class="dialog-backdrop"></div>');
  10987. app.root.append($backdropEl);
  10988. }
  10989. }
  10990. // Assign events
  10991. function buttonOnClick(e) {
  10992. var buttonEl = this;
  10993. var index = $(buttonEl).index();
  10994. var button = buttons[index];
  10995. if (button.onClick) { button.onClick(dialog, e); }
  10996. if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
  10997. if (button.close !== false) { dialog.close(); }
  10998. }
  10999. var addKeyboardHander;
  11000. function onKeyDown(e) {
  11001. var keyCode = e.keyCode;
  11002. buttons.forEach(function (button, index) {
  11003. if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
  11004. if (doc.activeElement) { doc.activeElement.blur(); }
  11005. if (button.onClick) { button.onClick(dialog, e); }
  11006. if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
  11007. if (button.close !== false) { dialog.close(); }
  11008. }
  11009. });
  11010. }
  11011. if (buttons && buttons.length > 0) {
  11012. dialog.on('open', function () {
  11013. $el.find('.dialog-button').each(function (index, buttonEl) {
  11014. var button = buttons[index];
  11015. if (button.keyCodes) { addKeyboardHander = true; }
  11016. $(buttonEl).on('click', buttonOnClick);
  11017. });
  11018. if (
  11019. addKeyboardHander
  11020. && !app.device.ios
  11021. && !app.device.android
  11022. && !app.device.cordova
  11023. ) {
  11024. $(doc).on('keydown', onKeyDown);
  11025. }
  11026. });
  11027. dialog.on('close', function () {
  11028. $el.find('.dialog-button').each(function (index, buttonEl) {
  11029. $(buttonEl).off('click', buttonOnClick);
  11030. });
  11031. if (
  11032. addKeyboardHander
  11033. && !app.device.ios
  11034. && !app.device.android
  11035. && !app.device.cordova
  11036. ) {
  11037. $(doc).off('keydown', onKeyDown);
  11038. }
  11039. addKeyboardHander = false;
  11040. });
  11041. }
  11042. Utils.extend(dialog, {
  11043. app: app,
  11044. $el: $el,
  11045. el: $el[0],
  11046. $backdropEl: $backdropEl,
  11047. backdropEl: $backdropEl && $backdropEl[0],
  11048. type: 'dialog',
  11049. setProgress: function setProgress(progress, duration) {
  11050. app.progressbar.set($el.find('.progressbar'), progress, duration);
  11051. return dialog;
  11052. },
  11053. setText: function setText(newText) {
  11054. var $textEl = $el.find('.dialog-text');
  11055. if ($textEl.length === 0) {
  11056. $textEl = $('<div class="dialog-text"></div>');
  11057. if (typeof title !== 'undefined') {
  11058. $textEl.insertAfter($el.find('.dialog-title'));
  11059. } else {
  11060. $el.find('.dialog-inner').prepend($textEl);
  11061. }
  11062. }
  11063. $textEl.html(newText);
  11064. dialog.params.text = newText;
  11065. return dialog;
  11066. },
  11067. setTitle: function setTitle(newTitle) {
  11068. var $titleEl = $el.find('.dialog-title');
  11069. if ($titleEl.length === 0) {
  11070. $titleEl = $('<div class="dialog-title"></div>');
  11071. $el.find('.dialog-inner').prepend($titleEl);
  11072. }
  11073. $titleEl.html(newTitle);
  11074. dialog.params.title = newTitle;
  11075. return dialog;
  11076. },
  11077. });
  11078. function handleClick(e) {
  11079. var target = e.target;
  11080. var $target = $(target);
  11081. if ($target.closest(dialog.el).length === 0) {
  11082. if (
  11083. dialog.params.closeByBackdropClick
  11084. && dialog.backdropEl
  11085. && dialog.backdropEl === target
  11086. ) {
  11087. dialog.close();
  11088. }
  11089. }
  11090. }
  11091. dialog.on('opened', function () {
  11092. if (dialog.params.closeByBackdropClick) {
  11093. app.on('click', handleClick);
  11094. }
  11095. });
  11096. dialog.on('close', function () {
  11097. if (dialog.params.closeByBackdropClick) {
  11098. app.off('click', handleClick);
  11099. }
  11100. });
  11101. $el[0].f7Modal = dialog;
  11102. if (dialog.params.destroyOnClose) {
  11103. dialog.once('closed', function () {
  11104. setTimeout(function () {
  11105. dialog.destroy();
  11106. }, 0);
  11107. });
  11108. }
  11109. return dialog;
  11110. }
  11111. if ( Modal ) Dialog.__proto__ = Modal;
  11112. Dialog.prototype = Object.create( Modal && Modal.prototype );
  11113. Dialog.prototype.constructor = Dialog;
  11114. return Dialog;
  11115. }(Modal));
  11116. var Dialog$1 = {
  11117. name: 'dialog',
  11118. params: {
  11119. dialog: {
  11120. title: undefined,
  11121. buttonOk: 'OK',
  11122. buttonCancel: 'Cancel',
  11123. usernamePlaceholder: 'Username',
  11124. passwordPlaceholder: 'Password',
  11125. preloaderTitle: 'Loading... ',
  11126. progressTitle: 'Loading... ',
  11127. backdrop: true,
  11128. closeByBackdropClick: false,
  11129. destroyPredefinedDialogs: true,
  11130. keyboardActions: true,
  11131. autoFocus: true,
  11132. },
  11133. },
  11134. static: {
  11135. Dialog: Dialog,
  11136. },
  11137. create: function create() {
  11138. var app = this;
  11139. function defaultDialogTitle() {
  11140. return app.params.dialog.title || app.name;
  11141. }
  11142. var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
  11143. var keyboardActions = app.params.dialog.keyboardActions;
  11144. var autoFocus = app.params.dialog.autoFocus;
  11145. var autoFocusHandler = (autoFocus ? {
  11146. on: {
  11147. opened: function opened(dialog) {
  11148. dialog.$el.find('input').eq(0).focus();
  11149. },
  11150. },
  11151. } : {});
  11152. app.dialog = Utils.extend(
  11153. ModalMethods({
  11154. app: app,
  11155. constructor: Dialog,
  11156. defaultSelector: '.dialog.modal-in',
  11157. }),
  11158. {
  11159. // Shortcuts
  11160. alert: function alert() {
  11161. var assign;
  11162. var args = [], len = arguments.length;
  11163. while ( len-- ) args[ len ] = arguments[ len ];
  11164. var text = args[0];
  11165. var title = args[1];
  11166. var callbackOk = args[2];
  11167. if (args.length === 2 && typeof args[1] === 'function') {
  11168. (assign = args, text = assign[0], callbackOk = assign[1], title = assign[2]);
  11169. }
  11170. return new Dialog(app, {
  11171. title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  11172. text: text,
  11173. buttons: [{
  11174. text: app.params.dialog.buttonOk,
  11175. bold: true,
  11176. onClick: callbackOk,
  11177. keyCodes: keyboardActions ? [13, 27] : null,
  11178. }],
  11179. destroyOnClose: destroyOnClose,
  11180. }).open();
  11181. },
  11182. prompt: function prompt() {
  11183. var assign;
  11184. var args = [], len = arguments.length;
  11185. while ( len-- ) args[ len ] = arguments[ len ];
  11186. var text = args[0];
  11187. var title = args[1];
  11188. var callbackOk = args[2];
  11189. var callbackCancel = args[3];
  11190. var defaultValue = args[4];
  11191. if (typeof args[1] === 'function') {
  11192. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], defaultValue = assign[3], title = assign[4]);
  11193. }
  11194. defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
  11195. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  11196. text: text,
  11197. content: ("<div class=\"dialog-input-field input\"><input type=\"text\" class=\"dialog-input\" value=\"" + defaultValue + "\"></div>"),
  11198. buttons: [
  11199. {
  11200. text: app.params.dialog.buttonCancel,
  11201. keyCodes: keyboardActions ? [27] : null,
  11202. color: app.theme === 'aurora' ? 'gray' : null,
  11203. },
  11204. {
  11205. text: app.params.dialog.buttonOk,
  11206. bold: true,
  11207. keyCodes: keyboardActions ? [13] : null,
  11208. } ],
  11209. onClick: function onClick(dialog, index) {
  11210. var inputValue = dialog.$el.find('.dialog-input').val();
  11211. if (index === 0 && callbackCancel) { callbackCancel(inputValue); }
  11212. if (index === 1 && callbackOk) { callbackOk(inputValue); }
  11213. },
  11214. destroyOnClose: destroyOnClose},
  11215. autoFocusHandler)).open();
  11216. },
  11217. confirm: function confirm() {
  11218. var assign;
  11219. var args = [], len = arguments.length;
  11220. while ( len-- ) args[ len ] = arguments[ len ];
  11221. var text = args[0];
  11222. var title = args[1];
  11223. var callbackOk = args[2];
  11224. var callbackCancel = args[3];
  11225. if (typeof args[1] === 'function') {
  11226. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  11227. }
  11228. return new Dialog(app, {
  11229. title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  11230. text: text,
  11231. buttons: [
  11232. {
  11233. text: app.params.dialog.buttonCancel,
  11234. onClick: callbackCancel,
  11235. keyCodes: keyboardActions ? [27] : null,
  11236. color: app.theme === 'aurora' ? 'gray' : null,
  11237. },
  11238. {
  11239. text: app.params.dialog.buttonOk,
  11240. bold: true,
  11241. onClick: callbackOk,
  11242. keyCodes: keyboardActions ? [13] : null,
  11243. } ],
  11244. destroyOnClose: destroyOnClose,
  11245. }).open();
  11246. },
  11247. login: function login() {
  11248. var assign;
  11249. var args = [], len = arguments.length;
  11250. while ( len-- ) args[ len ] = arguments[ len ];
  11251. var text = args[0];
  11252. var title = args[1];
  11253. var callbackOk = args[2];
  11254. var callbackCancel = args[3];
  11255. if (typeof args[1] === 'function') {
  11256. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  11257. }
  11258. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  11259. text: text,
  11260. 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>"),
  11261. buttons: [
  11262. {
  11263. text: app.params.dialog.buttonCancel,
  11264. keyCodes: keyboardActions ? [27] : null,
  11265. color: app.theme === 'aurora' ? 'gray' : null,
  11266. },
  11267. {
  11268. text: app.params.dialog.buttonOk,
  11269. bold: true,
  11270. keyCodes: keyboardActions ? [13] : null,
  11271. } ],
  11272. onClick: function onClick(dialog, index) {
  11273. var username = dialog.$el.find('[name="dialog-username"]').val();
  11274. var password = dialog.$el.find('[name="dialog-password"]').val();
  11275. if (index === 0 && callbackCancel) { callbackCancel(username, password); }
  11276. if (index === 1 && callbackOk) { callbackOk(username, password); }
  11277. },
  11278. destroyOnClose: destroyOnClose},
  11279. autoFocusHandler)).open();
  11280. },
  11281. password: function password() {
  11282. var assign;
  11283. var args = [], len = arguments.length;
  11284. while ( len-- ) args[ len ] = arguments[ len ];
  11285. var text = args[0];
  11286. var title = args[1];
  11287. var callbackOk = args[2];
  11288. var callbackCancel = args[3];
  11289. if (typeof args[1] === 'function') {
  11290. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  11291. }
  11292. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  11293. text: text,
  11294. 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>"),
  11295. buttons: [
  11296. {
  11297. text: app.params.dialog.buttonCancel,
  11298. keyCodes: keyboardActions ? [27] : null,
  11299. color: app.theme === 'aurora' ? 'gray' : null,
  11300. },
  11301. {
  11302. text: app.params.dialog.buttonOk,
  11303. bold: true,
  11304. keyCodes: keyboardActions ? [13] : null,
  11305. } ],
  11306. onClick: function onClick(dialog, index) {
  11307. var password = dialog.$el.find('[name="dialog-password"]').val();
  11308. if (index === 0 && callbackCancel) { callbackCancel(password); }
  11309. if (index === 1 && callbackOk) { callbackOk(password); }
  11310. },
  11311. destroyOnClose: destroyOnClose},
  11312. autoFocusHandler)).open();
  11313. },
  11314. preloader: function preloader(title, color) {
  11315. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  11316. return new Dialog(app, {
  11317. title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
  11318. content: ("<div class=\"preloader" + (color ? (" color-" + color) : '') + "\">" + preloaderInner + "</div>"),
  11319. cssClass: 'dialog-preloader',
  11320. destroyOnClose: destroyOnClose,
  11321. }).open();
  11322. },
  11323. progress: function progress() {
  11324. var assign, assign$1, assign$2;
  11325. var args = [], len = arguments.length;
  11326. while ( len-- ) args[ len ] = arguments[ len ];
  11327. var title = args[0];
  11328. var progress = args[1];
  11329. var color = args[2];
  11330. if (args.length === 2) {
  11331. if (typeof args[0] === 'number') {
  11332. (assign = args, progress = assign[0], color = assign[1], title = assign[2]);
  11333. } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
  11334. (assign$1 = args, title = assign$1[0], color = assign$1[1], progress = assign$1[2]);
  11335. }
  11336. } else if (args.length === 1) {
  11337. if (typeof args[0] === 'number') {
  11338. (assign$2 = args, progress = assign$2[0], title = assign$2[1], color = assign$2[2]);
  11339. }
  11340. }
  11341. var infinite = typeof progress === 'undefined';
  11342. var dialog = new Dialog(app, {
  11343. title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
  11344. cssClass: 'dialog-progress',
  11345. content: ("\n <div class=\"progressbar" + (infinite ? '-infinite' : '') + (color ? (" color-" + color) : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div>\n "),
  11346. destroyOnClose: destroyOnClose,
  11347. });
  11348. if (!infinite) { dialog.setProgress(progress); }
  11349. return dialog.open();
  11350. },
  11351. }
  11352. );
  11353. },
  11354. };
  11355. var Popup = /*@__PURE__*/(function (Modal) {
  11356. function Popup(app, params) {
  11357. var extendedParams = Utils.extend(
  11358. { on: {} },
  11359. app.params.popup,
  11360. params
  11361. );
  11362. // Extends with open/close Modal methods;
  11363. Modal.call(this, app, extendedParams);
  11364. var popup = this;
  11365. popup.params = extendedParams;
  11366. // Find Element
  11367. var $el;
  11368. if (!popup.params.el) {
  11369. $el = $(popup.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  11370. } else {
  11371. $el = $(popup.params.el).eq(0);
  11372. }
  11373. if ($el && $el.length > 0 && $el[0].f7Modal) {
  11374. return $el[0].f7Modal;
  11375. }
  11376. if ($el.length === 0) {
  11377. return popup.destroy();
  11378. }
  11379. var $backdropEl;
  11380. if (popup.params.backdrop && popup.params.backdropEl) {
  11381. $backdropEl = $(popup.params.backdropEl);
  11382. } else if (popup.params.backdrop) {
  11383. $backdropEl = app.root.children('.popup-backdrop');
  11384. if ($backdropEl.length === 0) {
  11385. $backdropEl = $('<div class="popup-backdrop"></div>');
  11386. app.root.append($backdropEl);
  11387. }
  11388. }
  11389. Utils.extend(popup, {
  11390. app: app,
  11391. push: $el.hasClass('popup-push') || popup.params.push,
  11392. $el: $el,
  11393. el: $el[0],
  11394. $backdropEl: $backdropEl,
  11395. backdropEl: $backdropEl && $backdropEl[0],
  11396. type: 'popup',
  11397. $htmlEl: $('html'),
  11398. });
  11399. if (popup.params.push) {
  11400. $el.addClass('popup-push');
  11401. }
  11402. function handleClick(e) {
  11403. var target = e.target;
  11404. var $target = $(target);
  11405. 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));
  11406. if (keyboardOpened) { return; }
  11407. if ($target.closest(popup.el).length === 0) {
  11408. if (
  11409. popup.params
  11410. && popup.params.closeByBackdropClick
  11411. && popup.params.backdrop
  11412. && popup.backdropEl
  11413. && popup.backdropEl === target
  11414. ) {
  11415. var needToClose = true;
  11416. popup.$el.nextAll('.popup.modal-in').each(function (index, popupEl) {
  11417. var popupInstance = popupEl.f7Modal;
  11418. if (!popupInstance) { return; }
  11419. if (
  11420. popupInstance.params.closeByBackdropClick
  11421. && popupInstance.params.backdrop
  11422. && popupInstance.backdropEl === popup.backdropEl
  11423. ) {
  11424. needToClose = false;
  11425. }
  11426. });
  11427. if (needToClose) {
  11428. popup.close();
  11429. }
  11430. }
  11431. }
  11432. }
  11433. function onKeyDown(e) {
  11434. var keyCode = e.keyCode;
  11435. if (keyCode === 27 && popup.params.closeOnEscape) {
  11436. popup.close();
  11437. }
  11438. }
  11439. var pushOffset;
  11440. var isPush;
  11441. function pushViewScale(offset) {
  11442. return (app.height - offset * 2) / app.height;
  11443. }
  11444. var allowSwipeToClose = true;
  11445. var isTouched = false;
  11446. var startTouch;
  11447. var currentTouch;
  11448. var isScrolling;
  11449. var touchStartTime;
  11450. var touchesDiff;
  11451. var isMoved = false;
  11452. var pageContentEl;
  11453. var pageContentScrollTop;
  11454. var pageContentOffsetHeight;
  11455. var pageContentScrollHeight;
  11456. var popupHeight;
  11457. var $pushEl;
  11458. function handleTouchStart(e) {
  11459. if (isTouched || !allowSwipeToClose || !popup.params.swipeToClose) { return; }
  11460. if (popup.params.swipeHandler && $(e.target).closest(popup.params.swipeHandler).length === 0) {
  11461. return;
  11462. }
  11463. isTouched = true;
  11464. isMoved = false;
  11465. startTouch = {
  11466. x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
  11467. y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
  11468. };
  11469. touchStartTime = Utils.now();
  11470. isScrolling = undefined;
  11471. if (!popup.params.swipeHandler && e.type === 'touchstart') {
  11472. pageContentEl = $(e.target).closest('.page-content')[0];
  11473. }
  11474. }
  11475. function handleTouchMove(e) {
  11476. if (!isTouched) { return; }
  11477. currentTouch = {
  11478. x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
  11479. y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
  11480. };
  11481. if (typeof isScrolling === 'undefined') {
  11482. isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
  11483. }
  11484. if (isScrolling) {
  11485. isTouched = false;
  11486. isMoved = false;
  11487. return;
  11488. }
  11489. touchesDiff = startTouch.y - currentTouch.y;
  11490. if (isPush && pushOffset && touchesDiff > 0) {
  11491. touchesDiff = 0;
  11492. }
  11493. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  11494. $el.transition(0);
  11495. if (typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose) {
  11496. $el.transform('');
  11497. $el.transition('');
  11498. return;
  11499. }
  11500. if (!isMoved) {
  11501. if (isPush && pushOffset) {
  11502. popupHeight = $el[0].offsetHeight;
  11503. $pushEl = $el.prevAll('.popup.modal-in').eq(0);
  11504. if ($pushEl.length === 0) {
  11505. $pushEl = app.root.children('.view, .views');
  11506. }
  11507. }
  11508. if (pageContentEl) {
  11509. pageContentScrollTop = pageContentEl.scrollTop;
  11510. pageContentScrollHeight = pageContentEl.scrollHeight;
  11511. pageContentOffsetHeight = pageContentEl.offsetHeight;
  11512. if (
  11513. !(pageContentScrollHeight === pageContentOffsetHeight)
  11514. && !(direction === 'to-bottom' && pageContentScrollTop === 0)
  11515. && !(direction === 'to-top' && pageContentScrollTop === (pageContentScrollHeight - pageContentOffsetHeight))
  11516. ) {
  11517. $el.transform('');
  11518. $el.transition('');
  11519. isTouched = false;
  11520. isMoved = false;
  11521. return;
  11522. }
  11523. }
  11524. isMoved = true;
  11525. popup.emit('local::swipeStart popupSwipeStart', popup);
  11526. popup.$el.trigger('popup:swipestart');
  11527. } else {
  11528. popup.emit('local::swipeMove popupSwipeMove', popup);
  11529. popup.$el.trigger('popup:swipemove');
  11530. }
  11531. e.preventDefault();
  11532. if (isPush && pushOffset) {
  11533. var pushProgress = 1 - Math.abs(touchesDiff / popupHeight);
  11534. var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
  11535. if ($pushEl.hasClass('popup')) {
  11536. if ($pushEl.hasClass('popup-push')) {
  11537. $pushEl.transition(0).transform(
  11538. ("translate3d(0, calc(-1 * " + pushProgress + " * (var(--f7-popup-push-offset) + 10px)) , 0px) scale(" + scale + ")")
  11539. );
  11540. } else {
  11541. $pushEl.transition(0).transform(
  11542. ("translate3d(0, 0px , 0px) scale(" + scale + ")")
  11543. );
  11544. }
  11545. } else {
  11546. $pushEl.transition(0).transform(("translate3d(0,0,0) scale(" + scale + ")"));
  11547. }
  11548. }
  11549. $el.transition(0).transform(("translate3d(0," + (-touchesDiff) + "px,0)"));
  11550. }
  11551. function handleTouchEnd() {
  11552. isTouched = false;
  11553. if (!isMoved) {
  11554. return;
  11555. }
  11556. popup.emit('local::swipeEnd popupSwipeEnd', popup);
  11557. popup.$el.trigger('popup:swipeend');
  11558. isMoved = false;
  11559. allowSwipeToClose = false;
  11560. $el.transition('');
  11561. if (isPush && pushOffset) {
  11562. $pushEl.transition('').transform('');
  11563. }
  11564. var direction = touchesDiff <= 0 ? 'to-bottom' : 'to-top';
  11565. if ((typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose)) {
  11566. $el.transform('');
  11567. allowSwipeToClose = true;
  11568. return;
  11569. }
  11570. var diff = Math.abs(touchesDiff);
  11571. var timeDiff = (new Date()).getTime() - touchStartTime;
  11572. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
  11573. Utils.nextTick(function () {
  11574. if (direction === 'to-bottom') {
  11575. $el.addClass('swipe-close-to-bottom');
  11576. } else {
  11577. $el.addClass('swipe-close-to-top');
  11578. }
  11579. $el.transform('');
  11580. popup.emit('local::swipeclose popupSwipeClose', popup);
  11581. popup.$el.trigger('popup:swipeclose');
  11582. popup.close();
  11583. allowSwipeToClose = true;
  11584. });
  11585. return;
  11586. }
  11587. allowSwipeToClose = true;
  11588. $el.transform('');
  11589. }
  11590. var passive = Support.passiveListener ? { passive: true } : false;
  11591. if (popup.params.swipeToClose) {
  11592. $el.on(app.touchEvents.start, handleTouchStart, passive);
  11593. app.on('touchmove', handleTouchMove);
  11594. app.on('touchend:passive', handleTouchEnd);
  11595. popup.once('popupDestroy', function () {
  11596. $el.off(app.touchEvents.start, handleTouchStart, passive);
  11597. app.off('touchmove', handleTouchMove);
  11598. app.off('touchend:passive', handleTouchEnd);
  11599. });
  11600. }
  11601. var hasPreviousPushPopup;
  11602. popup.on('open', function () {
  11603. hasPreviousPushPopup = false;
  11604. if (popup.params.closeOnEscape) {
  11605. $(doc).on('keydown', onKeyDown);
  11606. }
  11607. $el.prevAll('.popup.modal-in').addClass('popup-behind');
  11608. if (popup.push) {
  11609. isPush = popup.push && (
  11610. (app.width < 630 || app.height < 630)
  11611. || $el.hasClass('popup-tablet-fullscreen')
  11612. );
  11613. }
  11614. if (isPush) {
  11615. pushOffset = parseInt($el.css('--f7-popup-push-offset'), 10);
  11616. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  11617. if (pushOffset) {
  11618. $el.addClass('popup-push');
  11619. popup.$htmlEl.addClass('with-modal-popup-push');
  11620. popup.$htmlEl[0].style.setProperty('--f7-popup-push-scale', pushViewScale(pushOffset));
  11621. }
  11622. }
  11623. });
  11624. popup.on('opened', function () {
  11625. $el.removeClass('swipe-close-to-bottom swipe-close-to-top');
  11626. if (popup.params.closeByBackdropClick) {
  11627. app.on('click', handleClick);
  11628. }
  11629. });
  11630. popup.on('close', function () {
  11631. hasPreviousPushPopup = popup.$el.prevAll('.popup-push.modal-in').length > 0;
  11632. if (popup.params.closeOnEscape) {
  11633. $(doc).off('keydown', onKeyDown);
  11634. }
  11635. if (popup.params.closeByBackdropClick) {
  11636. app.off('click', handleClick);
  11637. }
  11638. $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
  11639. if (isPush && pushOffset && !hasPreviousPushPopup) {
  11640. popup.$htmlEl.removeClass('with-modal-popup-push');
  11641. popup.$htmlEl.addClass('with-modal-popup-push-closing');
  11642. }
  11643. });
  11644. popup.on('closed', function () {
  11645. if (isPush && pushOffset && !hasPreviousPushPopup) {
  11646. popup.$htmlEl.removeClass('with-modal-popup-push-closing');
  11647. popup.$htmlEl[0].style.removeProperty('--f7-popup-push-scale');
  11648. }
  11649. });
  11650. $el[0].f7Modal = popup;
  11651. return popup;
  11652. }
  11653. if ( Modal ) Popup.__proto__ = Modal;
  11654. Popup.prototype = Object.create( Modal && Modal.prototype );
  11655. Popup.prototype.constructor = Popup;
  11656. return Popup;
  11657. }(Modal));
  11658. var Popup$1 = {
  11659. name: 'popup',
  11660. params: {
  11661. popup: {
  11662. backdrop: true,
  11663. backdropEl: undefined,
  11664. closeByBackdropClick: true,
  11665. closeOnEscape: false,
  11666. swipeToClose: false,
  11667. swipeHandler: null,
  11668. push: false,
  11669. },
  11670. },
  11671. static: {
  11672. Popup: Popup,
  11673. },
  11674. create: function create() {
  11675. var app = this;
  11676. app.popup = ModalMethods({
  11677. app: app,
  11678. constructor: Popup,
  11679. defaultSelector: '.popup.modal-in',
  11680. parentSelector: '.popup',
  11681. });
  11682. },
  11683. clicks: {
  11684. '.popup-open': function openPopup($clickedEl, data) {
  11685. if ( data === void 0 ) data = {};
  11686. var app = this;
  11687. app.popup.open(data.popup, data.animate, $clickedEl);
  11688. },
  11689. '.popup-close': function closePopup($clickedEl, data) {
  11690. if ( data === void 0 ) data = {};
  11691. var app = this;
  11692. app.popup.close(data.popup, data.animate, $clickedEl);
  11693. },
  11694. },
  11695. };
  11696. var LoginScreen = /*@__PURE__*/(function (Modal) {
  11697. function LoginScreen(app, params) {
  11698. var extendedParams = Utils.extend({
  11699. on: {},
  11700. }, params);
  11701. // Extends with open/close Modal methods;
  11702. Modal.call(this, app, extendedParams);
  11703. var loginScreen = this;
  11704. loginScreen.params = extendedParams;
  11705. // Find Element
  11706. var $el;
  11707. if (!loginScreen.params.el) {
  11708. $el = $(loginScreen.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  11709. } else {
  11710. $el = $(loginScreen.params.el).eq(0);
  11711. }
  11712. if ($el && $el.length > 0 && $el[0].f7Modal) {
  11713. return $el[0].f7Modal;
  11714. }
  11715. if ($el.length === 0) {
  11716. return loginScreen.destroy();
  11717. }
  11718. Utils.extend(loginScreen, {
  11719. app: app,
  11720. $el: $el,
  11721. el: $el[0],
  11722. type: 'loginScreen',
  11723. });
  11724. $el[0].f7Modal = loginScreen;
  11725. return loginScreen;
  11726. }
  11727. if ( Modal ) LoginScreen.__proto__ = Modal;
  11728. LoginScreen.prototype = Object.create( Modal && Modal.prototype );
  11729. LoginScreen.prototype.constructor = LoginScreen;
  11730. return LoginScreen;
  11731. }(Modal));
  11732. var LoginScreen$1 = {
  11733. name: 'loginScreen',
  11734. static: {
  11735. LoginScreen: LoginScreen,
  11736. },
  11737. create: function create() {
  11738. var app = this;
  11739. app.loginScreen = ModalMethods({
  11740. app: app,
  11741. constructor: LoginScreen,
  11742. defaultSelector: '.login-screen.modal-in',
  11743. });
  11744. },
  11745. clicks: {
  11746. '.login-screen-open': function openLoginScreen($clickedEl, data) {
  11747. if ( data === void 0 ) data = {};
  11748. var app = this;
  11749. app.loginScreen.open(data.loginScreen, data.animate, $clickedEl);
  11750. },
  11751. '.login-screen-close': function closeLoginScreen($clickedEl, data) {
  11752. if ( data === void 0 ) data = {};
  11753. var app = this;
  11754. app.loginScreen.close(data.loginScreen, data.animate, $clickedEl);
  11755. },
  11756. },
  11757. };
  11758. var Popover = /*@__PURE__*/(function (Modal) {
  11759. function Popover(app, params) {
  11760. var extendedParams = Utils.extend(
  11761. { on: {} },
  11762. app.params.popover,
  11763. params
  11764. );
  11765. // Extends with open/close Modal methods;
  11766. Modal.call(this, app, extendedParams);
  11767. var popover = this;
  11768. popover.params = extendedParams;
  11769. // Find Element
  11770. var $el;
  11771. if (!popover.params.el) {
  11772. $el = $(popover.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  11773. } else {
  11774. $el = $(popover.params.el).eq(0);
  11775. }
  11776. if ($el && $el.length > 0 && $el[0].f7Modal) {
  11777. return $el[0].f7Modal;
  11778. }
  11779. // Find Target
  11780. var $targetEl = $(popover.params.targetEl).eq(0);
  11781. if ($el.length === 0) {
  11782. return popover.destroy();
  11783. }
  11784. // Backdrop
  11785. var $backdropEl;
  11786. if (popover.params.backdrop && popover.params.backdropEl) {
  11787. $backdropEl = $(popover.params.backdropEl);
  11788. } else if (popover.params.backdrop) {
  11789. $backdropEl = app.root.children('.popover-backdrop');
  11790. if ($backdropEl.length === 0) {
  11791. $backdropEl = $('<div class="popover-backdrop"></div>');
  11792. app.root.append($backdropEl);
  11793. }
  11794. }
  11795. // Find Angle
  11796. var $angleEl;
  11797. if ($el.find('.popover-angle').length === 0) {
  11798. $angleEl = $('<div class="popover-angle"></div>');
  11799. $el.prepend($angleEl);
  11800. } else {
  11801. $angleEl = $el.find('.popover-angle');
  11802. }
  11803. // Open
  11804. var originalOpen = popover.open;
  11805. Utils.extend(popover, {
  11806. app: app,
  11807. $el: $el,
  11808. el: $el[0],
  11809. $targetEl: $targetEl,
  11810. targetEl: $targetEl[0],
  11811. $angleEl: $angleEl,
  11812. angleEl: $angleEl[0],
  11813. $backdropEl: $backdropEl,
  11814. backdropEl: $backdropEl && $backdropEl[0],
  11815. type: 'popover',
  11816. open: function open() {
  11817. var assign;
  11818. var args = [], len = arguments.length;
  11819. while ( len-- ) args[ len ] = arguments[ len ];
  11820. var targetEl = args[0];
  11821. var animate = args[1];
  11822. if (typeof args[0] === 'boolean') { (assign = args, animate = assign[0], targetEl = assign[1]); }
  11823. if (targetEl) {
  11824. popover.$targetEl = $(targetEl);
  11825. popover.targetEl = popover.$targetEl[0];
  11826. }
  11827. return originalOpen.call(popover, animate);
  11828. },
  11829. });
  11830. function handleResize() {
  11831. popover.resize();
  11832. }
  11833. popover.on('popoverOpen', function () {
  11834. popover.resize();
  11835. app.on('resize', handleResize);
  11836. $(win).on('keyboardDidShow keyboardDidHide', handleResize);
  11837. popover.on('popoverClose popoverBeforeDestroy', function () {
  11838. app.off('resize', handleResize);
  11839. $(win).off('keyboardDidShow keyboardDidHide', handleResize);
  11840. });
  11841. });
  11842. function handleClick(e) {
  11843. var target = e.target;
  11844. var $target = $(target);
  11845. 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));
  11846. if (keyboardOpened) { return; }
  11847. if ($target.closest(popover.el).length === 0) {
  11848. if (
  11849. popover.params.closeByBackdropClick
  11850. && popover.params.backdrop
  11851. && popover.backdropEl
  11852. && popover.backdropEl === target
  11853. ) {
  11854. popover.close();
  11855. } else if (popover.params.closeByOutsideClick) {
  11856. popover.close();
  11857. }
  11858. }
  11859. }
  11860. function onKeyDown(e) {
  11861. var keyCode = e.keyCode;
  11862. if (keyCode === 27 && popover.params.closeOnEscape) {
  11863. popover.close();
  11864. }
  11865. }
  11866. if (popover.params.closeOnEscape) {
  11867. popover.on('popoverOpen', function () {
  11868. $(doc).on('keydown', onKeyDown);
  11869. });
  11870. popover.on('popoverClose', function () {
  11871. $(doc).off('keydown', onKeyDown);
  11872. });
  11873. }
  11874. popover.on('popoverOpened', function () {
  11875. if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
  11876. app.on('click', handleClick);
  11877. }
  11878. });
  11879. popover.on('popoverClose', function () {
  11880. if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
  11881. app.off('click', handleClick);
  11882. }
  11883. });
  11884. $el[0].f7Modal = popover;
  11885. return popover;
  11886. }
  11887. if ( Modal ) Popover.__proto__ = Modal;
  11888. Popover.prototype = Object.create( Modal && Modal.prototype );
  11889. Popover.prototype.constructor = Popover;
  11890. Popover.prototype.resize = function resize () {
  11891. var popover = this;
  11892. var app = popover.app;
  11893. var $el = popover.$el;
  11894. var $targetEl = popover.$targetEl;
  11895. var $angleEl = popover.$angleEl;
  11896. var ref = popover.params;
  11897. var targetX = ref.targetX;
  11898. var targetY = ref.targetY;
  11899. $el.css({ left: '', top: '' });
  11900. var ref$1 = [$el.width(), $el.height()];
  11901. var width = ref$1[0];
  11902. var height = ref$1[1];
  11903. var angleSize = 0;
  11904. var angleLeft;
  11905. var angleTop;
  11906. if (app.theme === 'ios' || app.theme === 'aurora') {
  11907. $angleEl.removeClass('on-left on-right on-top on-bottom').css({ left: '', top: '' });
  11908. angleSize = $angleEl.width() / 2;
  11909. } else {
  11910. $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom popover-on-middle').css({ left: '', top: '' });
  11911. }
  11912. var targetWidth;
  11913. var targetHeight;
  11914. var targetOffsetLeft;
  11915. var targetOffsetTop;
  11916. var safeAreaTop = parseInt($('html').css('--f7-safe-area-top'), 10);
  11917. if (Number.isNaN(safeAreaTop)) { safeAreaTop = 0; }
  11918. if ($targetEl && $targetEl.length > 0) {
  11919. targetWidth = $targetEl.outerWidth();
  11920. targetHeight = $targetEl.outerHeight();
  11921. var targetOffset = $targetEl.offset();
  11922. targetOffsetLeft = targetOffset.left - app.left;
  11923. targetOffsetTop = targetOffset.top - app.top;
  11924. var targetParentPage = $targetEl.parents('.page');
  11925. if (targetParentPage.length > 0) {
  11926. targetOffsetTop -= targetParentPage[0].scrollTop;
  11927. }
  11928. } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
  11929. targetOffsetLeft = targetX;
  11930. targetOffsetTop = targetY;
  11931. targetWidth = popover.params.targetWidth || 0;
  11932. targetHeight = popover.params.targetHeight || 0;
  11933. }
  11934. var ref$2 = [0, 0, 0];
  11935. var left = ref$2[0];
  11936. var top = ref$2[1];
  11937. var diff = ref$2[2];
  11938. // Top Position
  11939. var position = app.theme === 'md' ? 'bottom' : 'top';
  11940. if (app.theme === 'md') {
  11941. if (height < app.height - targetOffsetTop - targetHeight) {
  11942. // On bottom
  11943. position = 'bottom';
  11944. top = targetOffsetTop + targetHeight;
  11945. } else if (height < targetOffsetTop - safeAreaTop) {
  11946. // On top
  11947. top = targetOffsetTop - height;
  11948. position = 'top';
  11949. } else {
  11950. // On middle
  11951. position = 'middle';
  11952. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  11953. }
  11954. top = Math.max(8, Math.min(top, app.height - height - 8));
  11955. // Horizontal Position
  11956. var hPosition;
  11957. if (targetOffsetLeft < app.width / 2) {
  11958. hPosition = 'right';
  11959. left = position === 'middle'
  11960. ? targetOffsetLeft + targetWidth
  11961. : targetOffsetLeft;
  11962. } else {
  11963. hPosition = 'left';
  11964. left = position === 'middle'
  11965. ? targetOffsetLeft - width
  11966. : (targetOffsetLeft + targetWidth) - width;
  11967. }
  11968. left = Math.max(8, Math.min(left, app.width - width - 8));
  11969. $el.addClass(("popover-on-" + position + " popover-on-" + hPosition));
  11970. } else {
  11971. // ios and aurora
  11972. if ((height + angleSize) < targetOffsetTop - safeAreaTop) {
  11973. // On top
  11974. top = targetOffsetTop - height - angleSize;
  11975. } else if ((height + angleSize) < app.height - targetOffsetTop - targetHeight) {
  11976. // On bottom
  11977. position = 'bottom';
  11978. top = targetOffsetTop + targetHeight + angleSize;
  11979. } else {
  11980. // On middle
  11981. position = 'middle';
  11982. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  11983. diff = top;
  11984. top = Math.max(5, Math.min(top, app.height - height - 5));
  11985. diff -= top;
  11986. }
  11987. // Horizontal Position
  11988. if (position === 'top' || position === 'bottom') {
  11989. left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
  11990. diff = left;
  11991. left = Math.max(5, Math.min(left, app.width - width - 5));
  11992. if (position === 'top') {
  11993. $angleEl.addClass('on-bottom');
  11994. }
  11995. if (position === 'bottom') {
  11996. $angleEl.addClass('on-top');
  11997. }
  11998. diff -= left;
  11999. angleLeft = ((width / 2) - angleSize) + diff;
  12000. angleLeft = Math.max(Math.min(angleLeft, width - (angleSize * 2) - 13), 13);
  12001. $angleEl.css({ left: (angleLeft + "px") });
  12002. } else if (position === 'middle') {
  12003. left = targetOffsetLeft - width - angleSize;
  12004. $angleEl.addClass('on-right');
  12005. if (left < 5 || (left + width > app.width)) {
  12006. if (left < 5) { left = targetOffsetLeft + targetWidth + angleSize; }
  12007. if (left + width > app.width) { left = app.width - width - 5; }
  12008. $angleEl.removeClass('on-right').addClass('on-left');
  12009. }
  12010. angleTop = ((height / 2) - angleSize) + diff;
  12011. angleTop = Math.max(Math.min(angleTop, height - (angleSize * 2) - 13), 13);
  12012. $angleEl.css({ top: (angleTop + "px") });
  12013. }
  12014. }
  12015. // Apply Styles
  12016. $el.css({ top: (top + "px"), left: (left + "px") });
  12017. };
  12018. return Popover;
  12019. }(Modal));
  12020. var Popover$1 = {
  12021. name: 'popover',
  12022. params: {
  12023. popover: {
  12024. backdrop: true,
  12025. backdropEl: undefined,
  12026. closeByBackdropClick: true,
  12027. closeByOutsideClick: true,
  12028. closeOnEscape: false,
  12029. },
  12030. },
  12031. static: {
  12032. Popover: Popover,
  12033. },
  12034. create: function create() {
  12035. var app = this;
  12036. app.popover = Utils.extend(
  12037. ModalMethods({
  12038. app: app,
  12039. constructor: Popover,
  12040. defaultSelector: '.popover.modal-in',
  12041. }),
  12042. {
  12043. open: function open(popoverEl, targetEl, animate) {
  12044. var $popoverEl = $(popoverEl);
  12045. if ($popoverEl.length > 1) {
  12046. // check if same popover in other page
  12047. var $targetPage = $(targetEl).parents('.page');
  12048. if ($targetPage.length) {
  12049. $popoverEl.each(function (index, el) {
  12050. var $el = $(el);
  12051. if ($el.parents($targetPage)[0] === $targetPage[0]) {
  12052. $popoverEl = $el;
  12053. }
  12054. });
  12055. }
  12056. }
  12057. if ($popoverEl.length > 1) {
  12058. $popoverEl = $popoverEl.eq($popoverEl.length - 1);
  12059. }
  12060. var popover = $popoverEl[0].f7Modal;
  12061. var data = $popoverEl.dataset();
  12062. if (!popover) {
  12063. popover = new Popover(app, Object.assign(
  12064. {
  12065. el: $popoverEl,
  12066. targetEl: targetEl,
  12067. },
  12068. data
  12069. ));
  12070. }
  12071. return popover.open(targetEl, animate);
  12072. },
  12073. }
  12074. );
  12075. },
  12076. clicks: {
  12077. '.popover-open': function openPopover($clickedEl, data) {
  12078. if ( data === void 0 ) data = {};
  12079. var app = this;
  12080. app.popover.open(data.popover, $clickedEl, data.animate);
  12081. },
  12082. '.popover-close': function closePopover($clickedEl, data) {
  12083. if ( data === void 0 ) data = {};
  12084. var app = this;
  12085. app.popover.close(data.popover, data.animate, $clickedEl);
  12086. },
  12087. },
  12088. };
  12089. /* eslint indent: ["off"] */
  12090. var Actions = /*@__PURE__*/(function (Modal) {
  12091. function Actions(app, params) {
  12092. var extendedParams = Utils.extend(
  12093. { on: {} },
  12094. app.params.actions,
  12095. params
  12096. );
  12097. // Extends with open/close Modal methods;
  12098. Modal.call(this, app, extendedParams);
  12099. var actions = this;
  12100. actions.params = extendedParams;
  12101. // Buttons
  12102. var groups;
  12103. if (actions.params.buttons) {
  12104. groups = actions.params.buttons;
  12105. if (!Array.isArray(groups[0])) { groups = [groups]; }
  12106. }
  12107. actions.groups = groups;
  12108. // Find Element
  12109. var $el;
  12110. if (actions.params.el) {
  12111. $el = $(actions.params.el).eq(0);
  12112. } else if (actions.params.content) {
  12113. $el = $(actions.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  12114. } else if (actions.params.buttons) {
  12115. if (actions.params.convertToPopover) {
  12116. actions.popoverHtml = actions.renderPopover();
  12117. }
  12118. actions.actionsHtml = actions.render();
  12119. }
  12120. if ($el && $el.length > 0 && $el[0].f7Modal) {
  12121. return $el[0].f7Modal;
  12122. }
  12123. if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
  12124. return actions.destroy();
  12125. }
  12126. // Backdrop
  12127. var $backdropEl;
  12128. if (actions.params.backdrop && actions.params.backdropEl) {
  12129. $backdropEl = $(actions.params.backdropEl);
  12130. } else if (actions.params.backdrop) {
  12131. $backdropEl = app.root.children('.actions-backdrop');
  12132. if ($backdropEl.length === 0) {
  12133. $backdropEl = $('<div class="actions-backdrop"></div>');
  12134. app.root.append($backdropEl);
  12135. }
  12136. }
  12137. var originalOpen = actions.open;
  12138. var originalClose = actions.close;
  12139. var popover;
  12140. function buttonOnClick(e) {
  12141. var $buttonEl = $(this);
  12142. var buttonIndex;
  12143. var groupIndex;
  12144. if ($buttonEl.hasClass('list-button') || $buttonEl.hasClass('item-link')) {
  12145. buttonIndex = $buttonEl.parents('li').index();
  12146. groupIndex = $buttonEl.parents('.list').index();
  12147. } else {
  12148. buttonIndex = $buttonEl.index();
  12149. groupIndex = $buttonEl.parents('.actions-group').index();
  12150. }
  12151. if (typeof groups !== 'undefined') {
  12152. var button = groups[groupIndex][buttonIndex];
  12153. if (button.onClick) { button.onClick(actions, e); }
  12154. if (actions.params.onClick) { actions.params.onClick(actions, e); }
  12155. if (button.close !== false) { actions.close(); }
  12156. }
  12157. }
  12158. actions.open = function open(animate) {
  12159. var convertToPopover = false;
  12160. var ref = actions.params;
  12161. var targetEl = ref.targetEl;
  12162. var targetX = ref.targetX;
  12163. var targetY = ref.targetY;
  12164. var targetWidth = ref.targetWidth;
  12165. var targetHeight = ref.targetHeight;
  12166. if (actions.params.convertToPopover && (targetEl || (targetX !== undefined && targetY !== undefined))) {
  12167. // Popover
  12168. if (
  12169. actions.params.forceToPopover
  12170. || (app.device.ios && app.device.ipad)
  12171. || app.width >= 768
  12172. || (app.device.desktop && app.theme === 'aurora')
  12173. ) {
  12174. convertToPopover = true;
  12175. }
  12176. }
  12177. if (convertToPopover && actions.popoverHtml) {
  12178. popover = app.popover.create({
  12179. content: actions.popoverHtml,
  12180. backdrop: actions.params.backdrop,
  12181. targetEl: targetEl,
  12182. targetX: targetX,
  12183. targetY: targetY,
  12184. targetWidth: targetWidth,
  12185. targetHeight: targetHeight,
  12186. on: {
  12187. open: function open() {
  12188. if (!actions.$el) {
  12189. actions.$el = popover.$el;
  12190. }
  12191. actions.$el.trigger(("modal:open " + (actions.type.toLowerCase()) + ":open"));
  12192. actions.emit(("local::open modalOpen " + (actions.type) + "Open"), actions);
  12193. },
  12194. opened: function opened() {
  12195. if (!actions.$el) {
  12196. actions.$el = popover.$el;
  12197. }
  12198. actions.$el.trigger(("modal:opened " + (actions.type.toLowerCase()) + ":opened"));
  12199. actions.emit(("local::opened modalOpened " + (actions.type) + "Opened"), actions);
  12200. },
  12201. close: function close() {
  12202. if (!actions.$el) {
  12203. actions.$el = popover.$el;
  12204. }
  12205. actions.$el.trigger(("modal:close " + (actions.type.toLowerCase()) + ":close"));
  12206. actions.emit(("local::close modalClose " + (actions.type) + "Close"), actions);
  12207. },
  12208. closed: function closed() {
  12209. if (!actions.$el) {
  12210. actions.$el = popover.$el;
  12211. }
  12212. actions.$el.trigger(("modal:closed " + (actions.type.toLowerCase()) + ":closed"));
  12213. actions.emit(("local::closed modalClosed " + (actions.type) + "Closed"), actions);
  12214. },
  12215. },
  12216. });
  12217. popover.open(animate);
  12218. popover.once('popoverOpened', function () {
  12219. popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
  12220. $(buttonEl).on('click', buttonOnClick);
  12221. });
  12222. });
  12223. popover.once('popoverClosed', function () {
  12224. popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
  12225. $(buttonEl).off('click', buttonOnClick);
  12226. });
  12227. Utils.nextTick(function () {
  12228. popover.destroy();
  12229. popover = undefined;
  12230. });
  12231. });
  12232. } else {
  12233. actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
  12234. actions.$el[0].f7Modal = actions;
  12235. if (actions.groups) {
  12236. actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
  12237. $(buttonEl).on('click', buttonOnClick);
  12238. });
  12239. actions.once('actionsClosed', function () {
  12240. actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
  12241. $(buttonEl).off('click', buttonOnClick);
  12242. });
  12243. });
  12244. }
  12245. actions.el = actions.$el[0];
  12246. originalOpen.call(actions, animate);
  12247. }
  12248. return actions;
  12249. };
  12250. actions.close = function close(animate) {
  12251. if (popover) {
  12252. popover.close(animate);
  12253. } else {
  12254. originalClose.call(actions, animate);
  12255. }
  12256. return actions;
  12257. };
  12258. Utils.extend(actions, {
  12259. app: app,
  12260. $el: $el,
  12261. el: $el ? $el[0] : undefined,
  12262. $backdropEl: $backdropEl,
  12263. backdropEl: $backdropEl && $backdropEl[0],
  12264. type: 'actions',
  12265. });
  12266. function handleClick(e) {
  12267. var target = e.target;
  12268. var $target = $(target);
  12269. 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));
  12270. if (keyboardOpened) { return; }
  12271. if ($target.closest(actions.el).length === 0) {
  12272. if (
  12273. actions.params.closeByBackdropClick
  12274. && actions.params.backdrop
  12275. && actions.backdropEl
  12276. && actions.backdropEl === target
  12277. ) {
  12278. actions.close();
  12279. } else if (actions.params.closeByOutsideClick) {
  12280. actions.close();
  12281. }
  12282. }
  12283. }
  12284. function onKeyDown(e) {
  12285. var keyCode = e.keyCode;
  12286. if (keyCode === 27 && actions.params.closeOnEscape) {
  12287. actions.close();
  12288. }
  12289. }
  12290. if (actions.params.closeOnEscape) {
  12291. actions.on('open', function () {
  12292. $(doc).on('keydown', onKeyDown);
  12293. });
  12294. actions.on('close', function () {
  12295. $(doc).off('keydown', onKeyDown);
  12296. });
  12297. }
  12298. actions.on('opened', function () {
  12299. if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
  12300. app.on('click', handleClick);
  12301. }
  12302. });
  12303. actions.on('close', function () {
  12304. if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
  12305. app.off('click', handleClick);
  12306. }
  12307. });
  12308. if ($el) {
  12309. $el[0].f7Modal = actions;
  12310. }
  12311. return actions;
  12312. }
  12313. if ( Modal ) Actions.__proto__ = Modal;
  12314. Actions.prototype = Object.create( Modal && Modal.prototype );
  12315. Actions.prototype.constructor = Actions;
  12316. Actions.prototype.render = function render () {
  12317. var actions = this;
  12318. if (actions.params.render) { return actions.params.render.call(actions, actions); }
  12319. var groups = actions.groups;
  12320. var cssClass = actions.params.cssClass;
  12321. 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) {
  12322. var buttonClasses = [("actions-" + (button.label ? 'label' : 'button'))];
  12323. var color = button.color;
  12324. var bg = button.bg;
  12325. var bold = button.bold;
  12326. var disabled = button.disabled;
  12327. var label = button.label;
  12328. var text = button.text;
  12329. var icon = button.icon;
  12330. if (color) { buttonClasses.push(("color-" + color)); }
  12331. if (bg) { buttonClasses.push(("bg-color-" + bg)); }
  12332. if (bold) { buttonClasses.push('actions-button-bold'); }
  12333. if (disabled) { buttonClasses.push('disabled'); }
  12334. if (label) {
  12335. return ("<div class=\"" + (buttonClasses.join(' ')) + "\">" + text + "</div>");
  12336. }
  12337. 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();
  12338. }).join('')) + "\n </div>"); }).join('')) + "\n </div>\n ").trim();
  12339. };
  12340. Actions.prototype.renderPopover = function renderPopover () {
  12341. var actions = this;
  12342. if (actions.params.renderPopover) { return actions.params.renderPopover.call(actions, actions); }
  12343. var groups = actions.groups;
  12344. var cssClass = actions.params.cssClass;
  12345. 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) {
  12346. var itemClasses = [];
  12347. var color = button.color;
  12348. var bg = button.bg;
  12349. var bold = button.bold;
  12350. var disabled = button.disabled;
  12351. var label = button.label;
  12352. var text = button.text;
  12353. var icon = button.icon;
  12354. if (color) { itemClasses.push(("color-" + color)); }
  12355. if (bg) { itemClasses.push(("bg-color-" + bg)); }
  12356. if (bold) { itemClasses.push('popover-from-actions-bold'); }
  12357. if (disabled) { itemClasses.push('disabled'); }
  12358. if (label) {
  12359. itemClasses.push('popover-from-actions-label');
  12360. return ("<li class=\"" + (itemClasses.join(' ')) + "\">" + text + "</li>");
  12361. }
  12362. if (icon) {
  12363. itemClasses.push('item-link item-content');
  12364. 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 ");
  12365. }
  12366. itemClasses.push('list-button');
  12367. return ("\n <li>\n <a class=\"" + (itemClasses.join(' ')) + "\">" + text + "</a>\n </li>\n ");
  12368. }).join('')) + "\n </ul>\n </div>\n "); }).join('')) + "\n </div>\n </div>\n ").trim();
  12369. };
  12370. return Actions;
  12371. }(Modal));
  12372. var Actions$1 = {
  12373. name: 'actions',
  12374. params: {
  12375. actions: {
  12376. convertToPopover: true,
  12377. forceToPopover: false,
  12378. backdrop: true,
  12379. backdropEl: undefined,
  12380. cssClass: null,
  12381. closeByBackdropClick: true,
  12382. closeOnEscape: false,
  12383. render: null,
  12384. renderPopover: null,
  12385. },
  12386. },
  12387. static: {
  12388. Actions: Actions,
  12389. },
  12390. create: function create() {
  12391. var app = this;
  12392. app.actions = ModalMethods({
  12393. app: app,
  12394. constructor: Actions,
  12395. defaultSelector: '.actions-modal.modal-in',
  12396. });
  12397. },
  12398. clicks: {
  12399. '.actions-open': function openActions($clickedEl, data) {
  12400. if ( data === void 0 ) data = {};
  12401. var app = this;
  12402. app.actions.open(data.actions, data.animate, $clickedEl);
  12403. },
  12404. '.actions-close': function closeActions($clickedEl, data) {
  12405. if ( data === void 0 ) data = {};
  12406. var app = this;
  12407. app.actions.close(data.actions, data.animate, $clickedEl);
  12408. },
  12409. },
  12410. };
  12411. var Sheet = /*@__PURE__*/(function (Modal) {
  12412. function Sheet(app, params) {
  12413. var extendedParams = Utils.extend(
  12414. { on: {} },
  12415. app.params.sheet,
  12416. params
  12417. );
  12418. // Extends with open/close Modal methods;
  12419. Modal.call(this, app, extendedParams);
  12420. var sheet = this;
  12421. sheet.params = extendedParams;
  12422. if (typeof sheet.params.backdrop === 'undefined') {
  12423. sheet.params.backdrop = app.theme !== 'ios';
  12424. }
  12425. // Find Element
  12426. var $el;
  12427. if (!sheet.params.el) {
  12428. $el = $(sheet.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  12429. } else {
  12430. $el = $(sheet.params.el).eq(0);
  12431. }
  12432. if ($el && $el.length > 0 && $el[0].f7Modal) {
  12433. return $el[0].f7Modal;
  12434. }
  12435. if ($el.length === 0) {
  12436. return sheet.destroy();
  12437. }
  12438. var $backdropEl;
  12439. if (sheet.params.backdrop && sheet.params.backdropEl) {
  12440. $backdropEl = $(sheet.params.backdropEl);
  12441. } else if (sheet.params.backdrop) {
  12442. $backdropEl = app.root.children('.sheet-backdrop');
  12443. if ($backdropEl.length === 0) {
  12444. $backdropEl = $('<div class="sheet-backdrop"></div>');
  12445. app.root.append($backdropEl);
  12446. }
  12447. }
  12448. Utils.extend(sheet, {
  12449. app: app,
  12450. push: $el.hasClass('sheet-modal-push') || sheet.params.push,
  12451. $el: $el,
  12452. el: $el[0],
  12453. $backdropEl: $backdropEl,
  12454. backdropEl: $backdropEl && $backdropEl[0],
  12455. type: 'sheet',
  12456. $htmlEl: $('html'),
  12457. });
  12458. if (sheet.params.push) {
  12459. $el.addClass('sheet-modal-push');
  12460. }
  12461. var $pageContentEl;
  12462. function scrollToElementOnOpen() {
  12463. var $scrollEl = $(sheet.params.scrollToEl).eq(0);
  12464. if ($scrollEl.length === 0) { return; }
  12465. $pageContentEl = $scrollEl.parents('.page-content');
  12466. if ($pageContentEl.length === 0) { return; }
  12467. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  12468. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  12469. var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
  12470. var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
  12471. var pageScroll = $pageContentEl.scrollTop();
  12472. var newPaddingBottom;
  12473. var scrollElTop = ($scrollEl.offset().top - paddingTop) + $scrollEl[0].offsetHeight;
  12474. if (scrollElTop > pageHeight) {
  12475. var scrollTop = (pageScroll + scrollElTop) - pageHeight;
  12476. if (scrollTop + pageHeight > pageScrollHeight) {
  12477. newPaddingBottom = ((scrollTop + pageHeight) - pageScrollHeight) + paddingBottom;
  12478. if (pageHeight === pageScrollHeight) {
  12479. newPaddingBottom = $el.height();
  12480. }
  12481. $pageContentEl.css({
  12482. 'padding-bottom': (newPaddingBottom + "px"),
  12483. });
  12484. }
  12485. $pageContentEl.scrollTop(scrollTop, 300);
  12486. }
  12487. }
  12488. function scrollToElementOnClose() {
  12489. if ($pageContentEl && $pageContentEl.length > 0) {
  12490. $pageContentEl.css({
  12491. 'padding-bottom': '',
  12492. });
  12493. }
  12494. }
  12495. function handleClick(e) {
  12496. var target = e.target;
  12497. var $target = $(target);
  12498. 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));
  12499. if (keyboardOpened) { return; }
  12500. if ($target.closest(sheet.el).length === 0) {
  12501. if (
  12502. sheet.params.closeByBackdropClick
  12503. && sheet.params.backdrop
  12504. && sheet.backdropEl
  12505. && sheet.backdropEl === target
  12506. ) {
  12507. sheet.close();
  12508. } else if (sheet.params.closeByOutsideClick) {
  12509. sheet.close();
  12510. }
  12511. }
  12512. }
  12513. function onKeyDown(e) {
  12514. var keyCode = e.keyCode;
  12515. if (keyCode === 27 && sheet.params.closeOnEscape) {
  12516. sheet.close();
  12517. }
  12518. }
  12519. var pushOffset;
  12520. function pushViewScale(offset) {
  12521. return (app.height - offset * 2) / app.height;
  12522. }
  12523. var isTouched = false;
  12524. var startTouch;
  12525. var currentTouch;
  12526. var isScrolling;
  12527. var touchStartTime;
  12528. var touchesDiff;
  12529. var isMoved = false;
  12530. var isTopSheetModal;
  12531. var swipeStepTranslate;
  12532. var startTranslate;
  12533. var currentTranslate;
  12534. var sheetElOffsetHeight;
  12535. var minTranslate;
  12536. var maxTranslate;
  12537. var $pushViewEl;
  12538. var pushBorderRadius;
  12539. var sheetPageContentEl;
  12540. var sheetPageContentScrollTop;
  12541. var sheetPageContentScrollHeight;
  12542. var sheetPageContentOffsetHeight;
  12543. function handleTouchStart(e) {
  12544. if (isTouched || !(sheet.params.swipeToClose || sheet.params.swipeToStep)) { return; }
  12545. if (sheet.params.swipeHandler && $(e.target).closest(sheet.params.swipeHandler).length === 0) {
  12546. return;
  12547. }
  12548. isTouched = true;
  12549. isMoved = false;
  12550. startTouch = {
  12551. x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
  12552. y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
  12553. };
  12554. touchStartTime = Utils.now();
  12555. isScrolling = undefined;
  12556. isTopSheetModal = $el.hasClass('sheet-modal-top');
  12557. if (!sheet.params.swipeHandler && e.type === 'touchstart') {
  12558. sheetPageContentEl = $(e.target).closest('.page-content')[0];
  12559. }
  12560. }
  12561. function handleTouchMove(e) {
  12562. if (!isTouched) { return; }
  12563. currentTouch = {
  12564. x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
  12565. y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
  12566. };
  12567. if (typeof isScrolling === 'undefined') {
  12568. isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
  12569. }
  12570. if (isScrolling) {
  12571. isTouched = false;
  12572. isMoved = false;
  12573. return;
  12574. }
  12575. touchesDiff = startTouch.y - currentTouch.y;
  12576. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  12577. if (!isMoved) {
  12578. if (sheetPageContentEl && !$el.hasClass('modal-in-swipe-step')) {
  12579. sheetPageContentScrollTop = sheetPageContentEl.scrollTop;
  12580. sheetPageContentScrollHeight = sheetPageContentEl.scrollHeight;
  12581. sheetPageContentOffsetHeight = sheetPageContentEl.offsetHeight;
  12582. if (
  12583. !(sheetPageContentScrollHeight === sheetPageContentOffsetHeight)
  12584. && !(direction === 'to-bottom' && sheetPageContentScrollTop === 0)
  12585. && !(direction === 'to-top' && sheetPageContentScrollTop === (sheetPageContentScrollHeight - sheetPageContentOffsetHeight))
  12586. ) {
  12587. $el.transform('');
  12588. isTouched = false;
  12589. isMoved = false;
  12590. return;
  12591. }
  12592. }
  12593. if (sheet.push && pushOffset) {
  12594. $pushViewEl = app.root.children('.view, .views');
  12595. }
  12596. sheetElOffsetHeight = $el[0].offsetHeight;
  12597. startTranslate = Utils.getTranslate($el[0], 'y');
  12598. if (isTopSheetModal) {
  12599. minTranslate = sheet.params.swipeToClose ? -sheetElOffsetHeight : -swipeStepTranslate;
  12600. maxTranslate = 0;
  12601. } else {
  12602. minTranslate = 0;
  12603. maxTranslate = sheet.params.swipeToClose ? sheetElOffsetHeight : swipeStepTranslate;
  12604. }
  12605. isMoved = true;
  12606. }
  12607. currentTranslate = startTranslate - touchesDiff;
  12608. currentTranslate = Math.min(Math.max(currentTranslate, minTranslate), maxTranslate);
  12609. e.preventDefault();
  12610. if (sheet.push && pushOffset) {
  12611. var progress = (currentTranslate - startTranslate) / sheetElOffsetHeight;
  12612. if (sheet.params.swipeToStep) {
  12613. if (isTopSheetModal) {
  12614. progress = (currentTranslate / swipeStepTranslate);
  12615. } else {
  12616. progress = 1 - (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
  12617. }
  12618. }
  12619. progress = Math.abs(progress);
  12620. progress = Math.min(Math.max(progress, 0), 1);
  12621. var pushProgress = 1 - progress;
  12622. var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
  12623. $pushViewEl.transition(0).transform(("translate3d(0,0,0) scale(" + scale + ")"));
  12624. if (sheet.params.swipeToStep) {
  12625. $pushViewEl.css('border-radius', ((pushBorderRadius * pushProgress) + "px"));
  12626. }
  12627. }
  12628. $el
  12629. .transition(0)
  12630. .transform(("translate3d(0," + currentTranslate + "px,0)"));
  12631. if (sheet.params.swipeToStep) {
  12632. var progress$1;
  12633. if (isTopSheetModal) {
  12634. progress$1 = 1 - (currentTranslate / swipeStepTranslate);
  12635. } else {
  12636. progress$1 = (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
  12637. }
  12638. progress$1 = Math.min(Math.max(progress$1, 0), 1);
  12639. $el.trigger('sheet:stepprogress', progress$1);
  12640. sheet.emit('local::stepProgress sheetStepProgress', sheet, progress$1);
  12641. }
  12642. }
  12643. function handleTouchEnd() {
  12644. isTouched = false;
  12645. if (!isMoved) {
  12646. return;
  12647. }
  12648. isMoved = false;
  12649. $el.transform('').transition('');
  12650. if (sheet.push && pushOffset) {
  12651. $pushViewEl.transition('').transform('');
  12652. $pushViewEl.css('border-radius', '');
  12653. }
  12654. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  12655. var diff = Math.abs(touchesDiff);
  12656. if (diff === 0 || currentTranslate === startTranslate) { return; }
  12657. var timeDiff = (new Date()).getTime() - touchStartTime;
  12658. if (!sheet.params.swipeToStep) {
  12659. if (direction !== (isTopSheetModal ? 'to-top' : 'to-bottom')) {
  12660. return;
  12661. }
  12662. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > (sheetElOffsetHeight / 2))) {
  12663. sheet.close();
  12664. }
  12665. return;
  12666. }
  12667. var openDirection = isTopSheetModal ? 'to-bottom' : 'to-top';
  12668. var closeDirection = isTopSheetModal ? 'to-top' : 'to-bottom';
  12669. var absCurrentTranslate = Math.abs(currentTranslate);
  12670. var absSwipeStepTranslate = Math.abs(swipeStepTranslate);
  12671. if (timeDiff < 300 && diff > 10) {
  12672. if (direction === openDirection && absCurrentTranslate < absSwipeStepTranslate) {
  12673. // open step
  12674. $el.removeClass('modal-in-swipe-step');
  12675. $el.trigger('sheet:stepprogress', 1);
  12676. sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
  12677. $el.trigger('sheet:stepopen');
  12678. sheet.emit('local::stepOpen sheetStepOpen', sheet);
  12679. if (sheet.push && pushOffset) {
  12680. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  12681. $pushViewEl.css('border-radius', '');
  12682. }
  12683. }
  12684. if (direction === closeDirection && absCurrentTranslate > absSwipeStepTranslate) {
  12685. // close sheet
  12686. if (sheet.params.swipeToClose) {
  12687. sheet.close();
  12688. } else {
  12689. // close step
  12690. $el.addClass('modal-in-swipe-step');
  12691. $el.trigger('sheet:stepprogress', 0);
  12692. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  12693. $el.trigger('sheet:stepclose');
  12694. sheet.emit('local::stepClose sheetStepClose', sheet);
  12695. if (sheet.push && pushOffset) {
  12696. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  12697. $pushViewEl.css('border-radius', '0px');
  12698. }
  12699. }
  12700. }
  12701. if (direction === closeDirection && absCurrentTranslate <= absSwipeStepTranslate) {
  12702. // close step
  12703. $el.addClass('modal-in-swipe-step');
  12704. $el.trigger('sheet:stepprogress', 0);
  12705. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  12706. $el.trigger('sheet:stepclose');
  12707. sheet.emit('local::stepClose sheetStepClose', sheet);
  12708. if (sheet.push && pushOffset) {
  12709. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  12710. $pushViewEl.css('border-radius', '0px');
  12711. }
  12712. }
  12713. return;
  12714. }
  12715. if (timeDiff >= 300) {
  12716. var stepOpened = !$el.hasClass('modal-in-swipe-step');
  12717. if (!stepOpened) {
  12718. if (absCurrentTranslate < (absSwipeStepTranslate / 2)) {
  12719. // open step
  12720. $el.removeClass('modal-in-swipe-step');
  12721. $el.trigger('sheet:stepprogress', 1);
  12722. sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
  12723. $el.trigger('sheet:stepopen');
  12724. sheet.emit('local::stepOpen sheetStepOpen', sheet);
  12725. if (sheet.push && pushOffset) {
  12726. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  12727. $pushViewEl.css('border-radius', '');
  12728. }
  12729. } else if ((absCurrentTranslate - absSwipeStepTranslate) > (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
  12730. // close sheet
  12731. if (sheet.params.swipeToClose) { sheet.close(); }
  12732. }
  12733. } else if (stepOpened) {
  12734. if (absCurrentTranslate > absSwipeStepTranslate + (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
  12735. // close sheet
  12736. if (sheet.params.swipeToClose) { sheet.close(); }
  12737. } else if (absCurrentTranslate > absSwipeStepTranslate / 2) {
  12738. // close step
  12739. $el.addClass('modal-in-swipe-step');
  12740. $el.trigger('sheet:stepprogress', 0);
  12741. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  12742. $el.trigger('sheet:stepclose');
  12743. sheet.emit('local::stepClose sheetStepClose', sheet);
  12744. if (sheet.push && pushOffset) {
  12745. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  12746. $pushViewEl.css('border-radius', '0px');
  12747. }
  12748. }
  12749. }
  12750. }
  12751. }
  12752. sheet.setSwipeStep = function setSwipeStep(byResize) {
  12753. if ( byResize === void 0 ) byResize = true;
  12754. var $swipeStepEl = $el.find('.sheet-modal-swipe-step').eq(0);
  12755. if (!$swipeStepEl.length) { return; }
  12756. if ($el.hasClass('sheet-modal-top')) {
  12757. swipeStepTranslate = -($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
  12758. } else {
  12759. swipeStepTranslate = $el[0].offsetHeight - ($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
  12760. }
  12761. $el[0].style.setProperty('--f7-sheet-swipe-step', (swipeStepTranslate + "px"));
  12762. if (!byResize) {
  12763. $el.addClass('modal-in-swipe-step');
  12764. }
  12765. };
  12766. function onResize() {
  12767. sheet.setSwipeStep(true);
  12768. }
  12769. var passive = Support.passiveListener ? { passive: true } : false;
  12770. if (sheet.params.swipeToClose || sheet.params.swipeToStep) {
  12771. $el.on(app.touchEvents.start, handleTouchStart, passive);
  12772. app.on('touchmove', handleTouchMove);
  12773. app.on('touchend:passive', handleTouchEnd);
  12774. sheet.once('sheetDestroy', function () {
  12775. $el.off(app.touchEvents.start, handleTouchStart, passive);
  12776. app.off('touchmove', handleTouchMove);
  12777. app.off('touchend:passive', handleTouchEnd);
  12778. });
  12779. }
  12780. sheet.on('open', function () {
  12781. if (sheet.params.closeOnEscape) {
  12782. $(doc).on('keydown', onKeyDown);
  12783. }
  12784. $el.prevAll('.popup.modal-in').addClass('popup-behind');
  12785. if (sheet.params.swipeToStep) {
  12786. sheet.setSwipeStep(false);
  12787. app.on('resize', onResize);
  12788. }
  12789. if (sheet.params.scrollToEl) {
  12790. scrollToElementOnOpen();
  12791. }
  12792. if (sheet.push) {
  12793. pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
  12794. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  12795. if (pushOffset) {
  12796. $el.addClass('sheet-modal-push');
  12797. sheet.$htmlEl.addClass('with-modal-sheet-push');
  12798. if (!sheet.params.swipeToStep) {
  12799. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  12800. } else {
  12801. $pushViewEl = app.root.children('.view, .views');
  12802. pushBorderRadius = parseFloat($el.css(("border-" + (isTopSheetModal ? 'bottom' : 'top') + "-left-radius")));
  12803. $pushViewEl.css('border-radius', '0px');
  12804. }
  12805. }
  12806. }
  12807. });
  12808. sheet.on('opened', function () {
  12809. if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
  12810. app.on('click', handleClick);
  12811. }
  12812. });
  12813. sheet.on('close', function () {
  12814. if (sheet.params.swipeToStep) {
  12815. $el.removeClass('modal-in-swipe-step');
  12816. app.off('resize', onResize);
  12817. }
  12818. if (sheet.params.closeOnEscape) {
  12819. $(doc).off('keydown', onKeyDown);
  12820. }
  12821. if (sheet.params.scrollToEl) {
  12822. scrollToElementOnClose();
  12823. }
  12824. if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
  12825. app.off('click', handleClick);
  12826. }
  12827. $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
  12828. if (sheet.push && pushOffset) {
  12829. sheet.$htmlEl.removeClass('with-modal-sheet-push');
  12830. sheet.$htmlEl.addClass('with-modal-sheet-push-closing');
  12831. }
  12832. });
  12833. sheet.on('closed', function () {
  12834. if (sheet.push && pushOffset) {
  12835. sheet.$htmlEl.removeClass('with-modal-sheet-push-closing');
  12836. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  12837. }
  12838. });
  12839. sheet.stepOpen = function stepOpen() {
  12840. $el.removeClass('modal-in-swipe-step');
  12841. if (sheet.push) {
  12842. if (!pushOffset) {
  12843. pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
  12844. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  12845. }
  12846. if (pushOffset) {
  12847. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  12848. }
  12849. }
  12850. };
  12851. sheet.stepClose = function stepClose() {
  12852. $el.addClass('modal-in-swipe-step');
  12853. if (sheet.push) {
  12854. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  12855. }
  12856. };
  12857. sheet.stepToggle = function stepToggle() {
  12858. $el.toggleClass('modal-in-swipe-step');
  12859. };
  12860. $el[0].f7Modal = sheet;
  12861. return sheet;
  12862. }
  12863. if ( Modal ) Sheet.__proto__ = Modal;
  12864. Sheet.prototype = Object.create( Modal && Modal.prototype );
  12865. Sheet.prototype.constructor = Sheet;
  12866. return Sheet;
  12867. }(Modal));
  12868. var Sheet$1 = {
  12869. name: 'sheet',
  12870. params: {
  12871. sheet: {
  12872. push: false,
  12873. backdrop: undefined,
  12874. backdropEl: undefined,
  12875. closeByBackdropClick: true,
  12876. closeByOutsideClick: false,
  12877. closeOnEscape: false,
  12878. swipeToClose: false,
  12879. swipeToStep: false,
  12880. swipeHandler: null,
  12881. },
  12882. },
  12883. static: {
  12884. Sheet: Sheet,
  12885. },
  12886. create: function create() {
  12887. var app = this;
  12888. app.sheet = Utils.extend(
  12889. {},
  12890. ModalMethods({
  12891. app: app,
  12892. constructor: Sheet,
  12893. defaultSelector: '.sheet-modal.modal-in',
  12894. }),
  12895. {
  12896. stepOpen: function stepOpen(sheet) {
  12897. var sheetInstance = app.sheet.get(sheet);
  12898. if (sheetInstance && sheetInstance.stepOpen) { return sheetInstance.stepOpen(); }
  12899. return undefined;
  12900. },
  12901. stepClose: function stepClose(sheet) {
  12902. var sheetInstance = app.sheet.get(sheet);
  12903. if (sheetInstance && sheetInstance.stepClose) { return sheetInstance.stepClose(); }
  12904. return undefined;
  12905. },
  12906. stepToggle: function stepToggle(sheet) {
  12907. var sheetInstance = app.sheet.get(sheet);
  12908. if (sheetInstance && sheetInstance.stepToggle) { return sheetInstance.stepToggle(); }
  12909. return undefined;
  12910. },
  12911. }
  12912. );
  12913. },
  12914. clicks: {
  12915. '.sheet-open': function openSheet($clickedEl, data) {
  12916. if ( data === void 0 ) data = {};
  12917. var app = this;
  12918. if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
  12919. app.sheet.close('.sheet-modal.modal-in');
  12920. }
  12921. app.sheet.open(data.sheet, data.animate, $clickedEl);
  12922. },
  12923. '.sheet-close': function closeSheet($clickedEl, data) {
  12924. if ( data === void 0 ) data = {};
  12925. var app = this;
  12926. app.sheet.close(data.sheet, data.animate, $clickedEl);
  12927. },
  12928. },
  12929. };
  12930. var Toast = /*@__PURE__*/(function (Modal) {
  12931. function Toast(app, params) {
  12932. var extendedParams = Utils.extend({
  12933. on: {},
  12934. }, app.params.toast, params);
  12935. // Extends with open/close Modal methods;
  12936. Modal.call(this, app, extendedParams);
  12937. var toast = this;
  12938. toast.app = app;
  12939. toast.params = extendedParams;
  12940. var ref = toast.params;
  12941. var closeButton = ref.closeButton;
  12942. var closeTimeout = ref.closeTimeout;
  12943. var $el;
  12944. if (!toast.params.el) {
  12945. // Find Element
  12946. var toastHtml = toast.render();
  12947. $el = $(toastHtml);
  12948. } else {
  12949. $el = $(toast.params.el);
  12950. }
  12951. if ($el && $el.length > 0 && $el[0].f7Modal) {
  12952. return $el[0].f7Modal;
  12953. }
  12954. if ($el.length === 0) {
  12955. return toast.destroy();
  12956. }
  12957. Utils.extend(toast, {
  12958. $el: $el,
  12959. el: $el[0],
  12960. type: 'toast',
  12961. });
  12962. $el[0].f7Modal = toast;
  12963. if (closeButton) {
  12964. $el.find('.toast-button').on('click', function () {
  12965. toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
  12966. toast.close();
  12967. });
  12968. toast.on('beforeDestroy', function () {
  12969. $el.find('.toast-button').off('click');
  12970. });
  12971. }
  12972. var timeoutId;
  12973. toast.on('open', function () {
  12974. $('.toast.modal-in').each(function (index, openedEl) {
  12975. var toastInstance = app.toast.get(openedEl);
  12976. if (openedEl !== toast.el && toastInstance) {
  12977. toastInstance.close();
  12978. }
  12979. });
  12980. if (closeTimeout) {
  12981. timeoutId = Utils.nextTick(function () {
  12982. toast.close();
  12983. }, closeTimeout);
  12984. }
  12985. });
  12986. toast.on('close', function () {
  12987. win.clearTimeout(timeoutId);
  12988. });
  12989. if (toast.params.destroyOnClose) {
  12990. toast.once('closed', function () {
  12991. setTimeout(function () {
  12992. toast.destroy();
  12993. }, 0);
  12994. });
  12995. }
  12996. return toast;
  12997. }
  12998. if ( Modal ) Toast.__proto__ = Modal;
  12999. Toast.prototype = Object.create( Modal && Modal.prototype );
  13000. Toast.prototype.constructor = Toast;
  13001. Toast.prototype.render = function render () {
  13002. var toast = this;
  13003. if (toast.params.render) { return toast.params.render.call(toast, toast); }
  13004. var ref = toast.params;
  13005. var position = ref.position;
  13006. var horizontalPosition = ref.horizontalPosition;
  13007. var cssClass = ref.cssClass;
  13008. var icon = ref.icon;
  13009. var text = ref.text;
  13010. var closeButton = ref.closeButton;
  13011. var closeButtonColor = ref.closeButtonColor;
  13012. var closeButtonText = ref.closeButtonText;
  13013. var horizontalClass = position === 'top' || position === 'bottom'
  13014. ? ("toast-horizontal-" + horizontalPosition)
  13015. : '';
  13016. 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();
  13017. };
  13018. return Toast;
  13019. }(Modal));
  13020. var Toast$1 = {
  13021. name: 'toast',
  13022. static: {
  13023. Toast: Toast,
  13024. },
  13025. create: function create() {
  13026. var app = this;
  13027. app.toast = Utils.extend(
  13028. {},
  13029. ModalMethods({
  13030. app: app,
  13031. constructor: Toast,
  13032. defaultSelector: '.toast.modal-in',
  13033. }),
  13034. {
  13035. // Shortcuts
  13036. show: function show(params) {
  13037. Utils.extend(params, {
  13038. destroyOnClose: true,
  13039. });
  13040. return new Toast(app, params).open();
  13041. },
  13042. }
  13043. );
  13044. },
  13045. params: {
  13046. toast: {
  13047. icon: null,
  13048. text: null,
  13049. position: 'bottom',
  13050. horizontalPosition: 'left',
  13051. closeButton: false,
  13052. closeButtonColor: null,
  13053. closeButtonText: 'Ok',
  13054. closeTimeout: null,
  13055. cssClass: null,
  13056. render: null,
  13057. },
  13058. },
  13059. };
  13060. var Preloader = {
  13061. init: function init(el) {
  13062. var app = this;
  13063. var $el = $(el);
  13064. if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) { return; }
  13065. $el.append(Utils[((app.theme) + "PreloaderContent")]);
  13066. },
  13067. // Modal
  13068. visible: false,
  13069. show: function show(color) {
  13070. if ( color === void 0 ) color = 'white';
  13071. var app = this;
  13072. if (Preloader.visible) { return; }
  13073. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  13074. $('html').addClass('with-modal-preloader');
  13075. 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 "));
  13076. Preloader.visible = true;
  13077. },
  13078. showIn: function showIn(el, color) {
  13079. if ( color === void 0 ) color = 'white';
  13080. var app = this;
  13081. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  13082. $(el || 'html').addClass('with-modal-preloader');
  13083. $(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 "));
  13084. },
  13085. hide: function hide() {
  13086. var app = this;
  13087. if (!Preloader.visible) { return; }
  13088. $('html').removeClass('with-modal-preloader');
  13089. app.root.find('.preloader-backdrop, .preloader-modal').remove();
  13090. Preloader.visible = false;
  13091. },
  13092. hideIn: function hideIn(el) {
  13093. var app = this;
  13094. $(el || 'html').removeClass('with-modal-preloader');
  13095. $(el || app.root).find('.preloader-backdrop, .preloader-modal').remove();
  13096. },
  13097. };
  13098. var Preloader$1 = {
  13099. name: 'preloader',
  13100. create: function create() {
  13101. var app = this;
  13102. Utils.extend(app, {
  13103. preloader: {
  13104. init: Preloader.init.bind(app),
  13105. show: Preloader.show.bind(app),
  13106. hide: Preloader.hide.bind(app),
  13107. showIn: Preloader.showIn.bind(app),
  13108. hideIn: Preloader.hideIn.bind(app),
  13109. },
  13110. });
  13111. },
  13112. on: {
  13113. photoBrowserOpen: function photoBrowserOpen(pb) {
  13114. var app = this;
  13115. pb.$el.find('.preloader').each(function (index, preloaderEl) {
  13116. app.preloader.init(preloaderEl);
  13117. });
  13118. },
  13119. tabMounted: function tabMounted(tabEl) {
  13120. var app = this;
  13121. $(tabEl).find('.preloader').each(function (index, preloaderEl) {
  13122. app.preloader.init(preloaderEl);
  13123. });
  13124. },
  13125. pageInit: function pageInit(page) {
  13126. var app = this;
  13127. page.$el.find('.preloader').each(function (index, preloaderEl) {
  13128. app.preloader.init(preloaderEl);
  13129. });
  13130. },
  13131. },
  13132. vnode: {
  13133. preloader: {
  13134. insert: function insert(vnode) {
  13135. var app = this;
  13136. var preloaderEl = vnode.elm;
  13137. app.preloader.init(preloaderEl);
  13138. },
  13139. },
  13140. },
  13141. };
  13142. var Progressbar = {
  13143. set: function set() {
  13144. var assign;
  13145. var args = [], len = arguments.length;
  13146. while ( len-- ) args[ len ] = arguments[ len ];
  13147. var app = this;
  13148. var el = args[0];
  13149. var progress = args[1];
  13150. var duration = args[2];
  13151. if (typeof args[0] === 'number') {
  13152. (assign = args, progress = assign[0], duration = assign[1]);
  13153. el = app.root;
  13154. }
  13155. if (typeof progress === 'undefined' || progress === null) { return el; }
  13156. if (!progress) { progress = 0; }
  13157. var $el = $(el || app.root);
  13158. if ($el.length === 0) {
  13159. return el;
  13160. }
  13161. var progressNormalized = Math.min(Math.max(progress, 0), 100);
  13162. var $progressbarEl;
  13163. if ($el.hasClass('progressbar')) { $progressbarEl = $el.eq(0); }
  13164. else {
  13165. $progressbarEl = $el.children('.progressbar');
  13166. }
  13167. if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
  13168. return $progressbarEl;
  13169. }
  13170. var $progressbarLine = $progressbarEl.children('span');
  13171. if ($progressbarLine.length === 0) {
  13172. $progressbarLine = $('<span></span>');
  13173. $progressbarEl.append($progressbarLine);
  13174. }
  13175. $progressbarLine
  13176. .transition(typeof duration !== 'undefined' ? duration : '')
  13177. .transform(("translate3d(" + ((-100 + progressNormalized)) + "%,0,0)"));
  13178. return $progressbarEl[0];
  13179. },
  13180. show: function show() {
  13181. var assign, assign$1;
  13182. var args = [], len = arguments.length;
  13183. while ( len-- ) args[ len ] = arguments[ len ];
  13184. var app = this;
  13185. // '.page', 50, 'multi'
  13186. var el = args[0];
  13187. var progress = args[1];
  13188. var color = args[2];
  13189. var type = 'determined';
  13190. if (args.length === 2) {
  13191. if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
  13192. // '.page', 'multi'
  13193. (assign = args, el = assign[0], color = assign[1], progress = assign[2]);
  13194. type = 'infinite';
  13195. } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
  13196. // 50, 'multi'
  13197. (assign$1 = args, progress = assign$1[0], color = assign$1[1]);
  13198. el = app.root;
  13199. }
  13200. } else if (args.length === 1) {
  13201. if (typeof args[0] === 'number') {
  13202. el = app.root;
  13203. progress = args[0];
  13204. } else if (typeof args[0] === 'string') {
  13205. type = 'infinite';
  13206. el = app.root;
  13207. color = args[0];
  13208. }
  13209. } else if (args.length === 0) {
  13210. type = 'infinite';
  13211. el = app.root;
  13212. }
  13213. var $el = $(el);
  13214. if ($el.length === 0) { return undefined; }
  13215. var $progressbarEl;
  13216. if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
  13217. $progressbarEl = $el;
  13218. } else {
  13219. $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
  13220. if ($progressbarEl.length === 0) {
  13221. $progressbarEl = $(("\n <span class=\"progressbar" + (type === 'infinite' ? '-infinite' : '') + (color ? (" color-" + color) : '') + " progressbar-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span>"));
  13222. $el.append($progressbarEl);
  13223. }
  13224. }
  13225. if (typeof progress !== 'undefined') {
  13226. app.progressbar.set($progressbarEl, progress);
  13227. }
  13228. return $progressbarEl[0];
  13229. },
  13230. hide: function hide(el, removeAfterHide) {
  13231. if ( removeAfterHide === void 0 ) removeAfterHide = true;
  13232. var app = this;
  13233. var $el = $(el || app.root);
  13234. if ($el.length === 0) { return undefined; }
  13235. var $progressbarEl;
  13236. if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
  13237. $progressbarEl = $el;
  13238. } else {
  13239. $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
  13240. }
  13241. if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
  13242. return $progressbarEl;
  13243. }
  13244. $progressbarEl
  13245. .removeClass('progressbar-in')
  13246. .addClass('progressbar-out')
  13247. .animationEnd(function () {
  13248. if (removeAfterHide) {
  13249. $progressbarEl.remove();
  13250. }
  13251. });
  13252. return $progressbarEl;
  13253. },
  13254. };
  13255. var Progressbar$1 = {
  13256. name: 'progressbar',
  13257. create: function create() {
  13258. var app = this;
  13259. Utils.extend(app, {
  13260. progressbar: {
  13261. set: Progressbar.set.bind(app),
  13262. show: Progressbar.show.bind(app),
  13263. hide: Progressbar.hide.bind(app),
  13264. },
  13265. });
  13266. },
  13267. on: {
  13268. tabMounted: function tabMounted(tabEl) {
  13269. var app = this;
  13270. $(tabEl).find('.progressbar').each(function (index, progressbarEl) {
  13271. var $progressbarEl = $(progressbarEl);
  13272. app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
  13273. });
  13274. },
  13275. pageInit: function pageInit(page) {
  13276. var app = this;
  13277. page.$el.find('.progressbar').each(function (index, progressbarEl) {
  13278. var $progressbarEl = $(progressbarEl);
  13279. app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
  13280. });
  13281. },
  13282. },
  13283. vnode: {
  13284. progressbar: {
  13285. insert: function insert(vnode) {
  13286. var app = this;
  13287. var el = vnode.elm;
  13288. app.progressbar.set(el, el.getAttribute('data-progress'));
  13289. },
  13290. update: function update(vnode) {
  13291. var app = this;
  13292. var el = vnode.elm;
  13293. app.progressbar.set(el, el.getAttribute('data-progress'));
  13294. },
  13295. },
  13296. },
  13297. };
  13298. var Sortable = {
  13299. init: function init() {
  13300. var app = this;
  13301. var isTouched;
  13302. var isMoved;
  13303. var touchStartY;
  13304. var touchesDiff;
  13305. var $sortingEl;
  13306. var $sortingItems;
  13307. var $sortableContainer;
  13308. var sortingElHeight;
  13309. var minTop;
  13310. var maxTop;
  13311. var $insertAfterEl;
  13312. var $insertBeforeEl;
  13313. var indexFrom;
  13314. var $pageEl;
  13315. var $pageContentEl;
  13316. var pageHeight;
  13317. var pageOffset;
  13318. var sortingElOffsetLocal;
  13319. var sortingElOffsetTop;
  13320. var initialScrollTop;
  13321. var wasTapHold;
  13322. function handleTouchStart(e, isTapHold) {
  13323. isMoved = false;
  13324. isTouched = true;
  13325. wasTapHold = false;
  13326. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  13327. $sortingEl = $(e.target).closest('li').eq(0);
  13328. indexFrom = $sortingEl.index();
  13329. $sortableContainer = $sortingEl.parents('.sortable');
  13330. var $listGroup = $sortingEl.parents('.list-group');
  13331. if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
  13332. $sortableContainer = $listGroup;
  13333. }
  13334. $sortingItems = $sortableContainer.children('ul').children('li:not(.disallow-sorting):not(.no-sorting)');
  13335. if (app.panel) { app.panel.allowOpen = false; }
  13336. if (app.swipeout) { app.swipeout.allow = false; }
  13337. if (isTapHold) {
  13338. $sortingEl.addClass('sorting');
  13339. $sortableContainer.addClass('sortable-sorting');
  13340. wasTapHold = true;
  13341. }
  13342. }
  13343. function handleTouchMove(e) {
  13344. if (!isTouched || !$sortingEl) { return; }
  13345. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  13346. if (!isMoved) {
  13347. $pageEl = $sortingEl.parents('.page');
  13348. $pageContentEl = $sortingEl.parents('.page-content');
  13349. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  13350. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  13351. initialScrollTop = $pageContentEl[0].scrollTop;
  13352. pageOffset = $pageEl.offset().top + paddingTop;
  13353. pageHeight = $pageEl.height() - paddingTop - paddingBottom;
  13354. $sortingEl.addClass('sorting');
  13355. $sortableContainer.addClass('sortable-sorting');
  13356. sortingElOffsetLocal = $sortingEl[0].offsetTop;
  13357. minTop = $sortingEl[0].offsetTop;
  13358. maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
  13359. sortingElHeight = $sortingEl[0].offsetHeight;
  13360. sortingElOffsetTop = $sortingEl.offset().top;
  13361. }
  13362. isMoved = true;
  13363. e.preventDefault();
  13364. e.f7PreventSwipePanel = true;
  13365. touchesDiff = pageY - touchStartY;
  13366. var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
  13367. var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
  13368. $sortingEl.transform(("translate3d(0," + translate + "px,0)"));
  13369. var scrollAddition = 44;
  13370. var allowScroll = true;
  13371. if ((touchesDiff + translateScrollOffset) + scrollAddition < -minTop) {
  13372. allowScroll = false;
  13373. }
  13374. if ((touchesDiff + translateScrollOffset) - scrollAddition > maxTop) {
  13375. allowScroll = false;
  13376. }
  13377. $insertBeforeEl = undefined;
  13378. $insertAfterEl = undefined;
  13379. var scrollDiff;
  13380. if (allowScroll) {
  13381. if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
  13382. // To Bottom
  13383. scrollDiff = (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition) - (pageOffset + pageHeight);
  13384. }
  13385. if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
  13386. // To Top
  13387. scrollDiff = (sortingElOffsetTop + touchesDiff) - pageOffset - scrollAddition;
  13388. }
  13389. if (scrollDiff) {
  13390. $pageContentEl[0].scrollTop += scrollDiff;
  13391. }
  13392. }
  13393. $sortingItems.each(function (index, el) {
  13394. var $currentEl = $(el);
  13395. if ($currentEl[0] === $sortingEl[0]) { return; }
  13396. var currentElOffset = $currentEl[0].offsetTop;
  13397. var currentElHeight = $currentEl.height();
  13398. var sortingElOffset = sortingElOffsetLocal + translate;
  13399. if ((sortingElOffset >= currentElOffset - (currentElHeight / 2)) && $sortingEl.index() < $currentEl.index()) {
  13400. $currentEl.transform(("translate3d(0, " + (-sortingElHeight) + "px,0)"));
  13401. $insertAfterEl = $currentEl;
  13402. $insertBeforeEl = undefined;
  13403. } else if ((sortingElOffset <= currentElOffset + (currentElHeight / 2)) && $sortingEl.index() > $currentEl.index()) {
  13404. $currentEl.transform(("translate3d(0, " + sortingElHeight + "px,0)"));
  13405. $insertAfterEl = undefined;
  13406. if (!$insertBeforeEl) { $insertBeforeEl = $currentEl; }
  13407. } else {
  13408. $currentEl.transform('translate3d(0, 0%,0)');
  13409. }
  13410. });
  13411. }
  13412. function handleTouchEnd() {
  13413. if (!isTouched || !isMoved) {
  13414. if (isTouched && !isMoved) {
  13415. if (app.panel) { app.panel.allowOpen = true; }
  13416. if (app.swipeout) { app.swipeout.allow = true; }
  13417. if (wasTapHold) {
  13418. $sortingEl.removeClass('sorting');
  13419. $sortableContainer.removeClass('sortable-sorting');
  13420. }
  13421. }
  13422. isTouched = false;
  13423. isMoved = false;
  13424. return;
  13425. }
  13426. if (app.panel) { app.panel.allowOpen = true; }
  13427. if (app.swipeout) { app.swipeout.allow = true; }
  13428. $sortingItems.transform('');
  13429. $sortingEl.removeClass('sorting');
  13430. $sortableContainer.removeClass('sortable-sorting');
  13431. var indexTo;
  13432. if ($insertAfterEl) { indexTo = $insertAfterEl.index(); }
  13433. else if ($insertBeforeEl) { indexTo = $insertBeforeEl.index(); }
  13434. var moveElements = $sortableContainer.dataset().sortableMoveElements;
  13435. if (typeof moveElements === 'undefined') {
  13436. moveElements = app.params.sortable.moveElements;
  13437. }
  13438. if (moveElements) {
  13439. if ($insertAfterEl) {
  13440. $sortingEl.insertAfter($insertAfterEl);
  13441. }
  13442. if ($insertBeforeEl) {
  13443. $sortingEl.insertBefore($insertBeforeEl);
  13444. }
  13445. }
  13446. if (($insertAfterEl || $insertBeforeEl)
  13447. && $sortableContainer.hasClass('virtual-list')
  13448. ) {
  13449. indexFrom = $sortingEl[0].f7VirtualListIndex;
  13450. if (typeof indexFrom === 'undefined') { indexFrom = $sortingEl.attr('data-virtual-list-index'); }
  13451. if ($insertBeforeEl) {
  13452. indexTo = $insertBeforeEl[0].f7VirtualListIndex;
  13453. if (typeof indexTo === 'undefined') { indexTo = $insertBeforeEl.attr('data-virtual-list-index'); }
  13454. } else {
  13455. indexTo = $insertAfterEl[0].f7VirtualListIndex;
  13456. if (typeof indexTo === 'undefined') { indexTo = $insertAfterEl.attr('data-virtual-list-index'); }
  13457. }
  13458. if (indexTo !== null) { indexTo = parseInt(indexTo, 10); }
  13459. else { indexTo = undefined; }
  13460. var virtualList = $sortableContainer[0].f7VirtualList;
  13461. if (indexFrom) { indexFrom = parseInt(indexFrom, 10); }
  13462. if (indexTo) { indexTo = parseInt(indexTo, 10); }
  13463. if (virtualList) { virtualList.moveItem(indexFrom, indexTo); }
  13464. }
  13465. if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
  13466. $sortingEl.trigger('sortable:sort', { from: indexFrom, to: indexTo });
  13467. app.emit('sortableSort', $sortingEl[0], { from: indexFrom, to: indexTo, el: $sortingEl[0] }, $sortableContainer[0]);
  13468. }
  13469. $insertBeforeEl = undefined;
  13470. $insertAfterEl = undefined;
  13471. isTouched = false;
  13472. isMoved = false;
  13473. }
  13474. var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
  13475. $(doc).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
  13476. app.on('touchmove:active', handleTouchMove);
  13477. app.on('touchend:passive', handleTouchEnd);
  13478. $(doc).on('taphold', '.sortable-tap-hold', function (e, pointerEvent) {
  13479. handleTouchStart(pointerEvent, true);
  13480. });
  13481. },
  13482. enable: function enable(el) {
  13483. if ( el === void 0 ) el = '.list.sortable';
  13484. var app = this;
  13485. var $el = $(el);
  13486. if ($el.length === 0) { return; }
  13487. $el.addClass('sortable-enabled');
  13488. $el.trigger('sortable:enable');
  13489. app.emit('sortableEnable', $el[0]);
  13490. },
  13491. disable: function disable(el) {
  13492. if ( el === void 0 ) el = '.list.sortable';
  13493. var app = this;
  13494. var $el = $(el);
  13495. if ($el.length === 0) { return; }
  13496. $el.removeClass('sortable-enabled');
  13497. $el.trigger('sortable:disable');
  13498. app.emit('sortableDisable', $el[0]);
  13499. },
  13500. toggle: function toggle(el) {
  13501. if ( el === void 0 ) el = '.list.sortable';
  13502. var app = this;
  13503. var $el = $(el);
  13504. if ($el.length === 0) { return; }
  13505. if ($el.hasClass('sortable-enabled')) {
  13506. app.sortable.disable($el);
  13507. } else {
  13508. app.sortable.enable($el);
  13509. }
  13510. },
  13511. };
  13512. var Sortable$1 = {
  13513. name: 'sortable',
  13514. params: {
  13515. sortable: {
  13516. moveElements: true,
  13517. },
  13518. },
  13519. create: function create() {
  13520. var app = this;
  13521. Utils.extend(app, {
  13522. sortable: {
  13523. init: Sortable.init.bind(app),
  13524. enable: Sortable.enable.bind(app),
  13525. disable: Sortable.disable.bind(app),
  13526. toggle: Sortable.toggle.bind(app),
  13527. },
  13528. });
  13529. },
  13530. on: {
  13531. init: function init() {
  13532. var app = this;
  13533. if (!app.params.sortable) { return; }
  13534. app.sortable.init();
  13535. },
  13536. },
  13537. clicks: {
  13538. '.sortable-enable': function enable($clickedEl, data) {
  13539. if ( data === void 0 ) data = {};
  13540. var app = this;
  13541. app.sortable.enable(data.sortable);
  13542. },
  13543. '.sortable-disable': function disable($clickedEl, data) {
  13544. if ( data === void 0 ) data = {};
  13545. var app = this;
  13546. app.sortable.disable(data.sortable);
  13547. },
  13548. '.sortable-toggle': function toggle($clickedEl, data) {
  13549. if ( data === void 0 ) data = {};
  13550. var app = this;
  13551. app.sortable.toggle(data.sortable);
  13552. },
  13553. },
  13554. };
  13555. var Swipeout = {
  13556. init: function init() {
  13557. var app = this;
  13558. var touchesStart = {};
  13559. var isTouched;
  13560. var isMoved;
  13561. var isScrolling;
  13562. var touchStartTime;
  13563. var touchesDiff;
  13564. var $swipeoutEl;
  13565. var $swipeoutContent;
  13566. var $actionsRight;
  13567. var $actionsLeft;
  13568. var actionsLeftWidth;
  13569. var actionsRightWidth;
  13570. var translate;
  13571. var opened;
  13572. var openedActionsSide;
  13573. var $leftButtons;
  13574. var $rightButtons;
  13575. var direction;
  13576. var $overswipeLeftButton;
  13577. var $overswipeRightButton;
  13578. var overswipeLeft;
  13579. var overswipeRight;
  13580. function handleTouchStart(e) {
  13581. if (!Swipeout.allow) { return; }
  13582. isMoved = false;
  13583. isTouched = true;
  13584. isScrolling = undefined;
  13585. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  13586. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  13587. touchStartTime = (new Date()).getTime();
  13588. $swipeoutEl = $(this);
  13589. }
  13590. function handleTouchMove(e) {
  13591. if (!isTouched) { return; }
  13592. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  13593. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  13594. if (typeof isScrolling === 'undefined') {
  13595. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  13596. }
  13597. if (isScrolling) {
  13598. isTouched = false;
  13599. return;
  13600. }
  13601. if (!isMoved) {
  13602. if ($('.list.sortable-opened').length > 0) { return; }
  13603. $swipeoutContent = $swipeoutEl.find('.swipeout-content');
  13604. $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
  13605. $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
  13606. actionsLeftWidth = null;
  13607. actionsRightWidth = null;
  13608. $leftButtons = null;
  13609. $rightButtons = null;
  13610. $overswipeRightButton = null;
  13611. $overswipeLeftButton = null;
  13612. if ($actionsLeft.length > 0) {
  13613. actionsLeftWidth = $actionsLeft.outerWidth();
  13614. $leftButtons = $actionsLeft.children('a');
  13615. $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
  13616. }
  13617. if ($actionsRight.length > 0) {
  13618. actionsRightWidth = $actionsRight.outerWidth();
  13619. $rightButtons = $actionsRight.children('a');
  13620. $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
  13621. }
  13622. opened = $swipeoutEl.hasClass('swipeout-opened');
  13623. if (opened) {
  13624. openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
  13625. }
  13626. $swipeoutEl.removeClass('swipeout-transitioning');
  13627. if (!app.params.swipeout.noFollow) {
  13628. $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
  13629. $swipeoutEl.removeClass('swipeout-opened');
  13630. }
  13631. }
  13632. isMoved = true;
  13633. e.preventDefault();
  13634. touchesDiff = pageX - touchesStart.x;
  13635. translate = touchesDiff;
  13636. if (opened) {
  13637. if (openedActionsSide === 'right') { translate -= actionsRightWidth; }
  13638. else { translate += actionsLeftWidth; }
  13639. }
  13640. if (
  13641. (translate > 0 && $actionsLeft.length === 0)
  13642. || (translate < 0 && $actionsRight.length === 0)
  13643. ) {
  13644. if (!opened) {
  13645. isTouched = false;
  13646. isMoved = false;
  13647. $swipeoutContent.transform('');
  13648. if ($rightButtons && $rightButtons.length > 0) {
  13649. $rightButtons.transform('');
  13650. }
  13651. if ($leftButtons && $leftButtons.length > 0) {
  13652. $leftButtons.transform('');
  13653. }
  13654. return;
  13655. }
  13656. translate = 0;
  13657. }
  13658. if (translate < 0) { direction = 'to-left'; }
  13659. else if (translate > 0) { direction = 'to-right'; }
  13660. else if (!direction) { direction = 'to-left'; }
  13661. var buttonOffset;
  13662. var progress;
  13663. e.f7PreventSwipePanel = true;
  13664. if (app.params.swipeout.noFollow) {
  13665. if (opened) {
  13666. if (openedActionsSide === 'right' && touchesDiff > 0) {
  13667. app.swipeout.close($swipeoutEl);
  13668. }
  13669. if (openedActionsSide === 'left' && touchesDiff < 0) {
  13670. app.swipeout.close($swipeoutEl);
  13671. }
  13672. } else {
  13673. if (touchesDiff < 0 && $actionsRight.length > 0) {
  13674. app.swipeout.open($swipeoutEl, 'right');
  13675. }
  13676. if (touchesDiff > 0 && $actionsLeft.length > 0) {
  13677. app.swipeout.open($swipeoutEl, 'left');
  13678. }
  13679. }
  13680. isTouched = false;
  13681. isMoved = false;
  13682. return;
  13683. }
  13684. overswipeLeft = false;
  13685. overswipeRight = false;
  13686. if ($actionsRight.length > 0) {
  13687. // Show right actions
  13688. var buttonTranslate = translate;
  13689. progress = buttonTranslate / actionsRightWidth;
  13690. if (buttonTranslate < -actionsRightWidth) {
  13691. buttonTranslate = -actionsRightWidth - (Math.pow( (-buttonTranslate - actionsRightWidth), 0.8 ));
  13692. translate = buttonTranslate;
  13693. if ($overswipeRightButton.length > 0) {
  13694. overswipeRight = true;
  13695. }
  13696. }
  13697. if (direction !== 'to-left') {
  13698. progress = 0;
  13699. buttonTranslate = 0;
  13700. }
  13701. $rightButtons.each(function (index, buttonEl) {
  13702. var $buttonEl = $(buttonEl);
  13703. if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
  13704. $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
  13705. }
  13706. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  13707. if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
  13708. $buttonEl.css({ left: ((overswipeRight ? -buttonOffset : 0) + "px") });
  13709. if (overswipeRight) {
  13710. if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
  13711. $swipeoutEl.trigger('swipeout:overswipeenter');
  13712. app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
  13713. }
  13714. $buttonEl.addClass('swipeout-overswipe-active');
  13715. } else {
  13716. if ($buttonEl.hasClass('swipeout-overswipe-active')) {
  13717. $swipeoutEl.trigger('swipeout:overswipeexit');
  13718. app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
  13719. }
  13720. $buttonEl.removeClass('swipeout-overswipe-active');
  13721. }
  13722. }
  13723. $buttonEl.transform(("translate3d(" + (buttonTranslate - (buttonOffset * (1 + Math.max(progress, -1)))) + "px,0,0)"));
  13724. });
  13725. }
  13726. if ($actionsLeft.length > 0) {
  13727. // Show left actions
  13728. var buttonTranslate$1 = translate;
  13729. progress = buttonTranslate$1 / actionsLeftWidth;
  13730. if (buttonTranslate$1 > actionsLeftWidth) {
  13731. buttonTranslate$1 = actionsLeftWidth + (Math.pow( (buttonTranslate$1 - actionsLeftWidth), 0.8 ));
  13732. translate = buttonTranslate$1;
  13733. if ($overswipeLeftButton.length > 0) {
  13734. overswipeLeft = true;
  13735. }
  13736. }
  13737. if (direction !== 'to-right') {
  13738. buttonTranslate$1 = 0;
  13739. progress = 0;
  13740. }
  13741. $leftButtons.each(function (index, buttonEl) {
  13742. var $buttonEl = $(buttonEl);
  13743. if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
  13744. $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
  13745. }
  13746. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  13747. if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
  13748. $buttonEl.css({ left: ((overswipeLeft ? buttonOffset : 0) + "px") });
  13749. if (overswipeLeft) {
  13750. if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
  13751. $swipeoutEl.trigger('swipeout:overswipeenter');
  13752. app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
  13753. }
  13754. $buttonEl.addClass('swipeout-overswipe-active');
  13755. } else {
  13756. if ($buttonEl.hasClass('swipeout-overswipe-active')) {
  13757. $swipeoutEl.trigger('swipeout:overswipeexit');
  13758. app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
  13759. }
  13760. $buttonEl.removeClass('swipeout-overswipe-active');
  13761. }
  13762. }
  13763. if ($leftButtons.length > 1) {
  13764. $buttonEl.css('z-index', $leftButtons.length - index);
  13765. }
  13766. $buttonEl.transform(("translate3d(" + (buttonTranslate$1 + (buttonOffset * (1 - Math.min(progress, 1)))) + "px,0,0)"));
  13767. });
  13768. }
  13769. $swipeoutEl.trigger('swipeout', progress);
  13770. app.emit('swipeout', $swipeoutEl[0], progress);
  13771. $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
  13772. }
  13773. function handleTouchEnd() {
  13774. if (!isTouched || !isMoved) {
  13775. isTouched = false;
  13776. isMoved = false;
  13777. return;
  13778. }
  13779. isTouched = false;
  13780. isMoved = false;
  13781. var timeDiff = (new Date()).getTime() - touchStartTime;
  13782. var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
  13783. var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
  13784. var action;
  13785. var $buttons;
  13786. var i;
  13787. if (
  13788. (
  13789. timeDiff < 300
  13790. && (
  13791. (touchesDiff < -10 && direction === 'to-left')
  13792. || (touchesDiff > 10 && direction === 'to-right')
  13793. )
  13794. )
  13795. || (
  13796. timeDiff >= 300
  13797. && (Math.abs(translate) > actionsWidth / 2)
  13798. )
  13799. ) {
  13800. action = 'open';
  13801. } else {
  13802. action = 'close';
  13803. }
  13804. if (timeDiff < 300) {
  13805. if (Math.abs(translate) === 0) { action = 'close'; }
  13806. if (Math.abs(translate) === actionsWidth) { action = 'open'; }
  13807. }
  13808. if (action === 'open') {
  13809. Swipeout.el = $swipeoutEl[0];
  13810. $swipeoutEl.trigger('swipeout:open');
  13811. app.emit('swipeoutOpen', $swipeoutEl[0]);
  13812. $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
  13813. var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
  13814. $swipeoutContent.transform(("translate3d(" + newTranslate + "px,0,0)"));
  13815. $actions.addClass('swipeout-actions-opened');
  13816. $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
  13817. if ($buttons) {
  13818. for (i = 0; i < $buttons.length; i += 1) {
  13819. $($buttons[i]).transform(("translate3d(" + newTranslate + "px,0,0)"));
  13820. }
  13821. }
  13822. if (overswipeRight) {
  13823. $actionsRight.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
  13824. }
  13825. if (overswipeLeft) {
  13826. $actionsLeft.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
  13827. }
  13828. } else {
  13829. $swipeoutEl.trigger('swipeout:close');
  13830. app.emit('swipeoutClose', $swipeoutEl[0]);
  13831. Swipeout.el = undefined;
  13832. $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
  13833. $swipeoutContent.transform('');
  13834. $actions.removeClass('swipeout-actions-opened');
  13835. }
  13836. var buttonOffset;
  13837. if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
  13838. $leftButtons.each(function (index, buttonEl) {
  13839. var $buttonEl = $(buttonEl);
  13840. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  13841. if (typeof buttonOffset === 'undefined') {
  13842. $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
  13843. }
  13844. $buttonEl.transform(("translate3d(" + buttonOffset + "px,0,0)"));
  13845. });
  13846. }
  13847. if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
  13848. $rightButtons.each(function (index, buttonEl) {
  13849. var $buttonEl = $(buttonEl);
  13850. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  13851. if (typeof buttonOffset === 'undefined') {
  13852. $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
  13853. }
  13854. $buttonEl.transform(("translate3d(" + (-buttonOffset) + "px,0,0)"));
  13855. });
  13856. }
  13857. $swipeoutContent.transitionEnd(function () {
  13858. if ((opened && action === 'open') || (!opened && action === 'close')) { return; }
  13859. $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
  13860. app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
  13861. $swipeoutEl.removeClass('swipeout-transitioning');
  13862. if (opened && action === 'close') {
  13863. if ($actionsRight.length > 0) {
  13864. $rightButtons.transform('');
  13865. }
  13866. if ($actionsLeft.length > 0) {
  13867. $leftButtons.transform('');
  13868. }
  13869. }
  13870. });
  13871. }
  13872. var passiveListener = app.support.passiveListener ? { passive: true } : false;
  13873. app.on('touchstart', function (e) {
  13874. if (Swipeout.el) {
  13875. var $targetEl = $(e.target);
  13876. if (!(
  13877. $(Swipeout.el).is($targetEl[0])
  13878. || $targetEl.parents('.swipeout').is(Swipeout.el)
  13879. || $targetEl.hasClass('modal-in')
  13880. || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0
  13881. || $targetEl.hasClass('actions-modal')
  13882. || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0
  13883. )) {
  13884. app.swipeout.close(Swipeout.el);
  13885. }
  13886. }
  13887. });
  13888. $(doc).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
  13889. app.on('touchmove:active', handleTouchMove);
  13890. app.on('touchend:passive', handleTouchEnd);
  13891. },
  13892. allow: true,
  13893. el: undefined,
  13894. open: function open() {
  13895. var assign;
  13896. var args = [], len = arguments.length;
  13897. while ( len-- ) args[ len ] = arguments[ len ];
  13898. var app = this;
  13899. var el = args[0];
  13900. var side = args[1];
  13901. var callback = args[2];
  13902. if (typeof args[1] === 'function') {
  13903. (assign = args, el = assign[0], callback = assign[1], side = assign[2]);
  13904. }
  13905. var $el = $(el).eq(0);
  13906. if ($el.length === 0) { return; }
  13907. if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) { return; }
  13908. if (!side) {
  13909. if ($el.find('.swipeout-actions-right').length > 0) { side = 'right'; }
  13910. else { side = 'left'; }
  13911. }
  13912. var $swipeoutActions = $el.find((".swipeout-actions-" + side));
  13913. var $swipeoutContent = $el.find('.swipeout-content');
  13914. if ($swipeoutActions.length === 0) { return; }
  13915. $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
  13916. app.emit('swipeoutOpen', $el[0]);
  13917. $swipeoutActions.addClass('swipeout-actions-opened');
  13918. var $buttons = $swipeoutActions.children('a');
  13919. var swipeoutActionsWidth = $swipeoutActions.outerWidth();
  13920. var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
  13921. if ($buttons.length > 1) {
  13922. $buttons.each(function (buttonIndex, buttonEl) {
  13923. var $buttonEl = $(buttonEl);
  13924. if (side === 'right') {
  13925. $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
  13926. } else {
  13927. $buttonEl.css('z-index', $buttons.length - buttonIndex).transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
  13928. }
  13929. });
  13930. }
  13931. $el.addClass('swipeout-transitioning');
  13932. $swipeoutContent.transitionEnd(function () {
  13933. $el.trigger('swipeout:opened');
  13934. app.emit('swipeoutOpened', $el[0]);
  13935. if (callback) { callback.call($el[0]); }
  13936. });
  13937. Utils.nextFrame(function () {
  13938. $buttons.transform(("translate3d(" + translate + "px,0,0)"));
  13939. $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
  13940. });
  13941. Swipeout.el = $el[0];
  13942. },
  13943. close: function close(el, callback) {
  13944. var app = this;
  13945. var $el = $(el).eq(0);
  13946. if ($el.length === 0) { return; }
  13947. if (!$el.hasClass('swipeout-opened')) { return; }
  13948. var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
  13949. var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
  13950. var $buttons = $swipeoutActions.children('a');
  13951. var swipeoutActionsWidth = $swipeoutActions.outerWidth();
  13952. Swipeout.allow = false;
  13953. $el.trigger('swipeout:close');
  13954. app.emit('swipeoutClose', $el[0]);
  13955. $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
  13956. var closeTimeout;
  13957. function onSwipeoutClose() {
  13958. Swipeout.allow = true;
  13959. if ($el.hasClass('swipeout-opened')) { return; }
  13960. $el.removeClass('swipeout-transitioning');
  13961. $buttons.transform('');
  13962. $el.trigger('swipeout:closed');
  13963. app.emit('swipeoutClosed', $el[0]);
  13964. if (callback) { callback.call($el[0]); }
  13965. if (closeTimeout) { clearTimeout(closeTimeout); }
  13966. }
  13967. $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
  13968. closeTimeout = setTimeout(onSwipeoutClose, 500);
  13969. $buttons.each(function (index, buttonEl) {
  13970. var $buttonEl = $(buttonEl);
  13971. if (side === 'right') {
  13972. $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
  13973. } else {
  13974. $buttonEl.transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
  13975. }
  13976. $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active');
  13977. });
  13978. if (Swipeout.el && Swipeout.el === $el[0]) { Swipeout.el = undefined; }
  13979. },
  13980. delete: function delete$1(el, callback) {
  13981. var app = this;
  13982. var $el = $(el).eq(0);
  13983. if ($el.length === 0) { return; }
  13984. Swipeout.el = undefined;
  13985. $el.trigger('swipeout:delete');
  13986. app.emit('swipeoutDelete', $el[0]);
  13987. $el.css({ height: (($el.outerHeight()) + "px") });
  13988. $el.transitionEnd(function () {
  13989. $el.trigger('swipeout:deleted');
  13990. app.emit('swipeoutDeleted', $el[0]);
  13991. if (callback) { callback.call($el[0]); }
  13992. if ($el.parents('.virtual-list').length > 0) {
  13993. var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
  13994. var virtualIndex = $el[0].f7VirtualListIndex;
  13995. if (virtualList && typeof virtualIndex !== 'undefined') { virtualList.deleteItem(virtualIndex); }
  13996. } else if (app.params.swipeout.removeElements) {
  13997. if (app.params.swipeout.removeElementsWithTimeout) {
  13998. setTimeout(function () {
  13999. $el.remove();
  14000. }, app.params.swipeout.removeElementsTimeout);
  14001. } else {
  14002. $el.remove();
  14003. }
  14004. } else {
  14005. $el.removeClass('swipeout-deleting swipeout-transitioning');
  14006. }
  14007. });
  14008. // eslint-disable-next-line
  14009. // $el[0]._clientLeft = $el[0].clientLeft;
  14010. Utils.nextFrame(function () {
  14011. $el
  14012. .addClass('swipeout-deleting swipeout-transitioning')
  14013. .css({ height: '0px' })
  14014. .find('.swipeout-content')
  14015. .transform('translate3d(-100%,0,0)');
  14016. });
  14017. },
  14018. };
  14019. var Swipeout$1 = {
  14020. name: 'swipeout',
  14021. params: {
  14022. swipeout: {
  14023. actionsNoFold: false,
  14024. noFollow: false,
  14025. removeElements: true,
  14026. removeElementsWithTimeout: false,
  14027. removeElementsTimeout: 0,
  14028. },
  14029. },
  14030. create: function create() {
  14031. var app = this;
  14032. Utils.extend(app, {
  14033. swipeout: {
  14034. init: Swipeout.init.bind(app),
  14035. open: Swipeout.open.bind(app),
  14036. close: Swipeout.close.bind(app),
  14037. delete: Swipeout.delete.bind(app),
  14038. },
  14039. });
  14040. Object.defineProperty(app.swipeout, 'el', {
  14041. enumerable: true,
  14042. configurable: true,
  14043. get: function () { return Swipeout.el; },
  14044. set: function set(el) {
  14045. Swipeout.el = el;
  14046. },
  14047. });
  14048. Object.defineProperty(app.swipeout, 'allow', {
  14049. enumerable: true,
  14050. configurable: true,
  14051. get: function () { return Swipeout.allow; },
  14052. set: function set(allow) {
  14053. Swipeout.allow = allow;
  14054. },
  14055. });
  14056. },
  14057. clicks: {
  14058. '.swipeout-open': function openSwipeout($clickedEl, data) {
  14059. if ( data === void 0 ) data = {};
  14060. var app = this;
  14061. app.swipeout.open(data.swipeout, data.side);
  14062. },
  14063. '.swipeout-close': function closeSwipeout($clickedEl) {
  14064. var app = this;
  14065. var $swipeoutEl = $clickedEl.closest('.swipeout');
  14066. if ($swipeoutEl.length === 0) { return; }
  14067. app.swipeout.close($swipeoutEl);
  14068. },
  14069. '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
  14070. if ( data === void 0 ) data = {};
  14071. var app = this;
  14072. var $swipeoutEl = $clickedEl.closest('.swipeout');
  14073. if ($swipeoutEl.length === 0) { return; }
  14074. var confirm = data.confirm;
  14075. var confirmTitle = data.confirmTitle;
  14076. if (data.confirm) {
  14077. app.dialog.confirm(confirm, confirmTitle, function () {
  14078. app.swipeout.delete($swipeoutEl);
  14079. });
  14080. } else {
  14081. app.swipeout.delete($swipeoutEl);
  14082. }
  14083. },
  14084. },
  14085. on: {
  14086. init: function init() {
  14087. var app = this;
  14088. if (!app.params.swipeout) { return; }
  14089. app.swipeout.init();
  14090. },
  14091. },
  14092. };
  14093. var Accordion = {
  14094. toggleClicked: function toggleClicked($clickedEl) {
  14095. var app = this;
  14096. var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
  14097. if (!$accordionItemEl.length) { $accordionItemEl = $clickedEl.parents('li').eq(0); }
  14098. var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
  14099. if ($accordionContent.length) {
  14100. if ($accordionContent.parents($accordionItemEl).length) { return; }
  14101. }
  14102. if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) { return; }
  14103. app.accordion.toggle($accordionItemEl);
  14104. },
  14105. open: function open(el) {
  14106. var app = this;
  14107. var $el = $(el);
  14108. var prevented = false;
  14109. function prevent() {
  14110. prevented = true;
  14111. }
  14112. $el.trigger('accordion:beforeopen', { prevent: prevent }, prevent);
  14113. app.emit('accordionBeforeOpen', $el[0], prevent);
  14114. if (prevented) { return; }
  14115. var $list = $el.parents('.accordion-list').eq(0);
  14116. var $contentEl = $el.children('.accordion-item-content');
  14117. $contentEl.removeAttr('aria-hidden');
  14118. if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
  14119. if ($contentEl.length === 0) { return; }
  14120. var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
  14121. if ($openedItem.length > 0) {
  14122. app.accordion.close($openedItem);
  14123. }
  14124. $contentEl.transitionEnd(function () {
  14125. if ($el.hasClass('accordion-item-opened')) {
  14126. $contentEl.transition(0);
  14127. $contentEl.css('height', 'auto');
  14128. Utils.nextFrame(function () {
  14129. $contentEl.transition('');
  14130. $el.trigger('accordion:opened');
  14131. app.emit('accordionOpened', $el[0]);
  14132. });
  14133. } else {
  14134. $contentEl.css('height', '');
  14135. $el.trigger('accordion:closed');
  14136. app.emit('accordionClosed', $el[0]);
  14137. }
  14138. });
  14139. $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
  14140. $el.trigger('accordion:open');
  14141. $el.addClass('accordion-item-opened');
  14142. app.emit('accordionOpen', $el[0]);
  14143. },
  14144. close: function close(el) {
  14145. var app = this;
  14146. var $el = $(el);
  14147. var prevented = false;
  14148. function prevent() {
  14149. prevented = true;
  14150. }
  14151. $el.trigger('accordion:beforeclose', { prevent: prevent }, prevent);
  14152. app.emit('accordionBeforeClose', $el[0], prevent);
  14153. if (prevented) { return; }
  14154. var $contentEl = $el.children('.accordion-item-content');
  14155. if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
  14156. $el.removeClass('accordion-item-opened');
  14157. $contentEl.attr('aria-hidden', true);
  14158. $contentEl.transition(0);
  14159. $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
  14160. // Close
  14161. $contentEl.transitionEnd(function () {
  14162. if ($el.hasClass('accordion-item-opened')) {
  14163. $contentEl.transition(0);
  14164. $contentEl.css('height', 'auto');
  14165. Utils.nextFrame(function () {
  14166. $contentEl.transition('');
  14167. $el.trigger('accordion:opened');
  14168. app.emit('accordionOpened', $el[0]);
  14169. });
  14170. } else {
  14171. $contentEl.css('height', '');
  14172. $el.trigger('accordion:closed');
  14173. app.emit('accordionClosed', $el[0]);
  14174. }
  14175. });
  14176. Utils.nextFrame(function () {
  14177. $contentEl.transition('');
  14178. $contentEl.css('height', '');
  14179. $el.trigger('accordion:close');
  14180. app.emit('accordionClose', $el[0]);
  14181. });
  14182. },
  14183. toggle: function toggle(el) {
  14184. var app = this;
  14185. var $el = $(el);
  14186. if ($el.length === 0) { return; }
  14187. if ($el.hasClass('accordion-item-opened')) { app.accordion.close(el); }
  14188. else { app.accordion.open(el); }
  14189. },
  14190. };
  14191. var Accordion$1 = {
  14192. name: 'accordion',
  14193. create: function create() {
  14194. var app = this;
  14195. Utils.extend(app, {
  14196. accordion: {
  14197. open: Accordion.open.bind(app),
  14198. close: Accordion.close.bind(app),
  14199. toggle: Accordion.toggle.bind(app),
  14200. },
  14201. });
  14202. },
  14203. clicks: {
  14204. '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
  14205. var app = this;
  14206. Accordion.toggleClicked.call(app, $clickedEl);
  14207. },
  14208. },
  14209. };
  14210. var ContactsList = {
  14211. name: 'contactsList',
  14212. };
  14213. var VirtualList = /*@__PURE__*/(function (Framework7Class) {
  14214. function VirtualList(app, params) {
  14215. if ( params === void 0 ) params = {};
  14216. Framework7Class.call(this, params, [app]);
  14217. var vl = this;
  14218. var defaultHeight;
  14219. if (app.theme === 'md') {
  14220. defaultHeight = 48;
  14221. } else if (app.theme === 'ios') {
  14222. defaultHeight = 44;
  14223. } else if (app.theme === 'aurora') {
  14224. defaultHeight = 38;
  14225. }
  14226. var defaults = {
  14227. cols: 1,
  14228. height: defaultHeight,
  14229. cache: true,
  14230. dynamicHeightBufferSize: 1,
  14231. showFilteredItemsOnly: false,
  14232. renderExternal: undefined,
  14233. setListHeight: true,
  14234. searchByItem: undefined,
  14235. searchAll: undefined,
  14236. itemTemplate: undefined,
  14237. ul: null,
  14238. createUl: true,
  14239. scrollableParentEl: undefined,
  14240. renderItem: function renderItem(item) {
  14241. 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();
  14242. },
  14243. on: {},
  14244. };
  14245. // Extend defaults with modules params
  14246. vl.useModulesParams(defaults);
  14247. vl.params = Utils.extend(defaults, params);
  14248. if (vl.params.height === undefined || !vl.params.height) {
  14249. vl.params.height = defaultHeight;
  14250. }
  14251. vl.$el = $(params.el);
  14252. vl.el = vl.$el[0];
  14253. if (vl.$el.length === 0) { return undefined; }
  14254. vl.$el[0].f7VirtualList = vl;
  14255. vl.items = vl.params.items;
  14256. if (vl.params.showFilteredItemsOnly) {
  14257. vl.filteredItems = [];
  14258. }
  14259. if (vl.params.itemTemplate) {
  14260. if (typeof vl.params.itemTemplate === 'string') { vl.renderItem = app.t7.compile(vl.params.itemTemplate); }
  14261. else if (typeof vl.params.itemTemplate === 'function') { vl.renderItem = vl.params.itemTemplate; }
  14262. } else if (vl.params.renderItem) {
  14263. vl.renderItem = vl.params.renderItem;
  14264. }
  14265. vl.$pageContentEl = vl.$el.parents('.page-content');
  14266. vl.pageContentEl = vl.$pageContentEl[0];
  14267. vl.$scrollableParentEl = vl.params.scrollableParentEl ? $(vl.params.scrollableParentEl).eq(0) : vl.$pageContentEl;
  14268. if (!vl.$scrollableParentEl.length && vl.$pageContentEl.length) {
  14269. vl.$scrollableParentEl = vl.$pageContentEl;
  14270. }
  14271. vl.scrollableParentEl = vl.$scrollableParentEl[0];
  14272. // Bad scroll
  14273. if (typeof vl.params.updatableScroll !== 'undefined') {
  14274. vl.updatableScroll = vl.params.updatableScroll;
  14275. } else {
  14276. vl.updatableScroll = true;
  14277. if (Device.ios && Device.osVersion.split('.')[0] < 8) {
  14278. vl.updatableScroll = false;
  14279. }
  14280. }
  14281. // Append <ul>
  14282. var ul = vl.params.ul;
  14283. vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
  14284. if (vl.$ul.length === 0 && vl.params.createUl) {
  14285. vl.$el.append('<ul></ul>');
  14286. vl.$ul = vl.$el.children('ul');
  14287. }
  14288. vl.ul = vl.$ul[0];
  14289. var $itemsWrapEl;
  14290. if (!vl.ul && !vl.params.createUl) { $itemsWrapEl = vl.$el; }
  14291. else { $itemsWrapEl = vl.$ul; }
  14292. Utils.extend(vl, {
  14293. $itemsWrapEl: $itemsWrapEl,
  14294. itemsWrapEl: $itemsWrapEl[0],
  14295. // DOM cached items
  14296. domCache: {},
  14297. displayDomCache: {},
  14298. // Temporary DOM Element
  14299. tempDomElement: doc.createElement('ul'),
  14300. // Last repain position
  14301. lastRepaintY: null,
  14302. // Fragment
  14303. fragment: doc.createDocumentFragment(),
  14304. // Props
  14305. pageHeight: undefined,
  14306. rowsPerScreen: undefined,
  14307. rowsBefore: undefined,
  14308. rowsAfter: undefined,
  14309. rowsToRender: undefined,
  14310. maxBufferHeight: 0,
  14311. listHeight: undefined,
  14312. dynamicHeight: typeof vl.params.height === 'function',
  14313. });
  14314. // Install Modules
  14315. vl.useModules();
  14316. // Attach events
  14317. var handleScrollBound = vl.handleScroll.bind(vl);
  14318. var handleResizeBound = vl.handleResize.bind(vl);
  14319. var $pageEl;
  14320. var $tabEl;
  14321. var $panelEl;
  14322. var $popupEl;
  14323. vl.attachEvents = function attachEvents() {
  14324. $pageEl = vl.$el.parents('.page').eq(0);
  14325. $tabEl = vl.$el.parents('.tab').filter(function (tabElIndex, tabEl) {
  14326. return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
  14327. }).eq(0);
  14328. $panelEl = vl.$el.parents('.panel').eq(0);
  14329. $popupEl = vl.$el.parents('.popup').eq(0);
  14330. vl.$scrollableParentEl.on('scroll', handleScrollBound);
  14331. if ($pageEl.length) { $pageEl.on('page:reinit', handleResizeBound); }
  14332. if ($tabEl.length) { $tabEl.on('tab:show', handleResizeBound); }
  14333. if ($panelEl.length) { $panelEl.on('panel:open', handleResizeBound); }
  14334. if ($popupEl.length) { $popupEl.on('popup:open', handleResizeBound); }
  14335. app.on('resize', handleResizeBound);
  14336. };
  14337. vl.detachEvents = function attachEvents() {
  14338. vl.$scrollableParentEl.off('scroll', handleScrollBound);
  14339. if ($pageEl.length) { $pageEl.off('page:reinit', handleResizeBound); }
  14340. if ($tabEl.length) { $tabEl.off('tab:show', handleResizeBound); }
  14341. if ($panelEl.length) { $panelEl.off('panel:open', handleResizeBound); }
  14342. if ($popupEl.length) { $popupEl.off('popup:open', handleResizeBound); }
  14343. app.off('resize', handleResizeBound);
  14344. };
  14345. // Init
  14346. vl.init();
  14347. return vl;
  14348. }
  14349. if ( Framework7Class ) VirtualList.__proto__ = Framework7Class;
  14350. VirtualList.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  14351. VirtualList.prototype.constructor = VirtualList;
  14352. VirtualList.prototype.setListSize = function setListSize () {
  14353. var vl = this;
  14354. var items = vl.filteredItems || vl.items;
  14355. vl.pageHeight = vl.$scrollableParentEl[0].offsetHeight;
  14356. if (vl.dynamicHeight) {
  14357. vl.listHeight = 0;
  14358. vl.heights = [];
  14359. for (var i = 0; i < items.length; i += 1) {
  14360. var itemHeight = vl.params.height(items[i]);
  14361. vl.listHeight += itemHeight;
  14362. vl.heights.push(itemHeight);
  14363. }
  14364. } else {
  14365. vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
  14366. vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
  14367. vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
  14368. vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
  14369. vl.rowsToRender = (vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter);
  14370. vl.maxBufferHeight = (vl.rowsBefore / 2) * vl.params.height;
  14371. }
  14372. if (vl.updatableScroll || vl.params.setListHeight) {
  14373. vl.$itemsWrapEl.css({ height: ((vl.listHeight) + "px") });
  14374. }
  14375. };
  14376. VirtualList.prototype.render = function render (force, forceScrollTop) {
  14377. var vl = this;
  14378. if (force) { vl.lastRepaintY = null; }
  14379. var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$scrollableParentEl[0].getBoundingClientRect().top);
  14380. if (typeof forceScrollTop !== 'undefined') { scrollTop = forceScrollTop; }
  14381. if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || (!vl.updatableScroll && (vl.$scrollableParentEl[0].scrollTop + vl.pageHeight >= vl.$scrollableParentEl[0].scrollHeight))) {
  14382. vl.lastRepaintY = scrollTop;
  14383. } else {
  14384. return;
  14385. }
  14386. var items = vl.filteredItems || vl.items;
  14387. var fromIndex;
  14388. var toIndex;
  14389. var heightBeforeFirstItem = 0;
  14390. var heightBeforeLastItem = 0;
  14391. if (vl.dynamicHeight) {
  14392. var itemTop = 0;
  14393. var itemHeight;
  14394. vl.maxBufferHeight = vl.pageHeight;
  14395. for (var j = 0; j < vl.heights.length; j += 1) {
  14396. itemHeight = vl.heights[j];
  14397. if (typeof fromIndex === 'undefined') {
  14398. if (itemTop + itemHeight >= scrollTop - (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize)) { fromIndex = j; }
  14399. else { heightBeforeFirstItem += itemHeight; }
  14400. }
  14401. if (typeof toIndex === 'undefined') {
  14402. if (itemTop + itemHeight >= scrollTop + (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) || j === vl.heights.length - 1) { toIndex = j + 1; }
  14403. heightBeforeLastItem += itemHeight;
  14404. }
  14405. itemTop += itemHeight;
  14406. }
  14407. toIndex = Math.min(toIndex, items.length);
  14408. } else {
  14409. fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
  14410. if (fromIndex < 0) {
  14411. fromIndex = 0;
  14412. }
  14413. toIndex = Math.min(fromIndex + (vl.rowsToRender * vl.params.cols), items.length);
  14414. }
  14415. var topPosition;
  14416. var renderExternalItems = [];
  14417. vl.reachEnd = false;
  14418. var i;
  14419. for (i = fromIndex; i < toIndex; i += 1) {
  14420. var itemEl = (void 0);
  14421. // Define real item index
  14422. var index = vl.items.indexOf(items[i]);
  14423. if (i === fromIndex) { vl.currentFromIndex = index; }
  14424. if (i === toIndex - 1) { vl.currentToIndex = index; }
  14425. if (vl.filteredItems) {
  14426. if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) { vl.reachEnd = true; }
  14427. } else if (index === vl.items.length - 1) { vl.reachEnd = true; }
  14428. // Find items
  14429. if (vl.params.renderExternal) {
  14430. renderExternalItems.push(items[i]);
  14431. } else if (vl.domCache[index]) {
  14432. itemEl = vl.domCache[index];
  14433. itemEl.f7VirtualListIndex = index;
  14434. } else {
  14435. if (vl.renderItem) {
  14436. vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
  14437. } else {
  14438. vl.tempDomElement.innerHTML = items[i].toString().trim();
  14439. }
  14440. itemEl = vl.tempDomElement.childNodes[0];
  14441. if (vl.params.cache) { vl.domCache[index] = itemEl; }
  14442. itemEl.f7VirtualListIndex = index;
  14443. }
  14444. // Set item top position
  14445. if (i === fromIndex) {
  14446. if (vl.dynamicHeight) {
  14447. topPosition = heightBeforeFirstItem;
  14448. } else {
  14449. topPosition = ((i * vl.params.height) / vl.params.cols);
  14450. }
  14451. }
  14452. if (!vl.params.renderExternal) {
  14453. itemEl.style.top = topPosition + "px";
  14454. // Before item insert
  14455. vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);
  14456. // Append item to fragment
  14457. vl.fragment.appendChild(itemEl);
  14458. }
  14459. }
  14460. // Update list height with not updatable scroll
  14461. if (!vl.updatableScroll) {
  14462. if (vl.dynamicHeight) {
  14463. vl.itemsWrapEl.style.height = heightBeforeLastItem + "px";
  14464. } else {
  14465. vl.itemsWrapEl.style.height = ((i * vl.params.height) / vl.params.cols) + "px";
  14466. }
  14467. }
  14468. // Update list html
  14469. if (vl.params.renderExternal) {
  14470. if (items && items.length === 0) {
  14471. vl.reachEnd = true;
  14472. }
  14473. } else {
  14474. vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
  14475. vl.itemsWrapEl.innerHTML = '';
  14476. vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
  14477. if (items && items.length === 0) {
  14478. vl.reachEnd = true;
  14479. if (vl.params.emptyTemplate) { vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate; }
  14480. } else {
  14481. vl.itemsWrapEl.appendChild(vl.fragment);
  14482. }
  14483. vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
  14484. }
  14485. if (typeof forceScrollTop !== 'undefined' && force) {
  14486. vl.$scrollableParentEl.scrollTop(forceScrollTop, 0);
  14487. }
  14488. if (vl.params.renderExternal) {
  14489. vl.params.renderExternal(vl, {
  14490. fromIndex: fromIndex,
  14491. toIndex: toIndex,
  14492. listHeight: vl.listHeight,
  14493. topPosition: topPosition,
  14494. items: renderExternalItems,
  14495. });
  14496. }
  14497. };
  14498. // Filter
  14499. VirtualList.prototype.filterItems = function filterItems (indexes, resetScrollTop) {
  14500. if ( resetScrollTop === void 0 ) resetScrollTop = true;
  14501. var vl = this;
  14502. vl.filteredItems = [];
  14503. for (var i = 0; i < indexes.length; i += 1) {
  14504. vl.filteredItems.push(vl.items[indexes[i]]);
  14505. }
  14506. if (resetScrollTop) {
  14507. vl.$scrollableParentEl[0].scrollTop = 0;
  14508. }
  14509. vl.update();
  14510. };
  14511. VirtualList.prototype.resetFilter = function resetFilter () {
  14512. var vl = this;
  14513. if (vl.params.showFilteredItemsOnly) {
  14514. vl.filteredItems = [];
  14515. } else {
  14516. vl.filteredItems = null;
  14517. delete vl.filteredItems;
  14518. }
  14519. vl.update();
  14520. };
  14521. VirtualList.prototype.scrollToItem = function scrollToItem (index) {
  14522. var vl = this;
  14523. if (index > vl.items.length) { return false; }
  14524. var itemTop = 0;
  14525. if (vl.dynamicHeight) {
  14526. for (var i = 0; i < index; i += 1) {
  14527. itemTop += vl.heights[i];
  14528. }
  14529. } else {
  14530. itemTop = index * vl.params.height;
  14531. }
  14532. var listTop = vl.$el[0].offsetTop;
  14533. vl.render(true, (listTop + itemTop) - parseInt(vl.$scrollableParentEl.css('padding-top'), 10));
  14534. return true;
  14535. };
  14536. VirtualList.prototype.handleScroll = function handleScroll () {
  14537. var vl = this;
  14538. vl.render();
  14539. };
  14540. // Handle resize event
  14541. VirtualList.prototype.isVisible = function isVisible () {
  14542. var vl = this;
  14543. return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
  14544. };
  14545. VirtualList.prototype.handleResize = function handleResize () {
  14546. var vl = this;
  14547. if (vl.isVisible()) {
  14548. vl.setListSize();
  14549. vl.render(true);
  14550. }
  14551. };
  14552. // Append
  14553. VirtualList.prototype.appendItems = function appendItems (items) {
  14554. var vl = this;
  14555. for (var i = 0; i < items.length; i += 1) {
  14556. vl.items.push(items[i]);
  14557. }
  14558. vl.update();
  14559. };
  14560. VirtualList.prototype.appendItem = function appendItem (item) {
  14561. var vl = this;
  14562. vl.appendItems([item]);
  14563. };
  14564. // Replace
  14565. VirtualList.prototype.replaceAllItems = function replaceAllItems (items) {
  14566. var vl = this;
  14567. vl.items = items;
  14568. delete vl.filteredItems;
  14569. vl.domCache = {};
  14570. vl.update();
  14571. };
  14572. VirtualList.prototype.replaceItem = function replaceItem (index, item) {
  14573. var vl = this;
  14574. vl.items[index] = item;
  14575. if (vl.params.cache) { delete vl.domCache[index]; }
  14576. vl.update();
  14577. };
  14578. // Prepend
  14579. VirtualList.prototype.prependItems = function prependItems (items) {
  14580. var vl = this;
  14581. for (var i = items.length - 1; i >= 0; i -= 1) {
  14582. vl.items.unshift(items[i]);
  14583. }
  14584. if (vl.params.cache) {
  14585. var newCache = {};
  14586. Object.keys(vl.domCache).forEach(function (cached) {
  14587. newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
  14588. });
  14589. vl.domCache = newCache;
  14590. }
  14591. vl.update();
  14592. };
  14593. VirtualList.prototype.prependItem = function prependItem (item) {
  14594. var vl = this;
  14595. vl.prependItems([item]);
  14596. };
  14597. // Move
  14598. VirtualList.prototype.moveItem = function moveItem (from, to) {
  14599. var vl = this;
  14600. var fromIndex = from;
  14601. var toIndex = to;
  14602. if (fromIndex === toIndex) { return; }
  14603. // remove item from array
  14604. var item = vl.items.splice(fromIndex, 1)[0];
  14605. if (toIndex >= vl.items.length) {
  14606. // Add item to the end
  14607. vl.items.push(item);
  14608. toIndex = vl.items.length - 1;
  14609. } else {
  14610. // Add item to new index
  14611. vl.items.splice(toIndex, 0, item);
  14612. }
  14613. // Update cache
  14614. if (vl.params.cache) {
  14615. var newCache = {};
  14616. Object.keys(vl.domCache).forEach(function (cached) {
  14617. var cachedIndex = parseInt(cached, 10);
  14618. var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
  14619. var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
  14620. var indexShift = fromIndex < toIndex ? -1 : 1;
  14621. if (cachedIndex < leftIndex || cachedIndex > rightIndex) { newCache[cachedIndex] = vl.domCache[cachedIndex]; }
  14622. if (cachedIndex === leftIndex) { newCache[rightIndex] = vl.domCache[cachedIndex]; }
  14623. if (cachedIndex > leftIndex && cachedIndex <= rightIndex) { newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex]; }
  14624. });
  14625. vl.domCache = newCache;
  14626. }
  14627. vl.update();
  14628. };
  14629. // Insert before
  14630. VirtualList.prototype.insertItemBefore = function insertItemBefore (index, item) {
  14631. var vl = this;
  14632. if (index === 0) {
  14633. vl.prependItem(item);
  14634. return;
  14635. }
  14636. if (index >= vl.items.length) {
  14637. vl.appendItem(item);
  14638. return;
  14639. }
  14640. vl.items.splice(index, 0, item);
  14641. // Update cache
  14642. if (vl.params.cache) {
  14643. var newCache = {};
  14644. Object.keys(vl.domCache).forEach(function (cached) {
  14645. var cachedIndex = parseInt(cached, 10);
  14646. if (cachedIndex >= index) {
  14647. newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
  14648. }
  14649. });
  14650. vl.domCache = newCache;
  14651. }
  14652. vl.update();
  14653. };
  14654. // Delete
  14655. VirtualList.prototype.deleteItems = function deleteItems (indexes) {
  14656. var vl = this;
  14657. var prevIndex;
  14658. var indexShift = 0;
  14659. var loop = function ( i ) {
  14660. var index = indexes[i];
  14661. if (typeof prevIndex !== 'undefined') {
  14662. if (index > prevIndex) {
  14663. indexShift = -i;
  14664. }
  14665. }
  14666. index += indexShift;
  14667. prevIndex = indexes[i];
  14668. // Delete item
  14669. var deletedItem = vl.items.splice(index, 1)[0];
  14670. // Delete from filtered
  14671. if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
  14672. vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
  14673. }
  14674. // Update cache
  14675. if (vl.params.cache) {
  14676. var newCache = {};
  14677. Object.keys(vl.domCache).forEach(function (cached) {
  14678. var cachedIndex = parseInt(cached, 10);
  14679. if (cachedIndex === index) {
  14680. delete vl.domCache[index];
  14681. } else if (parseInt(cached, 10) > index) {
  14682. newCache[cachedIndex - 1] = vl.domCache[cached];
  14683. } else {
  14684. newCache[cachedIndex] = vl.domCache[cached];
  14685. }
  14686. });
  14687. vl.domCache = newCache;
  14688. }
  14689. };
  14690. for (var i = 0; i < indexes.length; i += 1) loop( i );
  14691. vl.update();
  14692. };
  14693. VirtualList.prototype.deleteAllItems = function deleteAllItems () {
  14694. var vl = this;
  14695. vl.items = [];
  14696. delete vl.filteredItems;
  14697. if (vl.params.cache) { vl.domCache = {}; }
  14698. vl.update();
  14699. };
  14700. VirtualList.prototype.deleteItem = function deleteItem (index) {
  14701. var vl = this;
  14702. vl.deleteItems([index]);
  14703. };
  14704. // Clear cache
  14705. VirtualList.prototype.clearCache = function clearCache () {
  14706. var vl = this;
  14707. vl.domCache = {};
  14708. };
  14709. // Update Virtual List
  14710. VirtualList.prototype.update = function update (deleteCache) {
  14711. var vl = this;
  14712. if (deleteCache && vl.params.cache) {
  14713. vl.domCache = {};
  14714. }
  14715. vl.setListSize();
  14716. vl.render(true);
  14717. };
  14718. VirtualList.prototype.init = function init () {
  14719. var vl = this;
  14720. vl.attachEvents();
  14721. vl.setListSize();
  14722. vl.render();
  14723. };
  14724. VirtualList.prototype.destroy = function destroy () {
  14725. var vl = this;
  14726. vl.detachEvents();
  14727. vl.$el[0].f7VirtualList = null;
  14728. delete vl.$el[0].f7VirtualList;
  14729. Utils.deleteProps(vl);
  14730. vl = null;
  14731. };
  14732. return VirtualList;
  14733. }(Framework7Class));
  14734. var VirtualList$1 = {
  14735. name: 'virtualList',
  14736. static: {
  14737. VirtualList: VirtualList,
  14738. },
  14739. create: function create() {
  14740. var app = this;
  14741. app.virtualList = ConstructorMethods({
  14742. defaultSelector: '.virtual-list',
  14743. constructor: VirtualList,
  14744. app: app,
  14745. domProp: 'f7VirtualList',
  14746. });
  14747. },
  14748. };
  14749. var ListIndex = /*@__PURE__*/(function (Framework7Class) {
  14750. function ListIndex(app, params) {
  14751. if ( params === void 0 ) params = {};
  14752. Framework7Class.call(this, params, [app]);
  14753. var index = this;
  14754. var defaults = {
  14755. el: null, // where to render indexes
  14756. listEl: null, // list el to generate indexes
  14757. indexes: 'auto', // or array of indexes
  14758. iosItemHeight: 14,
  14759. mdItemHeight: 14,
  14760. auroraItemHeight: 14,
  14761. scrollList: true,
  14762. label: false,
  14763. // eslint-disable-next-line
  14764. renderItem: function renderItem(itemContent, itemIndex) {
  14765. return ("\n <li>" + itemContent + "</li>\n ").trim();
  14766. },
  14767. renderSkipPlaceholder: function renderSkipPlaceholder() {
  14768. return '<li class="list-index-skip-placeholder"></li>';
  14769. },
  14770. on: {},
  14771. };
  14772. // Extend defaults with modules params
  14773. index.useModulesParams(defaults);
  14774. index.params = Utils.extend(defaults, params);
  14775. var $el;
  14776. var $listEl;
  14777. var $pageContentEl;
  14778. var $ul;
  14779. if (index.params.el) {
  14780. $el = $(index.params.el);
  14781. } else {
  14782. return index;
  14783. }
  14784. if ($el[0].f7ListIndex) {
  14785. return $el[0].f7ListIndex;
  14786. }
  14787. $ul = $el.find('ul');
  14788. if ($ul.length === 0) {
  14789. $ul = $('<ul></ul>');
  14790. $el.append($ul);
  14791. }
  14792. if (index.params.listEl) {
  14793. $listEl = $(index.params.listEl);
  14794. }
  14795. if (index.params.indexes === 'auto' && !$listEl) {
  14796. return index;
  14797. }
  14798. if ($listEl) {
  14799. $pageContentEl = $listEl.parents('.page-content').eq(0);
  14800. } else {
  14801. $pageContentEl = $el.siblings('.page-content').eq(0);
  14802. if ($pageContentEl.length === 0) {
  14803. $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
  14804. }
  14805. }
  14806. $el[0].f7ListIndex = index;
  14807. Utils.extend(index, {
  14808. app: app,
  14809. $el: $el,
  14810. el: $el && $el[0],
  14811. $ul: $ul,
  14812. ul: $ul && $ul[0],
  14813. $listEl: $listEl,
  14814. listEl: $listEl && $listEl[0],
  14815. $pageContentEl: $pageContentEl,
  14816. pageContentEl: $pageContentEl && $pageContentEl[0],
  14817. indexes: params.indexes,
  14818. height: 0,
  14819. skipRate: 0,
  14820. });
  14821. // Install Modules
  14822. index.useModules();
  14823. // Attach events
  14824. function handleResize() {
  14825. var height = { index: index };
  14826. index.calcSize();
  14827. if (height !== index.height) {
  14828. index.render();
  14829. }
  14830. }
  14831. function handleClick(e) {
  14832. var $clickedLi = $(e.target).closest('li');
  14833. if (!$clickedLi.length) { return; }
  14834. var itemIndex = $clickedLi.index();
  14835. if (index.skipRate > 0) {
  14836. var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
  14837. itemIndex = Math.round((index.indexes.length - 1) * percentage);
  14838. }
  14839. var itemContent = index.indexes[itemIndex];
  14840. index.$el.trigger('listindex:click', { content: itemContent, index: itemIndex });
  14841. index.emit('local::click listIndexClick', index, itemContent, itemIndex);
  14842. index.$el.trigger('listindex:select', { content: itemContent, index: itemIndex });
  14843. index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
  14844. if (index.$listEl && index.params.scrollList) {
  14845. index.scrollListToIndex(itemContent, itemIndex);
  14846. }
  14847. }
  14848. var touchesStart = {};
  14849. var isTouched;
  14850. var isMoved;
  14851. var topPoint;
  14852. var bottomPoint;
  14853. var $labelEl;
  14854. var previousIndex = null;
  14855. function handleTouchStart(e) {
  14856. var $children = $ul.children();
  14857. if (!$children.length) { return; }
  14858. topPoint = $children[0].getBoundingClientRect().top;
  14859. bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
  14860. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  14861. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  14862. isTouched = true;
  14863. isMoved = false;
  14864. previousIndex = null;
  14865. }
  14866. function handleTouchMove(e) {
  14867. if (!isTouched) { return; }
  14868. if (!isMoved && index.params.label) {
  14869. $labelEl = $('<span class="list-index-label"></span>');
  14870. $el.append($labelEl);
  14871. }
  14872. isMoved = true;
  14873. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  14874. e.preventDefault();
  14875. var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
  14876. percentage = Math.min(Math.max(percentage, 0), 1);
  14877. var itemIndex = Math.round((index.indexes.length - 1) * percentage);
  14878. var itemContent = index.indexes[itemIndex];
  14879. var ulHeight = bottomPoint - topPoint;
  14880. var bubbleBottom = ((index.height - ulHeight) / 2) + ((1 - percentage) * ulHeight);
  14881. if (itemIndex !== previousIndex) {
  14882. if (index.params.label) {
  14883. $labelEl.html(itemContent).transform(("translateY(-" + bubbleBottom + "px)"));
  14884. }
  14885. if (index.$listEl && index.params.scrollList) {
  14886. index.scrollListToIndex(itemContent, itemIndex);
  14887. }
  14888. }
  14889. previousIndex = itemIndex;
  14890. index.$el.trigger('listindex:select');
  14891. index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
  14892. }
  14893. function handleTouchEnd() {
  14894. if (!isTouched) { return; }
  14895. isTouched = false;
  14896. isMoved = false;
  14897. if (index.params.label) {
  14898. if ($labelEl) { $labelEl.remove(); }
  14899. $labelEl = undefined;
  14900. }
  14901. }
  14902. var passiveListener = app.support.passiveListener ? { passive: true } : false;
  14903. index.attachEvents = function attachEvents() {
  14904. $el.parents('.tab').on('tab:show', handleResize);
  14905. $el.parents('.page').on('page:reinit', handleResize);
  14906. $el.parents('.panel').on('panel:open', handleResize);
  14907. $el
  14908. .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
  14909. .on('modal:open', handleResize);
  14910. app.on('resize', handleResize);
  14911. $el.on('click', handleClick);
  14912. $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  14913. app.on('touchmove:active', handleTouchMove);
  14914. app.on('touchend:passive', handleTouchEnd);
  14915. };
  14916. index.detachEvents = function attachEvents() {
  14917. $el.parents('.tab').off('tab:show', handleResize);
  14918. $el.parents('.page').off('page:reinit', handleResize);
  14919. $el.parents('.panel').off('panel:open', handleResize);
  14920. $el
  14921. .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
  14922. .off('modal:open', handleResize);
  14923. app.off('resize', handleResize);
  14924. $el.off('click', handleClick);
  14925. $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  14926. app.off('touchmove:active', handleTouchMove);
  14927. app.off('touchend:passive', handleTouchEnd);
  14928. };
  14929. // Init
  14930. index.init();
  14931. return index;
  14932. }
  14933. if ( Framework7Class ) ListIndex.__proto__ = Framework7Class;
  14934. ListIndex.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  14935. ListIndex.prototype.constructor = ListIndex;
  14936. // eslint-disable-next-line
  14937. ListIndex.prototype.scrollListToIndex = function scrollListToIndex (itemContent, itemIndex) {
  14938. var index = this;
  14939. var $listEl = index.$listEl;
  14940. var $pageContentEl = index.$pageContentEl;
  14941. var app = index.app;
  14942. if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) { return index; }
  14943. var $scrollToEl;
  14944. $listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
  14945. if ($scrollToEl) { return; }
  14946. var $el = $(el);
  14947. if ($el.text() === itemContent) {
  14948. $scrollToEl = $el;
  14949. }
  14950. });
  14951. if (!$scrollToEl || $scrollToEl.length === 0) { return index; }
  14952. var parentTop = $scrollToEl.parent().offset().top;
  14953. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  14954. var scrollTop = $pageContentEl[0].scrollTop;
  14955. var scrollToElTop = $scrollToEl.offset().top;
  14956. if ($pageContentEl.parents('.page-with-navbar-large').length) {
  14957. var navbarInnerEl = app.navbar.getElByPage($pageContentEl.parents('.page-with-navbar-large').eq(0));
  14958. var $titleLargeEl = $(navbarInnerEl).find('.title-large');
  14959. if ($titleLargeEl.length) {
  14960. paddingTop -= $titleLargeEl[0].offsetHeight || 0;
  14961. }
  14962. }
  14963. if (parentTop <= paddingTop) {
  14964. $pageContentEl.scrollTop((parentTop + scrollTop) - paddingTop);
  14965. } else {
  14966. $pageContentEl.scrollTop((scrollToElTop + scrollTop) - paddingTop);
  14967. }
  14968. return index;
  14969. };
  14970. ListIndex.prototype.renderSkipPlaceholder = function renderSkipPlaceholder () {
  14971. var index = this;
  14972. return index.params.renderSkipPlaceholder.call(index);
  14973. };
  14974. ListIndex.prototype.renderItem = function renderItem (itemContent, itemIndex) {
  14975. var index = this;
  14976. return index.params.renderItem.call(index, itemContent, itemIndex);
  14977. };
  14978. ListIndex.prototype.render = function render () {
  14979. var index = this;
  14980. var $ul = index.$ul;
  14981. var indexes = index.indexes;
  14982. var skipRate = index.skipRate;
  14983. var wasSkipped;
  14984. var html = indexes.map(function (itemContent, itemIndex) {
  14985. if (itemIndex % skipRate !== 0 && skipRate > 0) {
  14986. wasSkipped = true;
  14987. return '';
  14988. }
  14989. var itemHtml = index.renderItem(itemContent, itemIndex);
  14990. if (wasSkipped) {
  14991. itemHtml = index.renderSkipPlaceholder() + itemHtml;
  14992. }
  14993. wasSkipped = false;
  14994. return itemHtml;
  14995. }).join('');
  14996. $ul.html(html);
  14997. return index;
  14998. };
  14999. ListIndex.prototype.calcSize = function calcSize () {
  15000. var index = this;
  15001. var app = index.app;
  15002. var params = index.params;
  15003. var el = index.el;
  15004. var indexes = index.indexes;
  15005. var height = el.offsetHeight;
  15006. var itemHeight = params[((app.theme) + "ItemHeight")];
  15007. var maxItems = Math.floor(height / itemHeight);
  15008. var items = indexes.length;
  15009. var skipRate = 0;
  15010. if (items > maxItems) {
  15011. skipRate = Math.ceil(((items * 2) - 1) / maxItems);
  15012. }
  15013. index.height = height;
  15014. index.skipRate = skipRate;
  15015. return index;
  15016. };
  15017. ListIndex.prototype.calcIndexes = function calcIndexes () {
  15018. var index = this;
  15019. if (index.params.indexes === 'auto') {
  15020. index.indexes = [];
  15021. index.$listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
  15022. var elContent = $(el).text();
  15023. if (index.indexes.indexOf(elContent) < 0) {
  15024. index.indexes.push(elContent);
  15025. }
  15026. });
  15027. } else {
  15028. index.indexes = index.params.indexes;
  15029. }
  15030. return index;
  15031. };
  15032. ListIndex.prototype.update = function update () {
  15033. var index = this;
  15034. index.calcIndexes();
  15035. index.calcSize();
  15036. index.render();
  15037. return index;
  15038. };
  15039. ListIndex.prototype.init = function init () {
  15040. var index = this;
  15041. index.calcIndexes();
  15042. index.calcSize();
  15043. index.render();
  15044. index.attachEvents();
  15045. };
  15046. ListIndex.prototype.destroy = function destroy () {
  15047. var index = this;
  15048. index.$el.trigger('listindex:beforedestroy', index);
  15049. index.emit('local::beforeDestroy listIndexBeforeDestroy');
  15050. index.detachEvents();
  15051. if (index.$el[0]) {
  15052. index.$el[0].f7ListIndex = null;
  15053. delete index.$el[0].f7ListIndex;
  15054. }
  15055. Utils.deleteProps(index);
  15056. index = null;
  15057. };
  15058. return ListIndex;
  15059. }(Framework7Class));
  15060. var ListIndex$1 = {
  15061. name: 'listIndex',
  15062. static: {
  15063. ListIndex: ListIndex,
  15064. },
  15065. create: function create() {
  15066. var app = this;
  15067. app.listIndex = ConstructorMethods({
  15068. defaultSelector: '.list-index',
  15069. constructor: ListIndex,
  15070. app: app,
  15071. domProp: 'f7ListIndex',
  15072. });
  15073. },
  15074. on: {
  15075. tabMounted: function tabMounted(tabEl) {
  15076. var app = this;
  15077. $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
  15078. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  15079. app.listIndex.create(params);
  15080. });
  15081. },
  15082. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  15083. $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
  15084. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  15085. });
  15086. },
  15087. pageInit: function pageInit(page) {
  15088. var app = this;
  15089. page.$el.find('.list-index-init').each(function (index, listIndexEl) {
  15090. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  15091. app.listIndex.create(params);
  15092. });
  15093. },
  15094. pageBeforeRemove: function pageBeforeRemove(page) {
  15095. page.$el.find('.list-index-init').each(function (index, listIndexEl) {
  15096. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  15097. });
  15098. },
  15099. },
  15100. vnode: {
  15101. 'list-index-init': {
  15102. insert: function insert(vnode) {
  15103. var app = this;
  15104. var listIndexEl = vnode.elm;
  15105. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  15106. app.listIndex.create(params);
  15107. },
  15108. destroy: function destroy(vnode) {
  15109. var listIndexEl = vnode.elm;
  15110. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  15111. },
  15112. },
  15113. },
  15114. };
  15115. var Timeline = {
  15116. name: 'timeline',
  15117. };
  15118. var Tab = {
  15119. show: function show() {
  15120. var assign, assign$1, assign$2;
  15121. var args = [], len = arguments.length;
  15122. while ( len-- ) args[ len ] = arguments[ len ];
  15123. var app = this;
  15124. var tabEl;
  15125. var tabLinkEl;
  15126. var animate;
  15127. var tabRoute;
  15128. var animatedInit;
  15129. if (args.length === 1 && args[0] && args[0].constructor === Object) {
  15130. tabEl = args[0].tabEl;
  15131. tabLinkEl = args[0].tabLinkEl;
  15132. animate = args[0].animate;
  15133. tabRoute = args[0].tabRoute;
  15134. animatedInit = args[0].animatedInit;
  15135. } else {
  15136. (assign = args, tabEl = assign[0], tabLinkEl = assign[1], animate = assign[2], tabRoute = assign[3]);
  15137. if (typeof args[1] === 'boolean') {
  15138. (assign$1 = args, tabEl = assign$1[0], animate = assign$1[1], tabLinkEl = assign$1[2], tabRoute = assign$1[3]);
  15139. if (args.length > 2 && tabLinkEl.constructor === Object) {
  15140. (assign$2 = args, tabEl = assign$2[0], animate = assign$2[1], tabRoute = assign$2[2], tabLinkEl = assign$2[3]);
  15141. }
  15142. }
  15143. }
  15144. if (typeof animate === 'undefined') { animate = true; }
  15145. var $newTabEl = $(tabEl);
  15146. if (tabRoute && $newTabEl[0]) {
  15147. $newTabEl[0].f7TabRoute = tabRoute;
  15148. }
  15149. if (!animatedInit && ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active'))) {
  15150. return {
  15151. $newTabEl: $newTabEl,
  15152. newTabEl: $newTabEl[0],
  15153. };
  15154. }
  15155. var $tabLinkEl;
  15156. if (tabLinkEl) { $tabLinkEl = $(tabLinkEl); }
  15157. var $tabsEl = $newTabEl.parent('.tabs');
  15158. if ($tabsEl.length === 0) {
  15159. return {
  15160. $newTabEl: $newTabEl,
  15161. newTabEl: $newTabEl[0],
  15162. };
  15163. }
  15164. // Release swipeouts in hidden tabs
  15165. if (app.swipeout) { app.swipeout.allowOpen = true; }
  15166. // Animated tabs
  15167. var tabsChangedCallbacks = [];
  15168. function onTabsChanged(callback) {
  15169. tabsChangedCallbacks.push(callback);
  15170. }
  15171. function tabsChanged() {
  15172. tabsChangedCallbacks.forEach(function (callback) {
  15173. callback();
  15174. });
  15175. }
  15176. var animated = false;
  15177. if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
  15178. $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
  15179. var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
  15180. if (animate && transitionDuration) {
  15181. $tabsEl.transitionEnd(tabsChanged);
  15182. animated = true;
  15183. }
  15184. var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
  15185. $tabsEl.transform(("translate3d(" + tabsTranslate + "%,0,0)"));
  15186. }
  15187. // Swipeable tabs
  15188. var swiper;
  15189. if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
  15190. swiper = $tabsEl.parent()[0].swiper;
  15191. if (swiper && swiper.activeIndex !== $newTabEl.index()) {
  15192. animated = true;
  15193. swiper
  15194. .once('slideChangeTransitionEnd', function () {
  15195. tabsChanged();
  15196. })
  15197. .slideTo($newTabEl.index(), animate ? undefined : 0);
  15198. } else if (swiper && swiper.animating) {
  15199. animated = true;
  15200. swiper
  15201. .once('slideChangeTransitionEnd', function () {
  15202. tabsChanged();
  15203. });
  15204. }
  15205. }
  15206. // Remove active class from old tabs
  15207. var $oldTabEl = $tabsEl.children('.tab-active');
  15208. $oldTabEl.removeClass('tab-active');
  15209. if (!animatedInit && (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute))) {
  15210. if ($oldTabEl.hasClass('view') && $oldTabEl.children('.page').length) {
  15211. $oldTabEl.children('.page').each(function (pageIndex, pageEl) {
  15212. $(pageEl).trigger('page:tabhide');
  15213. app.emit('pageTabHide', pageEl);
  15214. });
  15215. }
  15216. $oldTabEl.trigger('tab:hide');
  15217. app.emit('tabHide', $oldTabEl[0]);
  15218. }
  15219. // Trigger 'show' event on new tab
  15220. $newTabEl.addClass('tab-active');
  15221. if (!animatedInit && (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute))) {
  15222. if ($newTabEl.hasClass('view') && $newTabEl.children('.page').length) {
  15223. $newTabEl.children('.page').each(function (pageIndex, pageEl) {
  15224. $(pageEl).trigger('page:tabshow');
  15225. app.emit('pageTabShow', pageEl);
  15226. });
  15227. }
  15228. $newTabEl.trigger('tab:show');
  15229. app.emit('tabShow', $newTabEl[0]);
  15230. }
  15231. // Find related link for new tab
  15232. if (!$tabLinkEl) {
  15233. // Search by id
  15234. if (typeof tabEl === 'string') { $tabLinkEl = $((".tab-link[href=\"" + tabEl + "\"]")); }
  15235. else { $tabLinkEl = $((".tab-link[href=\"#" + ($newTabEl.attr('id')) + "\"]")); }
  15236. // Search by data-tab
  15237. if (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0)) {
  15238. $('[data-tab]').each(function (index, el) {
  15239. if ($newTabEl.is($(el).attr('data-tab'))) { $tabLinkEl = $(el); }
  15240. });
  15241. }
  15242. if (tabRoute && (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0))) {
  15243. $tabLinkEl = $(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
  15244. if ($tabLinkEl.length === 0) {
  15245. $tabLinkEl = $((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
  15246. }
  15247. }
  15248. if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
  15249. // eslint-disable-next-line
  15250. $tabLinkEl = $tabLinkEl.filter(function (index, tabLinkElement) {
  15251. return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
  15252. });
  15253. if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
  15254. var $pageEl = $newTabEl.parents('.page');
  15255. var $navbarEl = $(app.navbar.getElByPage($pageEl));
  15256. $tabLinkEl = $navbarEl.find(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
  15257. if ($tabLinkEl.length === 0) {
  15258. $tabLinkEl = $navbarEl.find((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
  15259. }
  15260. }
  15261. }
  15262. }
  15263. if ($tabLinkEl.length > 0) {
  15264. // Find related link for old tab
  15265. var $oldTabLinkEl;
  15266. if ($oldTabEl && $oldTabEl.length > 0) {
  15267. // Search by id
  15268. var oldTabId = $oldTabEl.attr('id');
  15269. if (oldTabId) {
  15270. $oldTabLinkEl = $((".tab-link[href=\"#" + oldTabId + "\"]"));
  15271. // Search by data-route-tab-id
  15272. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  15273. $oldTabLinkEl = $((".tab-link[data-route-tab-id=\"" + oldTabId + "\"]"));
  15274. }
  15275. }
  15276. // Search by data-tab
  15277. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  15278. $('[data-tab]').each(function (index, tabLinkElement) {
  15279. if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) { $oldTabLinkEl = $(tabLinkElement); }
  15280. });
  15281. }
  15282. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  15283. $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
  15284. }
  15285. } else if (tabRoute) {
  15286. $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
  15287. }
  15288. if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
  15289. // eslint-disable-next-line
  15290. $oldTabLinkEl = $oldTabLinkEl.filter(function (index, tabLinkElement) {
  15291. return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
  15292. });
  15293. }
  15294. if ($oldTabLinkEl && $oldTabLinkEl.length > 0) { $oldTabLinkEl.removeClass('tab-link-active'); }
  15295. // Update links' classes
  15296. if ($tabLinkEl && $tabLinkEl.length > 0) {
  15297. $tabLinkEl.addClass('tab-link-active');
  15298. // Material Highlight
  15299. if (app.theme === 'md' && app.toolbar) {
  15300. var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
  15301. if ($tabbarEl.length > 0) {
  15302. app.toolbar.setHighlight($tabbarEl);
  15303. }
  15304. }
  15305. }
  15306. }
  15307. return {
  15308. $newTabEl: $newTabEl,
  15309. newTabEl: $newTabEl[0],
  15310. $oldTabEl: $oldTabEl,
  15311. oldTabEl: $oldTabEl[0],
  15312. onTabsChanged: onTabsChanged,
  15313. animated: animated,
  15314. };
  15315. },
  15316. };
  15317. var Tabs = {
  15318. name: 'tabs',
  15319. create: function create() {
  15320. var app = this;
  15321. Utils.extend(app, {
  15322. tab: {
  15323. show: Tab.show.bind(app),
  15324. },
  15325. });
  15326. },
  15327. on: {
  15328. 'pageInit tabMounted': function onInit(pageOrTabEl) {
  15329. var $el = $(pageOrTabEl.el || pageOrTabEl);
  15330. var animatedTabEl = $el.find('.tabs-animated-wrap > .tabs > .tab-active')[0];
  15331. if (!animatedTabEl) { return; }
  15332. var app = this;
  15333. app.tab.show({ tabEl: animatedTabEl, animatedInit: true, animate: false });
  15334. },
  15335. },
  15336. clicks: {
  15337. '.tab-link': function tabLinkClick($clickedEl, data) {
  15338. if ( data === void 0 ) data = {};
  15339. if (($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0) || $clickedEl.attr('data-tab')) {
  15340. var app = this;
  15341. app.tab.show({
  15342. tabEl: data.tab || $clickedEl.attr('href'),
  15343. tabLinkEl: $clickedEl,
  15344. animate: data.animate,
  15345. });
  15346. }
  15347. },
  15348. },
  15349. };
  15350. function swipePanel(panel) {
  15351. var app = panel.app;
  15352. if (panel.swipeInitialized) {
  15353. return;
  15354. }
  15355. Utils.extend(panel, {
  15356. swipeable: true,
  15357. swipeInitialized: true,
  15358. });
  15359. var params = panel.params;
  15360. var $el = panel.$el;
  15361. var $backdropEl = panel.$backdropEl;
  15362. var side = panel.side;
  15363. var effect = panel.effect;
  15364. var otherPanel;
  15365. var isTouched;
  15366. var isGestureStarted;
  15367. var isMoved;
  15368. var isScrolling;
  15369. var isInterrupted;
  15370. var touchesStart = {};
  15371. var touchStartTime;
  15372. var touchesDiff;
  15373. var translate;
  15374. var backdropOpacity;
  15375. var panelWidth;
  15376. var direction;
  15377. var $viewEl;
  15378. var touchMoves = 0;
  15379. function handleTouchStart(e) {
  15380. if (!panel.swipeable || isGestureStarted) { return; }
  15381. if (!app.panel.allowOpen || (!params.swipe && !params.swipeOnlyClose) || isTouched) { return; }
  15382. if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) { return; }
  15383. otherPanel = app.panel.get(side === 'left' ? 'right' : 'left') || {};
  15384. var otherPanelOpened = otherPanel.opened && otherPanel.$el && !otherPanel.$el.hasClass('panel-in-breakpoint');
  15385. if (!panel.opened && otherPanelOpened) {
  15386. return;
  15387. }
  15388. if (!params.swipeOnlyClose) {
  15389. if (otherPanelOpened) { return; }
  15390. }
  15391. if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') { return; }
  15392. if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) { return; }
  15393. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  15394. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  15395. if (params.swipeOnlyClose && !panel.opened) {
  15396. return;
  15397. }
  15398. if (params.swipeActiveArea && !panel.opened) {
  15399. if (side === 'left') {
  15400. if (touchesStart.x > params.swipeActiveArea) { return; }
  15401. }
  15402. if (side === 'right') {
  15403. if (touchesStart.x < app.width - params.swipeActiveArea) { return; }
  15404. }
  15405. }
  15406. touchMoves = 0;
  15407. $viewEl = $(panel.getViewEl());
  15408. isMoved = false;
  15409. isTouched = true;
  15410. isScrolling = undefined;
  15411. isInterrupted = false;
  15412. touchStartTime = Utils.now();
  15413. direction = undefined;
  15414. }
  15415. function handleTouchMove(e) {
  15416. if (!isTouched || isGestureStarted || isInterrupted) { return; }
  15417. touchMoves += 1;
  15418. if (touchMoves < 2) { return; }
  15419. if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
  15420. isTouched = false;
  15421. return;
  15422. }
  15423. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  15424. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  15425. if (typeof isScrolling === 'undefined') {
  15426. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  15427. }
  15428. if (isScrolling) {
  15429. isTouched = false;
  15430. return;
  15431. }
  15432. if (!direction) {
  15433. if (pageX > touchesStart.x) {
  15434. direction = 'to-right';
  15435. } else {
  15436. direction = 'to-left';
  15437. }
  15438. if (params.swipeActiveArea > 0 && !panel.opened) {
  15439. if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
  15440. isTouched = false;
  15441. return;
  15442. }
  15443. if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
  15444. isTouched = false;
  15445. return;
  15446. }
  15447. }
  15448. if ($el.hasClass('panel-in-breakpoint')) {
  15449. isTouched = false;
  15450. return;
  15451. }
  15452. if (
  15453. (side === 'left'
  15454. && (
  15455. direction === 'to-left' && !$el.hasClass('panel-in')
  15456. )
  15457. )
  15458. || (side === 'right'
  15459. && (
  15460. direction === 'to-right' && !$el.hasClass('panel-in')
  15461. )
  15462. )
  15463. ) {
  15464. isTouched = false;
  15465. return;
  15466. }
  15467. }
  15468. var threshold = panel.opened ? 0 : -params.swipeThreshold;
  15469. if (side === 'right') { threshold = -threshold; }
  15470. if (!isMoved) {
  15471. if (!panel.opened) {
  15472. panel.insertToRoot();
  15473. $el.addClass('panel-in-swipe');
  15474. $backdropEl.css('visibility', 'visible');
  15475. $el.trigger('panel:swipeopen');
  15476. panel.emit('local::swipeOpen panelSwipeOpen', panel);
  15477. }
  15478. panelWidth = $el[0].offsetWidth;
  15479. if (effect === 'reveal' && $el.hasClass('panel-in-collapsed')) {
  15480. panelWidth -= parseFloat($viewEl.css(("margin-" + side)));
  15481. }
  15482. $el.transition(0);
  15483. }
  15484. isMoved = true;
  15485. e.preventDefault();
  15486. touchesDiff = (pageX - touchesStart.x) + threshold;
  15487. if (side === 'right') {
  15488. if (effect === 'cover') {
  15489. translate = touchesDiff + (panel.opened ? 0 : panelWidth);
  15490. if (translate < 0) { translate = 0; }
  15491. if (translate > panelWidth) {
  15492. translate = panelWidth;
  15493. }
  15494. } else {
  15495. translate = touchesDiff - (panel.opened ? panelWidth : 0);
  15496. if (translate > 0) { translate = 0; }
  15497. if (translate < -panelWidth) {
  15498. translate = -panelWidth;
  15499. }
  15500. }
  15501. } else {
  15502. translate = touchesDiff + (panel.opened ? panelWidth : 0);
  15503. if (translate < 0) { translate = 0; }
  15504. if (translate > panelWidth) {
  15505. translate = panelWidth;
  15506. }
  15507. }
  15508. var noFollowProgress = Math.abs(translate / panelWidth);
  15509. if (effect === 'reveal') {
  15510. if (!params.swipeNoFollow) {
  15511. $viewEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  15512. $backdropEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  15513. }
  15514. $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
  15515. panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
  15516. } else {
  15517. if (side === 'left') { translate -= panelWidth; }
  15518. if (!params.swipeNoFollow) {
  15519. $el.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  15520. $backdropEl.transition(0);
  15521. backdropOpacity = 1 - Math.abs(translate / panelWidth);
  15522. $backdropEl.css({ opacity: backdropOpacity });
  15523. }
  15524. $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
  15525. panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
  15526. }
  15527. if (params.swipeNoFollow) {
  15528. var stateChanged = (panel.opened && noFollowProgress === 0) || (!panel.opened && noFollowProgress === 1);
  15529. if (stateChanged) {
  15530. isInterrupted = true;
  15531. // eslint-disable-next-line
  15532. handleTouchEnd(e);
  15533. }
  15534. }
  15535. }
  15536. function handleTouchEnd(e) {
  15537. if (!isTouched || !isMoved) {
  15538. isTouched = false;
  15539. isMoved = false;
  15540. return;
  15541. }
  15542. var isGesture = e.type === 'gesturestart' || isGestureStarted;
  15543. isTouched = false;
  15544. isMoved = false;
  15545. var timeDiff = (new Date()).getTime() - touchStartTime;
  15546. var action;
  15547. var edge = (translate === 0 || Math.abs(translate) === panelWidth) && !params.swipeNoFollow;
  15548. var threshold = params.swipeThreshold || 0;
  15549. if (isGesture) {
  15550. action = 'reset';
  15551. } else if (!panel.opened) {
  15552. if (Math.abs(touchesDiff) < threshold) {
  15553. action = 'reset';
  15554. } else if (effect === 'cover') {
  15555. if (translate === 0) {
  15556. action = 'swap'; // open
  15557. } else if (timeDiff < 300 && Math.abs(translate) > 0) {
  15558. action = 'swap'; // open
  15559. } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
  15560. action = 'swap'; // open
  15561. } else {
  15562. action = 'reset'; // close
  15563. }
  15564. } else if (translate === 0) {
  15565. action = 'reset';
  15566. } else if (
  15567. (timeDiff < 300 && Math.abs(translate) > 0)
  15568. || (timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2))
  15569. ) {
  15570. action = 'swap';
  15571. } else {
  15572. action = 'reset';
  15573. }
  15574. } else if (effect === 'cover') {
  15575. if (translate === 0) {
  15576. action = 'reset'; // open
  15577. } else if (timeDiff < 300 && Math.abs(translate) > 0) {
  15578. action = 'swap'; // open
  15579. } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
  15580. action = 'reset'; // open
  15581. } else {
  15582. action = 'swap'; // close
  15583. }
  15584. } else if (translate === -panelWidth) {
  15585. action = 'reset';
  15586. } else if (
  15587. (timeDiff < 300 && Math.abs(translate) >= 0)
  15588. || (timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2))
  15589. ) {
  15590. if (side === 'left' && translate === panelWidth) { action = 'reset'; }
  15591. else { action = 'swap'; }
  15592. } else {
  15593. action = 'reset';
  15594. }
  15595. if (action === 'swap') {
  15596. if (panel.opened) {
  15597. panel.close(!edge);
  15598. } else {
  15599. panel.open(!edge);
  15600. }
  15601. }
  15602. var removePanelInClass = true;
  15603. if (action === 'reset') {
  15604. if (!panel.opened) {
  15605. if (edge) {
  15606. // edge position
  15607. $el.removeClass('panel-in-swipe');
  15608. } else {
  15609. removePanelInClass = false;
  15610. var target = effect === 'reveal' ? $viewEl : $el;
  15611. $('html').addClass('with-panel-closing');
  15612. target.transitionEnd(function () {
  15613. if ($el.hasClass('panel-in')) { return; }
  15614. $el.removeClass('panel-in-swipe');
  15615. $('html').removeClass('with-panel-closing');
  15616. });
  15617. }
  15618. }
  15619. }
  15620. if (effect === 'reveal') {
  15621. Utils.nextFrame(function () {
  15622. $viewEl.transition('');
  15623. $viewEl.transform('');
  15624. });
  15625. }
  15626. if (removePanelInClass) {
  15627. $el.removeClass('panel-in-swipe');
  15628. }
  15629. $el.transition('').transform('');
  15630. $backdropEl.transform('').transition('').css({ opacity: '', visibility: '' });
  15631. }
  15632. function handleGestureStart(e) {
  15633. isGestureStarted = true;
  15634. handleTouchEnd(e);
  15635. }
  15636. function handleGestureEnd() {
  15637. isGestureStarted = false;
  15638. }
  15639. // Add Events
  15640. app.on('touchstart:passive', handleTouchStart);
  15641. app.on('touchmove:active', handleTouchMove);
  15642. app.on('touchend:passive', handleTouchEnd);
  15643. app.on('gesturestart', handleGestureStart);
  15644. app.on('gestureend', handleGestureEnd);
  15645. panel.on('panelDestroy', function () {
  15646. app.off('touchstart:passive', handleTouchStart);
  15647. app.off('touchmove:active', handleTouchMove);
  15648. app.off('touchend:passive', handleTouchEnd);
  15649. app.off('gesturestart', handleGestureStart);
  15650. app.off('gestureend', handleGestureEnd);
  15651. });
  15652. }
  15653. function resizablePanel(panel) {
  15654. var app = panel.app;
  15655. if (panel.resizableInitialized) { return; }
  15656. Utils.extend(panel, {
  15657. resizable: true,
  15658. resizableWidth: null,
  15659. resizableInitialized: true,
  15660. });
  15661. var $htmlEl = $('html');
  15662. var $el = panel.$el;
  15663. var $backdropEl = panel.$backdropEl;
  15664. var side = panel.side;
  15665. var effect = panel.effect;
  15666. if (!$el) { return; }
  15667. var isTouched;
  15668. var isMoved;
  15669. var touchesStart = {};
  15670. var touchesDiff;
  15671. var panelWidth;
  15672. var $viewEl;
  15673. var panelMinWidth;
  15674. var panelMaxWidth;
  15675. var visibleByBreakpoint;
  15676. function transformCSSWidth(v) {
  15677. if (!v) { return null; }
  15678. if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
  15679. return parseInt(v, 10) / 100 * app.width;
  15680. }
  15681. var newV = parseInt(v, 10);
  15682. if (Number.isNaN(newV)) { return null; }
  15683. return newV;
  15684. }
  15685. function isResizable() {
  15686. return panel.resizable && $el.hasClass('panel-resizable');
  15687. }
  15688. function handleTouchStart(e) {
  15689. if (!isResizable()) { return; }
  15690. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  15691. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  15692. isMoved = false;
  15693. isTouched = true;
  15694. panelMinWidth = transformCSSWidth($el.css('min-width'));
  15695. panelMaxWidth = transformCSSWidth($el.css('max-width'));
  15696. visibleByBreakpoint = $el.hasClass('panel-in-breakpoint');
  15697. }
  15698. function handleTouchMove(e) {
  15699. if (!isTouched) { return; }
  15700. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  15701. if (!isMoved) {
  15702. panelWidth = $el[0].offsetWidth;
  15703. $el.transition(0);
  15704. $el.addClass('panel-resizing');
  15705. $htmlEl.css('cursor', 'col-resize');
  15706. if (effect === 'reveal' || visibleByBreakpoint) {
  15707. $viewEl = $(panel.getViewEl());
  15708. }
  15709. if (effect === 'reveal' && !visibleByBreakpoint) {
  15710. $backdropEl.transition(0);
  15711. $viewEl.transition(0);
  15712. }
  15713. }
  15714. isMoved = true;
  15715. e.preventDefault();
  15716. touchesDiff = (pageX - touchesStart.x);
  15717. var newPanelWidth = side === 'left' ? panelWidth + touchesDiff : panelWidth - touchesDiff;
  15718. if (panelMinWidth && !Number.isNaN(panelMinWidth)) {
  15719. newPanelWidth = Math.max(newPanelWidth, panelMinWidth);
  15720. }
  15721. if (panelMaxWidth && !Number.isNaN(panelMaxWidth)) {
  15722. newPanelWidth = Math.min(newPanelWidth, panelMaxWidth);
  15723. }
  15724. newPanelWidth = Math.min(Math.max(newPanelWidth, 0), app.width);
  15725. panel.resizableWidth = newPanelWidth;
  15726. $el[0].style.width = newPanelWidth + "px";
  15727. if (effect === 'reveal' && !visibleByBreakpoint) {
  15728. if ($viewEl) {
  15729. $viewEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
  15730. }
  15731. if ($backdropEl) {
  15732. $backdropEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
  15733. }
  15734. } else if (visibleByBreakpoint && $viewEl) {
  15735. $viewEl.css(("margin-" + side), (newPanelWidth + "px"));
  15736. }
  15737. $el.trigger('panel:resize', newPanelWidth);
  15738. panel.emit('local::resize panelResize', panel, newPanelWidth);
  15739. }
  15740. function handleTouchEnd() {
  15741. $('html').css('cursor', '');
  15742. if (!isTouched || !isMoved) {
  15743. isTouched = false;
  15744. isMoved = false;
  15745. return;
  15746. }
  15747. isTouched = false;
  15748. isMoved = false;
  15749. $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
  15750. $el[0].style.width = '';
  15751. if (effect === 'reveal' && !visibleByBreakpoint) {
  15752. $viewEl.transform('');
  15753. $backdropEl.transform('');
  15754. }
  15755. $el.removeClass('panel-resizing');
  15756. Utils.nextFrame(function () {
  15757. $el.transition('');
  15758. if (effect === 'reveal') {
  15759. $backdropEl.transition('');
  15760. if ($viewEl) { $viewEl.transition(''); }
  15761. }
  15762. });
  15763. }
  15764. function handleResize() {
  15765. if (!panel.opened || !panel.resizableWidth) { return; }
  15766. panelMinWidth = transformCSSWidth($el.css('min-width'));
  15767. panelMaxWidth = transformCSSWidth($el.css('max-width'));
  15768. if (panelMinWidth && !Number.isNaN(panelMinWidth) && panel.resizableWidth < panelMinWidth) {
  15769. panel.resizableWidth = Math.max(panel.resizableWidth, panelMinWidth);
  15770. }
  15771. if (panelMaxWidth && !Number.isNaN(panelMaxWidth) && panel.resizableWidth > panelMaxWidth) {
  15772. panel.resizableWidth = Math.min(panel.resizableWidth, panelMaxWidth);
  15773. }
  15774. panel.resizableWidth = Math.min(Math.max(panel.resizableWidth, 0), app.width);
  15775. $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
  15776. }
  15777. if (panel.$el.find('.panel-resize-handler').length === 0) {
  15778. panel.$el.append('<div class="panel-resize-handler"></div>');
  15779. }
  15780. panel.$resizeHandlerEl = panel.$el.children('.panel-resize-handler');
  15781. $el.addClass('panel-resizable');
  15782. // Add Events
  15783. var passive = Support.passiveListener ? { passive: true } : false;
  15784. panel.$el.on(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
  15785. app.on('touchmove:active', handleTouchMove);
  15786. app.on('touchend:passive', handleTouchEnd);
  15787. app.on('resize', handleResize);
  15788. panel.on('beforeOpen', handleResize);
  15789. panel.once('panelDestroy', function () {
  15790. $el.removeClass('panel-resizable');
  15791. panel.$resizeHandlerEl.remove();
  15792. panel.$el.off(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
  15793. app.off('touchmove:active', handleTouchMove);
  15794. app.off('touchend:passive', handleTouchEnd);
  15795. app.off('resize', handleResize);
  15796. panel.off('beforeOpen', handleResize);
  15797. });
  15798. }
  15799. var Panel = /*@__PURE__*/(function (Framework7Class) {
  15800. function Panel(app, params) {
  15801. if ( params === void 0 ) params = {};
  15802. var extendedParams = Utils.extend(
  15803. { on: {} },
  15804. app.params.panel,
  15805. params
  15806. );
  15807. Framework7Class.call(this, extendedParams, [app]);
  15808. var panel = this;
  15809. panel.params = extendedParams;
  15810. panel.$containerEl = panel.params.containerEl ? $(panel.params.containerEl).eq(0) : app.root;
  15811. panel.containerEl = panel.$containerEl[0];
  15812. var $el;
  15813. if (panel.params.el) {
  15814. $el = $(panel.params.el).eq(0);
  15815. } else if (panel.params.content) {
  15816. $el = $(panel.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  15817. }
  15818. if ($el.length === 0) { return panel; }
  15819. if ($el[0].f7Panel) { return $el[0].f7Panel; }
  15820. $el[0].f7Panel = panel;
  15821. var ref = panel.params;
  15822. var side = ref.side;
  15823. var effect = ref.effect;
  15824. var resizable = ref.resizable;
  15825. if (typeof side === 'undefined') { side = $el.hasClass('panel-left') ? 'left' : 'right'; }
  15826. if (typeof effect === 'undefined') { effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal'; }
  15827. if (typeof resizable === 'undefined') { resizable = $el.hasClass('panel-resizable'); }
  15828. var $backdropEl;
  15829. if (panel.params.backdrop && panel.params.backdropEl) {
  15830. $backdropEl = $(panel.params.backdropEl);
  15831. } else if (panel.params.backdrop) {
  15832. $backdropEl = panel.$containerEl.children('.panel-backdrop');
  15833. if ($backdropEl.length === 0) {
  15834. $backdropEl = $('<div class="panel-backdrop"></div>');
  15835. panel.$containerEl.prepend($backdropEl);
  15836. }
  15837. }
  15838. Utils.extend(panel, {
  15839. app: app,
  15840. side: side,
  15841. effect: effect,
  15842. resizable: resizable,
  15843. $el: $el,
  15844. el: $el[0],
  15845. opened: false,
  15846. $backdropEl: $backdropEl,
  15847. backdropEl: $backdropEl && $backdropEl[0],
  15848. });
  15849. // Install Modules
  15850. panel.useModules();
  15851. // Init
  15852. panel.init();
  15853. return panel;
  15854. }
  15855. if ( Framework7Class ) Panel.__proto__ = Framework7Class;
  15856. Panel.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  15857. Panel.prototype.constructor = Panel;
  15858. Panel.prototype.getViewEl = function getViewEl () {
  15859. var panel = this;
  15860. var viewEl;
  15861. if (panel.$containerEl.children('.views').length > 0) {
  15862. viewEl = panel.$containerEl.children('.views')[0];
  15863. } else {
  15864. viewEl = panel.$containerEl.children('.view')[0];
  15865. }
  15866. return viewEl;
  15867. };
  15868. Panel.prototype.enableVisibleBreakpoint = function enableVisibleBreakpoint () {
  15869. var panel = this;
  15870. panel.visibleBreakpointDisabled = false;
  15871. panel.setVisibleBreakpoint();
  15872. return panel;
  15873. };
  15874. Panel.prototype.disableVisibleBreakpoint = function disableVisibleBreakpoint () {
  15875. var panel = this;
  15876. panel.visibleBreakpointDisabled = true;
  15877. panel.setVisibleBreakpoint();
  15878. return panel;
  15879. };
  15880. Panel.prototype.toggleVisibleBreakpoint = function toggleVisibleBreakpoint () {
  15881. var panel = this;
  15882. panel.visibleBreakpointDisabled = !panel.visibleBreakpointDisabled;
  15883. panel.setVisibleBreakpoint();
  15884. return panel;
  15885. };
  15886. Panel.prototype.setVisibleBreakpoint = function setVisibleBreakpoint (emitEvents) {
  15887. var obj, obj$1, obj$2;
  15888. if ( emitEvents === void 0 ) emitEvents = true;
  15889. var panel = this;
  15890. var app = panel.app;
  15891. if (!panel.visibleBreakpointResizeHandler) {
  15892. panel.visibleBreakpointResizeHandler = function visibleBreakpointResizeHandler() {
  15893. panel.setVisibleBreakpoint();
  15894. };
  15895. app.on('resize', panel.visibleBreakpointResizeHandler);
  15896. }
  15897. var side = panel.side;
  15898. var $el = panel.$el;
  15899. var params = panel.params;
  15900. var visibleBreakpointDisabled = panel.visibleBreakpointDisabled;
  15901. var breakpoint = params.visibleBreakpoint;
  15902. var $viewEl = $(panel.getViewEl());
  15903. var wasVisible = $el.hasClass('panel-in-breakpoint');
  15904. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !visibleBreakpointDisabled) {
  15905. if (!wasVisible) {
  15906. $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
  15907. $el.addClass('panel-in-breakpoint').removeClass('panel-in panel-in-collapsed');
  15908. panel.onOpen(false);
  15909. panel.onOpened();
  15910. $viewEl.css(( obj = {}, obj[("margin-" + side)] = (($el.width()) + "px"), obj ));
  15911. app.allowPanelOpen = true;
  15912. if (emitEvents) {
  15913. panel.emit('local::breakpoint panelBreakpoint', panel);
  15914. panel.$el.trigger('panel:breakpoint');
  15915. }
  15916. } else {
  15917. $viewEl.css(( obj$1 = {}, obj$1[("margin-" + side)] = (($el.width()) + "px"), obj$1 ));
  15918. }
  15919. } else if (wasVisible) {
  15920. $el.removeClass('panel-in-breakpoint panel-in');
  15921. panel.onClose();
  15922. panel.onClosed();
  15923. $viewEl.css(( obj$2 = {}, obj$2[("margin-" + side)] = '', obj$2 ));
  15924. if (emitEvents) {
  15925. panel.emit('local::breakpoint panelBreakpoint', panel);
  15926. panel.$el.trigger('panel:breakpoint');
  15927. }
  15928. }
  15929. };
  15930. Panel.prototype.enableCollapsedBreakpoint = function enableCollapsedBreakpoint () {
  15931. var panel = this;
  15932. panel.collapsedBreakpointDisabled = false;
  15933. panel.setCollapsedBreakpoint();
  15934. return panel;
  15935. };
  15936. Panel.prototype.disableCollapsedBreakpoint = function disableCollapsedBreakpoint () {
  15937. var panel = this;
  15938. panel.collapsedBreakpointDisabled = true;
  15939. panel.setCollapsedBreakpoint();
  15940. return panel;
  15941. };
  15942. Panel.prototype.toggleCollapsedBreakpoint = function toggleCollapsedBreakpoint () {
  15943. var panel = this;
  15944. panel.collapsedBreakpointDisabled = !panel.collapsedBreakpointDisabled;
  15945. panel.setCollapsedBreakpoint();
  15946. return panel;
  15947. };
  15948. Panel.prototype.setCollapsedBreakpoint = function setCollapsedBreakpoint (emitEvents) {
  15949. var panel = this;
  15950. var app = panel.app;
  15951. if (!panel.collapsedBreakpointResizeHandler) {
  15952. panel.collapsedBreakpointResizeHandler = function collapsedBreakpointResizeHandler() {
  15953. panel.setCollapsedBreakpoint();
  15954. };
  15955. app.on('resize', panel.collapsedBreakpointResizeHandler);
  15956. }
  15957. var side = panel.side;
  15958. var $el = panel.$el;
  15959. var params = panel.params;
  15960. var collapsedBreakpointDisabled = panel.collapsedBreakpointDisabled;
  15961. if ($el.hasClass('panel-in-breakpoint')) { return; }
  15962. var breakpoint = params.collapsedBreakpoint;
  15963. var wasVisible = $el.hasClass('panel-in-collapsed');
  15964. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !collapsedBreakpointDisabled) {
  15965. if (!wasVisible) {
  15966. $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
  15967. $el.addClass('panel-in-collapsed').removeClass('panel-in');
  15968. panel.collapsed = true;
  15969. app.allowPanelOpen = true;
  15970. if (emitEvents) {
  15971. panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
  15972. panel.$el.trigger('panel:collapsedbreakpoint');
  15973. }
  15974. }
  15975. } else if (wasVisible) {
  15976. $el.removeClass('panel-in-collapsed panel-in');
  15977. panel.collapsed = false;
  15978. if (emitEvents) {
  15979. panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
  15980. panel.$el.trigger('panel:collapsedbreakpoint');
  15981. }
  15982. }
  15983. };
  15984. Panel.prototype.enableResizable = function enableResizable () {
  15985. var panel = this;
  15986. if (panel.resizableInitialized) {
  15987. panel.resizable = true;
  15988. panel.$el.addClass('panel-resizable');
  15989. } else {
  15990. resizablePanel(panel);
  15991. }
  15992. return panel;
  15993. };
  15994. Panel.prototype.disableResizable = function disableResizable () {
  15995. var panel = this;
  15996. panel.resizable = false;
  15997. panel.$el.removeClass('panel-resizable');
  15998. return panel;
  15999. };
  16000. Panel.prototype.enableSwipe = function enableSwipe () {
  16001. var panel = this;
  16002. if (panel.swipeInitialized) {
  16003. panel.swipeable = true;
  16004. } else {
  16005. swipePanel(panel);
  16006. }
  16007. return panel;
  16008. };
  16009. Panel.prototype.disableSwipe = function disableSwipe () {
  16010. var panel = this;
  16011. panel.swipeable = false;
  16012. return panel;
  16013. };
  16014. Panel.prototype.onOpen = function onOpen (modifyHtmlClasses) {
  16015. if ( modifyHtmlClasses === void 0 ) modifyHtmlClasses = true;
  16016. var panel = this;
  16017. var app = panel.app;
  16018. panel.opened = true;
  16019. app.panel.allowOpen = false;
  16020. panel.$el.trigger('panel:beforeopen');
  16021. panel.emit('local::beforeOpen panelBeforeOpen', panel);
  16022. if (modifyHtmlClasses) {
  16023. $('html').addClass(("with-panel with-panel-" + (panel.side) + "-" + (panel.effect)));
  16024. }
  16025. panel.$el.trigger('panel:open');
  16026. panel.emit('local::open panelOpen', panel);
  16027. };
  16028. Panel.prototype.onOpened = function onOpened () {
  16029. var panel = this;
  16030. var app = panel.app;
  16031. app.panel.allowOpen = true;
  16032. panel.$el.trigger('panel:opened');
  16033. panel.emit('local::opened panelOpened', panel);
  16034. };
  16035. Panel.prototype.onClose = function onClose () {
  16036. var panel = this;
  16037. var app = panel.app;
  16038. panel.opened = false;
  16039. app.panel.allowOpen = false;
  16040. panel.$el.trigger('panel:beforeclose');
  16041. panel.emit('local::beforeClose panelBeforeClose', panel);
  16042. $('html').addClass('with-panel-closing');
  16043. $('html').removeClass(("with-panel with-panel-" + (panel.side) + "-" + (panel.effect)));
  16044. panel.$el.trigger('panel:close');
  16045. panel.emit('local::close panelClose', panel);
  16046. };
  16047. Panel.prototype.onClosed = function onClosed () {
  16048. var panel = this;
  16049. var app = panel.app;
  16050. app.panel.allowOpen = true;
  16051. $('html').removeClass('with-panel-closing');
  16052. panel.$el.removeClass('panel-out');
  16053. if (panel.$backdropEl) {
  16054. var otherPanel = app.panel.get('.panel-in');
  16055. var shouldHideBackdrop = !otherPanel || (otherPanel && !otherPanel.$backdropEl);
  16056. if (shouldHideBackdrop) {
  16057. panel.$backdropEl.removeClass('panel-backdrop-in');
  16058. }
  16059. }
  16060. panel.$el.trigger('panel:closed');
  16061. panel.emit('local::closed panelClosed', panel);
  16062. };
  16063. Panel.prototype.toggle = function toggle (animate) {
  16064. if ( animate === void 0 ) animate = true;
  16065. var panel = this;
  16066. var breakpoint = panel.params.visibleBreakpoint;
  16067. var app = panel.app;
  16068. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null) {
  16069. return panel.toggleVisibleBreakpoint();
  16070. }
  16071. if (panel.opened) { panel.close(animate); }
  16072. else { panel.open(animate); }
  16073. return panel;
  16074. };
  16075. Panel.prototype.insertToRoot = function insertToRoot () {
  16076. var panel = this;
  16077. var $el = panel.$el;
  16078. var $backdropEl = panel.$backdropEl;
  16079. var $containerEl = panel.$containerEl;
  16080. var $panelParentEl = $el.parent();
  16081. var wasInDom = $el.parents(document).length > 0;
  16082. if (!$panelParentEl.is($containerEl) || $el.prevAll('.views, .view').length) {
  16083. var $insertBeforeEl = $containerEl.children('.panel, .views, .view').eq(0);
  16084. var $insertAfterEl = $containerEl.children('.panel-backdrop').eq(0);
  16085. if ($insertBeforeEl.length) {
  16086. $el.insertBefore($insertBeforeEl);
  16087. } else if ($insertAfterEl) {
  16088. $el.insertBefore($insertAfterEl);
  16089. } else {
  16090. $containerEl.prepend($el);
  16091. }
  16092. if ($backdropEl
  16093. && $backdropEl.length
  16094. && (
  16095. (
  16096. !$backdropEl.parent().is($containerEl)
  16097. && $backdropEl.nextAll('.panel').length === 0
  16098. )
  16099. || (
  16100. $backdropEl.parent().is($containerEl)
  16101. && $backdropEl.nextAll('.panel').length === 0
  16102. )
  16103. )
  16104. ) {
  16105. $backdropEl.insertBefore($el);
  16106. }
  16107. panel.once('panelClosed', function () {
  16108. if (wasInDom) {
  16109. $panelParentEl.append($el);
  16110. } else {
  16111. $el.remove();
  16112. }
  16113. });
  16114. }
  16115. };
  16116. Panel.prototype.open = function open (animate) {
  16117. if ( animate === void 0 ) animate = true;
  16118. var panel = this;
  16119. var app = panel.app;
  16120. if (!app.panel.allowOpen) { return false; }
  16121. var effect = panel.effect;
  16122. var $el = panel.$el;
  16123. var $backdropEl = panel.$backdropEl;
  16124. var opened = panel.opened;
  16125. if (!$el || $el.hasClass('panel-in')) {
  16126. return panel;
  16127. }
  16128. panel.insertToRoot();
  16129. // Ignore if opened
  16130. if (opened || $el.hasClass('panel-in-breakpoint') || $el.hasClass('panel-in')) { return false; }
  16131. // Close if some panel is opened
  16132. var otherOpenedPanel = app.panel.get('.panel-in');
  16133. if (otherOpenedPanel && otherOpenedPanel !== panel) {
  16134. otherOpenedPanel.close(animate);
  16135. }
  16136. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  16137. $el.addClass('panel-in');
  16138. if ($backdropEl) {
  16139. $backdropEl.addClass('panel-backdrop-in');
  16140. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  16141. }
  16142. if (panel.effect === 'cover') {
  16143. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  16144. panel._clientLeft = $el[0].clientLeft;
  16145. }
  16146. // Transitionend
  16147. var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
  16148. function panelTransitionEnd() {
  16149. transitionEndTarget.transitionEnd(function (e) {
  16150. if ($(e.target).is(transitionEndTarget)) {
  16151. if ($el.hasClass('panel-out')) {
  16152. panel.onClosed();
  16153. } else {
  16154. panel.onOpened();
  16155. }
  16156. } else { panelTransitionEnd(); }
  16157. });
  16158. }
  16159. if (animate) {
  16160. if ($backdropEl) {
  16161. $backdropEl.removeClass('not-animated');
  16162. }
  16163. panelTransitionEnd();
  16164. $el
  16165. .removeClass('panel-out not-animated')
  16166. .addClass('panel-in');
  16167. panel.onOpen();
  16168. } else {
  16169. if ($backdropEl) {
  16170. $backdropEl.addClass('not-animated');
  16171. }
  16172. $el.removeClass('panel-out').addClass('panel-in not-animated');
  16173. panel.onOpen();
  16174. panel.onOpened();
  16175. }
  16176. return true;
  16177. };
  16178. Panel.prototype.close = function close (animate) {
  16179. if ( animate === void 0 ) animate = true;
  16180. var panel = this;
  16181. var effect = panel.effect;
  16182. var $el = panel.$el;
  16183. var $backdropEl = panel.$backdropEl;
  16184. var opened = panel.opened;
  16185. if (!opened || $el.hasClass('panel-in-breakpoint') || !$el.hasClass('panel-in')) { return panel; }
  16186. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  16187. if ($backdropEl) {
  16188. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  16189. }
  16190. var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
  16191. function transitionEnd() {
  16192. if ($el.hasClass('panel-out')) {
  16193. panel.onClosed();
  16194. } else if ($el.hasClass('panel-in')) {
  16195. panel.onOpened();
  16196. }
  16197. $('html').removeClass('with-panel-closing');
  16198. }
  16199. if (animate) {
  16200. transitionEndTarget
  16201. .transitionEnd(function () {
  16202. transitionEnd();
  16203. });
  16204. $el
  16205. .removeClass('panel-in')
  16206. .addClass('panel-out');
  16207. // Emit close
  16208. panel.onClose();
  16209. } else {
  16210. $el
  16211. .addClass('not-animated')
  16212. .removeClass('panel-in')
  16213. .addClass('panel-out');
  16214. // Emit close
  16215. panel.onClose();
  16216. panel.onClosed();
  16217. }
  16218. return panel;
  16219. };
  16220. Panel.prototype.init = function init () {
  16221. var panel = this;
  16222. // const app = panel.app;
  16223. if (typeof panel.params.visibleBreakpoint !== 'undefined') {
  16224. panel.setVisibleBreakpoint();
  16225. }
  16226. if (typeof panel.params.collapsedBreakpoint !== 'undefined') {
  16227. panel.setCollapsedBreakpoint();
  16228. }
  16229. if (panel.params.swipe) {
  16230. panel.enableSwipe();
  16231. }
  16232. if (panel.resizable) {
  16233. panel.enableResizable();
  16234. }
  16235. };
  16236. Panel.prototype.destroy = function destroy () {
  16237. var obj;
  16238. var panel = this;
  16239. var app = panel.app;
  16240. if (!panel.$el) {
  16241. // Panel already destroyed
  16242. return;
  16243. }
  16244. panel.emit('local::beforeDestroy panelBeforeDestroy', panel);
  16245. panel.$el.trigger('panel:beforedestroy');
  16246. if (panel.visibleBreakpointResizeHandler) {
  16247. app.off('resize', panel.visibleBreakpointResizeHandler);
  16248. }
  16249. if (panel.collapsedBreakpointResizeHandler) {
  16250. app.off('resize', panel.collapsedBreakpointResizeHandler);
  16251. }
  16252. if (panel.$el.hasClass('panel-in-breakpoint') || panel.$el.hasClass('panel-in-collapsed')) {
  16253. var $viewEl = $(panel.getViewEl());
  16254. panel.$el.removeClass('panel-in-breakpoint panel-in-collapsed panel-in');
  16255. $viewEl.css(( obj = {}, obj[("margin-" + (panel.side))] = '', obj ));
  16256. panel.emit('local::breakpoint panelBreakpoint', panel);
  16257. panel.$el.trigger('panel:breakpoint');
  16258. }
  16259. panel.$el.trigger('panel:destroy');
  16260. panel.emit('local::destroy panelDestroy', panel);
  16261. if (panel.el) {
  16262. panel.el.f7Panel = null;
  16263. delete panel.el.f7Panel;
  16264. }
  16265. Utils.deleteProps(panel);
  16266. panel = null;
  16267. };
  16268. return Panel;
  16269. }(Framework7Class));
  16270. var Panel$1 = {
  16271. name: 'panel',
  16272. params: {
  16273. panel: {
  16274. opened: undefined, // default based on panel-in class
  16275. side: undefined, // default based on panel class
  16276. effect: undefined, // default based on panel class
  16277. resizable: undefined, // default based on panel-resizable class
  16278. backdrop: true,
  16279. backdropEl: undefined,
  16280. visibleBreakpoint: undefined,
  16281. collapsedBreakpoint: undefined,
  16282. swipe: false, // or true
  16283. swipeNoFollow: false, // or true
  16284. swipeOnlyClose: false,
  16285. swipeActiveArea: 0,
  16286. swipeThreshold: 0,
  16287. closeByBackdropClick: true,
  16288. containerEl: undefined,
  16289. },
  16290. },
  16291. static: {
  16292. Panel: Panel,
  16293. },
  16294. instance: {
  16295. panel: {
  16296. allowOpen: true,
  16297. },
  16298. },
  16299. create: function create() {
  16300. var app = this;
  16301. Utils.extend(app.panel, {
  16302. create: function create(params) {
  16303. return new Panel(app, params);
  16304. },
  16305. get: function get(el) {
  16306. if ( el === void 0 ) el = '.panel';
  16307. if (el instanceof Panel) { return el; }
  16308. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  16309. var $el = $(el);
  16310. if ($el.length === 0 || $el.length > 1) { return undefined; }
  16311. return $el[0].f7Panel;
  16312. },
  16313. destroy: function destroy(el) {
  16314. if ( el === void 0 ) el = '.panel';
  16315. var panel = app.panel.get(el);
  16316. if (panel && panel.destroy) { return panel.destroy(); }
  16317. return undefined;
  16318. },
  16319. open: function open(el, animate) {
  16320. if ( el === void 0 ) el = '.panel';
  16321. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  16322. var panel = app.panel.get(el);
  16323. if (panel && panel.open) { return panel.open(animate); }
  16324. if (!panel) {
  16325. panel = app.panel.create({ el: el });
  16326. return panel.open(animate);
  16327. }
  16328. return undefined;
  16329. },
  16330. close: function close(el, animate) {
  16331. if ( el === void 0 ) el = '.panel-in';
  16332. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  16333. var panel = app.panel.get(el);
  16334. if (panel && panel.open) { return panel.close(animate); }
  16335. if (!panel) {
  16336. panel = app.panel.create({ el: el });
  16337. return panel.close(animate);
  16338. }
  16339. return undefined;
  16340. },
  16341. toggle: function toggle(el, animate) {
  16342. if ( el === void 0 ) el = '.panel';
  16343. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  16344. var panel = app.panel.get(el);
  16345. if (panel && panel.toggle) { return panel.toggle(animate); }
  16346. if (!panel) {
  16347. panel = app.panel.create({ el: el });
  16348. return panel.toggle(animate);
  16349. }
  16350. return undefined;
  16351. },
  16352. });
  16353. },
  16354. on: {
  16355. init: function init() {
  16356. var app = this;
  16357. $('.panel-init').each(function (index, panelEl) {
  16358. var params = Object.assign(
  16359. { el: panelEl },
  16360. $(panelEl).dataset() || {}
  16361. );
  16362. app.panel.create(params);
  16363. });
  16364. },
  16365. pageInit: function pageInit(page) {
  16366. var app = this;
  16367. page.$el.find('.panel-init').each(function (index, panelEl) {
  16368. var params = Object.assign(
  16369. { el: panelEl },
  16370. $(panelEl).dataset() || {}
  16371. );
  16372. app.panel.create(params);
  16373. });
  16374. },
  16375. pageBeforeRemove: function pageBeforeRemove(page) {
  16376. var app = this;
  16377. page.$el.find('.panel-init').each(function (index, panelEl) {
  16378. var panel = app.panel.get(panelEl);
  16379. if (panel && panel.destroy) { panel.destroy(); }
  16380. });
  16381. },
  16382. },
  16383. vnode: {
  16384. 'panel-init': {
  16385. insert: function insert(vnode) {
  16386. var app = this;
  16387. var panelEl = vnode.elm;
  16388. var params = Object.assign(
  16389. { el: panelEl },
  16390. $(panelEl).dataset() || {}
  16391. );
  16392. app.panel.create(params);
  16393. },
  16394. destroy: function destroy(vnode) {
  16395. var app = this;
  16396. var panelEl = vnode.elm;
  16397. var panel = app.panel.get(panelEl);
  16398. if (panel && panel.destroy) { panel.destroy(); }
  16399. },
  16400. },
  16401. },
  16402. clicks: {
  16403. '.panel-open': function open(clickedEl, data) {
  16404. if ( data === void 0 ) data = {};
  16405. var app = this;
  16406. app.panel.open(data.panel, data.animate);
  16407. },
  16408. '.panel-close': function close(clickedEl, data) {
  16409. if ( data === void 0 ) data = {};
  16410. var app = this;
  16411. app.panel.close(data.panel, data.animate);
  16412. },
  16413. '.panel-toggle': function close(clickedEl, data) {
  16414. if ( data === void 0 ) data = {};
  16415. var app = this;
  16416. app.panel.toggle(data.panel, data.animate);
  16417. },
  16418. '.panel-backdrop': function close() {
  16419. var app = this;
  16420. var $panelEl = $('.panel-in:not(.panel-out)');
  16421. if (!$panelEl.length) { return; }
  16422. var instance = $panelEl[0] && $panelEl[0].f7Panel;
  16423. $panelEl.trigger('panel:backdrop-click');
  16424. if (instance) {
  16425. instance.emit('backdropClick', instance);
  16426. }
  16427. app.emit('panelBackdropClick', instance || $panelEl[0]);
  16428. if (app.params.panel.closeByBackdropClick) { app.panel.close(); }
  16429. },
  16430. },
  16431. };
  16432. /* eslint no-param-reassign: "off" */
  16433. var CardExpandable = {
  16434. open: function open(cardEl, animate) {
  16435. var assign;
  16436. if ( cardEl === void 0 ) cardEl = '.card-expandable';
  16437. if ( animate === void 0 ) animate = true;
  16438. var app = this;
  16439. var $cardEl = $(cardEl).eq(0);
  16440. if (!$cardEl || !$cardEl.length) { return; }
  16441. if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
  16442. var $pageEl = $cardEl.parents('.page').eq(0);
  16443. if (!$pageEl.length) { return; }
  16444. if ($pageEl.find('.card-opened').length) {
  16445. return;
  16446. }
  16447. var prevented;
  16448. function prevent() {
  16449. prevented = true;
  16450. }
  16451. $cardEl.trigger('card:beforeopen', { prevent: prevent });
  16452. app.emit('cardBeforeOpen', $cardEl[0], prevent);
  16453. if (prevented) { return; }
  16454. var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
  16455. var $pageContentEl = $cardEl.parents('.page-content');
  16456. var $backdropEl;
  16457. if ($cardEl.attr('data-backdrop-el')) {
  16458. $backdropEl = $($cardEl.attr('data-backdrop-el'));
  16459. }
  16460. if (!$backdropEl && cardParams.backdrop) {
  16461. $backdropEl = $pageContentEl.find('.card-backdrop');
  16462. if (!$backdropEl.length) {
  16463. $backdropEl = $('<div class="card-backdrop"></div>');
  16464. $pageContentEl.append($backdropEl);
  16465. }
  16466. }
  16467. var $navbarEl;
  16468. var $toolbarEl;
  16469. if (cardParams.hideNavbarOnOpen) {
  16470. $navbarEl = $pageEl.children('.navbar');
  16471. if (!$navbarEl.length) {
  16472. if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
  16473. }
  16474. }
  16475. if (cardParams.hideToolbarOnOpen) {
  16476. $toolbarEl = $pageEl.children('.toolbar');
  16477. if (!$toolbarEl.length) {
  16478. $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  16479. }
  16480. if (!$toolbarEl.length) {
  16481. $toolbarEl = $pageEl.parents('.views').children('.toolbar');
  16482. }
  16483. }
  16484. var currTransform = $cardEl.css('transform');
  16485. var hasTransform;
  16486. if (currTransform && currTransform.match(/[2-9]/)) {
  16487. hasTransform = true;
  16488. }
  16489. var $cardContentEl = $cardEl.children('.card-content');
  16490. var $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');
  16491. $cardEl.append($cardSizeEl);
  16492. var cardWidth = $cardEl[0].offsetWidth;
  16493. var cardHeight = $cardEl[0].offsetHeight;
  16494. var pageWidth = $pageEl[0].offsetWidth;
  16495. var pageHeight = $pageEl[0].offsetHeight;
  16496. var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
  16497. var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
  16498. var statusbarHeight;
  16499. if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
  16500. statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
  16501. if (Number.isNaN(statusbarHeight)) { statusbarHeight = 0; }
  16502. }
  16503. if (statusbarHeight) {
  16504. maxHeight -= statusbarHeight;
  16505. }
  16506. var scaleX = maxWidth / cardWidth;
  16507. var scaleY = maxHeight / cardHeight;
  16508. var offset = $cardEl.offset();
  16509. var pageOffset = $pageEl.offset();
  16510. if (statusbarHeight) {
  16511. pageOffset.top += statusbarHeight / 2;
  16512. }
  16513. offset.left -= pageOffset.left;
  16514. var cardLeftOffset;
  16515. var cardTopOffset;
  16516. if (hasTransform) {
  16517. var transformValues = currTransform
  16518. .replace(/matrix\(|\)/g, '')
  16519. .split(',')
  16520. .map(function (el) { return el.trim(); });
  16521. if (transformValues && transformValues.length > 1) {
  16522. var scale = parseFloat(transformValues[0]);
  16523. cardLeftOffset = offset.left - cardWidth * (1 - scale) / 2;
  16524. cardTopOffset = offset.top - pageOffset.top - cardHeight * (1 - scale) / 2;
  16525. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  16526. } else {
  16527. cardLeftOffset = $cardEl[0].offsetLeft;
  16528. cardTopOffset = $cardEl[0].offsetTop - ($pageContentEl.length ? $pageContentEl[0].scrollTop : 0);
  16529. }
  16530. } else {
  16531. cardLeftOffset = offset.left;
  16532. cardTopOffset = offset.top - pageOffset.top;
  16533. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  16534. }
  16535. cardLeftOffset -= (pageWidth - maxWidth) / 2;
  16536. cardTopOffset -= (pageHeight - maxHeight) / 2;
  16537. var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
  16538. if (app.rtl) {
  16539. (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
  16540. }
  16541. var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
  16542. var translateX = (cardRightOffset - cardLeftOffset) / 2;
  16543. var translateY = (cardBottomOffset - cardTopOffset) / 2;
  16544. if (cardParams.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
  16545. if ($navbarEl.closest('.navbar-hidden').length) {
  16546. // Was hidden
  16547. $cardEl[0].f7KeepNavbarOnClose = true;
  16548. } else {
  16549. delete $cardEl[0].f7KeepNavbarOnClose;
  16550. app.navbar.hide($navbarEl, cardParams.animate, cardParams.hideStatusbarOnOpen);
  16551. }
  16552. }
  16553. if (cardParams.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
  16554. if ($toolbarEl.closest('.toolbar-hidden').length) {
  16555. // Was hidden
  16556. $cardEl[0].f7KeepToolbarOnClose = true;
  16557. } else {
  16558. delete $cardEl[0].f7KeepToolbarOnClose;
  16559. app.toolbar.hide($toolbarEl, cardParams.animate);
  16560. }
  16561. }
  16562. if ($backdropEl) {
  16563. $backdropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');
  16564. }
  16565. $cardEl.removeClass('card-transitioning');
  16566. if (cardParams.animate) {
  16567. $cardEl.addClass('card-opening');
  16568. }
  16569. $cardEl.trigger('card:open');
  16570. app.emit('cardOpen', $cardEl[0]);
  16571. function transitionEnd() {
  16572. $pageEl.addClass('page-with-card-opened');
  16573. if (app.device.ios && $pageContentEl.length) {
  16574. $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
  16575. setTimeout(function () {
  16576. $pageContentEl.css('height', '');
  16577. });
  16578. }
  16579. $cardEl.addClass('card-opened');
  16580. $cardEl.removeClass('card-opening');
  16581. $cardEl.trigger('card:opened');
  16582. app.emit('cardOpened', $cardEl[0], $pageEl[0]);
  16583. }
  16584. $cardContentEl
  16585. .css({
  16586. width: (maxWidth + "px"),
  16587. height: (maxHeight + "px"),
  16588. })
  16589. .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  16590. $cardEl
  16591. .transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  16592. if (cardParams.animate) {
  16593. $cardEl.transitionEnd(function () {
  16594. transitionEnd();
  16595. });
  16596. } else {
  16597. transitionEnd();
  16598. }
  16599. function onResize() {
  16600. var assign;
  16601. $cardEl.removeClass('card-transitioning');
  16602. cardWidth = $cardEl[0].offsetWidth;
  16603. cardHeight = $cardEl[0].offsetHeight;
  16604. pageWidth = $pageEl[0].offsetWidth;
  16605. pageHeight = $pageEl[0].offsetHeight;
  16606. maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
  16607. maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
  16608. statusbarHeight = 0;
  16609. if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
  16610. statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
  16611. if (Number.isNaN(statusbarHeight)) { statusbarHeight = 0; }
  16612. }
  16613. if (statusbarHeight) {
  16614. maxHeight -= statusbarHeight;
  16615. }
  16616. scaleX = maxWidth / cardWidth;
  16617. scaleY = maxHeight / cardHeight;
  16618. $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');
  16619. offset = $cardEl.offset();
  16620. pageOffset = $pageEl.offset();
  16621. if (statusbarHeight) {
  16622. pageOffset.top += statusbarHeight / 2;
  16623. }
  16624. offset.left -= pageOffset.left;
  16625. offset.top -= pageOffset.top;
  16626. cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
  16627. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  16628. cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
  16629. cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
  16630. cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
  16631. if (app.rtl) {
  16632. (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
  16633. }
  16634. translateX = (cardRightOffset - cardLeftOffset) / 2;
  16635. translateY = (cardBottomOffset - cardTopOffset) / 2;
  16636. $cardEl.transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  16637. $cardContentEl
  16638. .css({
  16639. width: (maxWidth + "px"),
  16640. height: (maxHeight + "px"),
  16641. })
  16642. .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  16643. }
  16644. var cardScrollTop;
  16645. var isTouched;
  16646. var isMoved;
  16647. var touchStartX;
  16648. var touchStartY;
  16649. var touchEndX;
  16650. var touchEndY;
  16651. var isScrolling;
  16652. var progress;
  16653. var isV;
  16654. var isH;
  16655. var $cardScrollableEl;
  16656. function onTouchStart(e) {
  16657. if (!$(e.target).closest($cardEl).length) { return; }
  16658. if (!$cardEl.hasClass('card-opened')) { return; }
  16659. $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
  16660. if ($cardScrollableEl[0]
  16661. && $cardScrollableEl[0] !== $cardContentEl[0]
  16662. && !$cardScrollableEl[0].contains(e.target)
  16663. ) {
  16664. cardScrollTop = 0;
  16665. } else {
  16666. cardScrollTop = $cardScrollableEl.scrollTop();
  16667. }
  16668. isTouched = true;
  16669. touchStartX = e.targetTouches[0].pageX;
  16670. touchStartY = e.targetTouches[0].pageY;
  16671. isScrolling = undefined;
  16672. isV = false;
  16673. isH = false;
  16674. }
  16675. function onTouchMove(e) {
  16676. if (!isTouched) { return; }
  16677. touchEndX = e.targetTouches[0].pageX;
  16678. touchEndY = e.targetTouches[0].pageY;
  16679. if (typeof isScrolling === 'undefined') {
  16680. isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
  16681. }
  16682. if (!isH && !isV) {
  16683. if (!isScrolling && e.targetTouches[0].clientX <= 50) {
  16684. isH = true;
  16685. } else {
  16686. isV = true;
  16687. }
  16688. }
  16689. if (!(isH || isV) || (isV && cardScrollTop !== 0)) {
  16690. isTouched = true;
  16691. isMoved = true;
  16692. return;
  16693. }
  16694. if (!isMoved) {
  16695. $cardEl.removeClass('card-transitioning');
  16696. }
  16697. isMoved = true;
  16698. progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
  16699. if ((progress > 0 && isV) || isH) {
  16700. if (isV && app.device.ios && $cardScrollableEl[0] === $cardContentEl[0]) {
  16701. $cardScrollableEl.css('-webkit-overflow-scrolling', 'auto');
  16702. $cardScrollableEl.scrollTop(0);
  16703. }
  16704. e.preventDefault();
  16705. }
  16706. if (progress > 1) { progress = Math.pow( progress, 0.3 ); }
  16707. if (progress > (isV ? 1.3 : 1.1)) {
  16708. isTouched = false;
  16709. isMoved = false;
  16710. app.card.close($cardEl);
  16711. } else {
  16712. $cardEl.transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + (scaleX * (1 - progress * 0.2)) + ", " + (scaleY * (1 - progress * 0.2)) + ")"));
  16713. }
  16714. }
  16715. function onTouchEnd() {
  16716. if (!isTouched || !isMoved) { return; }
  16717. isTouched = false;
  16718. isMoved = false;
  16719. if (app.device.ios) {
  16720. $cardScrollableEl.css('-webkit-overflow-scrolling', '');
  16721. }
  16722. if (progress >= 0.8) {
  16723. app.card.close($cardEl);
  16724. } else {
  16725. $cardEl
  16726. .addClass('card-transitioning')
  16727. .transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  16728. }
  16729. }
  16730. $cardEl[0].detachEventHandlers = function detachEventHandlers() {
  16731. app.off('resize', onResize);
  16732. if (Support.touch && cardParams.swipeToClose) {
  16733. app.off('touchstart:passive', onTouchStart);
  16734. app.off('touchmove:active', onTouchMove);
  16735. app.off('touchend:passive', onTouchEnd);
  16736. }
  16737. };
  16738. app.on('resize', onResize);
  16739. if (Support.touch && cardParams.swipeToClose) {
  16740. app.on('touchstart:passive', onTouchStart);
  16741. app.on('touchmove:active', onTouchMove);
  16742. app.on('touchend:passive', onTouchEnd);
  16743. }
  16744. },
  16745. close: function close(cardEl, animate) {
  16746. if ( cardEl === void 0 ) cardEl = '.card-expandable.card-opened';
  16747. if ( animate === void 0 ) animate = true;
  16748. var app = this;
  16749. var $cardEl = $(cardEl).eq(0);
  16750. if (!$cardEl || !$cardEl.length) { return; }
  16751. if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
  16752. var $cardContentEl = $cardEl.children('.card-content');
  16753. var $pageContentEl = $cardEl.parents('.page-content');
  16754. var $pageEl = $cardEl.parents('.page').eq(0);
  16755. if (!$pageEl.length) { return; }
  16756. var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
  16757. var $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
  16758. var $navbarEl;
  16759. var $toolbarEl;
  16760. var $backdropEl;
  16761. if ($cardEl.attr('data-backdrop-el')) {
  16762. $backdropEl = $($cardEl.attr('data-backdrop-el'));
  16763. }
  16764. if (cardParams.backdrop) {
  16765. $backdropEl = $cardEl.parents('.page-content').find('.card-backdrop');
  16766. }
  16767. if (cardParams.hideNavbarOnOpen) {
  16768. $navbarEl = $pageEl.children('.navbar');
  16769. if (!$navbarEl.length) {
  16770. if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
  16771. }
  16772. if ($navbarEl && $navbarEl.length && !$cardEl[0].f7KeepNavbarOnClose) {
  16773. app.navbar.show($navbarEl, cardParams.animate);
  16774. }
  16775. }
  16776. if (cardParams.hideToolbarOnOpen) {
  16777. $toolbarEl = $pageEl.children('.toolbar');
  16778. if (!$toolbarEl.length) {
  16779. $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  16780. }
  16781. if (!$toolbarEl.length) {
  16782. $toolbarEl = $pageEl.parents('.views').children('.toolbar');
  16783. }
  16784. if ($toolbarEl && $toolbarEl.length && !$cardEl[0].f7KeepToolbarOnClose) {
  16785. app.toolbar.show($toolbarEl, cardParams.animate);
  16786. }
  16787. }
  16788. $pageEl.removeClass('page-with-card-opened');
  16789. if (app.device.ios && $pageContentEl.length) {
  16790. $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
  16791. setTimeout(function () {
  16792. $pageContentEl.css('height', '');
  16793. });
  16794. }
  16795. if ($backdropEl && $backdropEl.length) {
  16796. $backdropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');
  16797. }
  16798. $cardEl.removeClass('card-opened card-transitioning');
  16799. if (cardParams.animate) {
  16800. $cardEl.addClass('card-closing');
  16801. } else {
  16802. $cardEl.addClass('card-no-transition');
  16803. }
  16804. $cardEl.transform('');
  16805. $cardEl.trigger('card:close');
  16806. app.emit('cardClose', $cardEl[0], $pageEl[0]);
  16807. var animateWidth = $cardEl.hasClass('card-expandable-animate-width');
  16808. function transitionEnd() {
  16809. if (!animateWidth) {
  16810. $cardContentEl
  16811. .css({
  16812. width: '',
  16813. height: '',
  16814. });
  16815. }
  16816. if ($backdropEl && $backdropEl.length) {
  16817. $backdropEl.removeClass('card-backdrop-in card-backdrop-out');
  16818. }
  16819. $cardEl.removeClass('card-closing card-no-transition');
  16820. $cardEl.trigger('card:closed');
  16821. $cardEl.find('.card-expandable-size').remove();
  16822. app.emit('cardClosed', $cardEl[0], $pageEl[0]);
  16823. }
  16824. if (animateWidth) {
  16825. $cardContentEl
  16826. .css({
  16827. width: '',
  16828. height: '',
  16829. });
  16830. }
  16831. $cardContentEl
  16832. .transform('')
  16833. .scrollTop(0, animate ? 300 : 0);
  16834. if ($cardScrollableEl.length && $cardScrollableEl[0] !== $cardContentEl[0]) {
  16835. $cardScrollableEl.scrollTop(0, animate ? 300 : 0);
  16836. }
  16837. if (animate) {
  16838. $cardContentEl.transitionEnd(function () {
  16839. transitionEnd();
  16840. });
  16841. } else {
  16842. transitionEnd();
  16843. }
  16844. if ($cardEl[0].detachEventHandlers) {
  16845. $cardEl[0].detachEventHandlers();
  16846. delete $cardEl[0].detachEventHandlers;
  16847. }
  16848. },
  16849. toggle: function toggle(cardEl, animate) {
  16850. if ( cardEl === void 0 ) cardEl = '.card-expandable';
  16851. var app = this;
  16852. var $cardEl = $(cardEl).eq(0);
  16853. if (!$cardEl.length) { return; }
  16854. if ($cardEl.hasClass('card-opened')) {
  16855. app.card.close($cardEl, animate);
  16856. } else {
  16857. app.card.open($cardEl, animate);
  16858. }
  16859. },
  16860. };
  16861. var Card = {
  16862. name: 'card',
  16863. params: {
  16864. card: {
  16865. hideNavbarOnOpen: true,
  16866. hideStatusbarOnOpen: true,
  16867. hideToolbarOnOpen: true,
  16868. scrollableEl: '.card-content',
  16869. swipeToClose: true,
  16870. closeByBackdropClick: true,
  16871. backdrop: true,
  16872. },
  16873. },
  16874. create: function create() {
  16875. var app = this;
  16876. Utils.extend(app, {
  16877. card: {
  16878. open: CardExpandable.open.bind(app),
  16879. close: CardExpandable.close.bind(app),
  16880. toggle: CardExpandable.toggle.bind(app),
  16881. },
  16882. });
  16883. },
  16884. on: {
  16885. pageBeforeIn: function pageBeforeIn(page) {
  16886. var app = this;
  16887. if (app.params.card.hideNavbarOnOpen && page.navbarEl && page.$el.find('.card-opened.card-expandable').length) {
  16888. app.navbar.hide(page.navbarEl, true, app.params.card.hideStatusbarOnOpen);
  16889. }
  16890. if (app.params.card.hideToolbarOnOpen && page.$el.find('.card-opened.card-expandable').length) {
  16891. var $toolbarEl = page.$el.children('.toolbar');
  16892. if (!$toolbarEl.length) {
  16893. $toolbarEl = page.$el.parents('.view').children('.toolbar');
  16894. }
  16895. if (!$toolbarEl.length) {
  16896. $toolbarEl = page.$el.parents('.views').children('.toolbar');
  16897. }
  16898. if ($toolbarEl && $toolbarEl.length) {
  16899. app.toolbar.hide($toolbarEl);
  16900. }
  16901. }
  16902. },
  16903. },
  16904. clicks: {
  16905. '.card-close': function closeCard($clickedEl, data) {
  16906. var app = this;
  16907. app.card.close(data.card, data.animate);
  16908. },
  16909. '.card-open': function closeCard($clickedEl, data) {
  16910. var app = this;
  16911. app.card.open(data.card, data.animate);
  16912. },
  16913. '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {
  16914. var app = this;
  16915. if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) { return; }
  16916. if ($(e.target).closest('.card-prevent-open, .card-close').length) { return; }
  16917. app.card.open($clickedEl);
  16918. },
  16919. '.card-backdrop-in': function onBackdropClick() {
  16920. var app = this;
  16921. var needToClose = false;
  16922. if (app.params.card.closeByBackdropClick) { needToClose = true; }
  16923. var $openedCardEl = $('.card-opened');
  16924. if (!$openedCardEl.length) { return; }
  16925. if ($openedCardEl.attr('data-close-by-backdrop-click') === 'true') {
  16926. needToClose = true;
  16927. } else if ($openedCardEl.attr('data-close-by-backdrop-click') === 'false') {
  16928. needToClose = false;
  16929. }
  16930. if (needToClose) { app.card.close($openedCardEl); }
  16931. },
  16932. },
  16933. };
  16934. var Chip = {
  16935. name: 'chip',
  16936. };
  16937. // Form Data
  16938. var FormData$1 = {
  16939. store: function store(form, data) {
  16940. var app = this;
  16941. var formId = form;
  16942. var $formEl = $(form);
  16943. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  16944. formId = $formEl.attr('id');
  16945. }
  16946. // Store form data in app.formsData
  16947. app.form.data[("form-" + formId)] = data;
  16948. // Store form data in local storage also
  16949. win.localStorage[("f7form-" + formId)] = JSON.stringify(data);
  16950. },
  16951. get: function get(form) {
  16952. var app = this;
  16953. var formId = form;
  16954. var $formEl = $(form);
  16955. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  16956. formId = $formEl.attr('id');
  16957. }
  16958. if (win.localStorage[("f7form-" + formId)]) {
  16959. return JSON.parse(win.localStorage[("f7form-" + formId)]);
  16960. }
  16961. if (app.form.data[("form-" + formId)]) {
  16962. return app.form.data[("form-" + formId)];
  16963. }
  16964. return undefined;
  16965. },
  16966. remove: function remove(form) {
  16967. var app = this;
  16968. var formId = form;
  16969. var $formEl = $(form);
  16970. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  16971. formId = $formEl.attr('id');
  16972. }
  16973. // Delete form data from app.formsData
  16974. if (app.form.data[("form-" + formId)]) {
  16975. app.form.data[("form-" + formId)] = '';
  16976. delete app.form.data[("form-" + formId)];
  16977. }
  16978. // Delete form data from local storage also
  16979. if (win.localStorage[("f7form-" + formId)]) {
  16980. win.localStorage[("f7form-" + formId)] = '';
  16981. win.localStorage.removeItem(("f7form-" + formId));
  16982. }
  16983. },
  16984. };
  16985. // Form Storage
  16986. var FormStorage = {
  16987. init: function init(formEl) {
  16988. var app = this;
  16989. var $formEl = $(formEl);
  16990. var formId = $formEl.attr('id');
  16991. if (!formId) { return; }
  16992. var initialData = app.form.getFormData(formId);
  16993. if (initialData) {
  16994. app.form.fillFromData($formEl, initialData);
  16995. }
  16996. function store() {
  16997. var data = app.form.convertToData($formEl);
  16998. if (!data) { return; }
  16999. app.form.storeFormData(formId, data);
  17000. $formEl.trigger('form:storedata', data);
  17001. app.emit('formStoreData', $formEl[0], data);
  17002. }
  17003. $formEl.on('change submit', store);
  17004. },
  17005. destroy: function destroy(formEl) {
  17006. var $formEl = $(formEl);
  17007. $formEl.off('change submit');
  17008. },
  17009. };
  17010. // Form To/From Data
  17011. function formToData(formEl) {
  17012. var app = this;
  17013. var $formEl = $(formEl).eq(0);
  17014. if ($formEl.length === 0) { return undefined; }
  17015. // Form data
  17016. var data = {};
  17017. // Skip input types
  17018. var skipTypes = ['submit', 'image', 'button', 'file'];
  17019. var skipNames = [];
  17020. $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
  17021. var $inputEl = $(inputEl);
  17022. if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
  17023. return;
  17024. }
  17025. var name = $inputEl.attr('name');
  17026. var type = $inputEl.attr('type');
  17027. var tag = inputEl.nodeName.toLowerCase();
  17028. if (skipTypes.indexOf(type) >= 0) { return; }
  17029. if (skipNames.indexOf(name) >= 0 || !name) { return; }
  17030. if (tag === 'select' && $inputEl.prop('multiple')) {
  17031. skipNames.push(name);
  17032. data[name] = [];
  17033. $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
  17034. if (el.selected) { data[name].push(el.value); }
  17035. });
  17036. } else {
  17037. switch (type) {
  17038. case 'checkbox':
  17039. skipNames.push(name);
  17040. data[name] = [];
  17041. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  17042. if (el.checked) { data[name].push(el.value); }
  17043. });
  17044. break;
  17045. case 'radio':
  17046. skipNames.push(name);
  17047. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  17048. if (el.checked) { data[name] = el.value; }
  17049. });
  17050. break;
  17051. default:
  17052. data[name] = $inputEl.val();
  17053. break;
  17054. }
  17055. }
  17056. });
  17057. $formEl.trigger('form:todata', data);
  17058. app.emit('formToData', $formEl[0], data);
  17059. return data;
  17060. }
  17061. function formFromData(formEl, formData) {
  17062. var app = this;
  17063. var $formEl = $(formEl).eq(0);
  17064. if (!$formEl.length) { return; }
  17065. var data = formData;
  17066. var formId = $formEl.attr('id');
  17067. if (!data && formId) {
  17068. data = app.form.getFormData(formId);
  17069. }
  17070. if (!data) { return; }
  17071. // Skip input types
  17072. var skipTypes = ['submit', 'image', 'button', 'file'];
  17073. var skipNames = [];
  17074. $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
  17075. var $inputEl = $(inputEl);
  17076. if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
  17077. return;
  17078. }
  17079. var name = $inputEl.attr('name');
  17080. var type = $inputEl.attr('type');
  17081. var tag = inputEl.nodeName.toLowerCase();
  17082. if (typeof data[name] === 'undefined' || data[name] === null) { return; }
  17083. if (skipTypes.indexOf(type) >= 0) { return; }
  17084. if (skipNames.indexOf(name) >= 0 || !name) { return; }
  17085. if (tag === 'select' && $inputEl.prop('multiple')) {
  17086. skipNames.push(name);
  17087. $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
  17088. var selectEl = el;
  17089. if (data[name].indexOf(el.value) >= 0) { selectEl.selected = true; }
  17090. else { selectEl.selected = false; }
  17091. });
  17092. } else {
  17093. switch (type) {
  17094. case 'checkbox':
  17095. skipNames.push(name);
  17096. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  17097. var checkboxEl = el;
  17098. if (data[name].indexOf(el.value) >= 0) { checkboxEl.checked = true; }
  17099. else { checkboxEl.checked = false; }
  17100. });
  17101. break;
  17102. case 'radio':
  17103. skipNames.push(name);
  17104. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  17105. var radioEl = el;
  17106. if (data[name] === el.value) { radioEl.checked = true; }
  17107. else { radioEl.checked = false; }
  17108. });
  17109. break;
  17110. default:
  17111. $inputEl.val(data[name]);
  17112. break;
  17113. }
  17114. }
  17115. if (tag === 'select' || tag === 'input' || tag === 'textarea') {
  17116. $inputEl.trigger('change', 'fromdata');
  17117. }
  17118. });
  17119. $formEl.trigger('form:fromdata', data);
  17120. app.emit('formFromData', $formEl[0], data);
  17121. }
  17122. function initAjaxForm() {
  17123. var app = this;
  17124. function onSubmitChange(e, fromData) {
  17125. var $formEl = $(this);
  17126. if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) { return; }
  17127. if (e.type === 'submit') { e.preventDefault(); }
  17128. if (e.type === 'change' && fromData === 'fromdata') { return; }
  17129. var method = ($formEl.attr('method') || 'GET').toUpperCase();
  17130. var contentType = $formEl.prop('enctype') || $formEl.attr('enctype');
  17131. var url = $formEl.attr('action');
  17132. if (!url) { return; }
  17133. var data;
  17134. if (method === 'POST') {
  17135. if (contentType === 'application/x-www-form-urlencoded') {
  17136. data = app.form.convertToData($formEl[0]);
  17137. } else {
  17138. data = new win.FormData($formEl[0]);
  17139. }
  17140. } else {
  17141. data = Utils.serializeObject(app.form.convertToData($formEl[0]));
  17142. }
  17143. app.request({
  17144. method: method,
  17145. url: url,
  17146. contentType: contentType,
  17147. data: data,
  17148. beforeSend: function beforeSend(xhr) {
  17149. $formEl.trigger('formajax:beforesend', { data: data, xhr: xhr });
  17150. app.emit('formAjaxBeforeSend', $formEl[0], data, xhr);
  17151. },
  17152. error: function error(xhr) {
  17153. $formEl.trigger('formajax:error', { data: data, xhr: xhr });
  17154. app.emit('formAjaxError', $formEl[0], data, xhr);
  17155. },
  17156. complete: function complete(xhr) {
  17157. $formEl.trigger('formajax:complete', { data: data, xhr: xhr });
  17158. app.emit('formAjaxComplete', $formEl[0], data, xhr);
  17159. },
  17160. success: function success(response, status, xhr) {
  17161. $formEl.trigger('formajax:success', { data: data, xhr: xhr });
  17162. app.emit('formAjaxSuccess', $formEl[0], data, xhr);
  17163. },
  17164. });
  17165. }
  17166. $(doc).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);
  17167. }
  17168. var Form = {
  17169. name: 'form',
  17170. create: function create() {
  17171. var app = this;
  17172. Utils.extend(app, {
  17173. form: {
  17174. data: {},
  17175. storeFormData: FormData$1.store.bind(app),
  17176. getFormData: FormData$1.get.bind(app),
  17177. removeFormData: FormData$1.remove.bind(app),
  17178. convertToData: formToData.bind(app),
  17179. fillFromData: formFromData.bind(app),
  17180. storage: {
  17181. init: FormStorage.init.bind(app),
  17182. destroy: FormStorage.destroy.bind(app),
  17183. },
  17184. },
  17185. });
  17186. },
  17187. on: {
  17188. init: function init() {
  17189. var app = this;
  17190. initAjaxForm.call(app);
  17191. },
  17192. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  17193. var app = this;
  17194. $(tabEl).find('.form-store-data').each(function (index, formEl) {
  17195. app.form.storage.destroy(formEl);
  17196. });
  17197. },
  17198. tabMounted: function tabMounted(tabEl) {
  17199. var app = this;
  17200. $(tabEl).find('.form-store-data').each(function (index, formEl) {
  17201. app.form.storage.init(formEl);
  17202. });
  17203. },
  17204. pageBeforeRemove: function pageBeforeRemove(page) {
  17205. var app = this;
  17206. page.$el.find('.form-store-data').each(function (index, formEl) {
  17207. app.form.storage.destroy(formEl);
  17208. });
  17209. },
  17210. pageInit: function pageInit(page) {
  17211. var app = this;
  17212. page.$el.find('.form-store-data').each(function (index, formEl) {
  17213. app.form.storage.init(formEl);
  17214. });
  17215. },
  17216. },
  17217. };
  17218. var Input = {
  17219. ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],
  17220. createTextareaResizableShadow: function createTextareaResizableShadow() {
  17221. var $shadowEl = $(doc.createElement('textarea'));
  17222. $shadowEl.addClass('textarea-resizable-shadow');
  17223. $shadowEl.prop({
  17224. disabled: true,
  17225. readonly: true,
  17226. });
  17227. Input.textareaResizableShadow = $shadowEl;
  17228. },
  17229. textareaResizableShadow: undefined,
  17230. resizeTextarea: function resizeTextarea(textareaEl) {
  17231. var app = this;
  17232. var $textareaEl = $(textareaEl);
  17233. if (!Input.textareaResizableShadow) {
  17234. Input.createTextareaResizableShadow();
  17235. }
  17236. var $shadowEl = Input.textareaResizableShadow;
  17237. if (!$textareaEl.length) { return; }
  17238. if (!$textareaEl.hasClass('resizable')) { return; }
  17239. if (Input.textareaResizableShadow.parents().length === 0) {
  17240. app.root.append($shadowEl);
  17241. }
  17242. var styles = win.getComputedStyle($textareaEl[0]);
  17243. ('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) {
  17244. var styleValue = styles[style];
  17245. if (('font-size line-height letter-spacing width').split(' ').indexOf(style) >= 0) {
  17246. styleValue = styleValue.replace(',', '.');
  17247. }
  17248. $shadowEl.css(style, styleValue);
  17249. });
  17250. var currentHeight = $textareaEl[0].clientHeight;
  17251. $shadowEl.val('');
  17252. var initialHeight = $shadowEl[0].scrollHeight;
  17253. $shadowEl.val($textareaEl.val());
  17254. $shadowEl.css('height', 0);
  17255. var scrollHeight = $shadowEl[0].scrollHeight;
  17256. if (currentHeight !== scrollHeight) {
  17257. if (scrollHeight > initialHeight) {
  17258. $textareaEl.css('height', (scrollHeight + "px"));
  17259. } else if (scrollHeight < currentHeight) {
  17260. $textareaEl.css('height', '');
  17261. }
  17262. if (scrollHeight > initialHeight || scrollHeight < currentHeight) {
  17263. $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
  17264. app.emit('textareaResize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
  17265. }
  17266. }
  17267. },
  17268. validate: function validate(inputEl) {
  17269. var $inputEl = $(inputEl);
  17270. if (!$inputEl.length) { return true; }
  17271. var $itemInputEl = $inputEl.parents('.item-input');
  17272. var $inputWrapEl = $inputEl.parents('.input');
  17273. function unsetReadonly() {
  17274. if ($inputEl[0].f7ValidateReadonly) {
  17275. $inputEl[0].readOnly = false;
  17276. }
  17277. }
  17278. function setReadonly() {
  17279. if ($inputEl[0].f7ValidateReadonly) {
  17280. $inputEl[0].readOnly = true;
  17281. }
  17282. }
  17283. unsetReadonly();
  17284. var validity = $inputEl[0].validity;
  17285. var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
  17286. if (!validity) {
  17287. setReadonly();
  17288. return true;
  17289. }
  17290. if (!validity.valid) {
  17291. var $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');
  17292. if (validationMessage) {
  17293. if ($errorEl.length === 0) {
  17294. $errorEl = $(("<div class=\"" + ($inputWrapEl.length ? 'input-error-message' : 'item-input-error-message') + "\"></div>"));
  17295. $errorEl.insertAfter($inputEl);
  17296. }
  17297. $errorEl.text(validationMessage);
  17298. }
  17299. if ($errorEl.length > 0) {
  17300. $itemInputEl.addClass('item-input-with-error-message');
  17301. $inputWrapEl.addClass('input-with-error-message');
  17302. }
  17303. $itemInputEl.addClass('item-input-invalid');
  17304. $inputWrapEl.addClass('input-invalid');
  17305. $inputEl.addClass('input-invalid');
  17306. setReadonly();
  17307. return false;
  17308. }
  17309. $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');
  17310. $inputWrapEl.removeClass('input-invalid input-with-error-message');
  17311. $inputEl.removeClass('input-invalid');
  17312. setReadonly();
  17313. return true;
  17314. },
  17315. validateInputs: function validateInputs(el) {
  17316. var app = this;
  17317. var validates = $(el)
  17318. .find('input, textarea, select')
  17319. .toArray()
  17320. .map(function (inputEl) { return app.input.validate(inputEl); });
  17321. return validates.indexOf(false) < 0;
  17322. },
  17323. focus: function focus(inputEl) {
  17324. var $inputEl = $(inputEl);
  17325. var type = $inputEl.attr('type');
  17326. if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
  17327. $inputEl.parents('.item-input').addClass('item-input-focused');
  17328. $inputEl.parents('.input').addClass('input-focused');
  17329. $inputEl.addClass('input-focused');
  17330. },
  17331. blur: function blur(inputEl) {
  17332. var $inputEl = $(inputEl);
  17333. $inputEl.parents('.item-input').removeClass('item-input-focused');
  17334. $inputEl.parents('.input').removeClass('input-focused');
  17335. $inputEl.removeClass('input-focused');
  17336. },
  17337. checkEmptyState: function checkEmptyState(inputEl) {
  17338. var app = this;
  17339. var $inputEl = $(inputEl);
  17340. if (!$inputEl.is('input, select, textarea, .item-input [contenteditable]')) {
  17341. $inputEl = $inputEl.find('input, select, textarea, .item-input [contenteditable]').eq(0);
  17342. }
  17343. if (!$inputEl.length) { return; }
  17344. var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
  17345. var value;
  17346. if (isContentEditable) {
  17347. if ($inputEl.find('.text-editor-placeholder').length) { value = ''; }
  17348. else { value = $inputEl.html(); }
  17349. } else {
  17350. value = $inputEl.val();
  17351. }
  17352. var $itemInputEl = $inputEl.parents('.item-input');
  17353. var $inputWrapEl = $inputEl.parents('.input');
  17354. if ((value && (typeof value === 'string' && value.trim() !== '')) || (Array.isArray(value) && value.length > 0)) {
  17355. $itemInputEl.addClass('item-input-with-value');
  17356. $inputWrapEl.addClass('input-with-value');
  17357. $inputEl.addClass('input-with-value');
  17358. $inputEl.trigger('input:notempty');
  17359. app.emit('inputNotEmpty', $inputEl[0]);
  17360. } else {
  17361. $itemInputEl.removeClass('item-input-with-value');
  17362. $inputWrapEl.removeClass('input-with-value');
  17363. $inputEl.removeClass('input-with-value');
  17364. $inputEl.trigger('input:empty');
  17365. app.emit('inputEmpty', $inputEl[0]);
  17366. }
  17367. },
  17368. scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
  17369. if ( duration === void 0 ) duration = 0;
  17370. var $inputEl = $(inputEl);
  17371. var $scrollableEl = $inputEl.parents('.page-content, .panel, .card-expandable .card-content').eq(0);
  17372. if (!$scrollableEl.length) {
  17373. return false;
  17374. }
  17375. var contentHeight = $scrollableEl[0].offsetHeight;
  17376. var contentScrollTop = $scrollableEl[0].scrollTop;
  17377. var contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);
  17378. var contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);
  17379. var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
  17380. var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
  17381. var inputHeight = $inputEl[0].offsetHeight;
  17382. var min = (inputOffsetTop + contentScrollTop) - contentPaddingTop;
  17383. var max = ((inputOffsetTop + contentScrollTop) - contentHeight) + contentPaddingBottom + inputHeight;
  17384. var centeredPosition = min + ((max - min) / 2);
  17385. if (contentScrollTop > min) {
  17386. $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
  17387. return true;
  17388. }
  17389. if (contentScrollTop < max) {
  17390. $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
  17391. return true;
  17392. }
  17393. if (force) {
  17394. $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
  17395. }
  17396. return false;
  17397. },
  17398. init: function init() {
  17399. var app = this;
  17400. Input.createTextareaResizableShadow();
  17401. function onFocus() {
  17402. var inputEl = this;
  17403. if (app.params.input.scrollIntoViewOnFocus) {
  17404. if (Device.android) {
  17405. $(win).once('resize', function () {
  17406. if (doc && doc.activeElement === inputEl) {
  17407. app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
  17408. }
  17409. });
  17410. } else {
  17411. app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
  17412. }
  17413. }
  17414. app.input.focus(inputEl);
  17415. }
  17416. function onBlur() {
  17417. var $inputEl = $(this);
  17418. var tag = $inputEl[0].nodeName.toLowerCase();
  17419. app.input.blur($inputEl);
  17420. if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {
  17421. app.input.validate($inputEl);
  17422. }
  17423. // Resize textarea
  17424. if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
  17425. if (Input.textareaResizableShadow) { Input.textareaResizableShadow.remove(); }
  17426. }
  17427. }
  17428. function onChange() {
  17429. var $inputEl = $(this);
  17430. var type = $inputEl.attr('type');
  17431. var tag = $inputEl[0].nodeName.toLowerCase();
  17432. var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
  17433. if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
  17434. // Check Empty State
  17435. app.input.checkEmptyState($inputEl);
  17436. if (isContentEditable) { return; }
  17437. // Check validation
  17438. if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
  17439. app.input.validate($inputEl);
  17440. }
  17441. // Resize textarea
  17442. if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
  17443. app.input.resizeTextarea($inputEl);
  17444. }
  17445. }
  17446. function onInvalid(e) {
  17447. var $inputEl = $(this);
  17448. if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
  17449. e.preventDefault();
  17450. app.input.validate($inputEl);
  17451. }
  17452. }
  17453. function clearInput() {
  17454. var $clicked = $(this);
  17455. var $inputEl = $clicked.siblings('input, textarea').eq(0);
  17456. var previousValue = $inputEl.val();
  17457. $inputEl
  17458. .val('')
  17459. .trigger('input change')
  17460. .focus()
  17461. .trigger('input:clear', previousValue);
  17462. app.emit('inputClear', previousValue);
  17463. }
  17464. function preventDefault(e) {
  17465. e.preventDefault();
  17466. }
  17467. $(doc).on('click', '.input-clear-button', clearInput);
  17468. $(doc).on('mousedown', '.input-clear-button', preventDefault);
  17469. $(doc).on('change input', 'input, textarea, select, .item-input [contenteditable]', onChange, true);
  17470. $(doc).on('focus', 'input, textarea, select, .item-input [contenteditable]', onFocus, true);
  17471. $(doc).on('blur', 'input, textarea, select, .item-input [contenteditable]', onBlur, true);
  17472. $(doc).on('invalid', 'input, textarea, select', onInvalid, true);
  17473. },
  17474. };
  17475. var Input$1 = {
  17476. name: 'input',
  17477. params: {
  17478. input: {
  17479. scrollIntoViewOnFocus: Device.android,
  17480. scrollIntoViewCentered: false,
  17481. scrollIntoViewDuration: 0,
  17482. scrollIntoViewAlways: false,
  17483. },
  17484. },
  17485. create: function create() {
  17486. var app = this;
  17487. Utils.extend(app, {
  17488. input: {
  17489. scrollIntoView: Input.scrollIntoView.bind(app),
  17490. focus: Input.focus.bind(app),
  17491. blur: Input.blur.bind(app),
  17492. validate: Input.validate.bind(app),
  17493. validateInputs: Input.validateInputs.bind(app),
  17494. checkEmptyState: Input.checkEmptyState.bind(app),
  17495. resizeTextarea: Input.resizeTextarea.bind(app),
  17496. init: Input.init.bind(app),
  17497. },
  17498. });
  17499. },
  17500. on: {
  17501. init: function init() {
  17502. var app = this;
  17503. app.input.init();
  17504. },
  17505. tabMounted: function tabMounted(tabEl) {
  17506. var app = this;
  17507. var $tabEl = $(tabEl);
  17508. $tabEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
  17509. var $itemInputEl = $(itemInputEl);
  17510. $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputIndex, inputEl) {
  17511. var $inputEl = $(inputEl);
  17512. if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
  17513. app.input.checkEmptyState($inputEl);
  17514. });
  17515. });
  17516. $tabEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  17517. app.input.resizeTextarea(textareaEl);
  17518. });
  17519. },
  17520. pageInit: function pageInit(page) {
  17521. var app = this;
  17522. var $pageEl = page.$el;
  17523. $pageEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
  17524. var $itemInputEl = $(itemInputEl);
  17525. $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputIndex, inputEl) {
  17526. var $inputEl = $(inputEl);
  17527. if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
  17528. app.input.checkEmptyState($inputEl);
  17529. });
  17530. });
  17531. $pageEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  17532. app.input.resizeTextarea(textareaEl);
  17533. });
  17534. },
  17535. 'panelBreakpoint panelCollapsedBreakpoint panelResize panelOpen panelSwipeOpen resize viewMasterDetailBreakpoint': function onPanelOpen(instance) {
  17536. var app = this;
  17537. if (instance && instance.$el) {
  17538. instance.$el.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  17539. app.input.resizeTextarea(textareaEl);
  17540. });
  17541. } else {
  17542. $('textarea.resizable').each(function (textareaIndex, textareaEl) {
  17543. app.input.resizeTextarea(textareaEl);
  17544. });
  17545. }
  17546. },
  17547. },
  17548. };
  17549. var Checkbox = {
  17550. name: 'checkbox',
  17551. };
  17552. var Radio = {
  17553. name: 'radio',
  17554. };
  17555. var Toggle = /*@__PURE__*/(function (Framework7Class) {
  17556. function Toggle(app, params) {
  17557. if ( params === void 0 ) params = {};
  17558. Framework7Class.call(this, params, [app]);
  17559. var toggle = this;
  17560. var defaults = {};
  17561. // Extend defaults with modules params
  17562. toggle.useModulesParams(defaults);
  17563. toggle.params = Utils.extend(defaults, params);
  17564. var el = toggle.params.el;
  17565. if (!el) { return toggle; }
  17566. var $el = $(el);
  17567. if ($el.length === 0) { return toggle; }
  17568. if ($el[0].f7Toggle) { return $el[0].f7Toggle; }
  17569. var $inputEl = $el.children('input[type="checkbox"]');
  17570. Utils.extend(toggle, {
  17571. app: app,
  17572. $el: $el,
  17573. el: $el[0],
  17574. $inputEl: $inputEl,
  17575. inputEl: $inputEl[0],
  17576. disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled,
  17577. });
  17578. Object.defineProperty(toggle, 'checked', {
  17579. enumerable: true,
  17580. configurable: true,
  17581. set: function set(checked) {
  17582. if (!toggle || typeof toggle.$inputEl === 'undefined') { return; }
  17583. if (toggle.checked === checked) { return; }
  17584. $inputEl[0].checked = checked;
  17585. toggle.$inputEl.trigger('change');
  17586. },
  17587. get: function get() {
  17588. return $inputEl[0].checked;
  17589. },
  17590. });
  17591. $el[0].f7Toggle = toggle;
  17592. var isTouched;
  17593. var touchesStart = {};
  17594. var isScrolling;
  17595. var touchesDiff;
  17596. var toggleWidth;
  17597. var touchStartTime;
  17598. var touchStartChecked;
  17599. function handleTouchStart(e) {
  17600. if (isTouched || toggle.disabled) { return; }
  17601. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  17602. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  17603. touchesDiff = 0;
  17604. isTouched = true;
  17605. isScrolling = undefined;
  17606. touchStartTime = Utils.now();
  17607. touchStartChecked = toggle.checked;
  17608. toggleWidth = $el[0].offsetWidth;
  17609. Utils.nextTick(function () {
  17610. if (isTouched) {
  17611. $el.addClass('toggle-active-state');
  17612. }
  17613. });
  17614. }
  17615. function handleTouchMove(e) {
  17616. if (!isTouched || toggle.disabled) { return; }
  17617. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  17618. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  17619. var inverter = app.rtl ? -1 : 1;
  17620. if (typeof isScrolling === 'undefined') {
  17621. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  17622. }
  17623. if (isScrolling) {
  17624. isTouched = false;
  17625. return;
  17626. }
  17627. e.preventDefault();
  17628. touchesDiff = pageX - touchesStart.x;
  17629. var changed;
  17630. if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
  17631. changed = true;
  17632. }
  17633. if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
  17634. changed = true;
  17635. }
  17636. if (changed) {
  17637. touchesStart.x = pageX;
  17638. toggle.checked = !touchStartChecked;
  17639. touchStartChecked = !touchStartChecked;
  17640. }
  17641. }
  17642. function handleTouchEnd() {
  17643. if (!isTouched || toggle.disabled) {
  17644. if (isScrolling) { $el.removeClass('toggle-active-state'); }
  17645. isTouched = false;
  17646. return;
  17647. }
  17648. var inverter = app.rtl ? -1 : 1;
  17649. isTouched = false;
  17650. $el.removeClass('toggle-active-state');
  17651. var changed;
  17652. if ((Utils.now() - touchStartTime) < 300) {
  17653. if (touchesDiff * inverter < 0 && touchStartChecked) {
  17654. changed = true;
  17655. }
  17656. if (touchesDiff * inverter > 0 && !touchStartChecked) {
  17657. changed = true;
  17658. }
  17659. if (changed) {
  17660. toggle.checked = !touchStartChecked;
  17661. }
  17662. }
  17663. }
  17664. function handleInputChange() {
  17665. toggle.$el.trigger('toggle:change');
  17666. toggle.emit('local::change toggleChange', toggle);
  17667. }
  17668. toggle.attachEvents = function attachEvents() {
  17669. var passive = Support.passiveListener ? { passive: true } : false;
  17670. $el.on(app.touchEvents.start, handleTouchStart, passive);
  17671. app.on('touchmove', handleTouchMove);
  17672. app.on('touchend:passive', handleTouchEnd);
  17673. toggle.$inputEl.on('change', handleInputChange);
  17674. };
  17675. toggle.detachEvents = function detachEvents() {
  17676. var passive = Support.passiveListener ? { passive: true } : false;
  17677. $el.off(app.touchEvents.start, handleTouchStart, passive);
  17678. app.off('touchmove', handleTouchMove);
  17679. app.off('touchend:passive', handleTouchEnd);
  17680. toggle.$inputEl.off('change', handleInputChange);
  17681. };
  17682. // Install Modules
  17683. toggle.useModules();
  17684. // Init
  17685. toggle.init();
  17686. }
  17687. if ( Framework7Class ) Toggle.__proto__ = Framework7Class;
  17688. Toggle.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  17689. Toggle.prototype.constructor = Toggle;
  17690. Toggle.prototype.toggle = function toggle () {
  17691. var toggle = this;
  17692. toggle.checked = !toggle.checked;
  17693. };
  17694. Toggle.prototype.init = function init () {
  17695. var toggle = this;
  17696. toggle.attachEvents();
  17697. };
  17698. Toggle.prototype.destroy = function destroy () {
  17699. var toggle = this;
  17700. toggle.$el.trigger('toggle:beforedestroy');
  17701. toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);
  17702. delete toggle.$el[0].f7Toggle;
  17703. toggle.detachEvents();
  17704. Utils.deleteProps(toggle);
  17705. toggle = null;
  17706. };
  17707. return Toggle;
  17708. }(Framework7Class));
  17709. var Toggle$1 = {
  17710. name: 'toggle',
  17711. create: function create() {
  17712. var app = this;
  17713. app.toggle = ConstructorMethods({
  17714. defaultSelector: '.toggle',
  17715. constructor: Toggle,
  17716. app: app,
  17717. domProp: 'f7Toggle',
  17718. });
  17719. },
  17720. static: {
  17721. Toggle: Toggle,
  17722. },
  17723. on: {
  17724. tabMounted: function tabMounted(tabEl) {
  17725. var app = this;
  17726. $(tabEl).find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
  17727. },
  17728. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  17729. $(tabEl).find('.toggle-init').each(function (index, toggleEl) {
  17730. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  17731. });
  17732. },
  17733. pageInit: function pageInit(page) {
  17734. var app = this;
  17735. page.$el.find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
  17736. },
  17737. pageBeforeRemove: function pageBeforeRemove(page) {
  17738. page.$el.find('.toggle-init').each(function (index, toggleEl) {
  17739. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  17740. });
  17741. },
  17742. },
  17743. vnode: {
  17744. 'toggle-init': {
  17745. insert: function insert(vnode) {
  17746. var app = this;
  17747. var toggleEl = vnode.elm;
  17748. app.toggle.create({ el: toggleEl });
  17749. },
  17750. destroy: function destroy(vnode) {
  17751. var toggleEl = vnode.elm;
  17752. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  17753. },
  17754. },
  17755. },
  17756. };
  17757. var Range = /*@__PURE__*/(function (Framework7Class) {
  17758. function Range(app, params) {
  17759. Framework7Class.call(this, params, [app]);
  17760. var range = this;
  17761. var defaults = {
  17762. el: null,
  17763. inputEl: null,
  17764. dual: false,
  17765. step: 1,
  17766. label: false,
  17767. min: 0,
  17768. max: 100,
  17769. value: 0,
  17770. draggableBar: true,
  17771. vertical: false,
  17772. verticalReversed: false,
  17773. formatLabel: null,
  17774. scale: false,
  17775. scaleSteps: 5,
  17776. scaleSubSteps: 0,
  17777. formatScaleLabel: null,
  17778. limitKnobPosition: app.theme === 'ios',
  17779. };
  17780. // Extend defaults with modules params
  17781. range.useModulesParams(defaults);
  17782. range.params = Utils.extend(defaults, params);
  17783. var el = range.params.el;
  17784. if (!el) { return range; }
  17785. var $el = $(el);
  17786. if ($el.length === 0) { return range; }
  17787. if ($el[0].f7Range) { return $el[0].f7Range; }
  17788. var dataset = $el.dataset();
  17789. ('step min max value scaleSteps scaleSubSteps').split(' ').forEach(function (paramName) {
  17790. if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
  17791. range.params[paramName] = parseFloat(dataset[paramName]);
  17792. }
  17793. });
  17794. ('dual label vertical verticalReversed scale').split(' ').forEach(function (paramName) {
  17795. if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
  17796. range.params[paramName] = dataset[paramName];
  17797. }
  17798. });
  17799. if (!range.params.value) {
  17800. if (typeof dataset.value !== 'undefined') { range.params.value = dataset.value; }
  17801. if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
  17802. range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
  17803. }
  17804. }
  17805. var $inputEl;
  17806. if (!range.params.dual) {
  17807. if (range.params.inputEl) {
  17808. $inputEl = $(range.params.inputEl);
  17809. } else if ($el.find('input[type="range"]').length) {
  17810. $inputEl = $el.find('input[type="range"]').eq(0);
  17811. }
  17812. }
  17813. var ref = range.params;
  17814. var dual = ref.dual;
  17815. var step = ref.step;
  17816. var label = ref.label;
  17817. var min = ref.min;
  17818. var max = ref.max;
  17819. var value = ref.value;
  17820. var vertical = ref.vertical;
  17821. var verticalReversed = ref.verticalReversed;
  17822. var scale = ref.scale;
  17823. var scaleSteps = ref.scaleSteps;
  17824. var scaleSubSteps = ref.scaleSubSteps;
  17825. var limitKnobPosition = ref.limitKnobPosition;
  17826. Utils.extend(range, {
  17827. app: app,
  17828. $el: $el,
  17829. el: $el[0],
  17830. $inputEl: $inputEl,
  17831. inputEl: $inputEl ? $inputEl[0] : undefined,
  17832. dual: dual,
  17833. step: step,
  17834. label: label,
  17835. min: min,
  17836. max: max,
  17837. value: value,
  17838. previousValue: value,
  17839. vertical: vertical,
  17840. verticalReversed: verticalReversed,
  17841. scale: scale,
  17842. scaleSteps: scaleSteps,
  17843. scaleSubSteps: scaleSubSteps,
  17844. limitKnobPosition: limitKnobPosition,
  17845. });
  17846. if ($inputEl) {
  17847. ('step min max').split(' ').forEach(function (paramName) {
  17848. if (!params[paramName] && $inputEl.attr(paramName)) {
  17849. range.params[paramName] = parseFloat($inputEl.attr(paramName));
  17850. range[paramName] = parseFloat($inputEl.attr(paramName));
  17851. }
  17852. });
  17853. if (typeof $inputEl.val() !== 'undefined') {
  17854. range.params.value = parseFloat($inputEl.val());
  17855. range.value = parseFloat($inputEl.val());
  17856. }
  17857. }
  17858. // Dual
  17859. if (range.dual) {
  17860. $el.addClass('range-slider-dual');
  17861. }
  17862. if (range.label) {
  17863. $el.addClass('range-slider-label');
  17864. }
  17865. // Vertical
  17866. if (range.vertical) {
  17867. $el.addClass('range-slider-vertical');
  17868. if (range.verticalReversed) {
  17869. $el.addClass('range-slider-vertical-reversed');
  17870. }
  17871. } else {
  17872. $el.addClass('range-slider-horizontal');
  17873. }
  17874. // Check for layout
  17875. var $barEl = $('<div class="range-bar"></div>');
  17876. var $barActiveEl = $('<div class="range-bar-active"></div>');
  17877. $barEl.append($barActiveEl);
  17878. // Create Knobs
  17879. 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 ";
  17880. var knobs = [$(knobHTML)];
  17881. if (range.dual) {
  17882. knobs.push($(knobHTML));
  17883. }
  17884. $el.append($barEl);
  17885. knobs.forEach(function ($knobEl) {
  17886. $el.append($knobEl);
  17887. });
  17888. // Labels
  17889. var labels = [];
  17890. if (range.label) {
  17891. labels.push(knobs[0].find('.range-knob-label'));
  17892. if (range.dual) {
  17893. labels.push(knobs[1].find('.range-knob-label'));
  17894. }
  17895. }
  17896. // Scale
  17897. var $scaleEl;
  17898. if (range.scale && range.scaleSteps >= 1) {
  17899. $scaleEl = $(("\n <div class=\"range-scale\">\n " + (range.renderScale()) + "\n </div>\n "));
  17900. $el.append($scaleEl);
  17901. }
  17902. Utils.extend(range, {
  17903. knobs: knobs,
  17904. labels: labels,
  17905. $barEl: $barEl,
  17906. $barActiveEl: $barActiveEl,
  17907. $scaleEl: $scaleEl,
  17908. });
  17909. $el[0].f7Range = range;
  17910. // Touch Events
  17911. var isTouched;
  17912. var touchesStart = {};
  17913. var isScrolling;
  17914. var rangeOffset;
  17915. var rangeOffsetLeft;
  17916. var rangeOffsetTop;
  17917. var $touchedKnobEl;
  17918. var dualValueIndex;
  17919. var valueChangedByTouch;
  17920. var targetTouchIdentifier;
  17921. function onTouchChange() {
  17922. valueChangedByTouch = true;
  17923. }
  17924. function handleTouchStart(e) {
  17925. if (isTouched) { return; }
  17926. if (!range.params.draggableBar) {
  17927. if ($(e.target).closest('.range-knob').length === 0) {
  17928. return;
  17929. }
  17930. }
  17931. valueChangedByTouch = false;
  17932. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  17933. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  17934. if (e.type === 'touchstart') {
  17935. targetTouchIdentifier = e.targetTouches[0].identifier;
  17936. }
  17937. isTouched = true;
  17938. isScrolling = undefined;
  17939. rangeOffset = $el.offset();
  17940. rangeOffsetLeft = rangeOffset.left;
  17941. rangeOffsetTop = rangeOffset.top;
  17942. var progress;
  17943. if (range.vertical) {
  17944. progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
  17945. if (!range.verticalReversed) { progress = 1 - progress; }
  17946. } else if (range.app.rtl) {
  17947. progress = ((rangeOffsetLeft + range.rangeWidth) - touchesStart.x) / range.rangeWidth;
  17948. } else {
  17949. progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
  17950. }
  17951. var newValue = (progress * (range.max - range.min)) + range.min;
  17952. if (range.dual) {
  17953. if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
  17954. dualValueIndex = 0;
  17955. $touchedKnobEl = range.knobs[0];
  17956. newValue = [newValue, range.value[1]];
  17957. } else {
  17958. dualValueIndex = 1;
  17959. $touchedKnobEl = range.knobs[1];
  17960. newValue = [range.value[0], newValue];
  17961. }
  17962. } else {
  17963. $touchedKnobEl = range.knobs[0];
  17964. newValue = (progress * (range.max - range.min)) + range.min;
  17965. }
  17966. Utils.nextTick(function () {
  17967. if (isTouched) { $touchedKnobEl.addClass('range-knob-active-state'); }
  17968. }, 70);
  17969. range.on('change', onTouchChange);
  17970. range.setValue(newValue, true);
  17971. }
  17972. function handleTouchMove(e) {
  17973. if (!isTouched) { return; }
  17974. var pageX;
  17975. var pageY;
  17976. if (e.type === 'touchmove') {
  17977. for (var i = 0; i < e.targetTouches.length; i += 1) {
  17978. if (e.targetTouches[i].identifier === targetTouchIdentifier) {
  17979. pageX = e.targetTouches[i].pageX;
  17980. pageY = e.targetTouches[i].pageY;
  17981. }
  17982. }
  17983. } else {
  17984. pageX = e.pageX;
  17985. pageY = e.pageY;
  17986. }
  17987. if (typeof pageX === 'undefined' && typeof pageY === 'undefined') { return; }
  17988. if (typeof isScrolling === 'undefined' && !range.vertical) {
  17989. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  17990. }
  17991. if (isScrolling) {
  17992. isTouched = false;
  17993. return;
  17994. }
  17995. e.preventDefault();
  17996. var progress;
  17997. if (range.vertical) {
  17998. progress = (pageY - rangeOffsetTop) / range.rangeHeight;
  17999. if (!range.verticalReversed) { progress = 1 - progress; }
  18000. } else if (range.app.rtl) {
  18001. progress = ((rangeOffsetLeft + range.rangeWidth) - pageX) / range.rangeWidth;
  18002. } else {
  18003. progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
  18004. }
  18005. var newValue = (progress * (range.max - range.min)) + range.min;
  18006. if (range.dual) {
  18007. var leftValue;
  18008. var rightValue;
  18009. if (dualValueIndex === 0) {
  18010. leftValue = newValue;
  18011. rightValue = range.value[1];
  18012. if (leftValue > rightValue) {
  18013. rightValue = leftValue;
  18014. }
  18015. } else {
  18016. leftValue = range.value[0];
  18017. rightValue = newValue;
  18018. if (rightValue < leftValue) {
  18019. leftValue = rightValue;
  18020. }
  18021. }
  18022. newValue = [leftValue, rightValue];
  18023. }
  18024. range.setValue(newValue, true);
  18025. }
  18026. function handleTouchEnd(e) {
  18027. if (e.type === 'touchend') {
  18028. var touchEnded;
  18029. for (var i = 0; i < e.changedTouches.length; i += 1) {
  18030. if (e.changedTouches[i].identifier === targetTouchIdentifier) { touchEnded = true; }
  18031. }
  18032. if (!touchEnded) { return; }
  18033. }
  18034. if (!isTouched) {
  18035. if (isScrolling) { $touchedKnobEl.removeClass('range-knob-active-state'); }
  18036. isTouched = false;
  18037. return;
  18038. }
  18039. range.off('change', onTouchChange);
  18040. isTouched = false;
  18041. $touchedKnobEl.removeClass('range-knob-active-state');
  18042. if (valueChangedByTouch && range.$inputEl && !range.dual) {
  18043. range.$inputEl.trigger('change');
  18044. }
  18045. valueChangedByTouch = false;
  18046. if (typeof range.previousValue !== 'undefined') {
  18047. if (
  18048. (
  18049. range.dual
  18050. && (
  18051. range.previousValue[0] !== range.value[0]
  18052. || range.previousValue[1] !== range.value[1]
  18053. )
  18054. )
  18055. || (
  18056. !range.dual
  18057. && range.previousValue !== range.value
  18058. )
  18059. ) {
  18060. range.$el.trigger('range:changed', range.value);
  18061. range.emit('local::changed rangeChanged', range, range.value);
  18062. }
  18063. }
  18064. }
  18065. function handleResize() {
  18066. range.calcSize();
  18067. range.layout();
  18068. }
  18069. var parentModals;
  18070. var parentPanel;
  18071. var parentPage;
  18072. range.attachEvents = function attachEvents() {
  18073. var passive = Support.passiveListener ? { passive: true } : false;
  18074. range.$el.on(app.touchEvents.start, handleTouchStart, passive);
  18075. app.on('touchmove', handleTouchMove);
  18076. app.on('touchend:passive', handleTouchEnd);
  18077. app.on('tabShow', handleResize);
  18078. app.on('resize', handleResize);
  18079. parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');
  18080. parentModals.on('modal:open', handleResize);
  18081. parentPanel = range.$el.parents('.panel');
  18082. parentPanel.on('panel:open panel:resize', handleResize);
  18083. parentPage = range.$el.parents('.page').eq(0);
  18084. parentPage.on('page:reinit', handleResize);
  18085. };
  18086. range.detachEvents = function detachEvents() {
  18087. var passive = Support.passiveListener ? { passive: true } : false;
  18088. range.$el.off(app.touchEvents.start, handleTouchStart, passive);
  18089. app.off('touchmove', handleTouchMove);
  18090. app.off('touchend:passive', handleTouchEnd);
  18091. app.off('tabShow', handleResize);
  18092. app.off('resize', handleResize);
  18093. if (parentModals) {
  18094. parentModals.off('modal:open', handleResize);
  18095. }
  18096. if (parentPanel) {
  18097. parentPanel.off('panel:open panel:resize', handleResize);
  18098. }
  18099. if (parentPage) {
  18100. parentPage.off('page:reinit', handleResize);
  18101. }
  18102. parentModals = null;
  18103. parentPanel = null;
  18104. parentPage = null;
  18105. };
  18106. // Install Modules
  18107. range.useModules();
  18108. // Init
  18109. range.init();
  18110. return range;
  18111. }
  18112. if ( Framework7Class ) Range.__proto__ = Framework7Class;
  18113. Range.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  18114. Range.prototype.constructor = Range;
  18115. Range.prototype.calcSize = function calcSize () {
  18116. var range = this;
  18117. if (range.vertical) {
  18118. var height = range.$el.outerHeight();
  18119. if (height === 0) { return; }
  18120. range.rangeHeight = height;
  18121. range.knobHeight = range.knobs[0].outerHeight();
  18122. } else {
  18123. var width = range.$el.outerWidth();
  18124. if (width === 0) { return; }
  18125. range.rangeWidth = width;
  18126. range.knobWidth = range.knobs[0].outerWidth();
  18127. }
  18128. };
  18129. Range.prototype.layout = function layout () {
  18130. var obj;
  18131. var range = this;
  18132. var app = range.app;
  18133. var knobWidth = range.knobWidth;
  18134. var knobHeight = range.knobHeight;
  18135. var rangeWidth = range.rangeWidth;
  18136. var rangeHeight = range.rangeHeight;
  18137. var min = range.min;
  18138. var max = range.max;
  18139. var knobs = range.knobs;
  18140. var $barActiveEl = range.$barActiveEl;
  18141. var value = range.value;
  18142. var label = range.label;
  18143. var labels = range.labels;
  18144. var vertical = range.vertical;
  18145. var verticalReversed = range.verticalReversed;
  18146. var limitKnobPosition = range.limitKnobPosition;
  18147. var knobSize = vertical ? knobHeight : knobWidth;
  18148. var rangeSize = vertical ? rangeHeight : rangeWidth;
  18149. // eslint-disable-next-line
  18150. var positionProperty = vertical
  18151. ? (verticalReversed ? 'top' : 'bottom')
  18152. : (app.rtl ? 'right' : 'left');
  18153. if (range.dual) {
  18154. var progress = [((value[0] - min) / (max - min)), ((value[1] - min) / (max - min))];
  18155. $barActiveEl.css(( obj = {}, obj[positionProperty] = ((progress[0] * 100) + "%"), obj[vertical ? 'height' : 'width'] = (((progress[1] - progress[0]) * 100) + "%"), obj ));
  18156. knobs.forEach(function ($knobEl, knobIndex) {
  18157. var startPos = rangeSize * progress[knobIndex];
  18158. if (limitKnobPosition) {
  18159. var realStartPos = (rangeSize * progress[knobIndex]) - (knobSize / 2);
  18160. if (realStartPos < 0) { startPos = knobSize / 2; }
  18161. if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
  18162. }
  18163. $knobEl.css(positionProperty, (startPos + "px"));
  18164. if (label) { labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0])); }
  18165. });
  18166. } else {
  18167. var progress$1 = ((value - min) / (max - min));
  18168. $barActiveEl.css(vertical ? 'height' : 'width', ((progress$1 * 100) + "%"));
  18169. var startPos = rangeSize * progress$1;
  18170. if (limitKnobPosition) {
  18171. var realStartPos = (rangeSize * progress$1) - (knobSize / 2);
  18172. if (realStartPos < 0) { startPos = knobSize / 2; }
  18173. if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
  18174. }
  18175. knobs[0].css(positionProperty, (startPos + "px"));
  18176. if (label) { labels[0].text(range.formatLabel(value, labels[0][0])); }
  18177. }
  18178. if ((range.dual && value.indexOf(min) >= 0) || (!range.dual && value === min)) {
  18179. range.$el.addClass('range-slider-min');
  18180. } else {
  18181. range.$el.removeClass('range-slider-min');
  18182. }
  18183. if ((range.dual && value.indexOf(max) >= 0) || (!range.dual && value === max)) {
  18184. range.$el.addClass('range-slider-max');
  18185. } else {
  18186. range.$el.removeClass('range-slider-max');
  18187. }
  18188. };
  18189. Range.prototype.setValue = function setValue (newValue, byTouchMove) {
  18190. var range = this;
  18191. var step = range.step;
  18192. var min = range.min;
  18193. var max = range.max;
  18194. var valueChanged;
  18195. var oldValue;
  18196. if (range.dual) {
  18197. oldValue = [range.value[0], range.value[1]];
  18198. var newValues = newValue;
  18199. if (!Array.isArray(newValues)) { newValues = [newValue, newValue]; }
  18200. if (newValue[0] > newValue[1]) {
  18201. newValues = [newValues[0], newValues[0]];
  18202. }
  18203. newValues = newValues.map(function (value) { return Math.max(Math.min(Math.round(value / step) * step, max), min); });
  18204. if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
  18205. return range;
  18206. }
  18207. newValues.forEach(function (value, valueIndex) {
  18208. range.value[valueIndex] = value;
  18209. });
  18210. valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
  18211. range.layout();
  18212. } else {
  18213. oldValue = range.value;
  18214. var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
  18215. range.value = value;
  18216. range.layout();
  18217. valueChanged = oldValue !== value;
  18218. }
  18219. if (valueChanged) {
  18220. range.previousValue = oldValue;
  18221. }
  18222. // Events
  18223. if (!valueChanged) { return range; }
  18224. range.$el.trigger('range:change', range.value);
  18225. if (range.$inputEl && !range.dual) {
  18226. range.$inputEl.val(range.value);
  18227. if (!byTouchMove) {
  18228. range.$inputEl.trigger('input change');
  18229. } else {
  18230. range.$inputEl.trigger('input');
  18231. }
  18232. }
  18233. if (!byTouchMove) {
  18234. range.$el.trigger('range:changed', range.value);
  18235. range.emit('local::changed rangeChanged', range, range.value);
  18236. }
  18237. range.emit('local::change rangeChange', range, range.value);
  18238. return range;
  18239. };
  18240. Range.prototype.getValue = function getValue () {
  18241. return this.value;
  18242. };
  18243. Range.prototype.formatLabel = function formatLabel (value, labelEl) {
  18244. var range = this;
  18245. if (range.params.formatLabel) { return range.params.formatLabel.call(range, value, labelEl); }
  18246. return value;
  18247. };
  18248. Range.prototype.formatScaleLabel = function formatScaleLabel (value) {
  18249. var range = this;
  18250. if (range.params.formatScaleLabel) { return range.params.formatScaleLabel.call(range, value); }
  18251. return value;
  18252. };
  18253. Range.prototype.renderScale = function renderScale () {
  18254. var range = this;
  18255. var app = range.app;
  18256. var verticalReversed = range.verticalReversed;
  18257. var vertical = range.vertical;
  18258. // eslint-disable-next-line
  18259. var positionProperty = vertical
  18260. ? (verticalReversed ? 'top' : 'bottom')
  18261. : (app.rtl ? 'right' : 'left');
  18262. var html = '';
  18263. Array
  18264. .from({ length: range.scaleSteps + 1 })
  18265. .forEach(function (scaleEl, index) {
  18266. var scaleStepValue = (range.max - range.min) / range.scaleSteps;
  18267. var scaleValue = range.min + scaleStepValue * index;
  18268. var progress = ((scaleValue - range.min) / (range.max - range.min));
  18269. html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + (progress * 100) + "%\">" + (range.formatScaleLabel(scaleValue)) + "</div>";
  18270. if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
  18271. Array
  18272. .from({ length: range.scaleSubSteps - 1 })
  18273. .forEach(function (subStepEl, subIndex) {
  18274. var subStep = scaleStepValue / range.scaleSubSteps;
  18275. var scaleSubValue = scaleValue + subStep * (subIndex + 1);
  18276. var subProgress = ((scaleSubValue - range.min) / (range.max - range.min));
  18277. html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + (subProgress * 100) + "%\"></div>";
  18278. });
  18279. }
  18280. });
  18281. return html;
  18282. };
  18283. Range.prototype.updateScale = function updateScale () {
  18284. var range = this;
  18285. if (!range.scale || range.scaleSteps < 1) {
  18286. if (range.$scaleEl) { range.$scaleEl.remove(); }
  18287. delete range.$scaleEl;
  18288. return;
  18289. }
  18290. if (!range.$scaleEl) {
  18291. range.$scaleEl = $('<div class="range-scale"></div>');
  18292. range.$el.append(range.$scaleEl);
  18293. }
  18294. range.$scaleEl.html(range.renderScale());
  18295. };
  18296. Range.prototype.init = function init () {
  18297. var range = this;
  18298. range.calcSize();
  18299. range.layout();
  18300. range.attachEvents();
  18301. return range;
  18302. };
  18303. Range.prototype.destroy = function destroy () {
  18304. var range = this;
  18305. range.$el.trigger('range:beforedestroy');
  18306. range.emit('local::beforeDestroy rangeBeforeDestroy', range);
  18307. delete range.$el[0].f7Range;
  18308. range.detachEvents();
  18309. Utils.deleteProps(range);
  18310. range = null;
  18311. };
  18312. return Range;
  18313. }(Framework7Class));
  18314. var Range$1 = {
  18315. name: 'range',
  18316. create: function create() {
  18317. var app = this;
  18318. app.range = Utils.extend(
  18319. ConstructorMethods({
  18320. defaultSelector: '.range-slider',
  18321. constructor: Range,
  18322. app: app,
  18323. domProp: 'f7Range',
  18324. }),
  18325. {
  18326. getValue: function getValue(el) {
  18327. if ( el === void 0 ) el = '.range-slider';
  18328. var range = app.range.get(el);
  18329. if (range) { return range.getValue(); }
  18330. return undefined;
  18331. },
  18332. setValue: function setValue(el, value) {
  18333. if ( el === void 0 ) el = '.range-slider';
  18334. var range = app.range.get(el);
  18335. if (range) { return range.setValue(value); }
  18336. return undefined;
  18337. },
  18338. }
  18339. );
  18340. },
  18341. static: {
  18342. Range: Range,
  18343. },
  18344. on: {
  18345. tabMounted: function tabMounted(tabEl) {
  18346. var app = this;
  18347. $(tabEl).find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
  18348. el: rangeEl,
  18349. }); });
  18350. },
  18351. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  18352. $(tabEl).find('.range-slider-init').each(function (index, rangeEl) {
  18353. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  18354. });
  18355. },
  18356. pageInit: function pageInit(page) {
  18357. var app = this;
  18358. page.$el.find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
  18359. el: rangeEl,
  18360. }); });
  18361. },
  18362. pageBeforeRemove: function pageBeforeRemove(page) {
  18363. page.$el.find('.range-slider-init').each(function (index, rangeEl) {
  18364. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  18365. });
  18366. },
  18367. },
  18368. vnode: {
  18369. 'range-slider-init': {
  18370. insert: function insert(vnode) {
  18371. var rangeEl = vnode.elm;
  18372. var app = this;
  18373. app.range.create({ el: rangeEl });
  18374. },
  18375. destroy: function destroy(vnode) {
  18376. var rangeEl = vnode.elm;
  18377. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  18378. },
  18379. },
  18380. },
  18381. };
  18382. var Stepper = /*@__PURE__*/(function (Framework7Class) {
  18383. function Stepper(app, params) {
  18384. Framework7Class.call(this, params, [app]);
  18385. var stepper = this;
  18386. var defaults = {
  18387. el: null,
  18388. inputEl: null,
  18389. valueEl: null,
  18390. value: 0,
  18391. formatValue: null,
  18392. step: 1,
  18393. min: 0,
  18394. max: 100,
  18395. watchInput: true,
  18396. autorepeat: false,
  18397. autorepeatDynamic: false,
  18398. wraps: false,
  18399. manualInputMode: false,
  18400. decimalPoint: 4,
  18401. buttonsEndInputMode: true,
  18402. };
  18403. // Extend defaults with modules params
  18404. stepper.useModulesParams(defaults);
  18405. stepper.params = Utils.extend(defaults, params);
  18406. if (stepper.params.value < stepper.params.min) {
  18407. stepper.params.value = stepper.params.min;
  18408. }
  18409. if (stepper.params.value > stepper.params.max) {
  18410. stepper.params.value = stepper.params.max;
  18411. }
  18412. var el = stepper.params.el;
  18413. if (!el) { return stepper; }
  18414. var $el = $(el);
  18415. if ($el.length === 0) { return stepper; }
  18416. if ($el[0].f7Stepper) { return $el[0].f7Stepper; }
  18417. var $inputEl;
  18418. if (stepper.params.inputEl) {
  18419. $inputEl = $(stepper.params.inputEl);
  18420. } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {
  18421. $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);
  18422. }
  18423. if ($inputEl && $inputEl.length) {
  18424. ('step min max').split(' ').forEach(function (paramName) {
  18425. if (!params[paramName] && $inputEl.attr(paramName)) {
  18426. stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
  18427. }
  18428. });
  18429. var decimalPoint$1 = parseInt(stepper.params.decimalPoint, 10);
  18430. if (Number.isNaN(decimalPoint$1)) {
  18431. stepper.params.decimalPoint = 0;
  18432. } else {
  18433. stepper.params.decimalPoint = decimalPoint$1;
  18434. }
  18435. var inputValue = parseFloat($inputEl.val());
  18436. if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
  18437. stepper.params.value = inputValue;
  18438. }
  18439. }
  18440. var $valueEl;
  18441. if (stepper.params.valueEl) {
  18442. $valueEl = $(stepper.params.valueEl);
  18443. } else if ($el.find('.stepper-value').length) {
  18444. $valueEl = $el.find('.stepper-value').eq(0);
  18445. }
  18446. var $buttonPlusEl = $el.find('.stepper-button-plus');
  18447. var $buttonMinusEl = $el.find('.stepper-button-minus');
  18448. var ref = stepper.params;
  18449. var step = ref.step;
  18450. var min = ref.min;
  18451. var max = ref.max;
  18452. var value = ref.value;
  18453. var decimalPoint = ref.decimalPoint;
  18454. Utils.extend(stepper, {
  18455. app: app,
  18456. $el: $el,
  18457. el: $el[0],
  18458. $buttonPlusEl: $buttonPlusEl,
  18459. buttonPlusEl: $buttonPlusEl[0],
  18460. $buttonMinusEl: $buttonMinusEl,
  18461. buttonMinusEl: $buttonMinusEl[0],
  18462. $inputEl: $inputEl,
  18463. inputEl: $inputEl ? $inputEl[0] : undefined,
  18464. $valueEl: $valueEl,
  18465. valueEl: $valueEl ? $valueEl[0] : undefined,
  18466. step: step,
  18467. min: min,
  18468. max: max,
  18469. value: value,
  18470. decimalPoint: decimalPoint,
  18471. typeModeChanged: false,
  18472. });
  18473. $el[0].f7Stepper = stepper;
  18474. // Handle Events
  18475. var touchesStart = {};
  18476. var isTouched;
  18477. var isScrolling;
  18478. var preventButtonClick;
  18479. var intervalId;
  18480. var timeoutId;
  18481. var autorepeatAction = null;
  18482. var autorepeatInAction = false;
  18483. var manualInput = false;
  18484. function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
  18485. clearTimeout(timeoutId);
  18486. timeoutId = setTimeout(function () {
  18487. if (current === 1) {
  18488. preventButtonClick = true;
  18489. autorepeatInAction = true;
  18490. }
  18491. clearInterval(intervalId);
  18492. action();
  18493. intervalId = setInterval(function () {
  18494. action();
  18495. }, repeatEvery);
  18496. if (current < progressions) {
  18497. dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
  18498. }
  18499. }, current === 1 ? startsIn : progressionStep);
  18500. }
  18501. function onTouchStart(e) {
  18502. if (isTouched) { return; }
  18503. if (manualInput) { return; }
  18504. if ($(e.target).closest($buttonPlusEl).length) {
  18505. autorepeatAction = 'increment';
  18506. } else if ($(e.target).closest($buttonMinusEl).length) {
  18507. autorepeatAction = 'decrement';
  18508. }
  18509. if (!autorepeatAction) { return; }
  18510. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  18511. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  18512. isTouched = true;
  18513. isScrolling = undefined;
  18514. var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
  18515. dynamicRepeat(1, progressions, 500, 1000, 300, function () {
  18516. stepper[autorepeatAction]();
  18517. });
  18518. }
  18519. function onTouchMove(e) {
  18520. if (!isTouched) { return; }
  18521. if (manualInput) { return; }
  18522. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  18523. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  18524. if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
  18525. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  18526. }
  18527. var distance = Math.pow( ((Math.pow( (pageX - touchesStart.x), 2 )) + (Math.pow( (pageY - touchesStart.y), 2 ))), 0.5 );
  18528. if (isScrolling || distance > 20) {
  18529. isTouched = false;
  18530. clearTimeout(timeoutId);
  18531. clearInterval(intervalId);
  18532. }
  18533. }
  18534. function onTouchEnd() {
  18535. clearTimeout(timeoutId);
  18536. clearInterval(intervalId);
  18537. autorepeatAction = null;
  18538. autorepeatInAction = false;
  18539. isTouched = false;
  18540. }
  18541. function onMinusClick() {
  18542. if (manualInput) {
  18543. if (stepper.params.buttonsEndInputMode) {
  18544. manualInput = false;
  18545. stepper.endTypeMode(true);
  18546. }
  18547. return;
  18548. }
  18549. if (preventButtonClick) {
  18550. preventButtonClick = false;
  18551. return;
  18552. }
  18553. stepper.decrement(true);
  18554. }
  18555. function onPlusClick() {
  18556. if (manualInput) {
  18557. if (stepper.params.buttonsEndInputMode) {
  18558. manualInput = false;
  18559. stepper.endTypeMode(true);
  18560. }
  18561. return;
  18562. }
  18563. if (preventButtonClick) {
  18564. preventButtonClick = false;
  18565. return;
  18566. }
  18567. stepper.increment(true);
  18568. }
  18569. function onInputClick(e) {
  18570. if (!e.target.readOnly && stepper.params.manualInputMode) {
  18571. manualInput = true;
  18572. if (typeof e.target.selectionStart === 'number') {
  18573. e.target.selectionStart = e.target.value.length;
  18574. e.target.selectionEnd = e.target.value.length;
  18575. }
  18576. }
  18577. }
  18578. function onInputKey(e) {
  18579. if (e.keyCode === 13 || e.which === 13) {
  18580. e.preventDefault();
  18581. manualInput = false;
  18582. stepper.endTypeMode();
  18583. }
  18584. }
  18585. function onInputBlur() {
  18586. manualInput = false;
  18587. stepper.endTypeMode(true);
  18588. }
  18589. function onInput(e) {
  18590. if (manualInput) {
  18591. stepper.typeValue(e.target.value);
  18592. return;
  18593. }
  18594. if (e.detail && e.detail.sentByF7Stepper) { return; }
  18595. stepper.setValue(e.target.value, true);
  18596. }
  18597. stepper.attachEvents = function attachEvents() {
  18598. $buttonMinusEl.on('click', onMinusClick);
  18599. $buttonPlusEl.on('click', onPlusClick);
  18600. if (stepper.params.watchInput && $inputEl && $inputEl.length) {
  18601. $inputEl.on('input', onInput);
  18602. $inputEl.on('click', onInputClick);
  18603. $inputEl.on('blur', onInputBlur);
  18604. $inputEl.on('keyup', onInputKey);
  18605. }
  18606. if (stepper.params.autorepeat) {
  18607. app.on('touchstart:passive', onTouchStart);
  18608. app.on('touchmove:active', onTouchMove);
  18609. app.on('touchend:passive', onTouchEnd);
  18610. }
  18611. };
  18612. stepper.detachEvents = function detachEvents() {
  18613. $buttonMinusEl.off('click', onMinusClick);
  18614. $buttonPlusEl.off('click', onPlusClick);
  18615. if (stepper.params.watchInput && $inputEl && $inputEl.length) {
  18616. $inputEl.off('input', onInput);
  18617. $inputEl.off('click', onInputClick);
  18618. $inputEl.off('blur', onInputBlur);
  18619. $inputEl.off('keyup', onInputKey);
  18620. }
  18621. };
  18622. // Install Modules
  18623. stepper.useModules();
  18624. // Init
  18625. stepper.init();
  18626. return stepper;
  18627. }
  18628. if ( Framework7Class ) Stepper.__proto__ = Framework7Class;
  18629. Stepper.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  18630. Stepper.prototype.constructor = Stepper;
  18631. Stepper.prototype.minus = function minus () {
  18632. return this.decrement();
  18633. };
  18634. Stepper.prototype.plus = function plus () {
  18635. return this.increment();
  18636. };
  18637. Stepper.prototype.decrement = function decrement () {
  18638. var stepper = this;
  18639. return stepper.setValue(stepper.value - stepper.step, false, true);
  18640. };
  18641. Stepper.prototype.increment = function increment () {
  18642. var stepper = this;
  18643. return stepper.setValue(stepper.value + stepper.step, false, true);
  18644. };
  18645. Stepper.prototype.setValue = function setValue (newValue, forceUpdate, withWraps) {
  18646. var stepper = this;
  18647. var step = stepper.step;
  18648. var min = stepper.min;
  18649. var max = stepper.max;
  18650. var oldValue = stepper.value;
  18651. var value = Math.round(newValue / step) * step;
  18652. if (stepper.params.wraps && withWraps) {
  18653. if (value > max) { value = min; }
  18654. if (value < min) { value = max; }
  18655. } else {
  18656. value = Math.max(Math.min(value, max), min);
  18657. }
  18658. if (Number.isNaN(value)) {
  18659. value = oldValue;
  18660. }
  18661. stepper.value = value;
  18662. var valueChanged = oldValue !== value;
  18663. // Events
  18664. if (!valueChanged && !forceUpdate) { return stepper; }
  18665. stepper.$el.trigger('stepper:change', stepper.value);
  18666. var formattedValue = stepper.formatValue(stepper.value);
  18667. if (stepper.$inputEl && stepper.$inputEl.length) {
  18668. stepper.$inputEl.val(formattedValue);
  18669. stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
  18670. }
  18671. if (stepper.$valueEl && stepper.$valueEl.length) {
  18672. stepper.$valueEl.html(formattedValue);
  18673. }
  18674. stepper.emit('local::change stepperChange', stepper, stepper.value);
  18675. return stepper;
  18676. };
  18677. Stepper.prototype.endTypeMode = function endTypeMode (noBlur) {
  18678. var stepper = this;
  18679. var min = stepper.min;
  18680. var max = stepper.max;
  18681. var value = parseFloat(stepper.value);
  18682. if (Number.isNaN(value)) { value = 0; }
  18683. value = Math.max(Math.min(value, max), min);
  18684. stepper.value = value;
  18685. if (!stepper.typeModeChanged) {
  18686. if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
  18687. stepper.$inputEl.blur();
  18688. }
  18689. return stepper;
  18690. }
  18691. stepper.typeModeChanged = false;
  18692. stepper.$el.trigger('stepper:change', stepper.value);
  18693. var formattedValue = stepper.formatValue(stepper.value);
  18694. if (stepper.$inputEl && stepper.$inputEl.length) {
  18695. stepper.$inputEl.val(formattedValue);
  18696. stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
  18697. if (!noBlur) { stepper.$inputEl.blur(); }
  18698. }
  18699. if (stepper.$valueEl && stepper.$valueEl.length) {
  18700. stepper.$valueEl.html(formattedValue);
  18701. }
  18702. stepper.emit('local::change stepperChange', stepper, stepper.value);
  18703. return stepper;
  18704. };
  18705. Stepper.prototype.typeValue = function typeValue (value) {
  18706. var stepper = this;
  18707. stepper.typeModeChanged = true;
  18708. var inputTxt = String(value);
  18709. if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
  18710. if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
  18711. inputTxt = inputTxt.slice(0, -1);
  18712. stepper.value = inputTxt;
  18713. stepper.$inputEl.val(stepper.value);
  18714. return stepper;
  18715. }
  18716. } else {
  18717. var newValue = parseFloat(inputTxt.replace(',', '.'));
  18718. if (newValue === 0) {
  18719. stepper.value = inputTxt.replace(',', '.');
  18720. stepper.$inputEl.val(stepper.value);
  18721. return stepper;
  18722. }
  18723. if (Number.isNaN(newValue)) {
  18724. stepper.value = 0;
  18725. stepper.$inputEl.val(stepper.value);
  18726. return stepper;
  18727. }
  18728. var powVal = Math.pow( 10, stepper.params.decimalPoint );
  18729. newValue = (Math.round((newValue) * powVal)).toFixed(stepper.params.decimalPoint + 1) / powVal;
  18730. stepper.value = parseFloat(String(newValue).replace(',', '.'));
  18731. stepper.$inputEl.val(stepper.value);
  18732. return stepper;
  18733. }
  18734. stepper.value = inputTxt;
  18735. stepper.$inputEl.val(inputTxt);
  18736. return stepper;
  18737. };
  18738. Stepper.prototype.getValue = function getValue () {
  18739. return this.value;
  18740. };
  18741. Stepper.prototype.formatValue = function formatValue (value) {
  18742. var stepper = this;
  18743. if (!stepper.params.formatValue) { return value; }
  18744. return stepper.params.formatValue.call(stepper, value);
  18745. };
  18746. Stepper.prototype.init = function init () {
  18747. var stepper = this;
  18748. stepper.attachEvents();
  18749. if (stepper.$valueEl && stepper.$valueEl.length) {
  18750. var formattedValue = stepper.formatValue(stepper.value);
  18751. stepper.$valueEl.html(formattedValue);
  18752. }
  18753. return stepper;
  18754. };
  18755. Stepper.prototype.destroy = function destroy () {
  18756. var stepper = this;
  18757. stepper.$el.trigger('stepper:beforedestroy');
  18758. stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);
  18759. delete stepper.$el[0].f7Stepper;
  18760. stepper.detachEvents();
  18761. Utils.deleteProps(stepper);
  18762. stepper = null;
  18763. };
  18764. return Stepper;
  18765. }(Framework7Class));
  18766. var Stepper$1 = {
  18767. name: 'stepper',
  18768. create: function create() {
  18769. var app = this;
  18770. app.stepper = Utils.extend(
  18771. ConstructorMethods({
  18772. defaultSelector: '.stepper',
  18773. constructor: Stepper,
  18774. app: app,
  18775. domProp: 'f7Stepper',
  18776. }),
  18777. {
  18778. getValue: function getValue(el) {
  18779. if ( el === void 0 ) el = '.stepper';
  18780. var stepper = app.stepper.get(el);
  18781. if (stepper) { return stepper.getValue(); }
  18782. return undefined;
  18783. },
  18784. setValue: function setValue(el, value) {
  18785. if ( el === void 0 ) el = '.stepper';
  18786. var stepper = app.stepper.get(el);
  18787. if (stepper) { return stepper.setValue(value); }
  18788. return undefined;
  18789. },
  18790. }
  18791. );
  18792. },
  18793. static: {
  18794. Stepper: Stepper,
  18795. },
  18796. on: {
  18797. tabMounted: function tabMounted(tabEl) {
  18798. var app = this;
  18799. $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
  18800. var dataset = $(stepperEl).dataset();
  18801. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  18802. });
  18803. },
  18804. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  18805. $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
  18806. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  18807. });
  18808. },
  18809. pageInit: function pageInit(page) {
  18810. var app = this;
  18811. page.$el.find('.stepper-init').each(function (index, stepperEl) {
  18812. var dataset = $(stepperEl).dataset();
  18813. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  18814. });
  18815. },
  18816. pageBeforeRemove: function pageBeforeRemove(page) {
  18817. page.$el.find('.stepper-init').each(function (index, stepperEl) {
  18818. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  18819. });
  18820. },
  18821. },
  18822. vnode: {
  18823. 'stepper-init': {
  18824. insert: function insert(vnode) {
  18825. var app = this;
  18826. var stepperEl = vnode.elm;
  18827. var dataset = $(stepperEl).dataset();
  18828. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  18829. },
  18830. destroy: function destroy(vnode) {
  18831. var stepperEl = vnode.elm;
  18832. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  18833. },
  18834. },
  18835. },
  18836. };
  18837. var SmartSelect = /*@__PURE__*/(function (Framework7Class) {
  18838. function SmartSelect(app, params) {
  18839. if ( params === void 0 ) params = {};
  18840. Framework7Class.call(this, params, [app]);
  18841. var ss = this;
  18842. var defaults = Utils.extend({
  18843. on: {},
  18844. }, app.params.smartSelect);
  18845. if (typeof defaults.searchbarDisableButton === 'undefined') {
  18846. defaults.searchbarDisableButton = app.theme !== 'aurora';
  18847. }
  18848. // Extend defaults with modules params
  18849. ss.useModulesParams(defaults);
  18850. ss.params = Utils.extend({}, defaults, params);
  18851. ss.app = app;
  18852. var $el = $(ss.params.el).eq(0);
  18853. if ($el.length === 0) { return ss; }
  18854. if ($el[0].f7SmartSelect) { return $el[0].f7SmartSelect; }
  18855. var $selectEl = $el.find('select').eq(0);
  18856. if ($selectEl.length === 0) { return ss; }
  18857. var $valueEl;
  18858. if (ss.params.setValueText) {
  18859. $valueEl = $(ss.params.valueEl);
  18860. if ($valueEl.length === 0) {
  18861. $valueEl = $el.find('.item-after');
  18862. }
  18863. if ($valueEl.length === 0) {
  18864. $valueEl = $('<div class="item-after"></div>');
  18865. $valueEl.insertAfter($el.find('.item-title'));
  18866. }
  18867. }
  18868. // Url
  18869. var url = params.url;
  18870. if (!url) {
  18871. if ($el.attr('href') && $el.attr('href') !== '#') { url = $el.attr('href'); }
  18872. else if ($selectEl.attr('name')) { url = ($selectEl.attr('name').toLowerCase()) + "-select/"; }
  18873. }
  18874. if (!url) { url = ss.params.url; }
  18875. var multiple = $selectEl[0].multiple;
  18876. var inputType = multiple ? 'checkbox' : 'radio';
  18877. var id = Utils.id();
  18878. Utils.extend(ss, {
  18879. $el: $el,
  18880. el: $el[0],
  18881. $selectEl: $selectEl,
  18882. selectEl: $selectEl[0],
  18883. $valueEl: $valueEl,
  18884. valueEl: $valueEl && $valueEl[0],
  18885. url: url,
  18886. multiple: multiple,
  18887. inputType: inputType,
  18888. id: id,
  18889. inputName: (inputType + "-" + id),
  18890. selectName: $selectEl.attr('name'),
  18891. maxLength: $selectEl.attr('maxlength') || params.maxLength,
  18892. });
  18893. $el[0].f7SmartSelect = ss;
  18894. // Events
  18895. function onClick() {
  18896. ss.open();
  18897. }
  18898. function onChange() {
  18899. var value = ss.$selectEl.val();
  18900. ss.$el.trigger('smartselect:change', value);
  18901. ss.emit('local::change smartSelectChange', ss, value);
  18902. if (ss.vl) {
  18903. ss.vl.clearCache();
  18904. }
  18905. ss.setValueText();
  18906. }
  18907. ss.attachEvents = function attachEvents() {
  18908. $el.on('click', onClick);
  18909. $el.on('change', 'select', onChange);
  18910. };
  18911. ss.detachEvents = function detachEvents() {
  18912. $el.off('click', onClick);
  18913. $el.off('change', 'select', onChange);
  18914. };
  18915. function handleInputChange() {
  18916. var optionEl;
  18917. var text;
  18918. var inputEl = this;
  18919. var value = inputEl.value;
  18920. var optionText = [];
  18921. var displayAs;
  18922. if (inputEl.type === 'checkbox') {
  18923. for (var i = 0; i < ss.selectEl.options.length; i += 1) {
  18924. optionEl = ss.selectEl.options[i];
  18925. if (optionEl.value === value) {
  18926. optionEl.selected = inputEl.checked;
  18927. }
  18928. if (optionEl.selected) {
  18929. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
  18930. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  18931. optionText.push(text.trim());
  18932. }
  18933. }
  18934. if (ss.maxLength) {
  18935. ss.checkMaxLength();
  18936. }
  18937. } else {
  18938. optionEl = ss.$selectEl.find(("option[value=\"" + value + "\"]"))[0];
  18939. if (!optionEl) {
  18940. optionEl = ss.$selectEl.find('option').filter(function (index, optEl) { return optEl.value === value; })[0];
  18941. }
  18942. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
  18943. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  18944. optionText = [text];
  18945. ss.selectEl.value = value;
  18946. }
  18947. ss.$selectEl.trigger('change');
  18948. if (ss.params.setValueText) {
  18949. ss.$valueEl.text(ss.formatValueText(optionText));
  18950. }
  18951. if (ss.params.closeOnSelect && ss.inputType === 'radio') {
  18952. ss.close();
  18953. }
  18954. }
  18955. ss.attachInputsEvents = function attachInputsEvents() {
  18956. ss.$containerEl.on('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
  18957. };
  18958. ss.detachInputsEvents = function detachInputsEvents() {
  18959. ss.$containerEl.off('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
  18960. };
  18961. // Install Modules
  18962. ss.useModules();
  18963. // Init
  18964. ss.init();
  18965. return ss;
  18966. }
  18967. if ( Framework7Class ) SmartSelect.__proto__ = Framework7Class;
  18968. SmartSelect.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  18969. SmartSelect.prototype.constructor = SmartSelect;
  18970. var prototypeAccessors = { view: { configurable: true } };
  18971. SmartSelect.prototype.setValue = function setValue (value) {
  18972. var ss = this;
  18973. var newValue = value;
  18974. var optionText = [];
  18975. var optionEl;
  18976. var displayAs;
  18977. var text;
  18978. if (ss.multiple) {
  18979. if (!Array.isArray(newValue)) { newValue = [newValue]; }
  18980. for (var i = 0; i < ss.selectEl.options.length; i += 1) {
  18981. optionEl = ss.selectEl.options[i];
  18982. if (newValue.indexOf(optionEl.value) >= 0) {
  18983. optionEl.selected = true;
  18984. } else {
  18985. optionEl.selected = false;
  18986. }
  18987. if (optionEl.selected) {
  18988. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
  18989. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  18990. optionText.push(text.trim());
  18991. }
  18992. }
  18993. } else {
  18994. optionEl = ss.$selectEl.find(("option[value=\"" + newValue + "\"]"))[0];
  18995. if (optionEl) {
  18996. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
  18997. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  18998. optionText = [text];
  18999. }
  19000. ss.selectEl.value = newValue;
  19001. }
  19002. if (ss.params.setValueText) {
  19003. ss.$valueEl.text(ss.formatValueText(optionText));
  19004. }
  19005. ss.$selectEl.trigger('change');
  19006. return ss;
  19007. };
  19008. SmartSelect.prototype.unsetValue = function unsetValue () {
  19009. var ss = this;
  19010. if (ss.params.setValueText) {
  19011. ss.$valueEl.text(ss.formatValueText([]));
  19012. }
  19013. ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
  19014. optionEl.selected = false;
  19015. optionEl.checked = false;
  19016. });
  19017. ss.$selectEl[0].value = null;
  19018. if (ss.$containerEl) {
  19019. ss.$containerEl.find(("input[name=\"" + (ss.inputName) + "\"][type=\"checkbox\"], input[name=\"" + (ss.inputName) + "\"][type=\"radio\"]")).prop('checked', false);
  19020. }
  19021. ss.$selectEl.trigger('change');
  19022. };
  19023. SmartSelect.prototype.getValue = function getValue () {
  19024. var ss = this;
  19025. return ss.$selectEl.val();
  19026. };
  19027. prototypeAccessors.view.get = function () {
  19028. var ref = this;
  19029. var params = ref.params;
  19030. var $el = ref.$el;
  19031. var view;
  19032. if (params.view) {
  19033. view = params.view;
  19034. }
  19035. if (!view) {
  19036. view = $el.parents('.view').length && $el.parents('.view')[0].f7View;
  19037. }
  19038. if (!view && params.openIn === 'page') {
  19039. throw Error('Smart Select requires initialized View');
  19040. }
  19041. return view;
  19042. };
  19043. SmartSelect.prototype.checkMaxLength = function checkMaxLength () {
  19044. var ss = this;
  19045. var $containerEl = ss.$containerEl;
  19046. if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
  19047. $containerEl.find('input[type="checkbox"]').each(function (index, inputEl) {
  19048. if (!inputEl.checked) {
  19049. $(inputEl).parents('li').addClass('disabled');
  19050. } else {
  19051. $(inputEl).parents('li').removeClass('disabled');
  19052. }
  19053. });
  19054. } else {
  19055. $containerEl.find('.disabled').removeClass('disabled');
  19056. }
  19057. };
  19058. SmartSelect.prototype.formatValueText = function formatValueText (values) {
  19059. var ss = this;
  19060. var textValue;
  19061. if (ss.params.formatValueText) {
  19062. textValue = ss.params.formatValueText.call(ss, values, ss);
  19063. } else {
  19064. textValue = values.join(', ');
  19065. }
  19066. return textValue;
  19067. };
  19068. SmartSelect.prototype.setValueText = function setValueText (value) {
  19069. var ss = this;
  19070. var valueArray = [];
  19071. if (typeof value !== 'undefined') {
  19072. if (Array.isArray(value)) {
  19073. valueArray = value;
  19074. } else {
  19075. valueArray = [value];
  19076. }
  19077. } else {
  19078. ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
  19079. var $optionEl = $(optionEl);
  19080. if (optionEl.selected) {
  19081. var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');
  19082. if (displayAs && typeof displayAs !== 'undefined') {
  19083. valueArray.push(displayAs);
  19084. } else {
  19085. valueArray.push(optionEl.textContent.trim());
  19086. }
  19087. }
  19088. });
  19089. }
  19090. if (ss.params.setValueText) {
  19091. ss.$valueEl.text(ss.formatValueText(valueArray));
  19092. }
  19093. };
  19094. SmartSelect.prototype.getItemsData = function getItemsData () {
  19095. var ss = this;
  19096. var theme = ss.app.theme;
  19097. var items = [];
  19098. var previousGroupEl;
  19099. ss.$selectEl.find('option').each(function (index, optionEl) {
  19100. var $optionEl = $(optionEl);
  19101. var optionData = $optionEl.dataset();
  19102. var optionImage = optionData.optionImage || ss.params.optionImage;
  19103. var optionIcon = optionData.optionIcon || ss.params.optionIcon;
  19104. var optionIconIos = theme === 'ios' && (optionData.optionIconIos || ss.params.optionIconIos);
  19105. var optionIconMd = theme === 'md' && (optionData.optionIconMd || ss.params.optionIconMd);
  19106. var optionIconAurora = theme === 'aurora' && (optionData.optionIconAurora || ss.params.optionIconAurora);
  19107. var optionHasMedia = optionImage || optionIcon || optionIconIos || optionIconMd || optionIconAurora;
  19108. var optionColor = optionData.optionColor;
  19109. var optionClassName = optionData.optionClass || '';
  19110. if ($optionEl[0].disabled) { optionClassName += ' disabled'; }
  19111. var optionGroupEl = $optionEl.parent('optgroup')[0];
  19112. var optionGroupLabel = optionGroupEl && optionGroupEl.label;
  19113. var optionIsLabel = false;
  19114. if (optionGroupEl && optionGroupEl !== previousGroupEl) {
  19115. optionIsLabel = true;
  19116. previousGroupEl = optionGroupEl;
  19117. items.push({
  19118. groupLabel: optionGroupLabel,
  19119. isLabel: optionIsLabel,
  19120. });
  19121. }
  19122. items.push({
  19123. value: $optionEl[0].value,
  19124. text: $optionEl[0].textContent.trim(),
  19125. selected: $optionEl[0].selected,
  19126. groupEl: optionGroupEl,
  19127. groupLabel: optionGroupLabel,
  19128. image: optionImage,
  19129. icon: optionIcon,
  19130. iconIos: optionIconIos,
  19131. iconMd: optionIconMd,
  19132. iconAurora: optionIconAurora,
  19133. color: optionColor,
  19134. className: optionClassName,
  19135. disabled: $optionEl[0].disabled,
  19136. id: ss.id,
  19137. hasMedia: optionHasMedia,
  19138. checkbox: ss.inputType === 'checkbox',
  19139. radio: ss.inputType === 'radio',
  19140. inputName: ss.inputName,
  19141. inputType: ss.inputType,
  19142. });
  19143. });
  19144. ss.items = items;
  19145. return items;
  19146. };
  19147. SmartSelect.prototype.renderSearchbar = function renderSearchbar () {
  19148. var ss = this;
  19149. if (ss.params.renderSearchbar) { return ss.params.renderSearchbar.call(ss); }
  19150. 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 ";
  19151. return searchbarHTML;
  19152. };
  19153. SmartSelect.prototype.renderItem = function renderItem (item, index) {
  19154. var ss = this;
  19155. if (ss.params.renderItem) { return ss.params.renderItem.call(ss, item, index); }
  19156. function getIconContent(iconValue) {
  19157. if ( iconValue === void 0 ) iconValue = '';
  19158. if (iconValue.indexOf(':') >= 0) {
  19159. return iconValue.split(':')[1];
  19160. }
  19161. return '';
  19162. }
  19163. function getIconClass(iconValue) {
  19164. if ( iconValue === void 0 ) iconValue = '';
  19165. if (iconValue.indexOf(':') >= 0) {
  19166. var className = iconValue.split(':')[0];
  19167. if (className === 'f7') { className = 'f7-icons'; }
  19168. if (className === 'material') { className = 'material-icons'; }
  19169. return className;
  19170. }
  19171. return iconValue;
  19172. }
  19173. var itemHtml;
  19174. if (item.isLabel) {
  19175. itemHtml = "<li class=\"item-divider\">" + (item.groupLabel) + "</li>";
  19176. } else {
  19177. var selected = item.selected;
  19178. var disabled;
  19179. if (ss.params.virtualList) {
  19180. var ssValue = ss.getValue();
  19181. selected = ss.multiple ? ssValue.indexOf(item.value) >= 0 : ssValue === item.value;
  19182. if (ss.multiple) {
  19183. disabled = ss.multiple && !selected && ssValue.length === parseInt(ss.maxLength, 10);
  19184. }
  19185. }
  19186. var icon = item.icon;
  19187. var iconIos = item.iconIos;
  19188. var iconMd = item.iconMd;
  19189. var iconAurora = item.iconAurora;
  19190. var hasIcon = icon || iconIos || iconMd || iconAurora;
  19191. var iconContent = getIconContent(icon || iconIos || iconMd || iconAurora || '');
  19192. var iconClass = getIconClass(icon || iconIos || iconMd || iconAurora || '');
  19193. 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 ";
  19194. }
  19195. return itemHtml;
  19196. };
  19197. SmartSelect.prototype.renderItems = function renderItems () {
  19198. var ss = this;
  19199. if (ss.params.renderItems) { return ss.params.renderItems.call(ss, ss.items); }
  19200. var itemsHtml = "\n " + (ss.items.map(function (item, index) { return ("" + (ss.renderItem(item, index))); }).join('')) + "\n ";
  19201. return itemsHtml;
  19202. };
  19203. SmartSelect.prototype.renderPage = function renderPage () {
  19204. var ss = this;
  19205. if (ss.params.renderPage) { return ss.params.renderPage.call(ss, ss.items); }
  19206. var pageTitle = ss.params.pageTitle;
  19207. if (typeof pageTitle === 'undefined') {
  19208. var $itemTitleEl = ss.$el.find('.item-title');
  19209. pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
  19210. }
  19211. var cssClass = ss.params.cssClass;
  19212. 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 ";
  19213. return pageHtml;
  19214. };
  19215. SmartSelect.prototype.renderPopup = function renderPopup () {
  19216. var ss = this;
  19217. if (ss.params.renderPopup) { return ss.params.renderPopup.call(ss, ss.items); }
  19218. var pageTitle = ss.params.pageTitle;
  19219. if (typeof pageTitle === 'undefined') {
  19220. var $itemTitleEl = ss.$el.find('.item-title');
  19221. pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
  19222. }
  19223. var cssClass = ss.params.cssClass || '';
  19224. 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 ";
  19225. return popupHtml;
  19226. };
  19227. SmartSelect.prototype.renderSheet = function renderSheet () {
  19228. var ss = this;
  19229. if (ss.params.renderSheet) { return ss.params.renderSheet.call(ss, ss.items); }
  19230. var cssClass = ss.params.cssClass;
  19231. 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 ";
  19232. return sheetHtml;
  19233. };
  19234. SmartSelect.prototype.renderPopover = function renderPopover () {
  19235. var ss = this;
  19236. if (ss.params.renderPopover) { return ss.params.renderPopover.call(ss, ss.items); }
  19237. var cssClass = ss.params.cssClass;
  19238. 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 ";
  19239. return popoverHtml;
  19240. };
  19241. SmartSelect.prototype.scrollToSelectedItem = function scrollToSelectedItem () {
  19242. var ss = this;
  19243. var params = ss.params;
  19244. var $containerEl = ss.$containerEl;
  19245. if (!ss.opened) { return ss; }
  19246. if (params.virtualList) {
  19247. var selectedIndex;
  19248. ss.vl.items.forEach(function (item, index) {
  19249. if (typeof selectedIndex === 'undefined' && item.selected) {
  19250. selectedIndex = index;
  19251. }
  19252. });
  19253. if (typeof selectedIndex !== 'undefined') {
  19254. ss.vl.scrollToItem(selectedIndex);
  19255. }
  19256. } else {
  19257. var $selectedItemEl = $containerEl.find('input:checked').parents('li');
  19258. if (!$selectedItemEl.length) { return ss; }
  19259. var $pageContentEl = $containerEl.find('.page-content');
  19260. $pageContentEl.scrollTop($selectedItemEl.offset().top - $pageContentEl.offset().top - parseInt($pageContentEl.css('padding-top'), 10));
  19261. }
  19262. return ss;
  19263. };
  19264. SmartSelect.prototype.onOpen = function onOpen (type, containerEl) {
  19265. var ss = this;
  19266. var app = ss.app;
  19267. var $containerEl = $(containerEl);
  19268. ss.$containerEl = $containerEl;
  19269. ss.openedIn = type;
  19270. ss.opened = true;
  19271. // Init VL
  19272. if (ss.params.virtualList) {
  19273. ss.vl = app.virtualList.create({
  19274. el: $containerEl.find('.virtual-list'),
  19275. items: ss.items,
  19276. renderItem: ss.renderItem.bind(ss),
  19277. height: ss.params.virtualListHeight,
  19278. searchByItem: function searchByItem(query, item) {
  19279. if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) { return true; }
  19280. return false;
  19281. },
  19282. });
  19283. }
  19284. if (ss.params.scrollToSelectedItem) {
  19285. ss.scrollToSelectedItem();
  19286. }
  19287. // Init SB
  19288. if (ss.params.searchbar) {
  19289. var $searchbarEl = $containerEl.find('.searchbar');
  19290. if (type === 'page' && app.theme === 'ios') {
  19291. $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
  19292. }
  19293. if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
  19294. var $notFoundEl = null;
  19295. if (typeof ss.params.appendSearchbarNotFound === 'string') {
  19296. $notFoundEl = $(("<div class=\"block searchbar-not-found\">" + (ss.params.appendSearchbarNotFound) + "</div>"));
  19297. } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
  19298. $notFoundEl = $('<div class="block searchbar-not-found">Nothing found</div>');
  19299. } else {
  19300. $notFoundEl = ss.params.appendSearchbarNotFound;
  19301. }
  19302. if ($notFoundEl) {
  19303. $containerEl.find('.page-content').append($notFoundEl[0]);
  19304. }
  19305. }
  19306. var searchbarParams = Utils.extend({
  19307. el: $searchbarEl,
  19308. backdropEl: $containerEl.find('.searchbar-backdrop'),
  19309. searchContainer: (".smart-select-list-" + (ss.id)),
  19310. searchIn: '.item-title',
  19311. }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
  19312. ss.searchbar = app.searchbar.create(searchbarParams);
  19313. }
  19314. // Check for max length
  19315. if (ss.maxLength) {
  19316. ss.checkMaxLength();
  19317. }
  19318. // Close on select
  19319. if (ss.params.closeOnSelect) {
  19320. ss.$containerEl.find(("input[type=\"radio\"][name=\"" + (ss.inputName) + "\"]:checked")).parents('label').once('click', function () {
  19321. ss.close();
  19322. });
  19323. }
  19324. // Attach input events
  19325. ss.attachInputsEvents();
  19326. ss.$el.trigger('smartselect:open');
  19327. ss.emit('local::open smartSelectOpen', ss);
  19328. };
  19329. SmartSelect.prototype.onOpened = function onOpened () {
  19330. var ss = this;
  19331. ss.$el.trigger('smartselect:opened');
  19332. ss.emit('local::opened smartSelectOpened', ss);
  19333. };
  19334. SmartSelect.prototype.onClose = function onClose () {
  19335. var ss = this;
  19336. if (ss.destroyed) { return; }
  19337. // Destroy VL
  19338. if (ss.vl && ss.vl.destroy) {
  19339. ss.vl.destroy();
  19340. ss.vl = null;
  19341. delete ss.vl;
  19342. }
  19343. // Destroy SB
  19344. if (ss.searchbar && ss.searchbar.destroy) {
  19345. ss.searchbar.destroy();
  19346. ss.searchbar = null;
  19347. delete ss.searchbar;
  19348. }
  19349. // Detach events
  19350. ss.detachInputsEvents();
  19351. ss.$el.trigger('smartselect:close');
  19352. ss.emit('local::close smartSelectClose', ss);
  19353. };
  19354. SmartSelect.prototype.onClosed = function onClosed () {
  19355. var ss = this;
  19356. if (ss.destroyed) { return; }
  19357. ss.opened = false;
  19358. ss.$containerEl = null;
  19359. delete ss.$containerEl;
  19360. ss.$el.trigger('smartselect:closed');
  19361. ss.emit('local::closed smartSelectClosed', ss);
  19362. };
  19363. SmartSelect.prototype.openPage = function openPage () {
  19364. var ss = this;
  19365. if (ss.opened) { return ss; }
  19366. ss.getItemsData();
  19367. var pageHtml = ss.renderPage(ss.items);
  19368. ss.view.router.navigate({
  19369. url: ss.url,
  19370. route: {
  19371. content: pageHtml,
  19372. path: ss.url,
  19373. on: {
  19374. pageBeforeIn: function pageBeforeIn(e, page) {
  19375. ss.onOpen('page', page.el);
  19376. },
  19377. pageAfterIn: function pageAfterIn(e, page) {
  19378. ss.onOpened('page', page.el);
  19379. },
  19380. pageBeforeOut: function pageBeforeOut(e, page) {
  19381. ss.onClose('page', page.el);
  19382. },
  19383. pageAfterOut: function pageAfterOut(e, page) {
  19384. ss.onClosed('page', page.el);
  19385. },
  19386. },
  19387. },
  19388. });
  19389. return ss;
  19390. };
  19391. SmartSelect.prototype.openPopup = function openPopup () {
  19392. var ss = this;
  19393. if (ss.opened) { return ss; }
  19394. ss.getItemsData();
  19395. var popupHtml = ss.renderPopup(ss.items);
  19396. var popupParams = {
  19397. content: popupHtml,
  19398. push: ss.params.popupPush,
  19399. swipeToClose: ss.params.popupSwipeToClose,
  19400. on: {
  19401. popupOpen: function popupOpen(popup) {
  19402. ss.onOpen('popup', popup.el);
  19403. },
  19404. popupOpened: function popupOpened(popup) {
  19405. ss.onOpened('popup', popup.el);
  19406. },
  19407. popupClose: function popupClose(popup) {
  19408. ss.onClose('popup', popup.el);
  19409. },
  19410. popupClosed: function popupClosed(popup) {
  19411. ss.onClosed('popup', popup.el);
  19412. },
  19413. },
  19414. };
  19415. if (ss.params.routableModals && ss.view) {
  19416. ss.view.router.navigate({
  19417. url: ss.url,
  19418. route: {
  19419. path: ss.url,
  19420. popup: popupParams,
  19421. },
  19422. });
  19423. } else {
  19424. ss.modal = ss.app.popup.create(popupParams).open();
  19425. }
  19426. return ss;
  19427. };
  19428. SmartSelect.prototype.openSheet = function openSheet () {
  19429. var ss = this;
  19430. if (ss.opened) { return ss; }
  19431. ss.getItemsData();
  19432. var sheetHtml = ss.renderSheet(ss.items);
  19433. var sheetParams = {
  19434. content: sheetHtml,
  19435. backdrop: false,
  19436. scrollToEl: ss.$el,
  19437. closeByOutsideClick: true,
  19438. push: ss.params.sheetPush,
  19439. swipeToClose: ss.params.sheetSwipeToClose,
  19440. on: {
  19441. sheetOpen: function sheetOpen(sheet) {
  19442. ss.onOpen('sheet', sheet.el);
  19443. },
  19444. sheetOpened: function sheetOpened(sheet) {
  19445. ss.onOpened('sheet', sheet.el);
  19446. },
  19447. sheetClose: function sheetClose(sheet) {
  19448. ss.onClose('sheet', sheet.el);
  19449. },
  19450. sheetClosed: function sheetClosed(sheet) {
  19451. ss.onClosed('sheet', sheet.el);
  19452. },
  19453. },
  19454. };
  19455. if (ss.params.routableModals && ss.view) {
  19456. ss.view.router.navigate({
  19457. url: ss.url,
  19458. route: {
  19459. path: ss.url,
  19460. sheet: sheetParams,
  19461. },
  19462. });
  19463. } else {
  19464. ss.modal = ss.app.sheet.create(sheetParams).open();
  19465. }
  19466. return ss;
  19467. };
  19468. SmartSelect.prototype.openPopover = function openPopover () {
  19469. var ss = this;
  19470. if (ss.opened) { return ss; }
  19471. ss.getItemsData();
  19472. var popoverHtml = ss.renderPopover(ss.items);
  19473. var popoverParams = {
  19474. content: popoverHtml,
  19475. targetEl: ss.$el,
  19476. on: {
  19477. popoverOpen: function popoverOpen(popover) {
  19478. ss.onOpen('popover', popover.el);
  19479. },
  19480. popoverOpened: function popoverOpened(popover) {
  19481. ss.onOpened('popover', popover.el);
  19482. },
  19483. popoverClose: function popoverClose(popover) {
  19484. ss.onClose('popover', popover.el);
  19485. },
  19486. popoverClosed: function popoverClosed(popover) {
  19487. ss.onClosed('popover', popover.el);
  19488. },
  19489. },
  19490. };
  19491. if (ss.params.routableModals && ss.view) {
  19492. ss.view.router.navigate({
  19493. url: ss.url,
  19494. route: {
  19495. path: ss.url,
  19496. popover: popoverParams,
  19497. },
  19498. });
  19499. } else {
  19500. ss.modal = ss.app.popover.create(popoverParams).open();
  19501. }
  19502. return ss;
  19503. };
  19504. SmartSelect.prototype.open = function open (type) {
  19505. var ss = this;
  19506. if (ss.opened) { return ss; }
  19507. var prevented = false;
  19508. function prevent() {
  19509. prevented = true;
  19510. }
  19511. if (ss.$el) {
  19512. ss.$el.trigger('smartselect:beforeopen', { prevent: prevent });
  19513. }
  19514. ss.emit('local::beforeOpen smartSelectBeforeOpen', ss, prevent);
  19515. if (prevented) { return ss; }
  19516. var openIn = type || ss.params.openIn;
  19517. ss[("open" + (openIn.split('').map(function (el, index) {
  19518. if (index === 0) { return el.toUpperCase(); }
  19519. return el;
  19520. }).join('')))]();
  19521. return ss;
  19522. };
  19523. SmartSelect.prototype.close = function close () {
  19524. var ss = this;
  19525. if (!ss.opened) { return ss; }
  19526. if ((ss.params.routableModals && ss.view) || ss.openedIn === 'page') {
  19527. ss.view.router.back();
  19528. } else {
  19529. ss.modal.once('modalClosed', function () {
  19530. Utils.nextTick(function () {
  19531. if (ss.destroyed) { return; }
  19532. ss.modal.destroy();
  19533. delete ss.modal;
  19534. });
  19535. });
  19536. ss.modal.close();
  19537. }
  19538. return ss;
  19539. };
  19540. SmartSelect.prototype.init = function init () {
  19541. var ss = this;
  19542. ss.attachEvents();
  19543. ss.setValueText();
  19544. };
  19545. SmartSelect.prototype.destroy = function destroy () {
  19546. var ss = this;
  19547. ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
  19548. ss.$el.trigger('smartselect:beforedestroy');
  19549. ss.detachEvents();
  19550. delete ss.$el[0].f7SmartSelect;
  19551. Utils.deleteProps(ss);
  19552. ss.destroyed = true;
  19553. };
  19554. Object.defineProperties( SmartSelect.prototype, prototypeAccessors );
  19555. return SmartSelect;
  19556. }(Framework7Class));
  19557. var SmartSelect$1 = {
  19558. name: 'smartSelect',
  19559. params: {
  19560. smartSelect: {
  19561. el: undefined,
  19562. valueEl: undefined,
  19563. setValueText: true,
  19564. formatValueText: null,
  19565. openIn: 'page', // or 'popup' or 'sheet' or 'popover'
  19566. popupPush: false,
  19567. popupSwipeToClose: undefined, // defaults to app
  19568. sheetPush: false,
  19569. sheetSwipeToClose: undefined, // defaults to app
  19570. pageTitle: undefined,
  19571. pageBackLinkText: 'Back',
  19572. popupCloseLinkText: 'Close',
  19573. popupTabletFullscreen: false,
  19574. sheetCloseLinkText: 'Done',
  19575. searchbar: false,
  19576. searchbarPlaceholder: 'Search',
  19577. searchbarDisableText: 'Cancel',
  19578. searchbarDisableButton: undefined,
  19579. searchbarSpellcheck: false,
  19580. closeOnSelect: false,
  19581. virtualList: false,
  19582. virtualListHeight: undefined,
  19583. scrollToSelectedItem: false,
  19584. formColorTheme: undefined,
  19585. navbarColorTheme: undefined,
  19586. routableModals: true,
  19587. url: 'select/',
  19588. cssClass: '',
  19589. /*
  19590. Custom render functions
  19591. */
  19592. renderPage: undefined,
  19593. renderPopup: undefined,
  19594. renderSheet: undefined,
  19595. renderPopover: undefined,
  19596. renderItems: undefined,
  19597. renderItem: undefined,
  19598. renderSearchbar: undefined,
  19599. },
  19600. },
  19601. static: {
  19602. SmartSelect: SmartSelect,
  19603. },
  19604. create: function create() {
  19605. var app = this;
  19606. app.smartSelect = Utils.extend(
  19607. ConstructorMethods({
  19608. defaultSelector: '.smart-select',
  19609. constructor: SmartSelect,
  19610. app: app,
  19611. domProp: 'f7SmartSelect',
  19612. }),
  19613. {
  19614. open: function open(smartSelectEl) {
  19615. var ss = app.smartSelect.get(smartSelectEl);
  19616. if (ss && ss.open) { return ss.open(); }
  19617. return undefined;
  19618. },
  19619. close: function close(smartSelectEl) {
  19620. var ss = app.smartSelect.get(smartSelectEl);
  19621. if (ss && ss.close) { return ss.close(); }
  19622. return undefined;
  19623. },
  19624. }
  19625. );
  19626. },
  19627. on: {
  19628. tabMounted: function tabMounted(tabEl) {
  19629. var app = this;
  19630. $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
  19631. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  19632. });
  19633. },
  19634. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  19635. $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
  19636. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  19637. smartSelectEl.f7SmartSelect.destroy();
  19638. }
  19639. });
  19640. },
  19641. pageInit: function pageInit(page) {
  19642. var app = this;
  19643. page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
  19644. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  19645. });
  19646. },
  19647. pageBeforeRemove: function pageBeforeRemove(page) {
  19648. page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
  19649. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  19650. smartSelectEl.f7SmartSelect.destroy();
  19651. }
  19652. });
  19653. },
  19654. },
  19655. clicks: {
  19656. '.smart-select': function open($clickedEl, data) {
  19657. var app = this;
  19658. if (!$clickedEl[0].f7SmartSelect) {
  19659. var ss = app.smartSelect.create(Utils.extend({ el: $clickedEl }, data));
  19660. ss.open();
  19661. }
  19662. },
  19663. },
  19664. vnode: {
  19665. 'smart-select-init': {
  19666. insert: function insert(vnode) {
  19667. var app = this;
  19668. var smartSelectEl = vnode.elm;
  19669. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  19670. },
  19671. destroy: function destroy(vnode) {
  19672. var smartSelectEl = vnode.elm;
  19673. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  19674. smartSelectEl.f7SmartSelect.destroy();
  19675. }
  19676. },
  19677. },
  19678. },
  19679. };
  19680. function getElMinSize(dimension, $el) {
  19681. var minSize = $el.css(("min-" + dimension));
  19682. if (minSize === 'auto' || minSize === 'none') {
  19683. minSize = 0;
  19684. } else if (minSize.indexOf('px') >= 0) {
  19685. minSize = parseFloat(minSize);
  19686. } else if (minSize.indexOf('%') >= 0) {
  19687. minSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(minSize) / 100;
  19688. }
  19689. return minSize;
  19690. }
  19691. function getElMaxSize(dimension, $el) {
  19692. var maxSize = $el.css(("max-" + dimension));
  19693. if (maxSize === 'auto' || maxSize === 'none') {
  19694. maxSize = null;
  19695. } else if (maxSize.indexOf('px') >= 0) {
  19696. maxSize = parseFloat(maxSize);
  19697. } else if (maxSize.indexOf('%') >= 0) {
  19698. maxSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(maxSize) / 100;
  19699. }
  19700. return maxSize;
  19701. }
  19702. var Grid = {
  19703. init: function init() {
  19704. var app = this;
  19705. var isTouched;
  19706. var isMoved;
  19707. var touchStartX;
  19708. var touchStartY;
  19709. var $resizeHandlerEl;
  19710. var $prevResizableEl;
  19711. var $nextResizableEl;
  19712. var prevElSize;
  19713. var prevElMinSize;
  19714. var prevElMaxSize;
  19715. var nextElSize;
  19716. var nextElMinSize;
  19717. var nextElMaxSize;
  19718. var parentSize;
  19719. var itemsInFlow;
  19720. var gapSize;
  19721. var isScrolling;
  19722. function handleTouchStart(e) {
  19723. if (isTouched || isMoved) { return; }
  19724. $resizeHandlerEl = $(e.target).closest('.resize-handler');
  19725. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  19726. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  19727. isTouched = true;
  19728. $prevResizableEl = undefined;
  19729. $nextResizableEl = undefined;
  19730. isScrolling = undefined;
  19731. }
  19732. function handleTouchMove(e) {
  19733. if (!isTouched) { return; }
  19734. var isRow = $resizeHandlerEl.parent('.row').length === 1;
  19735. var sizeProp = isRow ? 'height' : 'width';
  19736. var getSizeProp = isRow ? 'offsetHeight' : 'offsetWidth';
  19737. if (!isMoved) {
  19738. $prevResizableEl = $resizeHandlerEl.parent(isRow ? '.row' : '.col');
  19739. if ($prevResizableEl.length && (!$prevResizableEl.hasClass('resizable') || $prevResizableEl.hasClass('resizable-fixed'))) {
  19740. $prevResizableEl = $prevResizableEl.prevAll('.resizable:not(.resizable-fixed)').eq(0);
  19741. }
  19742. $nextResizableEl = $prevResizableEl.next(isRow ? '.row' : '.col');
  19743. if ($nextResizableEl.length && (!$nextResizableEl.hasClass('resizable') || $nextResizableEl.hasClass('resizable-fixed'))) {
  19744. $nextResizableEl = $nextResizableEl.nextAll('.resizable:not(.resizable-fixed)').eq(0);
  19745. }
  19746. if ($prevResizableEl.length) {
  19747. prevElSize = $prevResizableEl[0][getSizeProp];
  19748. prevElMinSize = getElMinSize(sizeProp, $prevResizableEl);
  19749. prevElMaxSize = getElMaxSize(sizeProp, $prevResizableEl);
  19750. parentSize = $prevResizableEl.parent()[0][getSizeProp];
  19751. itemsInFlow = $prevResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
  19752. gapSize = parseFloat($prevResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
  19753. }
  19754. if ($nextResizableEl.length) {
  19755. nextElSize = $nextResizableEl[0][getSizeProp];
  19756. nextElMinSize = getElMinSize(sizeProp, $nextResizableEl);
  19757. nextElMaxSize = getElMaxSize(sizeProp, $nextResizableEl);
  19758. if (!$prevResizableEl.length) {
  19759. parentSize = $nextResizableEl.parent()[0][getSizeProp];
  19760. itemsInFlow = $nextResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
  19761. gapSize = parseFloat($nextResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
  19762. }
  19763. }
  19764. }
  19765. isMoved = true;
  19766. var touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  19767. var touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  19768. if (typeof isScrolling === 'undefined' && !isRow) {
  19769. isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
  19770. }
  19771. if (isScrolling) {
  19772. isTouched = false;
  19773. isMoved = false;
  19774. return;
  19775. }
  19776. var isAbsolute = $prevResizableEl.hasClass('resizable-absolute') || $nextResizableEl.hasClass('resizable-absolute');
  19777. var resizeNextEl = !isRow || (isRow && !isAbsolute);
  19778. if ((resizeNextEl && !$nextResizableEl.length) || !$prevResizableEl.length) {
  19779. isTouched = false;
  19780. isMoved = false;
  19781. return;
  19782. }
  19783. e.preventDefault();
  19784. var diff = isRow
  19785. ? touchCurrentY - touchStartY
  19786. : touchCurrentX - touchStartX;
  19787. var prevElNewSize;
  19788. var nextElNewSize;
  19789. if ($prevResizableEl.length) {
  19790. prevElNewSize = prevElSize + diff;
  19791. if (prevElNewSize < prevElMinSize) {
  19792. prevElNewSize = prevElMinSize;
  19793. diff = prevElNewSize - prevElSize;
  19794. }
  19795. if (prevElMaxSize && prevElNewSize > prevElMaxSize) {
  19796. prevElNewSize = prevElMaxSize;
  19797. diff = prevElNewSize - prevElSize;
  19798. }
  19799. }
  19800. if ($nextResizableEl.length && resizeNextEl) {
  19801. nextElNewSize = nextElSize - diff;
  19802. if (nextElNewSize < nextElMinSize) {
  19803. nextElNewSize = nextElMinSize;
  19804. diff = nextElSize - nextElNewSize;
  19805. prevElNewSize = prevElSize + diff;
  19806. }
  19807. if (nextElMaxSize && nextElNewSize > nextElMaxSize) {
  19808. nextElNewSize = nextElMaxSize;
  19809. diff = nextElSize - nextElNewSize;
  19810. prevElNewSize = prevElSize + diff;
  19811. }
  19812. }
  19813. if (isAbsolute) {
  19814. $prevResizableEl[0].style[sizeProp] = prevElNewSize + "px";
  19815. if (resizeNextEl) {
  19816. $nextResizableEl[0].style[sizeProp] = nextElNewSize + "px";
  19817. }
  19818. $prevResizableEl.trigger('grid:resize');
  19819. $nextResizableEl.trigger('grid:resize');
  19820. app.emit('gridResize', $prevResizableEl[0]);
  19821. app.emit('gridResize', $nextResizableEl[0]);
  19822. return;
  19823. }
  19824. var gapAddSize = (itemsInFlow - 1) * gapSize / itemsInFlow;
  19825. var gapAddSizeCSS = isRow
  19826. ? ((itemsInFlow - 1) + " * var(--f7-grid-row-gap) / " + itemsInFlow)
  19827. : '(var(--f7-cols-per-row) - 1) * var(--f7-grid-gap) / var(--f7-cols-per-row)';
  19828. var prevElNewSizeNormalized = prevElNewSize + gapAddSize;
  19829. var nextElNewSizeNormalized = nextElNewSize + gapAddSize;
  19830. $prevResizableEl[0].style[sizeProp] = "calc(" + (prevElNewSizeNormalized / parentSize * 100) + "% - " + gapAddSizeCSS + ")";
  19831. $nextResizableEl[0].style[sizeProp] = "calc(" + (nextElNewSizeNormalized / parentSize * 100) + "% - " + gapAddSizeCSS + ")";
  19832. $prevResizableEl.trigger('grid:resize');
  19833. $nextResizableEl.trigger('grid:resize');
  19834. app.emit('gridResize', $prevResizableEl[0]);
  19835. app.emit('gridResize', $nextResizableEl[0]);
  19836. }
  19837. function handleTouchEnd() {
  19838. if (!isTouched) { return; }
  19839. if (!isMoved) {
  19840. isTouched = false;
  19841. }
  19842. isTouched = false;
  19843. isMoved = false;
  19844. }
  19845. $(document).on(app.touchEvents.start, '.col > .resize-handler, .row > .resize-handler', handleTouchStart);
  19846. app.on('touchmove', handleTouchMove);
  19847. app.on('touchend', handleTouchEnd);
  19848. },
  19849. };
  19850. var Grid$1 = {
  19851. name: 'grid',
  19852. create: function create() {
  19853. var app = this;
  19854. Utils.extend(app, {
  19855. grid: {
  19856. init: Grid.init.bind(app),
  19857. },
  19858. });
  19859. },
  19860. on: {
  19861. init: function init() {
  19862. var app = this;
  19863. app.grid.init();
  19864. },
  19865. },
  19866. };
  19867. var Calendar = /*@__PURE__*/(function (Framework7Class) {
  19868. function Calendar(app, params) {
  19869. if ( params === void 0 ) params = {};
  19870. Framework7Class.call(this, params, [app]);
  19871. var calendar = this;
  19872. calendar.params = Utils.extend({}, app.params.calendar, params);
  19873. var $containerEl;
  19874. if (calendar.params.containerEl) {
  19875. $containerEl = $(calendar.params.containerEl);
  19876. if ($containerEl.length === 0) { return calendar; }
  19877. }
  19878. var $inputEl;
  19879. if (calendar.params.inputEl) {
  19880. $inputEl = $(calendar.params.inputEl);
  19881. }
  19882. var isHorizontal = calendar.params.direction === 'horizontal';
  19883. var inverter = 1;
  19884. if (isHorizontal) {
  19885. inverter = app.rtl ? -1 : 1;
  19886. }
  19887. Utils.extend(calendar, {
  19888. app: app,
  19889. $containerEl: $containerEl,
  19890. containerEl: $containerEl && $containerEl[0],
  19891. inline: $containerEl && $containerEl.length > 0,
  19892. $inputEl: $inputEl,
  19893. inputEl: $inputEl && $inputEl[0],
  19894. initialized: false,
  19895. opened: false,
  19896. url: calendar.params.url,
  19897. isHorizontal: isHorizontal,
  19898. inverter: inverter,
  19899. animating: false,
  19900. hasTimePicker: calendar.params.timePicker && !calendar.params.rangePicker && !calendar.params.multiple,
  19901. });
  19902. calendar.dayFormatter = new Intl.DateTimeFormat(calendar.params.locale, { day: 'numeric' });
  19903. calendar.monthFormatter = new Intl.DateTimeFormat(calendar.params.locale, { month: 'long' });
  19904. calendar.yearFormatter = new Intl.DateTimeFormat(calendar.params.locale, { year: 'numeric' });
  19905. calendar.timeSelectorFormatter = new Intl.DateTimeFormat(calendar.params.locale, calendar.params.timePickerFormat);
  19906. // Auto names
  19907. var ref = calendar.params;
  19908. var monthNames = ref.monthNames;
  19909. var monthNamesShort = ref.monthNamesShort;
  19910. var dayNames = ref.dayNames;
  19911. var dayNamesShort = ref.dayNamesShort;
  19912. var ref$1 = calendar.getIntlNames();
  19913. var monthNamesIntl = ref$1.monthNamesIntl;
  19914. var monthNamesShortIntl = ref$1.monthNamesShortIntl;
  19915. var dayNamesIntl = ref$1.dayNamesIntl;
  19916. var dayNamesShortIntl = ref$1.dayNamesShortIntl;
  19917. if (monthNames === 'auto') { monthNames = monthNamesIntl; }
  19918. if (monthNamesShort === 'auto') { monthNamesShort = monthNamesShortIntl; }
  19919. if (dayNames === 'auto') { dayNames = dayNamesIntl; }
  19920. if (dayNamesShort === 'auto') { dayNamesShort = dayNamesShortIntl; }
  19921. Utils.extend(calendar, {
  19922. monthNames: monthNames,
  19923. monthNamesShort: monthNamesShort,
  19924. dayNames: dayNames,
  19925. dayNamesShort: dayNamesShort,
  19926. });
  19927. function onInputClick() {
  19928. calendar.open();
  19929. }
  19930. function onInputFocus(e) {
  19931. e.preventDefault();
  19932. }
  19933. function onInputClear() {
  19934. calendar.setValue([]);
  19935. if (calendar.opened) {
  19936. calendar.update();
  19937. }
  19938. }
  19939. function onHtmlClick(e) {
  19940. var $targetEl = $(e.target);
  19941. if (calendar.destroyed || !calendar.params) { return; }
  19942. if (calendar.isPopover()) { return; }
  19943. if (!calendar.opened || calendar.closing) { return; }
  19944. if ($targetEl.closest('[class*="backdrop"]').length) { return; }
  19945. if ($inputEl && $inputEl.length > 0) {
  19946. if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
  19947. calendar.close();
  19948. }
  19949. } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
  19950. calendar.close();
  19951. }
  19952. }
  19953. // Events
  19954. Utils.extend(calendar, {
  19955. attachInputEvents: function attachInputEvents() {
  19956. calendar.$inputEl.on('click', onInputClick);
  19957. calendar.$inputEl.on('input:clear', onInputClear);
  19958. if (calendar.params.inputReadOnly) {
  19959. calendar.$inputEl.on('focus mousedown', onInputFocus);
  19960. if (calendar.$inputEl[0]) {
  19961. calendar.$inputEl[0].f7ValidateReadonly = true;
  19962. }
  19963. }
  19964. },
  19965. detachInputEvents: function detachInputEvents() {
  19966. calendar.$inputEl.off('click', onInputClick);
  19967. calendar.$inputEl.off('input:clear', onInputClear);
  19968. if (calendar.params.inputReadOnly) {
  19969. calendar.$inputEl.off('focus mousedown', onInputFocus);
  19970. if (calendar.$inputEl[0]) {
  19971. delete calendar.$inputEl[0].f7ValidateReadonly;
  19972. }
  19973. }
  19974. },
  19975. attachHtmlEvents: function attachHtmlEvents() {
  19976. app.on('click', onHtmlClick);
  19977. },
  19978. detachHtmlEvents: function detachHtmlEvents() {
  19979. app.off('click', onHtmlClick);
  19980. },
  19981. });
  19982. calendar.attachCalendarEvents = function attachCalendarEvents() {
  19983. var allowItemClick = true;
  19984. var isTouched;
  19985. var isMoved;
  19986. var touchStartX;
  19987. var touchStartY;
  19988. var touchCurrentX;
  19989. var touchCurrentY;
  19990. var touchStartTime;
  19991. var touchEndTime;
  19992. var currentTranslate;
  19993. var wrapperWidth;
  19994. var wrapperHeight;
  19995. var percentage;
  19996. var touchesDiff;
  19997. var isScrolling;
  19998. var $el = calendar.$el;
  19999. var $wrapperEl = calendar.$wrapperEl;
  20000. function handleTouchStart(e) {
  20001. if (isMoved || isTouched) { return; }
  20002. isTouched = true;
  20003. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  20004. touchCurrentX = touchStartX;
  20005. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  20006. touchCurrentY = touchStartY;
  20007. touchStartTime = (new Date()).getTime();
  20008. percentage = 0;
  20009. allowItemClick = true;
  20010. isScrolling = undefined;
  20011. currentTranslate = calendar.monthsTranslate;
  20012. }
  20013. function handleTouchMove(e) {
  20014. if (!isTouched) { return; }
  20015. var isH = calendar.isHorizontal;
  20016. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  20017. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  20018. if (typeof isScrolling === 'undefined') {
  20019. isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
  20020. }
  20021. if (isH && isScrolling) {
  20022. isTouched = false;
  20023. return;
  20024. }
  20025. e.preventDefault();
  20026. if (calendar.animating) {
  20027. isTouched = false;
  20028. return;
  20029. }
  20030. allowItemClick = false;
  20031. if (!isMoved) {
  20032. // First move
  20033. isMoved = true;
  20034. wrapperWidth = $wrapperEl[0].offsetWidth;
  20035. wrapperHeight = $wrapperEl[0].offsetHeight;
  20036. $wrapperEl.transition(0);
  20037. }
  20038. touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
  20039. percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
  20040. currentTranslate = ((calendar.monthsTranslate * calendar.inverter) + percentage) * 100;
  20041. // Transform wrapper
  20042. $wrapperEl.transform(("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)"));
  20043. }
  20044. function handleTouchEnd() {
  20045. if (!isTouched || !isMoved) {
  20046. isTouched = false;
  20047. isMoved = false;
  20048. return;
  20049. }
  20050. isTouched = false;
  20051. isMoved = false;
  20052. touchEndTime = new Date().getTime();
  20053. if (touchEndTime - touchStartTime < 300) {
  20054. if (Math.abs(touchesDiff) < 10) {
  20055. calendar.resetMonth();
  20056. } else if (touchesDiff >= 10) {
  20057. if (app.rtl) { calendar.nextMonth(); }
  20058. else { calendar.prevMonth(); }
  20059. } else if (app.rtl) { calendar.prevMonth(); }
  20060. else { calendar.nextMonth(); }
  20061. } else if (percentage <= -0.5) {
  20062. if (app.rtl) { calendar.prevMonth(); }
  20063. else { calendar.nextMonth(); }
  20064. } else if (percentage >= 0.5) {
  20065. if (app.rtl) { calendar.nextMonth(); }
  20066. else { calendar.prevMonth(); }
  20067. } else {
  20068. calendar.resetMonth();
  20069. }
  20070. // Allow click
  20071. setTimeout(function () {
  20072. allowItemClick = true;
  20073. }, 100);
  20074. }
  20075. function handleDayClick(e) {
  20076. if (!allowItemClick) { return; }
  20077. var $dayEl = $(e.target).parents('.calendar-day');
  20078. if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
  20079. $dayEl = $(e.target);
  20080. }
  20081. if ($dayEl.length === 0) { return; }
  20082. if ($dayEl.hasClass('calendar-day-disabled')) { return; }
  20083. if (!calendar.params.rangePicker) {
  20084. if ($dayEl.hasClass('calendar-day-next')) { calendar.nextMonth(); }
  20085. if ($dayEl.hasClass('calendar-day-prev')) { calendar.prevMonth(); }
  20086. }
  20087. var dateYear = parseInt($dayEl.attr('data-year'), 10);
  20088. var dateMonth = parseInt($dayEl.attr('data-month'), 10);
  20089. var dateDay = parseInt($dayEl.attr('data-day'), 10);
  20090. calendar.emit(
  20091. 'local::dayClick calendarDayClick',
  20092. calendar,
  20093. $dayEl[0],
  20094. dateYear,
  20095. dateMonth,
  20096. dateDay
  20097. );
  20098. if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
  20099. var valueToAdd = new Date(dateYear, dateMonth, dateDay, 0, 0, 0);
  20100. if (calendar.hasTimePicker) {
  20101. if (calendar.value && calendar.value[0]) {
  20102. valueToAdd.setHours(calendar.value[0].getHours(), calendar.value[0].getMinutes());
  20103. } else {
  20104. valueToAdd.setHours(new Date().getHours(), new Date().getMinutes());
  20105. }
  20106. }
  20107. calendar.addValue(valueToAdd);
  20108. }
  20109. if (calendar.params.closeOnSelect) {
  20110. if (
  20111. (calendar.params.rangePicker && calendar.value.length === 2)
  20112. || !calendar.params.rangePicker
  20113. ) {
  20114. calendar.close();
  20115. }
  20116. }
  20117. }
  20118. function onNextMonthClick() {
  20119. calendar.nextMonth();
  20120. }
  20121. function onPrevMonthClick() {
  20122. calendar.prevMonth();
  20123. }
  20124. function onNextYearClick() {
  20125. calendar.nextYear();
  20126. }
  20127. function onPrevYearClick() {
  20128. calendar.prevYear();
  20129. }
  20130. function onMonthSelectorClick() {
  20131. $el.append(calendar.renderMonthPicker());
  20132. }
  20133. function onMonthSelectorItemClick() {
  20134. var $clickedEl = $(this);
  20135. if ($clickedEl.hasClass('calendar-month-picker-item-current')) {
  20136. $el.find('.calendar-month-picker').remove();
  20137. return;
  20138. }
  20139. $el.find('.calendar-month-picker-item-current').add($clickedEl).toggleClass('calendar-month-picker-item-current');
  20140. var index = $clickedEl.index();
  20141. var localeMonthIndex = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
  20142. var monthIndex = calendar.currentMonth;
  20143. var diff = localeMonthIndex - monthIndex;
  20144. var diffIndex = index - diff;
  20145. calendar.setYearMonth(calendar.currentYear, diffIndex, 0);
  20146. setTimeout(function () {
  20147. $el.find('.calendar-month-picker').remove();
  20148. }, 200);
  20149. }
  20150. function onYearSelectorClick() {
  20151. $el.append(calendar.renderYearPicker());
  20152. var $currentEl = $el.find('.calendar-year-picker-item-current');
  20153. var $yearPickerEl = $el.find('.calendar-year-picker');
  20154. if (!$currentEl || !$currentEl.length) { return; }
  20155. $yearPickerEl.scrollTop(
  20156. $currentEl[0].offsetTop
  20157. - $yearPickerEl[0].offsetHeight / 2
  20158. + $currentEl[0].offsetHeight / 2
  20159. );
  20160. }
  20161. function onYearSelectorItemClick() {
  20162. var $clickedEl = $(this);
  20163. if ($clickedEl.hasClass('calendar-year-picker-item-current')) {
  20164. $el.find('.calendar-year-picker').remove();
  20165. return;
  20166. }
  20167. $el.find('.calendar-year-picker-item-current').add($clickedEl).toggleClass('calendar-year-picker-item-current');
  20168. var year = parseInt($clickedEl.attr('data-year'), 10);
  20169. calendar.setYearMonth(year, undefined, 0);
  20170. setTimeout(function () {
  20171. $el.find('.calendar-year-picker').remove();
  20172. }, 200);
  20173. }
  20174. function onTimeSelectorClick() {
  20175. calendar.openTimePicker();
  20176. }
  20177. function onTimePickerCloseClick() {
  20178. calendar.closeTimePicker();
  20179. }
  20180. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  20181. // Selectors clicks
  20182. $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
  20183. $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
  20184. $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
  20185. $el.find('.calendar-next-year-button').on('click', onNextYearClick);
  20186. if (calendar.params.monthPicker) {
  20187. $el.find('.current-month-value').on('click', onMonthSelectorClick);
  20188. $el.on('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
  20189. }
  20190. if (calendar.params.yearPicker) {
  20191. $el.find('.current-year-value').on('click', onYearSelectorClick);
  20192. $el.on('click', '.calendar-year-picker-item', onYearSelectorItemClick);
  20193. }
  20194. if (calendar.hasTimePicker) {
  20195. $el.find('.calendar-time-selector a').on('click', onTimeSelectorClick);
  20196. $el.on('click', '.calendar-time-picker-close', onTimePickerCloseClick);
  20197. }
  20198. // Day clicks
  20199. $wrapperEl.on('click', handleDayClick);
  20200. // Touch events
  20201. if (calendar.params.touchMove) {
  20202. $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
  20203. app.on('touchmove:active', handleTouchMove);
  20204. app.on('touchend:passive', handleTouchEnd);
  20205. }
  20206. calendar.detachCalendarEvents = function detachCalendarEvents() {
  20207. $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
  20208. $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
  20209. $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
  20210. $el.find('.calendar-next-year-button').off('click', onNextYearClick);
  20211. if (calendar.params.monthPicker) {
  20212. $el.find('.current-month-value').off('click', onMonthSelectorClick);
  20213. $el.off('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
  20214. }
  20215. if (calendar.params.yearPicker) {
  20216. $el.find('.current-year-value').off('click', onYearSelectorClick);
  20217. $el.off('click', '.calendar-year-picker-item', onYearSelectorItemClick);
  20218. }
  20219. if (calendar.hasTimePicker) {
  20220. $el.find('.calendar-time-selector a').off('click', onTimeSelectorClick);
  20221. $el.off('click', '.calendar-time-picker-close', onTimePickerCloseClick);
  20222. }
  20223. $wrapperEl.off('click', handleDayClick);
  20224. if (calendar.params.touchMove) {
  20225. $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
  20226. app.off('touchmove:active', handleTouchMove);
  20227. app.off('touchend:passive', handleTouchEnd);
  20228. }
  20229. };
  20230. };
  20231. calendar.init();
  20232. return calendar;
  20233. }
  20234. if ( Framework7Class ) Calendar.__proto__ = Framework7Class;
  20235. Calendar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  20236. Calendar.prototype.constructor = Calendar;
  20237. var prototypeAccessors = { view: { configurable: true } };
  20238. prototypeAccessors.view.get = function () {
  20239. var ref = this;
  20240. var $inputEl = ref.$inputEl;
  20241. var app = ref.app;
  20242. var params = ref.params;
  20243. var view;
  20244. if (params.view) {
  20245. view = params.view;
  20246. } else if ($inputEl) {
  20247. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  20248. }
  20249. if (!view) { view = app.views.main; }
  20250. return view;
  20251. };
  20252. Calendar.prototype.getIntlNames = function getIntlNames () {
  20253. var calendar = this;
  20254. var locale = calendar.params.locale;
  20255. var monthNamesIntl = [];
  20256. var monthNamesShortIntl = [];
  20257. var dayNamesIntl = [];
  20258. var dayNamesShortIntl = [];
  20259. var formatterMonthNames = new Intl.DateTimeFormat(locale, { month: 'long' });
  20260. var formatterMonthNamesShort = new Intl.DateTimeFormat(locale, { month: 'short' });
  20261. var formatterDayNames = new Intl.DateTimeFormat(locale, { weekday: 'long' });
  20262. var formatterDayNamesShort = new Intl.DateTimeFormat(locale, { weekday: 'short' });
  20263. var year;
  20264. var yearStarted;
  20265. var yearEnded;
  20266. for (var i = 0; i < 24; i += 1) {
  20267. var date = new Date().setMonth(i, 1);
  20268. var currentYear = calendar.yearFormatter.format(date);
  20269. if (year && currentYear !== year) {
  20270. if (yearStarted) { yearEnded = true; }
  20271. yearStarted = true;
  20272. year = currentYear;
  20273. }
  20274. if (!year) {
  20275. year = currentYear;
  20276. }
  20277. if (yearStarted && year === currentYear && !yearEnded) {
  20278. monthNamesIntl.push(formatterMonthNames.format(date));
  20279. monthNamesShortIntl.push(formatterMonthNamesShort.format(date));
  20280. }
  20281. }
  20282. var weekDay = new Date().getDay();
  20283. for (var i$1 = 0; i$1 < 7; i$1 += 1) {
  20284. var date$1 = new Date().getTime() + (i$1 - weekDay) * 24 * 60 * 60 * 1000;
  20285. dayNamesIntl.push(formatterDayNames.format(date$1));
  20286. dayNamesShortIntl.push(formatterDayNamesShort.format(date$1));
  20287. }
  20288. return {
  20289. monthNamesIntl: monthNamesIntl,
  20290. monthNamesShortIntl: monthNamesShortIntl,
  20291. dayNamesIntl: dayNamesIntl,
  20292. dayNamesShortIntl: dayNamesShortIntl,
  20293. };
  20294. };
  20295. Calendar.prototype.normalizeDate = function normalizeDate (date) {
  20296. var calendar = this;
  20297. var d = new Date(date);
  20298. if (calendar.hasTimePicker) {
  20299. return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
  20300. }
  20301. return new Date(d.getFullYear(), d.getMonth(), d.getDate());
  20302. };
  20303. Calendar.prototype.normalizeValues = function normalizeValues (values) {
  20304. var calendar = this;
  20305. var newValues = [];
  20306. if (values && Array.isArray(values)) {
  20307. newValues = values.map(function (val) { return calendar.normalizeDate(val); });
  20308. }
  20309. return newValues;
  20310. };
  20311. Calendar.prototype.initInput = function initInput () {
  20312. var calendar = this;
  20313. if (!calendar.$inputEl) { return; }
  20314. if (calendar.params.inputReadOnly) { calendar.$inputEl.prop('readOnly', true); }
  20315. };
  20316. Calendar.prototype.isPopover = function isPopover () {
  20317. var calendar = this;
  20318. var app = calendar.app;
  20319. var modal = calendar.modal;
  20320. var params = calendar.params;
  20321. if (params.openIn === 'sheet') { return false; }
  20322. if (modal && modal.type !== 'popover') { return false; }
  20323. if (!calendar.inline && calendar.inputEl) {
  20324. if (params.openIn === 'popover') { return true; }
  20325. if (app.device.ios) {
  20326. return !!app.device.ipad;
  20327. }
  20328. if (app.width >= 768) {
  20329. return true;
  20330. }
  20331. if (app.device.desktop && app.theme === 'aurora') {
  20332. return true;
  20333. }
  20334. }
  20335. return false;
  20336. };
  20337. Calendar.prototype.formatDate = function formatDate (d) {
  20338. var calendar = this;
  20339. var date = new Date(d);
  20340. var year = date.getFullYear();
  20341. var month = date.getMonth();
  20342. var month1 = month + 1;
  20343. var day = date.getDate();
  20344. var weekDay = date.getDay();
  20345. var monthNames = calendar.monthNames;
  20346. var monthNamesShort = calendar.monthNamesShort;
  20347. var dayNames = calendar.dayNames;
  20348. var dayNamesShort = calendar.dayNamesShort;
  20349. var ref = calendar.params;
  20350. var dateFormat = ref.dateFormat;
  20351. var locale = ref.locale;
  20352. function twoDigits(number) {
  20353. return (number < 10) ? ("0" + number) : number;
  20354. }
  20355. if (typeof dateFormat === 'string') {
  20356. var tokens = {
  20357. yyyy: year,
  20358. yy: String(year).substring(2),
  20359. mm: twoDigits(month1),
  20360. m: month1,
  20361. MM: monthNames[month],
  20362. M: monthNamesShort[month],
  20363. dd: twoDigits(day),
  20364. d: day,
  20365. DD: dayNames[weekDay],
  20366. D: dayNamesShort[weekDay],
  20367. };
  20368. if (calendar.params.timePicker) {
  20369. var hours = date.getHours();
  20370. var minutes = date.getMinutes();
  20371. var seconds = date.getSeconds();
  20372. var hours12 = hours;
  20373. if (hours > 12) { hours12 = hours - 12; }
  20374. if (hours === 0) { hours12 = 12; }
  20375. var a = hours >= 12 && hours !== 0 ? 'pm' : 'am';
  20376. Object.assign(tokens, {
  20377. HH: twoDigits(hours),
  20378. H: hours,
  20379. hh: twoDigits(hours12),
  20380. h: hours12,
  20381. ss: twoDigits(seconds),
  20382. s: seconds,
  20383. ':mm': twoDigits(minutes),
  20384. ':m': minutes,
  20385. a: a,
  20386. A: a.toUpperCase(),
  20387. });
  20388. }
  20389. var regexp = new RegExp(
  20390. Object.keys(tokens).map(function (t) { return ("(" + t + ")"); }).join('|'),
  20391. 'g'
  20392. );
  20393. return dateFormat.replace(regexp, function (token) {
  20394. if (token in tokens) { return tokens[token]; }
  20395. return token;
  20396. });
  20397. }
  20398. if (typeof dateFormat === 'function') {
  20399. return dateFormat(date);
  20400. }
  20401. // Intl Object
  20402. var formatter = new Intl.DateTimeFormat(locale, dateFormat);
  20403. return formatter.format(date);
  20404. };
  20405. Calendar.prototype.formatValue = function formatValue () {
  20406. var calendar = this;
  20407. var value = calendar.value;
  20408. if (calendar.params.formatValue) {
  20409. return calendar.params.formatValue.call(calendar, value);
  20410. }
  20411. return value
  20412. .map(function (v) { return calendar.formatDate(v); })
  20413. .join(calendar.params.rangePicker ? ' - ' : ', ');
  20414. };
  20415. Calendar.prototype.addValue = function addValue (newValue) {
  20416. var calendar = this;
  20417. var ref = calendar.params;
  20418. var multiple = ref.multiple;
  20419. var rangePicker = ref.rangePicker;
  20420. var rangePickerMinDays = ref.rangePickerMinDays;
  20421. var rangePickerMaxDays = ref.rangePickerMaxDays;
  20422. if (multiple) {
  20423. if (!calendar.value) { calendar.value = []; }
  20424. var inValuesIndex;
  20425. for (var i = 0; i < calendar.value.length; i += 1) {
  20426. if (new Date(newValue).getTime() === new Date(calendar.value[i]).getTime()) {
  20427. inValuesIndex = i;
  20428. }
  20429. }
  20430. if (typeof inValuesIndex === 'undefined') {
  20431. calendar.value.push(newValue);
  20432. } else {
  20433. calendar.value.splice(inValuesIndex, 1);
  20434. }
  20435. calendar.updateValue();
  20436. } else if (rangePicker) {
  20437. if (!calendar.value) { calendar.value = []; }
  20438. if (calendar.value.length === 2 || calendar.value.length === 0) {
  20439. calendar.value = [];
  20440. }
  20441. if ((calendar.value.length === 0
  20442. || ((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); }
  20443. else { calendar.value = []; }
  20444. calendar.value.sort(function (a, b) { return a - b; });
  20445. calendar.updateValue();
  20446. } else {
  20447. calendar.value = [newValue];
  20448. calendar.updateValue();
  20449. }
  20450. };
  20451. Calendar.prototype.setValue = function setValue (values) {
  20452. var calendar = this;
  20453. var currentValue = calendar.value;
  20454. if (Array.isArray(currentValue) && Array.isArray(values) && currentValue.length === values.length) {
  20455. var equal = true;
  20456. currentValue.forEach(function (v, index) {
  20457. if (v !== values[index]) { equal = false; }
  20458. });
  20459. if (equal) { return; }
  20460. }
  20461. calendar.value = values;
  20462. calendar.updateValue();
  20463. };
  20464. Calendar.prototype.getValue = function getValue () {
  20465. var calendar = this;
  20466. return calendar.value;
  20467. };
  20468. Calendar.prototype.updateValue = function updateValue (onlyHeader) {
  20469. var calendar = this;
  20470. var $el = calendar.$el;
  20471. var $wrapperEl = calendar.$wrapperEl;
  20472. var $inputEl = calendar.$inputEl;
  20473. var value = calendar.value;
  20474. var params = calendar.params;
  20475. var i;
  20476. if ($el && $el.length > 0) {
  20477. $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected');
  20478. var valueDate;
  20479. if (params.rangePicker && value.length === 2) {
  20480. for (i = new Date(value[0]).getTime(); i <= new Date(value[1]).getTime(); i += 24 * 60 * 60 * 1000) {
  20481. valueDate = new Date(i);
  20482. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  20483. }
  20484. valueDate = new Date(new Date(value[1]).getTime());
  20485. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  20486. } else {
  20487. for (i = 0; i < calendar.value.length; i += 1) {
  20488. valueDate = new Date(value[i]);
  20489. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  20490. }
  20491. }
  20492. }
  20493. if (!onlyHeader) {
  20494. calendar.emit('local::change calendarChange', calendar, value);
  20495. }
  20496. if ($el && $el.length > 0 && calendar.hasTimePicker) {
  20497. $el.find('.calendar-time-selector a').text(value && value.length ? calendar.timeSelectorFormatter.format(value[0]) : calendar.params.timePickerPlaceholder);
  20498. }
  20499. if (($inputEl && $inputEl.length) || params.header) {
  20500. var inputValue = calendar.formatValue(value);
  20501. if (params.header && $el && $el.length) {
  20502. $el.find('.calendar-selected-date').text(inputValue);
  20503. }
  20504. if ($inputEl && $inputEl.length && !onlyHeader) {
  20505. $inputEl.val(inputValue);
  20506. $inputEl.trigger('change');
  20507. }
  20508. }
  20509. };
  20510. Calendar.prototype.updateCurrentMonthYear = function updateCurrentMonthYear (dir) {
  20511. var calendar = this;
  20512. var $months = calendar.$months;
  20513. var $el = calendar.$el;
  20514. var monthNames = calendar.monthNames;
  20515. var currentLocaleMonth;
  20516. var currentLocaleYear;
  20517. if (typeof dir === 'undefined') {
  20518. calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
  20519. calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
  20520. currentLocaleMonth = $months.eq(1).attr('data-locale-month');
  20521. currentLocaleYear = $months.eq(1).attr('data-locale-year');
  20522. } else {
  20523. calendar.currentMonth = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-month'), 10);
  20524. calendar.currentYear = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-year'), 10);
  20525. currentLocaleMonth = $months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-locale-month');
  20526. currentLocaleYear = $months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-locale-year');
  20527. }
  20528. $el.find('.current-month-value').text(monthNames[currentLocaleMonth]);
  20529. $el.find('.current-year-value').text(currentLocaleYear);
  20530. };
  20531. Calendar.prototype.update = function update () {
  20532. var calendar = this;
  20533. var currentYear = calendar.currentYear;
  20534. var currentMonth = calendar.currentMonth;
  20535. var $wrapperEl = calendar.$wrapperEl;
  20536. var currentDate = new Date(currentYear, currentMonth);
  20537. var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
  20538. var currentMonthHtml = calendar.renderMonth(currentDate);
  20539. var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
  20540. $wrapperEl
  20541. .transition(0)
  20542. .html(("" + prevMonthHtml + currentMonthHtml + nextMonthHtml))
  20543. .transform('translate3d(0,0,0)');
  20544. calendar.$months = $wrapperEl.find('.calendar-month');
  20545. calendar.monthsTranslate = 0;
  20546. calendar.setMonthsTranslate();
  20547. calendar.$months.each(function (index, monthEl) {
  20548. calendar.emit(
  20549. 'local::monthAdd calendarMonthAdd',
  20550. monthEl
  20551. );
  20552. });
  20553. };
  20554. Calendar.prototype.onMonthChangeStart = function onMonthChangeStart (dir) {
  20555. var calendar = this;
  20556. var $months = calendar.$months;
  20557. var currentYear = calendar.currentYear;
  20558. var currentMonth = calendar.currentMonth;
  20559. calendar.updateCurrentMonthYear(dir);
  20560. $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
  20561. var currentIndex = dir === 'next' ? $months.length - 1 : 0;
  20562. $months.eq(currentIndex).addClass('calendar-month-current');
  20563. $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
  20564. calendar.emit(
  20565. 'local::monthYearChangeStart calendarMonthYearChangeStart',
  20566. calendar,
  20567. currentYear,
  20568. currentMonth
  20569. );
  20570. };
  20571. Calendar.prototype.onMonthChangeEnd = function onMonthChangeEnd (dir, rebuildBoth) {
  20572. var calendar = this;
  20573. var currentYear = calendar.currentYear;
  20574. var currentMonth = calendar.currentMonth;
  20575. var $wrapperEl = calendar.$wrapperEl;
  20576. var monthsTranslate = calendar.monthsTranslate;
  20577. calendar.animating = false;
  20578. var nextMonthHtml;
  20579. var prevMonthHtml;
  20580. var currentMonthHtml;
  20581. $wrapperEl
  20582. .find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)')
  20583. .remove();
  20584. if (typeof dir === 'undefined') {
  20585. dir = 'next'; // eslint-disable-line
  20586. rebuildBoth = true; // eslint-disable-line
  20587. }
  20588. if (!rebuildBoth) {
  20589. currentMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), dir);
  20590. } else {
  20591. $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
  20592. prevMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'prev');
  20593. nextMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'next');
  20594. }
  20595. if (dir === 'next' || rebuildBoth) {
  20596. $wrapperEl.append(currentMonthHtml || nextMonthHtml);
  20597. }
  20598. if (dir === 'prev' || rebuildBoth) {
  20599. $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
  20600. }
  20601. var $months = $wrapperEl.find('.calendar-month');
  20602. calendar.$months = $months;
  20603. calendar.setMonthsTranslate(monthsTranslate);
  20604. calendar.emit(
  20605. 'local::monthAdd calendarMonthAdd',
  20606. calendar,
  20607. dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]
  20608. );
  20609. calendar.emit(
  20610. 'local::monthYearChangeEnd calendarMonthYearChangeEnd',
  20611. calendar,
  20612. currentYear,
  20613. currentMonth
  20614. );
  20615. };
  20616. Calendar.prototype.setMonthsTranslate = function setMonthsTranslate (translate) {
  20617. var calendar = this;
  20618. var $months = calendar.$months;
  20619. var isH = calendar.isHorizontal;
  20620. var inverter = calendar.inverter;
  20621. // eslint-disable-next-line
  20622. translate = translate || calendar.monthsTranslate || 0;
  20623. if (typeof calendar.monthsTranslate === 'undefined') {
  20624. calendar.monthsTranslate = translate;
  20625. }
  20626. $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
  20627. var prevMonthTranslate = -(translate + 1) * 100 * inverter;
  20628. var currentMonthTranslate = -translate * 100 * inverter;
  20629. var nextMonthTranslate = -(translate - 1) * 100 * inverter;
  20630. $months.eq(0)
  20631. .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
  20632. .addClass('calendar-month-prev');
  20633. $months.eq(1)
  20634. .transform(("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)"))
  20635. .addClass('calendar-month-current');
  20636. $months.eq(2)
  20637. .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
  20638. .addClass('calendar-month-next');
  20639. };
  20640. Calendar.prototype.nextMonth = function nextMonth (transition) {
  20641. var calendar = this;
  20642. var params = calendar.params;
  20643. var $wrapperEl = calendar.$wrapperEl;
  20644. var inverter = calendar.inverter;
  20645. var isH = calendar.isHorizontal;
  20646. if (typeof transition === 'undefined' || typeof transition === 'object') {
  20647. transition = ''; // eslint-disable-line
  20648. if (!params.animate) { transition = 0; } // eslint-disable-line
  20649. }
  20650. var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
  20651. var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
  20652. var nextDate = new Date(nextYear, nextMonth);
  20653. var nextDateTime = nextDate.getTime();
  20654. var transitionEndCallback = !calendar.animating;
  20655. if (params.maxDate) {
  20656. if (nextDateTime > new Date(params.maxDate).getTime()) {
  20657. calendar.resetMonth();
  20658. return;
  20659. }
  20660. }
  20661. calendar.monthsTranslate -= 1;
  20662. if (nextMonth === calendar.currentMonth) {
  20663. var nextMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
  20664. var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next'))
  20665. .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
  20666. .addClass('calendar-month-next');
  20667. $wrapperEl.append(nextMonthHtml[0]);
  20668. calendar.$months = $wrapperEl.find('.calendar-month');
  20669. calendar.emit(
  20670. 'local::monthAdd calendarMonthAdd',
  20671. calendar.$months.eq(calendar.$months.length - 1)[0]
  20672. );
  20673. }
  20674. calendar.animating = true;
  20675. calendar.onMonthChangeStart('next');
  20676. var translate = (calendar.monthsTranslate * 100) * inverter;
  20677. $wrapperEl.transition(transition).transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  20678. if (transitionEndCallback) {
  20679. $wrapperEl.transitionEnd(function () {
  20680. calendar.onMonthChangeEnd('next');
  20681. });
  20682. }
  20683. if (!params.animate) {
  20684. calendar.onMonthChangeEnd('next');
  20685. }
  20686. };
  20687. Calendar.prototype.prevMonth = function prevMonth (transition) {
  20688. var calendar = this;
  20689. var params = calendar.params;
  20690. var $wrapperEl = calendar.$wrapperEl;
  20691. var inverter = calendar.inverter;
  20692. var isH = calendar.isHorizontal;
  20693. if (typeof transition === 'undefined' || typeof transition === 'object') {
  20694. transition = ''; // eslint-disable-line
  20695. if (!params.animate) { transition = 0; } // eslint-disable-line
  20696. }
  20697. var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
  20698. var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
  20699. var prevDate = new Date(prevYear, prevMonth + 1, -1);
  20700. var prevDateTime = prevDate.getTime();
  20701. var transitionEndCallback = !calendar.animating;
  20702. if (params.minDate) {
  20703. var minDate = new Date(params.minDate);
  20704. minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
  20705. if (prevDateTime < minDate.getTime()) {
  20706. calendar.resetMonth();
  20707. return;
  20708. }
  20709. }
  20710. calendar.monthsTranslate += 1;
  20711. if (prevMonth === calendar.currentMonth) {
  20712. var prevMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
  20713. var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev'))
  20714. .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
  20715. .addClass('calendar-month-prev');
  20716. $wrapperEl.prepend(prevMonthHtml[0]);
  20717. calendar.$months = $wrapperEl.find('.calendar-month');
  20718. calendar.emit(
  20719. 'local::monthAdd calendarMonthAdd',
  20720. calendar.$months.eq(0)[0]
  20721. );
  20722. }
  20723. calendar.animating = true;
  20724. calendar.onMonthChangeStart('prev');
  20725. var translate = (calendar.monthsTranslate * 100) * inverter;
  20726. $wrapperEl
  20727. .transition(transition)
  20728. .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  20729. if (transitionEndCallback) {
  20730. $wrapperEl.transitionEnd(function () {
  20731. calendar.onMonthChangeEnd('prev');
  20732. });
  20733. }
  20734. if (!params.animate) {
  20735. calendar.onMonthChangeEnd('prev');
  20736. }
  20737. };
  20738. Calendar.prototype.resetMonth = function resetMonth (transition) {
  20739. if ( transition === void 0 ) transition = '';
  20740. var calendar = this;
  20741. var $wrapperEl = calendar.$wrapperEl;
  20742. var inverter = calendar.inverter;
  20743. var isH = calendar.isHorizontal;
  20744. var monthsTranslate = calendar.monthsTranslate;
  20745. var translate = (monthsTranslate * 100) * inverter;
  20746. $wrapperEl
  20747. .transition(transition)
  20748. .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  20749. };
  20750. // eslint-disable-next-line
  20751. Calendar.prototype.setYearMonth = function setYearMonth (year, month, transition) {
  20752. var calendar = this;
  20753. var params = calendar.params;
  20754. var isH = calendar.isHorizontal;
  20755. var $wrapperEl = calendar.$wrapperEl;
  20756. var inverter = calendar.inverter;
  20757. // eslint-disable-next-line
  20758. if (typeof year === 'undefined') { year = calendar.currentYear; }
  20759. // eslint-disable-next-line
  20760. if (typeof month === 'undefined') { month = calendar.currentMonth; }
  20761. if (typeof transition === 'undefined' || typeof transition === 'object') {
  20762. // eslint-disable-next-line
  20763. transition = '';
  20764. // eslint-disable-next-line
  20765. if (!params.animate) { transition = 0; }
  20766. }
  20767. var targetDate;
  20768. if (year < calendar.currentYear) {
  20769. targetDate = new Date(year, month + 1, -1).getTime();
  20770. } else {
  20771. targetDate = new Date(year, month).getTime();
  20772. }
  20773. if (params.maxDate && targetDate > new Date(params.maxDate).getTime()) {
  20774. return false;
  20775. }
  20776. if (params.minDate) {
  20777. var minDate = new Date(params.minDate);
  20778. minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
  20779. if (targetDate < minDate.getTime()) {
  20780. return false;
  20781. }
  20782. }
  20783. var currentDate = new Date(calendar.currentYear, calendar.currentMonth).getTime();
  20784. var dir = targetDate > currentDate ? 'next' : 'prev';
  20785. var newMonthHTML = calendar.renderMonth(new Date(year, month));
  20786. calendar.monthsTranslate = calendar.monthsTranslate || 0;
  20787. var prevTranslate = calendar.monthsTranslate;
  20788. var monthTranslate;
  20789. var transitionEndCallback = !calendar.animating && transition !== 0;
  20790. if (targetDate > currentDate) {
  20791. // To next
  20792. calendar.monthsTranslate -= 1;
  20793. if (!calendar.animating) { calendar.$months.eq(calendar.$months.length - 1).remove(); }
  20794. $wrapperEl.append(newMonthHTML);
  20795. calendar.$months = $wrapperEl.find('.calendar-month');
  20796. monthTranslate = -(prevTranslate - 1) * 100 * inverter;
  20797. calendar.$months
  20798. .eq(calendar.$months.length - 1)
  20799. .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
  20800. .addClass('calendar-month-next');
  20801. } else {
  20802. // To prev
  20803. calendar.monthsTranslate += 1;
  20804. if (!calendar.animating) { calendar.$months.eq(0).remove(); }
  20805. $wrapperEl.prepend(newMonthHTML);
  20806. calendar.$months = $wrapperEl.find('.calendar-month');
  20807. monthTranslate = -(prevTranslate + 1) * 100 * inverter;
  20808. calendar.$months
  20809. .eq(0)
  20810. .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
  20811. .addClass('calendar-month-prev');
  20812. }
  20813. calendar.emit(
  20814. 'local::monthAdd calendarMonthAdd',
  20815. dir === 'next'
  20816. ? calendar.$months.eq(calendar.$months.length - 1)[0]
  20817. : calendar.$months.eq(0)[0]
  20818. );
  20819. calendar.animating = true;
  20820. calendar.onMonthChangeStart(dir);
  20821. var wrapperTranslate = (calendar.monthsTranslate * 100) * inverter;
  20822. $wrapperEl
  20823. .transition(transition)
  20824. .transform(("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)"));
  20825. if (transitionEndCallback) {
  20826. $wrapperEl.transitionEnd(function () {
  20827. calendar.onMonthChangeEnd(dir, true);
  20828. });
  20829. }
  20830. if (!params.animate || transition === 0) {
  20831. calendar.onMonthChangeEnd(dir, true);
  20832. }
  20833. };
  20834. Calendar.prototype.nextYear = function nextYear () {
  20835. var calendar = this;
  20836. calendar.setYearMonth(calendar.currentYear + 1);
  20837. };
  20838. Calendar.prototype.prevYear = function prevYear () {
  20839. var calendar = this;
  20840. calendar.setYearMonth(calendar.currentYear - 1);
  20841. };
  20842. // eslint-disable-next-line
  20843. Calendar.prototype.dateInRange = function dateInRange (dayDate, range) {
  20844. var match = false;
  20845. var i;
  20846. if (!range) { return false; }
  20847. if (Array.isArray(range)) {
  20848. for (i = 0; i < range.length; i += 1) {
  20849. if (range[i].from || range[i].to) {
  20850. if (range[i].from && range[i].to) {
  20851. if ((dayDate <= new Date(range[i].to).getTime()) && (dayDate >= new Date(range[i].from).getTime())) {
  20852. match = true;
  20853. }
  20854. } else if (range[i].from) {
  20855. if (dayDate >= new Date(range[i].from).getTime()) {
  20856. match = true;
  20857. }
  20858. } else if (range[i].to) {
  20859. if (dayDate <= new Date(range[i].to).getTime()) {
  20860. match = true;
  20861. }
  20862. }
  20863. } else if (range[i].date) {
  20864. if (dayDate === new Date(range[i].date).getTime()) {
  20865. match = true;
  20866. }
  20867. } else if (dayDate === new Date(range[i]).getTime()) {
  20868. match = true;
  20869. }
  20870. }
  20871. } else if (range.from || range.to) {
  20872. if (range.from && range.to) {
  20873. if ((dayDate <= new Date(range.to).getTime()) && (dayDate >= new Date(range.from).getTime())) {
  20874. match = true;
  20875. }
  20876. } else if (range.from) {
  20877. if (dayDate >= new Date(range.from).getTime()) {
  20878. match = true;
  20879. }
  20880. } else if (range.to) {
  20881. if (dayDate <= new Date(range.to).getTime()) {
  20882. match = true;
  20883. }
  20884. }
  20885. } else if (range.date) {
  20886. match = dayDate === new Date(range.date).getTime();
  20887. } else if (typeof range === 'function') {
  20888. match = range(new Date(dayDate));
  20889. }
  20890. return match;
  20891. };
  20892. // eslint-disable-next-line
  20893. Calendar.prototype.daysInMonth = function daysInMonth (date) {
  20894. var d = new Date(date);
  20895. return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
  20896. };
  20897. Calendar.prototype.renderMonths = function renderMonths (date) {
  20898. var calendar = this;
  20899. if (calendar.params.renderMonths) {
  20900. return calendar.params.renderMonths.call(calendar, date);
  20901. }
  20902. 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();
  20903. };
  20904. Calendar.prototype.renderMonth = function renderMonth (d, offset) {
  20905. var calendar = this;
  20906. var params = calendar.params;
  20907. var value = calendar.value;
  20908. if (params.renderMonth) {
  20909. return params.renderMonth.call(calendar, d, offset);
  20910. }
  20911. var date = new Date(d);
  20912. var year = date.getFullYear();
  20913. var month = date.getMonth();
  20914. var localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
  20915. if (localeMonth < 0) { localeMonth = month; }
  20916. var localeYear = calendar.yearFormatter.format(date);
  20917. if (offset === 'next') {
  20918. if (month === 11) { date = new Date(year + 1, 0); }
  20919. else { date = new Date(year, month + 1, 1); }
  20920. }
  20921. if (offset === 'prev') {
  20922. if (month === 0) { date = new Date(year - 1, 11); }
  20923. else { date = new Date(year, month - 1, 1); }
  20924. }
  20925. if (offset === 'next' || offset === 'prev') {
  20926. month = date.getMonth();
  20927. year = date.getFullYear();
  20928. localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
  20929. if (localeMonth < 0) { localeMonth = month; }
  20930. localeYear = calendar.yearFormatter.format(date);
  20931. }
  20932. var currentValues = [];
  20933. var today = new Date().setHours(0, 0, 0, 0);
  20934. var minDate = params.minDate ? new Date(params.minDate).getTime() : null;
  20935. var maxDate = params.maxDate ? new Date(params.maxDate).getTime() : null;
  20936. var rows = 6;
  20937. var cols = 7;
  20938. var daysInPrevMonth = calendar.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - (10 * 24 * 60 * 60 * 1000));
  20939. var daysInMonth = calendar.daysInMonth(date);
  20940. var minDayNumber = params.firstDay === 6 ? 0 : 1;
  20941. var monthHtml = '';
  20942. var dayIndex = 0 + (params.firstDay - 1);
  20943. var disabled;
  20944. var hasEvents;
  20945. var firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();
  20946. if (firstDayOfMonthIndex === 0) { firstDayOfMonthIndex = 7; }
  20947. if (value && value.length) {
  20948. for (var i = 0; i < value.length; i += 1) {
  20949. currentValues.push(new Date(value[i]).setHours(0, 0, 0, 0));
  20950. }
  20951. }
  20952. for (var row = 1; row <= rows; row += 1) {
  20953. var rowHtml = '';
  20954. var loop = function ( col ) {
  20955. dayIndex += 1;
  20956. var dayDate = (void 0);
  20957. var dayNumber = dayIndex - firstDayOfMonthIndex;
  20958. var addClass = '';
  20959. if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
  20960. dayIndex -= 7;
  20961. dayNumber = dayIndex - firstDayOfMonthIndex;
  20962. }
  20963. var weekDayIndex = ((col - 1) + params.firstDay > 6)
  20964. ? ((col - 1 - 7) + params.firstDay)
  20965. : ((col - 1) + params.firstDay);
  20966. if (dayNumber < 0) {
  20967. dayNumber = daysInPrevMonth + dayNumber + 1;
  20968. addClass += ' calendar-day-prev';
  20969. dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
  20970. } else {
  20971. dayNumber += 1;
  20972. if (dayNumber > daysInMonth) {
  20973. dayNumber -= daysInMonth;
  20974. addClass += ' calendar-day-next';
  20975. dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
  20976. } else {
  20977. dayDate = new Date(year, month, dayNumber).getTime();
  20978. }
  20979. }
  20980. // Today
  20981. if (dayDate === today) { addClass += ' calendar-day-today'; }
  20982. // Selected
  20983. if (params.rangePicker && currentValues.length === 2) {
  20984. if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) { addClass += ' calendar-day-selected'; }
  20985. } else if (currentValues.indexOf(dayDate) >= 0) { addClass += ' calendar-day-selected'; }
  20986. // Weekend
  20987. if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
  20988. addClass += ' calendar-day-weekend';
  20989. }
  20990. // Events
  20991. var eventsHtml = '';
  20992. hasEvents = false;
  20993. if (params.events) {
  20994. if (calendar.dateInRange(dayDate, params.events)) {
  20995. hasEvents = true;
  20996. }
  20997. }
  20998. if (hasEvents) {
  20999. addClass += ' calendar-day-has-events';
  21000. eventsHtml = "\n <span class=\"calendar-day-events\">\n <span class=\"calendar-day-event\"></span>\n </span>\n ";
  21001. if (Array.isArray(params.events)) {
  21002. var eventDots = [];
  21003. params.events.forEach(function (ev) {
  21004. var color = ev.color || '';
  21005. if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
  21006. eventDots.push(color);
  21007. }
  21008. });
  21009. 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 ";
  21010. }
  21011. }
  21012. // Custom Ranges
  21013. if (params.rangesClasses) {
  21014. for (var k = 0; k < params.rangesClasses.length; k += 1) {
  21015. if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
  21016. addClass += " " + (params.rangesClasses[k].cssClass);
  21017. }
  21018. }
  21019. }
  21020. // Disabled
  21021. disabled = false;
  21022. if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {
  21023. disabled = true;
  21024. }
  21025. if (params.disabled) {
  21026. if (calendar.dateInRange(dayDate, params.disabled)) {
  21027. disabled = true;
  21028. }
  21029. }
  21030. if (disabled) {
  21031. addClass += ' calendar-day-disabled';
  21032. }
  21033. dayDate = new Date(dayDate);
  21034. var dayYear = dayDate.getFullYear();
  21035. var dayMonth = dayDate.getMonth();
  21036. var dayNumberDisplay = calendar.dayFormatter.format(dayDate);
  21037. 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();
  21038. };
  21039. for (var col = 1; col <= cols; col += 1) loop( col );
  21040. monthHtml += "<div class=\"calendar-row\">" + rowHtml + "</div>";
  21041. }
  21042. monthHtml = "<div class=\"calendar-month\" data-year=\"" + year + "\" data-month=\"" + month + "\" data-locale-year=\"" + localeYear + "\" data-locale-month=\"" + localeMonth + "\">" + monthHtml + "</div>";
  21043. return monthHtml;
  21044. };
  21045. Calendar.prototype.renderWeekHeader = function renderWeekHeader () {
  21046. var calendar = this;
  21047. if (calendar.params.renderWeekHeader) {
  21048. return calendar.params.renderWeekHeader.call(calendar);
  21049. }
  21050. var params = calendar.params;
  21051. var weekDaysHtml = '';
  21052. for (var i = 0; i < 7; i += 1) {
  21053. var dayIndex = (i + params.firstDay > 6)
  21054. ? ((i - 7) + params.firstDay)
  21055. : (i + params.firstDay);
  21056. var dayName = calendar.dayNamesShort[dayIndex];
  21057. weekDaysHtml += "<div class=\"calendar-week-day\">" + dayName + "</div>";
  21058. }
  21059. return ("\n <div class=\"calendar-week-header\">\n " + weekDaysHtml + "\n </div>\n ").trim();
  21060. };
  21061. Calendar.prototype.renderMonthSelector = function renderMonthSelector () {
  21062. var calendar = this;
  21063. if (calendar.params.renderMonthSelector) {
  21064. return calendar.params.renderMonthSelector.call(calendar);
  21065. }
  21066. 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();
  21067. };
  21068. Calendar.prototype.renderMonthPicker = function renderMonthPicker () {
  21069. var calendar = this;
  21070. var localeMonth = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
  21071. 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 ");
  21072. };
  21073. Calendar.prototype.renderYearSelector = function renderYearSelector () {
  21074. var calendar = this;
  21075. if (calendar.params.renderYearSelector) {
  21076. return calendar.params.renderYearSelector.call(calendar);
  21077. }
  21078. 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();
  21079. };
  21080. Calendar.prototype.renderYearPicker = function renderYearPicker () {
  21081. var calendar = this;
  21082. var currentYear = calendar.currentYear;
  21083. var yearMin = calendar.params.yearPickerMin || new Date().getFullYear() - 100;
  21084. if (calendar.params.minDate) {
  21085. yearMin = Math.max(yearMin, new Date(calendar.params.minDate).getFullYear());
  21086. }
  21087. var yearMax = calendar.params.yearPickerMax || new Date().getFullYear() + 100;
  21088. if (calendar.params.maxDate) {
  21089. yearMax = Math.min(yearMax, new Date(calendar.params.maxDate).getFullYear());
  21090. }
  21091. var years = [];
  21092. for (var i = yearMin; i <= yearMax; i += 1) {
  21093. years.push(i);
  21094. }
  21095. 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 ");
  21096. };
  21097. // eslint-disable-next-line
  21098. Calendar.prototype.renderTimeSelector = function renderTimeSelector () {
  21099. var calendar = this;
  21100. var value = calendar.value && calendar.value[0];
  21101. var timeString;
  21102. if (value) { timeString = calendar.timeSelectorFormatter.format(value); }
  21103. return ("\n <div class=\"calendar-time-selector\"><a class=\"link\">" + (timeString || calendar.params.timePickerPlaceholder) + "</a></div>\n ");
  21104. };
  21105. Calendar.prototype.renderHeader = function renderHeader () {
  21106. var calendar = this;
  21107. if (calendar.params.renderHeader) {
  21108. return calendar.params.renderHeader.call(calendar);
  21109. }
  21110. return ("\n <div class=\"calendar-header\">\n <div class=\"calendar-selected-date\">" + (calendar.params.headerPlaceholder) + "</div>\n </div>\n ").trim();
  21111. };
  21112. Calendar.prototype.renderFooter = function renderFooter () {
  21113. var calendar = this;
  21114. var app = calendar.app;
  21115. if (calendar.params.renderFooter) {
  21116. return calendar.params.renderFooter.call(calendar);
  21117. }
  21118. 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();
  21119. };
  21120. Calendar.prototype.renderToolbar = function renderToolbar () {
  21121. var calendar = this;
  21122. if (calendar.params.renderToolbar) {
  21123. return calendar.params.renderToolbar.call(calendar, calendar);
  21124. }
  21125. 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();
  21126. };
  21127. // eslint-disable-next-line
  21128. Calendar.prototype.renderInline = function renderInline () {
  21129. var calendar = this;
  21130. var ref = calendar.params;
  21131. var cssClass = ref.cssClass;
  21132. var toolbar = ref.toolbar;
  21133. var header = ref.header;
  21134. var footer = ref.footer;
  21135. var rangePicker = ref.rangePicker;
  21136. var weekHeader = ref.weekHeader;
  21137. var value = calendar.value;
  21138. var hasTimePicker = calendar.hasTimePicker;
  21139. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  21140. 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();
  21141. return inlineHtml;
  21142. };
  21143. Calendar.prototype.renderCustomModal = function renderCustomModal () {
  21144. var calendar = this;
  21145. var ref = calendar.params;
  21146. var cssClass = ref.cssClass;
  21147. var toolbar = ref.toolbar;
  21148. var header = ref.header;
  21149. var footer = ref.footer;
  21150. var rangePicker = ref.rangePicker;
  21151. var weekHeader = ref.weekHeader;
  21152. var value = calendar.value;
  21153. var hasTimePicker = calendar.hasTimePicker;
  21154. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  21155. 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();
  21156. return sheetHtml;
  21157. };
  21158. Calendar.prototype.renderSheet = function renderSheet () {
  21159. var calendar = this;
  21160. var ref = calendar.params;
  21161. var cssClass = ref.cssClass;
  21162. var toolbar = ref.toolbar;
  21163. var header = ref.header;
  21164. var footer = ref.footer;
  21165. var rangePicker = ref.rangePicker;
  21166. var weekHeader = ref.weekHeader;
  21167. var value = calendar.value;
  21168. var hasTimePicker = calendar.hasTimePicker;
  21169. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  21170. 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();
  21171. return sheetHtml;
  21172. };
  21173. Calendar.prototype.renderPopover = function renderPopover () {
  21174. var calendar = this;
  21175. var ref = calendar.params;
  21176. var cssClass = ref.cssClass;
  21177. var toolbar = ref.toolbar;
  21178. var header = ref.header;
  21179. var footer = ref.footer;
  21180. var rangePicker = ref.rangePicker;
  21181. var weekHeader = ref.weekHeader;
  21182. var value = calendar.value;
  21183. var hasTimePicker = calendar.hasTimePicker;
  21184. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  21185. 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();
  21186. return popoverHtml;
  21187. };
  21188. Calendar.prototype.render = function render () {
  21189. var calendar = this;
  21190. var params = calendar.params;
  21191. if (params.render) { return params.render.call(calendar); }
  21192. if (!calendar.inline) {
  21193. var modalType = params.openIn;
  21194. if (modalType === 'auto') { modalType = calendar.isPopover() ? 'popover' : 'sheet'; }
  21195. if (modalType === 'popover') { return calendar.renderPopover(); }
  21196. if (modalType === 'sheet') { return calendar.renderSheet(); }
  21197. return calendar.renderCustomModal();
  21198. }
  21199. return calendar.renderInline();
  21200. };
  21201. Calendar.prototype.openTimePicker = function openTimePicker () {
  21202. var calendar = this;
  21203. var $el = calendar.$el;
  21204. var app = calendar.app;
  21205. if (!$el || !$el.length) { return; }
  21206. $el.append('<div class="calendar-time-picker"></div>');
  21207. var hoursArr = [];
  21208. var minutesArr = [];
  21209. for (var i = 0; i <= 23; i += 1) { hoursArr.push(i); }
  21210. for (var i$1 = 0; i$1 <= 59; i$1 += 1) { minutesArr.push(i$1); }
  21211. var value;
  21212. if (calendar.value && calendar.value.length) {
  21213. value = [calendar.value[0].getHours(), calendar.value[0].getMinutes()];
  21214. } else {
  21215. value = [new Date().getHours(), new Date().getMinutes()];
  21216. }
  21217. calendar.timePickerInstance = app.picker.create({
  21218. containerEl: $el.find('.calendar-time-picker'),
  21219. value: value,
  21220. toolbar: true,
  21221. rotateEffect: false,
  21222. toolbarCloseText: calendar.params.toolbarCloseText,
  21223. cols: [
  21224. {
  21225. values: hoursArr,
  21226. },
  21227. {
  21228. divider: true,
  21229. content: ':',
  21230. },
  21231. {
  21232. values: minutesArr,
  21233. displayValues: minutesArr.map(function (m) { return (m < 10 ? ("0" + m) : m); }),
  21234. } ],
  21235. });
  21236. calendar.timePickerInstance.$el.find('.toolbar a').removeClass('sheet-close popover-close').addClass('calendar-time-picker-close');
  21237. };
  21238. Calendar.prototype.closeTimePicker = function closeTimePicker () {
  21239. var calendar = this;
  21240. if (calendar.timePickerInstance) {
  21241. var ref = calendar.timePickerInstance.value.map(function (v) { return parseInt(v, 10); });
  21242. var hours = ref[0];
  21243. var minutes = ref[1];
  21244. var value = calendar.value && calendar.value.length && calendar.value[0];
  21245. if (!value) {
  21246. value = new Date();
  21247. value.setHours(hours, minutes, 0, 0);
  21248. } else {
  21249. value = new Date(value);
  21250. value.setHours(hours, minutes);
  21251. }
  21252. calendar.setValue([value]);
  21253. calendar.timePickerInstance.close();
  21254. calendar.timePickerInstance.destroy();
  21255. delete calendar.timePickerInstance;
  21256. }
  21257. if (calendar.$el && calendar.$el.length) {
  21258. calendar.$el.find('.calendar-time-picker').remove();
  21259. }
  21260. };
  21261. Calendar.prototype.onOpen = function onOpen () {
  21262. var calendar = this;
  21263. var initialized = calendar.initialized;
  21264. var $el = calendar.$el;
  21265. var app = calendar.app;
  21266. var $inputEl = calendar.$inputEl;
  21267. var inline = calendar.inline;
  21268. var value = calendar.value;
  21269. var params = calendar.params;
  21270. calendar.closing = false;
  21271. calendar.opened = true;
  21272. calendar.opening = true;
  21273. // Init main events
  21274. calendar.attachCalendarEvents();
  21275. var updateValue = !value && params.value;
  21276. // Set value
  21277. if (!initialized) {
  21278. if (value) { calendar.setValue(value, 0); }
  21279. else if (params.value) {
  21280. calendar.setValue(calendar.normalizeValues(params.value), 0);
  21281. }
  21282. } else if (value) {
  21283. calendar.setValue(value, 0);
  21284. }
  21285. // Update current month and year
  21286. calendar.updateCurrentMonthYear();
  21287. // Set initial translate
  21288. calendar.monthsTranslate = 0;
  21289. calendar.setMonthsTranslate();
  21290. // Update input value
  21291. if (updateValue) { calendar.updateValue(); }
  21292. else if (params.header && value) {
  21293. calendar.updateValue(true);
  21294. }
  21295. // Extra focus
  21296. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  21297. $inputEl.trigger('focus');
  21298. }
  21299. calendar.initialized = true;
  21300. calendar.$months.each(function (index, monthEl) {
  21301. calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
  21302. });
  21303. // Trigger events
  21304. if ($el) {
  21305. $el.trigger('calendar:open');
  21306. }
  21307. if ($inputEl) {
  21308. $inputEl.trigger('calendar:open');
  21309. }
  21310. calendar.emit('local::open calendarOpen', calendar);
  21311. };
  21312. Calendar.prototype.onOpened = function onOpened () {
  21313. var calendar = this;
  21314. calendar.opening = false;
  21315. if (calendar.$el) {
  21316. calendar.$el.trigger('calendar:opened');
  21317. }
  21318. if (calendar.$inputEl) {
  21319. calendar.$inputEl.trigger('calendar:opened');
  21320. }
  21321. calendar.emit('local::opened calendarOpened', calendar);
  21322. };
  21323. Calendar.prototype.onClose = function onClose () {
  21324. var calendar = this;
  21325. var app = calendar.app;
  21326. calendar.opening = false;
  21327. calendar.closing = true;
  21328. if (calendar.$inputEl) {
  21329. if (app.theme === 'md') {
  21330. calendar.$inputEl.trigger('blur');
  21331. } else {
  21332. var validate = calendar.$inputEl.attr('validate');
  21333. var required = calendar.$inputEl.attr('required');
  21334. if (validate && required) {
  21335. app.input.validate(calendar.$inputEl);
  21336. }
  21337. }
  21338. }
  21339. if (calendar.detachCalendarEvents) {
  21340. calendar.detachCalendarEvents();
  21341. }
  21342. if (calendar.$el) {
  21343. calendar.$el.trigger('calendar:close');
  21344. }
  21345. if (calendar.$inputEl) {
  21346. calendar.$inputEl.trigger('calendar:close');
  21347. }
  21348. calendar.emit('local::close calendarClose', calendar);
  21349. };
  21350. Calendar.prototype.onClosed = function onClosed () {
  21351. var calendar = this;
  21352. calendar.opened = false;
  21353. calendar.closing = false;
  21354. if (!calendar.inline) {
  21355. Utils.nextTick(function () {
  21356. if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
  21357. if (!calendar.params.routableModals) {
  21358. calendar.modal.destroy();
  21359. }
  21360. }
  21361. delete calendar.modal;
  21362. });
  21363. }
  21364. if (calendar.timePickerInstance) {
  21365. if (calendar.timePickerInstance.destroy) { calendar.timePickerInstance.destroy(); }
  21366. delete calendar.timePickerInstance;
  21367. }
  21368. if (calendar.$el) {
  21369. calendar.$el.trigger('calendar:closed');
  21370. }
  21371. if (calendar.$inputEl) {
  21372. calendar.$inputEl.trigger('calendar:closed');
  21373. }
  21374. calendar.emit('local::closed calendarClosed', calendar);
  21375. };
  21376. Calendar.prototype.open = function open () {
  21377. var obj;
  21378. var calendar = this;
  21379. var app = calendar.app;
  21380. var opened = calendar.opened;
  21381. var inline = calendar.inline;
  21382. var $inputEl = calendar.$inputEl;
  21383. var params = calendar.params;
  21384. if (opened) { return; }
  21385. if (inline) {
  21386. calendar.$el = $(calendar.render());
  21387. calendar.$el[0].f7Calendar = calendar;
  21388. calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
  21389. calendar.$months = calendar.$wrapperEl.find('.calendar-month');
  21390. calendar.$containerEl.append(calendar.$el);
  21391. calendar.onOpen();
  21392. calendar.onOpened();
  21393. return;
  21394. }
  21395. var modalType = params.openIn;
  21396. if (modalType === 'auto') {
  21397. modalType = calendar.isPopover() ? 'popover' : 'sheet';
  21398. }
  21399. var modalContent = calendar.render();
  21400. var modalParams = {
  21401. targetEl: $inputEl,
  21402. scrollToEl: params.scrollToInput ? $inputEl : undefined,
  21403. content: modalContent,
  21404. backdrop: params.backdrop === true || (modalType === 'popover' && app.params.popover.backdrop !== false && params.backdrop !== false),
  21405. closeByBackdropClick: params.closeByBackdropClick,
  21406. on: {
  21407. open: function open() {
  21408. var modal = this;
  21409. calendar.modal = modal;
  21410. calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
  21411. calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
  21412. calendar.$months = calendar.$wrapperEl.find('.calendar-month');
  21413. calendar.$el[0].f7Calendar = calendar;
  21414. if (modalType === 'customModal') {
  21415. $(calendar.$el).find('.calendar-close').once('click', function () {
  21416. calendar.close();
  21417. });
  21418. }
  21419. calendar.onOpen();
  21420. },
  21421. opened: function opened() { calendar.onOpened(); },
  21422. close: function close() { calendar.onClose(); },
  21423. closed: function closed() { calendar.onClosed(); },
  21424. },
  21425. };
  21426. if (modalType === 'sheet') {
  21427. modalParams.push = params.sheetPush;
  21428. modalParams.swipeToClose = params.sheetSwipeToClose;
  21429. }
  21430. if (params.routableModals && calendar.view) {
  21431. calendar.view.router.navigate({
  21432. url: calendar.url,
  21433. route: ( obj = {
  21434. path: calendar.url
  21435. }, obj[modalType] = modalParams, obj ),
  21436. });
  21437. } else {
  21438. calendar.modal = app[modalType].create(modalParams);
  21439. calendar.modal.open();
  21440. }
  21441. };
  21442. Calendar.prototype.close = function close () {
  21443. var calendar = this;
  21444. var opened = calendar.opened;
  21445. var inline = calendar.inline;
  21446. if (!opened) { return; }
  21447. if (inline) {
  21448. calendar.onClose();
  21449. calendar.onClosed();
  21450. return;
  21451. }
  21452. if (calendar.params.routableModals && calendar.view) {
  21453. calendar.view.router.back();
  21454. } else {
  21455. calendar.modal.close();
  21456. }
  21457. };
  21458. Calendar.prototype.init = function init () {
  21459. var calendar = this;
  21460. calendar.initInput();
  21461. if (calendar.inline) {
  21462. calendar.open();
  21463. calendar.emit('local::init calendarInit', calendar);
  21464. return;
  21465. }
  21466. if (!calendar.initialized && calendar.params.value) {
  21467. calendar.setValue(calendar.normalizeValues(calendar.params.value));
  21468. }
  21469. // Attach input Events
  21470. if (calendar.$inputEl) {
  21471. calendar.attachInputEvents();
  21472. }
  21473. if (calendar.params.closeByOutsideClick) {
  21474. calendar.attachHtmlEvents();
  21475. }
  21476. calendar.emit('local::init calendarInit', calendar);
  21477. };
  21478. Calendar.prototype.destroy = function destroy () {
  21479. var calendar = this;
  21480. if (calendar.destroyed) { return; }
  21481. var $el = calendar.$el;
  21482. calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
  21483. if ($el) { $el.trigger('calendar:beforedestroy'); }
  21484. calendar.close();
  21485. // Detach Events
  21486. if (calendar.$inputEl) {
  21487. calendar.detachInputEvents();
  21488. }
  21489. if (calendar.params.closeByOutsideClick) {
  21490. calendar.detachHtmlEvents();
  21491. }
  21492. if (calendar.timePickerInstance) {
  21493. if (calendar.timePickerInstance.destroy) { calendar.timePickerInstance.destroy(); }
  21494. delete calendar.timePickerInstance;
  21495. }
  21496. if ($el && $el.length) { delete calendar.$el[0].f7Calendar; }
  21497. Utils.deleteProps(calendar);
  21498. calendar.destroyed = true;
  21499. };
  21500. Object.defineProperties( Calendar.prototype, prototypeAccessors );
  21501. return Calendar;
  21502. }(Framework7Class));
  21503. var Calendar$1 = {
  21504. name: 'calendar',
  21505. static: {
  21506. Calendar: Calendar,
  21507. },
  21508. create: function create() {
  21509. var app = this;
  21510. app.calendar = ConstructorMethods({
  21511. defaultSelector: '.calendar',
  21512. constructor: Calendar,
  21513. app: app,
  21514. domProp: 'f7Calendar',
  21515. });
  21516. app.calendar.close = function close(el) {
  21517. if ( el === void 0 ) el = '.calendar';
  21518. var $el = $(el);
  21519. if ($el.length === 0) { return; }
  21520. var calendar = $el[0].f7Calendar;
  21521. if (!calendar || (calendar && !calendar.opened)) { return; }
  21522. calendar.close();
  21523. };
  21524. },
  21525. params: {
  21526. calendar: {
  21527. // Calendar settings
  21528. dateFormat: undefined,
  21529. monthNames: 'auto',
  21530. monthNamesShort: 'auto',
  21531. dayNames: 'auto',
  21532. dayNamesShort: 'auto',
  21533. locale: undefined,
  21534. firstDay: 1, // First day of the week, Monday
  21535. weekendDays: [0, 6], // Sunday and Saturday
  21536. multiple: false,
  21537. rangePicker: false,
  21538. rangePickerMinDays: 1, // when calendar is used as rangePicker
  21539. rangePickerMaxDays: 0, // when calendar is used as rangePicker, 0 means unlimited
  21540. direction: 'horizontal', // or 'vertical'
  21541. minDate: null,
  21542. maxDate: null,
  21543. disabled: null, // dates range of disabled days
  21544. events: null, // dates range of days with events
  21545. rangesClasses: null, // array with custom classes date ranges
  21546. touchMove: true,
  21547. animate: true,
  21548. closeOnSelect: false,
  21549. monthSelector: true,
  21550. monthPicker: true,
  21551. yearSelector: true,
  21552. yearPicker: true,
  21553. yearPickerMin: undefined,
  21554. yearPickerMax: undefined,
  21555. timePicker: false,
  21556. timePickerFormat: { hour: 'numeric', minute: 'numeric' },
  21557. timePickerPlaceholder: 'Select time',
  21558. weekHeader: true,
  21559. value: null,
  21560. // Common opener settings
  21561. containerEl: null,
  21562. openIn: 'auto', // or 'popover' or 'sheet' or 'customModal'
  21563. sheetPush: false,
  21564. sheetSwipeToClose: undefined,
  21565. formatValue: null,
  21566. inputEl: null,
  21567. inputReadOnly: true,
  21568. closeByOutsideClick: true,
  21569. scrollToInput: true,
  21570. header: false,
  21571. headerPlaceholder: 'Select date',
  21572. toolbar: true,
  21573. toolbarCloseText: 'Done',
  21574. footer: false,
  21575. cssClass: null,
  21576. routableModals: true,
  21577. view: null,
  21578. url: 'date/',
  21579. backdrop: null,
  21580. closeByBackdropClick: true,
  21581. // Render functions
  21582. renderWeekHeader: null,
  21583. renderMonths: null,
  21584. renderMonth: null,
  21585. renderMonthSelector: null,
  21586. renderYearSelector: null,
  21587. renderHeader: null,
  21588. renderFooter: null,
  21589. renderToolbar: null,
  21590. renderInline: null,
  21591. renderPopover: null,
  21592. renderSheet: null,
  21593. render: null,
  21594. },
  21595. },
  21596. };
  21597. function pickerColumn (colEl, updateItems) {
  21598. var picker = this;
  21599. var app = picker.app;
  21600. var $colEl = $(colEl);
  21601. var colIndex = $colEl.index();
  21602. var col = picker.cols[colIndex];
  21603. if (col.divider) { return; }
  21604. col.$el = $colEl;
  21605. col.el = $colEl[0];
  21606. col.$itemsEl = col.$el.find('.picker-items');
  21607. col.items = col.$itemsEl.find('.picker-item');
  21608. var itemHeight;
  21609. var itemsHeight;
  21610. var minTranslate;
  21611. var maxTranslate;
  21612. var animationFrameId;
  21613. function updateDuringScroll() {
  21614. animationFrameId = Utils.requestAnimationFrame(function () {
  21615. col.updateItems(undefined, undefined, 0);
  21616. updateDuringScroll();
  21617. });
  21618. }
  21619. col.replaceValues = function replaceColValues(values, displayValues) {
  21620. col.detachEvents();
  21621. col.values = values;
  21622. col.displayValues = displayValues;
  21623. col.$itemsEl.html(picker.renderColumn(col, true));
  21624. col.items = col.$itemsEl.find('.picker-item');
  21625. col.calcSize();
  21626. col.setValue(col.values[0], 0, true);
  21627. col.attachEvents();
  21628. };
  21629. col.calcSize = function calcColSize() {
  21630. if (picker.params.rotateEffect) {
  21631. col.$el.removeClass('picker-column-absolute');
  21632. if (!col.width) { col.$el.css({ width: '' }); }
  21633. }
  21634. var colWidth = 0;
  21635. var colHeight = col.$el[0].offsetHeight;
  21636. itemHeight = col.items[0].offsetHeight;
  21637. itemsHeight = itemHeight * col.items.length;
  21638. minTranslate = ((colHeight / 2) - itemsHeight) + (itemHeight / 2);
  21639. maxTranslate = (colHeight / 2) - (itemHeight / 2);
  21640. if (col.width) {
  21641. colWidth = col.width;
  21642. if (parseInt(colWidth, 10) === colWidth) { colWidth += 'px'; }
  21643. col.$el.css({ width: colWidth });
  21644. }
  21645. if (picker.params.rotateEffect) {
  21646. if (!col.width) {
  21647. col.items.each(function (index, itemEl) {
  21648. var item = $(itemEl).children('span');
  21649. colWidth = Math.max(colWidth, item[0].offsetWidth);
  21650. });
  21651. col.$el.css({ width: ((colWidth + 2) + "px") });
  21652. }
  21653. col.$el.addClass('picker-column-absolute');
  21654. }
  21655. };
  21656. col.setValue = function setColValue(newValue, transition, valueCallbacks) {
  21657. if ( transition === void 0 ) transition = '';
  21658. var newActiveIndex = col.$itemsEl.find((".picker-item[data-picker-value=\"" + newValue + "\"]")).index();
  21659. if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
  21660. return;
  21661. }
  21662. var newTranslate = (-newActiveIndex * itemHeight) + maxTranslate;
  21663. // Update wrapper
  21664. col.$itemsEl.transition(transition);
  21665. col.$itemsEl.transform(("translate3d(0," + newTranslate + "px,0)"));
  21666. // Watch items
  21667. if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
  21668. Utils.cancelAnimationFrame(animationFrameId);
  21669. col.$itemsEl.transitionEnd(function () {
  21670. Utils.cancelAnimationFrame(animationFrameId);
  21671. });
  21672. updateDuringScroll();
  21673. }
  21674. // Update items
  21675. col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
  21676. };
  21677. col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
  21678. if (typeof translate === 'undefined') {
  21679. // eslint-disable-next-line
  21680. translate = Utils.getTranslate(col.$itemsEl[0], 'y');
  21681. }
  21682. // eslint-disable-next-line
  21683. if (typeof activeIndex === 'undefined') { activeIndex = -Math.round((translate - maxTranslate) / itemHeight); }
  21684. // eslint-disable-next-line
  21685. if (activeIndex < 0) { activeIndex = 0; }
  21686. // eslint-disable-next-line
  21687. if (activeIndex >= col.items.length) { activeIndex = col.items.length - 1; }
  21688. var previousActiveIndex = col.activeIndex;
  21689. col.activeIndex = activeIndex;
  21690. col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
  21691. col.items.transition(transition);
  21692. var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform('');
  21693. // Set 3D rotate effect
  21694. if (picker.params.rotateEffect) {
  21695. col.items.each(function (index, itemEl) {
  21696. var $itemEl = $(itemEl);
  21697. var itemOffsetTop = $itemEl.index() * itemHeight;
  21698. var translateOffset = maxTranslate - translate;
  21699. var itemOffset = itemOffsetTop - translateOffset;
  21700. var percentage = itemOffset / itemHeight;
  21701. var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
  21702. var angle = (-18 * percentage);
  21703. if (angle > 180) { angle = 180; }
  21704. if (angle < -180) { angle = -180; }
  21705. if (Math.abs(percentage) > itemsFit) {
  21706. $itemEl.addClass('picker-item-far');
  21707. } else {
  21708. $itemEl.removeClass('picker-item-far');
  21709. }
  21710. $itemEl.transform(("translate3d(0, " + (-translate + maxTranslate) + "px, " + (picker.needsOriginFix ? -110 : 0) + "px) rotateX(" + angle + "deg)"));
  21711. });
  21712. }
  21713. if (valueCallbacks || typeof valueCallbacks === 'undefined') {
  21714. // Update values
  21715. col.value = selectedItem.attr('data-picker-value');
  21716. col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;
  21717. // On change callback
  21718. if (previousActiveIndex !== activeIndex) {
  21719. if (col.onChange) {
  21720. col.onChange(picker, col.value, col.displayValue);
  21721. }
  21722. picker.updateValue();
  21723. }
  21724. }
  21725. };
  21726. var allowItemClick = true;
  21727. var isTouched;
  21728. var isMoved;
  21729. var touchStartY;
  21730. var touchCurrentY;
  21731. var touchStartTime;
  21732. var touchEndTime;
  21733. var startTranslate;
  21734. var returnTo;
  21735. var currentTranslate;
  21736. var prevTranslate;
  21737. var velocityTranslate;
  21738. function handleTouchStart(e) {
  21739. if (isMoved || isTouched) { return; }
  21740. e.preventDefault();
  21741. isTouched = true;
  21742. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  21743. touchCurrentY = touchStartY;
  21744. touchStartTime = (new Date()).getTime();
  21745. allowItemClick = true;
  21746. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  21747. currentTranslate = startTranslate;
  21748. }
  21749. function handleTouchMove(e) {
  21750. if (!isTouched) { return; }
  21751. e.preventDefault();
  21752. allowItemClick = false;
  21753. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  21754. if (!isMoved) {
  21755. // First move
  21756. Utils.cancelAnimationFrame(animationFrameId);
  21757. isMoved = true;
  21758. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  21759. currentTranslate = startTranslate;
  21760. col.$itemsEl.transition(0);
  21761. }
  21762. var diff = touchCurrentY - touchStartY;
  21763. currentTranslate = startTranslate + diff;
  21764. returnTo = undefined;
  21765. // Normalize translate
  21766. if (currentTranslate < minTranslate) {
  21767. currentTranslate = minTranslate - (Math.pow( (minTranslate - currentTranslate), 0.8 ));
  21768. returnTo = 'min';
  21769. }
  21770. if (currentTranslate > maxTranslate) {
  21771. currentTranslate = maxTranslate + (Math.pow( (currentTranslate - maxTranslate), 0.8 ));
  21772. returnTo = 'max';
  21773. }
  21774. // Transform wrapper
  21775. col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
  21776. // Update items
  21777. col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove);
  21778. // Calc velocity
  21779. velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
  21780. prevTranslate = currentTranslate;
  21781. }
  21782. function handleTouchEnd() {
  21783. if (!isTouched || !isMoved) {
  21784. isTouched = false;
  21785. isMoved = false;
  21786. return;
  21787. }
  21788. isTouched = false;
  21789. isMoved = false;
  21790. col.$itemsEl.transition('');
  21791. if (returnTo) {
  21792. if (returnTo === 'min') {
  21793. col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
  21794. } else {
  21795. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
  21796. }
  21797. }
  21798. touchEndTime = new Date().getTime();
  21799. var newTranslate;
  21800. if (touchEndTime - touchStartTime > 300) {
  21801. newTranslate = currentTranslate;
  21802. } else {
  21803. newTranslate = currentTranslate + (velocityTranslate * picker.params.momentumRatio);
  21804. }
  21805. newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
  21806. // Active Index
  21807. var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
  21808. // Normalize translate
  21809. if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
  21810. // Transform wrapper
  21811. col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
  21812. // Update items
  21813. col.updateItems(activeIndex, newTranslate, '', true);
  21814. // Watch items
  21815. if (picker.params.updateValuesOnMomentum) {
  21816. updateDuringScroll();
  21817. col.$itemsEl.transitionEnd(function () {
  21818. Utils.cancelAnimationFrame(animationFrameId);
  21819. });
  21820. }
  21821. // Allow click
  21822. setTimeout(function () {
  21823. allowItemClick = true;
  21824. }, 100);
  21825. }
  21826. var mousewheelTimeout;
  21827. function handleMouseWheel(e) {
  21828. var deltaX = e.deltaX;
  21829. var deltaY = e.deltaY;
  21830. if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
  21831. clearTimeout(mousewheelTimeout);
  21832. e.preventDefault();
  21833. Utils.cancelAnimationFrame(animationFrameId);
  21834. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  21835. col.$itemsEl.transition(0);
  21836. currentTranslate = startTranslate - deltaY;
  21837. returnTo = undefined;
  21838. // Normalize translate
  21839. if (currentTranslate < minTranslate) {
  21840. currentTranslate = minTranslate;
  21841. returnTo = 'min';
  21842. }
  21843. if (currentTranslate > maxTranslate) {
  21844. currentTranslate = maxTranslate;
  21845. returnTo = 'max';
  21846. }
  21847. // Transform wrapper
  21848. col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
  21849. // Update items
  21850. col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnMousewheel);
  21851. // On end
  21852. mousewheelTimeout = setTimeout(function () {
  21853. col.$itemsEl.transition('');
  21854. if (returnTo) {
  21855. if (returnTo === 'min') {
  21856. col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
  21857. } else {
  21858. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
  21859. }
  21860. }
  21861. touchEndTime = new Date().getTime();
  21862. var newTranslate = currentTranslate;
  21863. newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
  21864. // Active Index
  21865. var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
  21866. // Normalize translate
  21867. if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
  21868. // Transform wrapper
  21869. col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
  21870. // Update items
  21871. col.updateItems(activeIndex, newTranslate, '', true);
  21872. }, 200);
  21873. }
  21874. function handleClick() {
  21875. if (!allowItemClick) { return; }
  21876. Utils.cancelAnimationFrame(animationFrameId);
  21877. var value = $(this).attr('data-picker-value');
  21878. col.setValue(value);
  21879. }
  21880. var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
  21881. col.attachEvents = function attachColEvents() {
  21882. col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
  21883. app.on('touchmove:active', handleTouchMove);
  21884. app.on('touchend:passive', handleTouchEnd);
  21885. if (picker.params.mousewheel) {
  21886. col.$el.on('wheel', handleMouseWheel);
  21887. }
  21888. col.items.on('click', handleClick);
  21889. };
  21890. col.detachEvents = function detachColEvents() {
  21891. col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
  21892. app.off('touchmove:active', handleTouchMove);
  21893. app.off('touchend:passive', handleTouchEnd);
  21894. if (picker.params.mousewheel) {
  21895. col.$el.off('wheel', handleMouseWheel);
  21896. }
  21897. col.items.off('click', handleClick);
  21898. };
  21899. col.init = function initCol() {
  21900. col.calcSize();
  21901. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)")).transition(0);
  21902. if (colIndex === 0) { col.$el.addClass('picker-column-first'); }
  21903. if (colIndex === picker.cols.length - 1) { col.$el.addClass('picker-column-last'); }
  21904. // Update items on init
  21905. if (updateItems) { col.updateItems(0, maxTranslate, 0); }
  21906. col.attachEvents();
  21907. };
  21908. col.destroy = function destroyCol() {
  21909. col.detachEvents();
  21910. };
  21911. col.init();
  21912. }
  21913. var Picker = /*@__PURE__*/(function (Framework7Class) {
  21914. function Picker(app, params) {
  21915. if ( params === void 0 ) params = {};
  21916. Framework7Class.call(this, params, [app]);
  21917. var picker = this;
  21918. picker.params = Utils.extend({}, app.params.picker, params);
  21919. var $containerEl;
  21920. if (picker.params.containerEl) {
  21921. $containerEl = $(picker.params.containerEl);
  21922. if ($containerEl.length === 0) { return picker; }
  21923. }
  21924. var $inputEl;
  21925. if (picker.params.inputEl) {
  21926. $inputEl = $(picker.params.inputEl);
  21927. }
  21928. var $scrollToEl = picker.params.scrollToInput ? $inputEl : undefined;
  21929. if (picker.params.scrollToEl) {
  21930. var scrollToEl = $(picker.params.scrollToEl);
  21931. if (scrollToEl.length > 0) {
  21932. $scrollToEl = scrollToEl;
  21933. }
  21934. }
  21935. Utils.extend(picker, {
  21936. app: app,
  21937. $containerEl: $containerEl,
  21938. containerEl: $containerEl && $containerEl[0],
  21939. inline: $containerEl && $containerEl.length > 0,
  21940. needsOriginFix: app.device.ios || ((win.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && win.navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android),
  21941. cols: [],
  21942. $inputEl: $inputEl,
  21943. inputEl: $inputEl && $inputEl[0],
  21944. $scrollToEl: $scrollToEl,
  21945. initialized: false,
  21946. opened: false,
  21947. url: picker.params.url,
  21948. });
  21949. function onResize() {
  21950. picker.resizeCols();
  21951. }
  21952. function onInputClick() {
  21953. picker.open();
  21954. }
  21955. function onInputFocus(e) {
  21956. e.preventDefault();
  21957. }
  21958. function onHtmlClick(e) {
  21959. if (picker.destroyed || !picker.params) { return; }
  21960. var $targetEl = $(e.target);
  21961. if (picker.isPopover()) { return; }
  21962. if (!picker.opened || picker.closing) { return; }
  21963. if ($targetEl.closest('[class*="backdrop"]').length) { return; }
  21964. if ($inputEl && $inputEl.length > 0) {
  21965. if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
  21966. picker.close();
  21967. }
  21968. } else if ($(e.target).closest('.sheet-modal').length === 0) {
  21969. picker.close();
  21970. }
  21971. }
  21972. // Events
  21973. Utils.extend(picker, {
  21974. attachResizeEvent: function attachResizeEvent() {
  21975. app.on('resize', onResize);
  21976. },
  21977. detachResizeEvent: function detachResizeEvent() {
  21978. app.off('resize', onResize);
  21979. },
  21980. attachInputEvents: function attachInputEvents() {
  21981. picker.$inputEl.on('click', onInputClick);
  21982. if (picker.params.inputReadOnly) {
  21983. picker.$inputEl.on('focus mousedown', onInputFocus);
  21984. if (picker.$inputEl[0]) {
  21985. picker.$inputEl[0].f7ValidateReadonly = true;
  21986. }
  21987. }
  21988. },
  21989. detachInputEvents: function detachInputEvents() {
  21990. picker.$inputEl.off('click', onInputClick);
  21991. if (picker.params.inputReadOnly) {
  21992. picker.$inputEl.off('focus mousedown', onInputFocus);
  21993. if (picker.$inputEl[0]) {
  21994. delete picker.$inputEl[0].f7ValidateReadonly;
  21995. }
  21996. }
  21997. },
  21998. attachHtmlEvents: function attachHtmlEvents() {
  21999. app.on('click', onHtmlClick);
  22000. },
  22001. detachHtmlEvents: function detachHtmlEvents() {
  22002. app.off('click', onHtmlClick);
  22003. },
  22004. });
  22005. picker.init();
  22006. return picker;
  22007. }
  22008. if ( Framework7Class ) Picker.__proto__ = Framework7Class;
  22009. Picker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  22010. Picker.prototype.constructor = Picker;
  22011. var prototypeAccessors = { view: { configurable: true } };
  22012. prototypeAccessors.view.get = function () {
  22013. var ref = this;
  22014. var app = ref.app;
  22015. var params = ref.params;
  22016. var $inputEl = ref.$inputEl;
  22017. var view;
  22018. if (params.view) {
  22019. view = params.view;
  22020. } else if ($inputEl) {
  22021. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  22022. }
  22023. if (!view) { view = app.views.main; }
  22024. return view;
  22025. };
  22026. Picker.prototype.initInput = function initInput () {
  22027. var picker = this;
  22028. if (!picker.$inputEl) { return; }
  22029. if (picker.params.inputReadOnly) { picker.$inputEl.prop('readOnly', true); }
  22030. };
  22031. Picker.prototype.resizeCols = function resizeCols () {
  22032. var picker = this;
  22033. if (!picker.opened) { return; }
  22034. for (var i = 0; i < picker.cols.length; i += 1) {
  22035. if (!picker.cols[i].divider) {
  22036. picker.cols[i].calcSize();
  22037. picker.cols[i].setValue(picker.cols[i].value, 0, false);
  22038. }
  22039. }
  22040. };
  22041. Picker.prototype.isPopover = function isPopover () {
  22042. var picker = this;
  22043. var app = picker.app;
  22044. var modal = picker.modal;
  22045. var params = picker.params;
  22046. if (params.openIn === 'sheet') { return false; }
  22047. if (modal && modal.type !== 'popover') { return false; }
  22048. if (!picker.inline && picker.inputEl) {
  22049. if (params.openIn === 'popover') { return true; }
  22050. if (app.device.ios) {
  22051. return !!app.device.ipad;
  22052. }
  22053. if (app.width >= 768) {
  22054. return true;
  22055. }
  22056. if (app.device.desktop && app.theme === 'aurora') {
  22057. return true;
  22058. }
  22059. }
  22060. return false;
  22061. };
  22062. Picker.prototype.formatValue = function formatValue () {
  22063. var picker = this;
  22064. var value = picker.value;
  22065. var displayValue = picker.displayValue;
  22066. if (picker.params.formatValue) {
  22067. return picker.params.formatValue.call(picker, value, displayValue);
  22068. }
  22069. return value.join(' ');
  22070. };
  22071. Picker.prototype.setValue = function setValue (values, transition) {
  22072. var picker = this;
  22073. var valueIndex = 0;
  22074. if (picker.cols.length === 0) {
  22075. picker.value = values;
  22076. picker.updateValue(values);
  22077. return;
  22078. }
  22079. for (var i = 0; i < picker.cols.length; i += 1) {
  22080. if (picker.cols[i] && !picker.cols[i].divider) {
  22081. picker.cols[i].setValue(values[valueIndex], transition);
  22082. valueIndex += 1;
  22083. }
  22084. }
  22085. };
  22086. Picker.prototype.getValue = function getValue () {
  22087. var picker = this;
  22088. return picker.value;
  22089. };
  22090. Picker.prototype.updateValue = function updateValue (forceValues) {
  22091. var picker = this;
  22092. var newValue = forceValues || [];
  22093. var newDisplayValue = [];
  22094. var column;
  22095. if (picker.cols.length === 0) {
  22096. var noDividerColumns = picker.params.cols.filter(function (c) { return !c.divider; });
  22097. for (var i = 0; i < noDividerColumns.length; i += 1) {
  22098. column = noDividerColumns[i];
  22099. if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
  22100. newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
  22101. } else {
  22102. newDisplayValue.push(newValue[i]);
  22103. }
  22104. }
  22105. } else {
  22106. for (var i$1 = 0; i$1 < picker.cols.length; i$1 += 1) {
  22107. if (!picker.cols[i$1].divider) {
  22108. newValue.push(picker.cols[i$1].value);
  22109. newDisplayValue.push(picker.cols[i$1].displayValue);
  22110. }
  22111. }
  22112. }
  22113. if (newValue.indexOf(undefined) >= 0) {
  22114. return;
  22115. }
  22116. picker.value = newValue;
  22117. picker.displayValue = newDisplayValue;
  22118. picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
  22119. if (picker.inputEl) {
  22120. picker.$inputEl.val(picker.formatValue());
  22121. picker.$inputEl.trigger('change');
  22122. }
  22123. };
  22124. Picker.prototype.initColumn = function initColumn (colEl, updateItems) {
  22125. var picker = this;
  22126. pickerColumn.call(picker, colEl, updateItems);
  22127. };
  22128. // eslint-disable-next-line
  22129. Picker.prototype.destroyColumn = function destroyColumn (colEl) {
  22130. var picker = this;
  22131. var $colEl = $(colEl);
  22132. var index = $colEl.index();
  22133. if (picker.cols[index] && picker.cols[index].destroy) {
  22134. picker.cols[index].destroy();
  22135. }
  22136. };
  22137. Picker.prototype.renderToolbar = function renderToolbar () {
  22138. var picker = this;
  22139. if (picker.params.renderToolbar) { return picker.params.renderToolbar.call(picker, picker); }
  22140. 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();
  22141. };
  22142. // eslint-disable-next-line
  22143. Picker.prototype.renderColumn = function renderColumn (col, onlyItems) {
  22144. var colClasses = "picker-column " + (col.textAlign ? ("picker-column-" + (col.textAlign)) : '') + " " + (col.cssClass || '');
  22145. var columnHtml;
  22146. var columnItemsHtml;
  22147. if (col.divider) {
  22148. columnHtml = "\n <div class=\"" + colClasses + " picker-column-divider\">" + (col.content) + "</div>\n ";
  22149. } else {
  22150. 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('');
  22151. columnHtml = "\n <div class=\"" + colClasses + "\">\n <div class=\"picker-items\">" + columnItemsHtml + "</div>\n </div>\n ";
  22152. }
  22153. return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
  22154. };
  22155. Picker.prototype.renderInline = function renderInline () {
  22156. var picker = this;
  22157. var ref = picker.params;
  22158. var rotateEffect = ref.rotateEffect;
  22159. var cssClass = ref.cssClass;
  22160. var toolbar = ref.toolbar;
  22161. 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();
  22162. return inlineHtml;
  22163. };
  22164. Picker.prototype.renderSheet = function renderSheet () {
  22165. var picker = this;
  22166. var ref = picker.params;
  22167. var rotateEffect = ref.rotateEffect;
  22168. var cssClass = ref.cssClass;
  22169. var toolbar = ref.toolbar;
  22170. 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();
  22171. return sheetHtml;
  22172. };
  22173. Picker.prototype.renderPopover = function renderPopover () {
  22174. var picker = this;
  22175. var ref = picker.params;
  22176. var rotateEffect = ref.rotateEffect;
  22177. var cssClass = ref.cssClass;
  22178. var toolbar = ref.toolbar;
  22179. 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();
  22180. return popoverHtml;
  22181. };
  22182. Picker.prototype.render = function render () {
  22183. var picker = this;
  22184. if (picker.params.render) { return picker.params.render.call(picker); }
  22185. if (!picker.inline) {
  22186. if (picker.isPopover()) { return picker.renderPopover(); }
  22187. return picker.renderSheet();
  22188. }
  22189. return picker.renderInline();
  22190. };
  22191. Picker.prototype.onOpen = function onOpen () {
  22192. var picker = this;
  22193. var initialized = picker.initialized;
  22194. var $el = picker.$el;
  22195. var app = picker.app;
  22196. var $inputEl = picker.$inputEl;
  22197. var inline = picker.inline;
  22198. var value = picker.value;
  22199. var params = picker.params;
  22200. picker.opened = true;
  22201. picker.closing = false;
  22202. picker.opening = true;
  22203. // Init main events
  22204. picker.attachResizeEvent();
  22205. // Init cols
  22206. $el.find('.picker-column').each(function (index, colEl) {
  22207. var updateItems = true;
  22208. if (
  22209. (!initialized && params.value)
  22210. || (initialized && value)
  22211. ) {
  22212. updateItems = false;
  22213. }
  22214. picker.initColumn(colEl, updateItems);
  22215. });
  22216. // Set value
  22217. if (!initialized) {
  22218. if (value) { picker.setValue(value, 0); }
  22219. else if (params.value) {
  22220. picker.setValue(params.value, 0);
  22221. }
  22222. } else if (value) {
  22223. picker.setValue(value, 0);
  22224. }
  22225. // Extra focus
  22226. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  22227. $inputEl.trigger('focus');
  22228. }
  22229. picker.initialized = true;
  22230. // Trigger events
  22231. if ($el) {
  22232. $el.trigger('picker:open');
  22233. }
  22234. if ($inputEl) {
  22235. $inputEl.trigger('picker:open');
  22236. }
  22237. picker.emit('local::open pickerOpen', picker);
  22238. };
  22239. Picker.prototype.onOpened = function onOpened () {
  22240. var picker = this;
  22241. picker.opening = false;
  22242. if (picker.$el) {
  22243. picker.$el.trigger('picker:opened');
  22244. }
  22245. if (picker.$inputEl) {
  22246. picker.$inputEl.trigger('picker:opened');
  22247. }
  22248. picker.emit('local::opened pickerOpened', picker);
  22249. };
  22250. Picker.prototype.onClose = function onClose () {
  22251. var picker = this;
  22252. var app = picker.app;
  22253. picker.opening = false;
  22254. picker.closing = true;
  22255. // Detach events
  22256. picker.detachResizeEvent();
  22257. picker.cols.forEach(function (col) {
  22258. if (col.destroy) { col.destroy(); }
  22259. });
  22260. if (picker.$inputEl) {
  22261. if (app.theme === 'md') {
  22262. picker.$inputEl.trigger('blur');
  22263. } else {
  22264. var validate = picker.$inputEl.attr('validate');
  22265. var required = picker.$inputEl.attr('required');
  22266. if (validate && required) {
  22267. app.input.validate(picker.$inputEl);
  22268. }
  22269. }
  22270. }
  22271. if (picker.$el) {
  22272. picker.$el.trigger('picker:close');
  22273. }
  22274. if (picker.$inputEl) {
  22275. picker.$inputEl.trigger('picker:close');
  22276. }
  22277. picker.emit('local::close pickerClose', picker);
  22278. };
  22279. Picker.prototype.onClosed = function onClosed () {
  22280. var picker = this;
  22281. picker.opened = false;
  22282. picker.closing = false;
  22283. if (!picker.inline) {
  22284. Utils.nextTick(function () {
  22285. if (picker.modal && picker.modal.el && picker.modal.destroy) {
  22286. if (!picker.params.routableModals) {
  22287. picker.modal.destroy();
  22288. }
  22289. }
  22290. delete picker.modal;
  22291. });
  22292. }
  22293. if (picker.$el) {
  22294. picker.$el.trigger('picker:closed');
  22295. }
  22296. if (picker.$inputEl) {
  22297. picker.$inputEl.trigger('picker:closed');
  22298. }
  22299. picker.emit('local::closed pickerClosed', picker);
  22300. };
  22301. Picker.prototype.open = function open () {
  22302. var obj;
  22303. var picker = this;
  22304. var app = picker.app;
  22305. var opened = picker.opened;
  22306. var inline = picker.inline;
  22307. var $inputEl = picker.$inputEl;
  22308. var $scrollToEl = picker.$scrollToEl;
  22309. var params = picker.params;
  22310. if (opened) { return; }
  22311. if (picker.cols.length === 0 && params.cols.length) {
  22312. params.cols.forEach(function (col) {
  22313. picker.cols.push(col);
  22314. });
  22315. }
  22316. if (inline) {
  22317. picker.$el = $(picker.render());
  22318. picker.$el[0].f7Picker = picker;
  22319. picker.$containerEl.append(picker.$el);
  22320. picker.onOpen();
  22321. picker.onOpened();
  22322. return;
  22323. }
  22324. var isPopover = picker.isPopover();
  22325. var modalType = isPopover ? 'popover' : 'sheet';
  22326. var modalParams = {
  22327. targetEl: $inputEl,
  22328. scrollToEl: $scrollToEl,
  22329. content: picker.render(),
  22330. backdrop: typeof params.backdrop !== 'undefined' ? params.backdrop : isPopover,
  22331. on: {
  22332. open: function open() {
  22333. var modal = this;
  22334. picker.modal = modal;
  22335. picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
  22336. picker.$el[0].f7Picker = picker;
  22337. picker.onOpen();
  22338. },
  22339. opened: function opened() { picker.onOpened(); },
  22340. close: function close() { picker.onClose(); },
  22341. closed: function closed() { picker.onClosed(); },
  22342. },
  22343. };
  22344. if (modalType === 'sheet') {
  22345. modalParams.push = params.sheetPush;
  22346. modalParams.swipeToClose = params.sheetSwipeToClose;
  22347. }
  22348. if (params.routableModals && picker.view) {
  22349. picker.view.router.navigate({
  22350. url: picker.url,
  22351. route: ( obj = {
  22352. path: picker.url
  22353. }, obj[modalType] = modalParams, obj ),
  22354. });
  22355. } else {
  22356. picker.modal = app[modalType].create(modalParams);
  22357. picker.modal.open();
  22358. }
  22359. };
  22360. Picker.prototype.close = function close () {
  22361. var picker = this;
  22362. var opened = picker.opened;
  22363. var inline = picker.inline;
  22364. if (!opened) { return; }
  22365. if (inline) {
  22366. picker.onClose();
  22367. picker.onClosed();
  22368. return;
  22369. }
  22370. if (picker.params.routableModals && picker.view) {
  22371. picker.view.router.back();
  22372. } else {
  22373. picker.modal.close();
  22374. }
  22375. };
  22376. Picker.prototype.init = function init () {
  22377. var picker = this;
  22378. picker.initInput();
  22379. if (picker.inline) {
  22380. picker.open();
  22381. picker.emit('local::init pickerInit', picker);
  22382. return;
  22383. }
  22384. if (!picker.initialized && picker.params.value) {
  22385. picker.setValue(picker.params.value);
  22386. }
  22387. // Attach input Events
  22388. if (picker.$inputEl) {
  22389. picker.attachInputEvents();
  22390. }
  22391. if (picker.params.closeByOutsideClick) {
  22392. picker.attachHtmlEvents();
  22393. }
  22394. picker.emit('local::init pickerInit', picker);
  22395. };
  22396. Picker.prototype.destroy = function destroy () {
  22397. var picker = this;
  22398. if (picker.destroyed) { return; }
  22399. var $el = picker.$el;
  22400. picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
  22401. if ($el) { $el.trigger('picker:beforedestroy'); }
  22402. picker.close();
  22403. // Detach Events
  22404. if (picker.$inputEl) {
  22405. picker.detachInputEvents();
  22406. }
  22407. if (picker.params.closeByOutsideClick) {
  22408. picker.detachHtmlEvents();
  22409. }
  22410. if ($el && $el.length) { delete picker.$el[0].f7Picker; }
  22411. Utils.deleteProps(picker);
  22412. picker.destroyed = true;
  22413. };
  22414. Object.defineProperties( Picker.prototype, prototypeAccessors );
  22415. return Picker;
  22416. }(Framework7Class));
  22417. var Picker$1 = {
  22418. name: 'picker',
  22419. static: {
  22420. Picker: Picker,
  22421. },
  22422. create: function create() {
  22423. var app = this;
  22424. app.picker = ConstructorMethods({
  22425. defaultSelector: '.picker',
  22426. constructor: Picker,
  22427. app: app,
  22428. domProp: 'f7Picker',
  22429. });
  22430. app.picker.close = function close(el) {
  22431. if ( el === void 0 ) el = '.picker';
  22432. var $el = $(el);
  22433. if ($el.length === 0) { return; }
  22434. var picker = $el[0].f7Picker;
  22435. if (!picker || (picker && !picker.opened)) { return; }
  22436. picker.close();
  22437. };
  22438. },
  22439. params: {
  22440. picker: {
  22441. // Picker settings
  22442. updateValuesOnMomentum: false,
  22443. updateValuesOnTouchmove: true,
  22444. updateValuesOnMousewheel: true,
  22445. mousewheel: true,
  22446. rotateEffect: false,
  22447. momentumRatio: 7,
  22448. freeMode: false,
  22449. cols: [],
  22450. // Common opener settings
  22451. containerEl: null,
  22452. openIn: 'auto', // or 'popover' or 'sheet'
  22453. sheetPush: false,
  22454. sheetSwipeToClose: undefined,
  22455. backdrop: undefined, // uses Popover or Sheet defaults
  22456. formatValue: null,
  22457. inputEl: null,
  22458. inputReadOnly: true,
  22459. closeByOutsideClick: true,
  22460. scrollToInput: true,
  22461. scrollToEl: undefined,
  22462. toolbar: true,
  22463. toolbarCloseText: 'Done',
  22464. cssClass: null,
  22465. routableModals: true,
  22466. view: null,
  22467. url: 'select/',
  22468. // Render functions
  22469. renderToolbar: null,
  22470. render: null,
  22471. },
  22472. },
  22473. };
  22474. var InfiniteScroll = {
  22475. handleScroll: function handleScroll(el, e) {
  22476. var app = this;
  22477. var $el = $(el);
  22478. var scrollTop = $el[0].scrollTop;
  22479. var scrollHeight = $el[0].scrollHeight;
  22480. var height = $el[0].offsetHeight;
  22481. var distance = $el[0].getAttribute('data-infinite-distance');
  22482. var virtualListContainer = $el.find('.virtual-list');
  22483. var virtualList;
  22484. var onTop = $el.hasClass('infinite-scroll-top');
  22485. if (!distance) { distance = 50; }
  22486. if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
  22487. distance = (parseInt(distance, 10) / 100) * height;
  22488. }
  22489. if (distance > height) { distance = height; }
  22490. if (onTop) {
  22491. if (scrollTop < distance) {
  22492. $el.trigger('infinite', e);
  22493. app.emit('infinite', $el[0], e);
  22494. }
  22495. } else if (scrollTop + height >= scrollHeight - distance) {
  22496. if (virtualListContainer.length > 0) {
  22497. virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
  22498. if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
  22499. return;
  22500. }
  22501. }
  22502. $el.trigger('infinite', e);
  22503. app.emit('infinite', $el[0], e);
  22504. }
  22505. },
  22506. create: function create(el) {
  22507. var $el = $(el);
  22508. var app = this;
  22509. function scrollHandler(e) {
  22510. app.infiniteScroll.handle(this, e);
  22511. }
  22512. $el.each(function (index, element) {
  22513. element.f7InfiniteScrollHandler = scrollHandler;
  22514. element.addEventListener('scroll', element.f7InfiniteScrollHandler);
  22515. });
  22516. },
  22517. destroy: function destroy(el) {
  22518. var $el = $(el);
  22519. $el.each(function (index, element) {
  22520. element.removeEventListener('scroll', element.f7InfiniteScrollHandler);
  22521. delete element.f7InfiniteScrollHandler;
  22522. });
  22523. },
  22524. };
  22525. var InfiniteScroll$1 = {
  22526. name: 'infiniteScroll',
  22527. create: function create() {
  22528. var app = this;
  22529. Utils.extend(app, {
  22530. infiniteScroll: {
  22531. handle: InfiniteScroll.handleScroll.bind(app),
  22532. create: InfiniteScroll.create.bind(app),
  22533. destroy: InfiniteScroll.destroy.bind(app),
  22534. },
  22535. });
  22536. },
  22537. on: {
  22538. tabMounted: function tabMounted(tabEl) {
  22539. var app = this;
  22540. var $tabEl = $(tabEl);
  22541. var $isEls = $tabEl.find('.infinite-scroll-content');
  22542. if ($tabEl.is('.infinite-scroll-content')) { $isEls.add($tabEl); }
  22543. $isEls.each(function (index, el) {
  22544. app.infiniteScroll.create(el);
  22545. });
  22546. },
  22547. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  22548. var $tabEl = $(tabEl);
  22549. var app = this;
  22550. var $isEls = $tabEl.find('.infinite-scroll-content');
  22551. if ($tabEl.is('.infinite-scroll-content')) { $isEls.add($tabEl); }
  22552. $isEls.each(function (index, el) {
  22553. app.infiniteScroll.destroy(el);
  22554. });
  22555. },
  22556. pageInit: function pageInit(page) {
  22557. var app = this;
  22558. page.$el.find('.infinite-scroll-content').each(function (index, el) {
  22559. app.infiniteScroll.create(el);
  22560. });
  22561. },
  22562. pageBeforeRemove: function pageBeforeRemove(page) {
  22563. var app = this;
  22564. page.$el.find('.infinite-scroll-content').each(function (index, el) {
  22565. app.infiniteScroll.destroy(el);
  22566. });
  22567. },
  22568. },
  22569. };
  22570. var PullToRefresh = /*@__PURE__*/(function (Framework7Class) {
  22571. function PullToRefresh(app, el) {
  22572. Framework7Class.call(this, {}, [app]);
  22573. var ptr = this;
  22574. var $el = $(el);
  22575. var $preloaderEl = $el.find('.ptr-preloader');
  22576. ptr.$el = $el;
  22577. ptr.el = $el[0];
  22578. ptr.app = app;
  22579. ptr.bottom = ptr.$el.hasClass('ptr-bottom');
  22580. // Extend defaults with modules params
  22581. ptr.useModulesParams({});
  22582. var isMaterial = app.theme === 'md';
  22583. var isIos = app.theme === 'ios';
  22584. var isAurora = app.theme === 'aurora';
  22585. // Done
  22586. ptr.done = function done() {
  22587. var $transitionTarget = isMaterial ? $preloaderEl : $el;
  22588. $transitionTarget.transitionEnd(function () {
  22589. $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down ptr-closing');
  22590. $el.trigger('ptr:done');
  22591. ptr.emit('local::done ptrDone', $el[0]);
  22592. });
  22593. $el.removeClass('ptr-refreshing').addClass('ptr-transitioning ptr-closing');
  22594. return ptr;
  22595. };
  22596. ptr.refresh = function refresh() {
  22597. if ($el.hasClass('ptr-refreshing')) { return ptr; }
  22598. $el.addClass('ptr-transitioning ptr-refreshing');
  22599. $el.trigger('ptr:refresh', ptr.done);
  22600. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  22601. return ptr;
  22602. };
  22603. // Mousewheel
  22604. ptr.mousewheel = $el.attr('data-ptr-mousewheel') === 'true';
  22605. // Events handling
  22606. var touchId;
  22607. var isTouched;
  22608. var isMoved;
  22609. var touchesStart = {};
  22610. var isScrolling;
  22611. var touchesDiff;
  22612. var refresh = false;
  22613. var useTranslate = false;
  22614. var forceUseTranslate = false;
  22615. var startTranslate = 0;
  22616. var translate;
  22617. var scrollTop;
  22618. var wasScrolled;
  22619. var triggerDistance;
  22620. var dynamicTriggerDistance;
  22621. var pullStarted;
  22622. var hasNavbar = false;
  22623. var scrollHeight;
  22624. var offsetHeight;
  22625. var maxScrollTop;
  22626. var $pageEl = $el.parents('.page');
  22627. if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbars').length > 0) { hasNavbar = true; }
  22628. if ($pageEl.hasClass('no-navbar')) { hasNavbar = false; }
  22629. if (!ptr.bottom) {
  22630. var pageNavbarEl = app.navbar.getElByPage($pageEl[0]);
  22631. if (pageNavbarEl) {
  22632. var $pageNavbarEl = $(pageNavbarEl);
  22633. var isLargeTransparent = $pageNavbarEl.hasClass('navbar-large-transparent')
  22634. || (
  22635. $pageNavbarEl.hasClass('navbar-large')
  22636. && $pageNavbarEl.hasClass('navbar-transparent')
  22637. );
  22638. var isTransparent = $pageNavbarEl.hasClass('navbar-transparent') && !$pageNavbarEl.hasClass('navbar-large');
  22639. if (isLargeTransparent) {
  22640. $el.addClass('ptr-with-navbar-large-transparent');
  22641. } else if (isTransparent) {
  22642. $el.addClass('ptr-with-navbar-transparent');
  22643. }
  22644. }
  22645. }
  22646. if (!hasNavbar && !ptr.bottom) { $el.addClass('ptr-no-navbar'); }
  22647. // Define trigger distance
  22648. if ($el.attr('data-ptr-distance')) {
  22649. dynamicTriggerDistance = true;
  22650. } else if (isMaterial) {
  22651. triggerDistance = 66;
  22652. } else if (isIos) {
  22653. triggerDistance = 44;
  22654. } else if (isAurora) {
  22655. triggerDistance = 38;
  22656. }
  22657. function handleTouchStart(e) {
  22658. if (isTouched) {
  22659. if (Device.os === 'android') {
  22660. if ('targetTouches' in e && e.targetTouches.length > 1) { return; }
  22661. } else { return; }
  22662. }
  22663. if ($el.hasClass('ptr-refreshing')) {
  22664. return;
  22665. }
  22666. if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
  22667. isMoved = false;
  22668. pullStarted = false;
  22669. isTouched = true;
  22670. isScrolling = undefined;
  22671. wasScrolled = undefined;
  22672. if (e.type === 'touchstart') { touchId = e.targetTouches[0].identifier; }
  22673. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  22674. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  22675. }
  22676. function handleTouchMove(e) {
  22677. if (!isTouched) { return; }
  22678. var pageX;
  22679. var pageY;
  22680. var touch;
  22681. if (e.type === 'touchmove') {
  22682. if (touchId && e.touches) {
  22683. for (var i = 0; i < e.touches.length; i += 1) {
  22684. if (e.touches[i].identifier === touchId) {
  22685. touch = e.touches[i];
  22686. }
  22687. }
  22688. }
  22689. if (!touch) { touch = e.targetTouches[0]; }
  22690. pageX = touch.pageX;
  22691. pageY = touch.pageY;
  22692. } else {
  22693. pageX = e.pageX;
  22694. pageY = e.pageY;
  22695. }
  22696. if (!pageX || !pageY) { return; }
  22697. if (typeof isScrolling === 'undefined') {
  22698. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  22699. }
  22700. if (!isScrolling) {
  22701. isTouched = false;
  22702. return;
  22703. }
  22704. scrollTop = $el[0].scrollTop;
  22705. if (!isMoved) {
  22706. $el.removeClass('ptr-transitioning');
  22707. var targetIsScrollable;
  22708. scrollHeight = $el[0].scrollHeight;
  22709. offsetHeight = $el[0].offsetHeight;
  22710. if (ptr.bottom) {
  22711. maxScrollTop = scrollHeight - offsetHeight;
  22712. }
  22713. if (scrollTop > scrollHeight) {
  22714. isTouched = false;
  22715. return;
  22716. }
  22717. var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
  22718. if ($ptrWatchScrollable.length) {
  22719. $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
  22720. if (ptrScrollableEl === el) { return; }
  22721. if (
  22722. (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
  22723. && $(ptrScrollableEl).css('overflow') === 'auto'
  22724. && (
  22725. (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
  22726. || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
  22727. )
  22728. ) {
  22729. targetIsScrollable = true;
  22730. }
  22731. });
  22732. }
  22733. if (targetIsScrollable) {
  22734. isTouched = false;
  22735. return;
  22736. }
  22737. if (dynamicTriggerDistance) {
  22738. triggerDistance = $el.attr('data-ptr-distance');
  22739. if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
  22740. }
  22741. startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
  22742. if (scrollHeight === offsetHeight || Device.os !== 'ios' || isMaterial) {
  22743. useTranslate = true;
  22744. } else {
  22745. useTranslate = false;
  22746. }
  22747. forceUseTranslate = false;
  22748. }
  22749. isMoved = true;
  22750. touchesDiff = pageY - touchesStart.y;
  22751. if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
  22752. var ptrStarted = ptr.bottom
  22753. ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
  22754. : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
  22755. if (ptrStarted) {
  22756. // iOS 8 fix
  22757. if (Device.os === 'ios' && parseInt(Device.osVersion.split('.')[0], 10) > 7) {
  22758. if (!ptr.bottom && scrollTop === 0 && !wasScrolled) { useTranslate = true; }
  22759. if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) { useTranslate = true; }
  22760. }
  22761. if (!useTranslate && ptr.bottom && !isMaterial) {
  22762. $el.css('-webkit-overflow-scrolling', 'auto');
  22763. $el.scrollTop(maxScrollTop);
  22764. forceUseTranslate = true;
  22765. }
  22766. if (useTranslate || forceUseTranslate) {
  22767. if (e.cancelable) {
  22768. e.preventDefault();
  22769. }
  22770. translate = (ptr.bottom ? -1 * (Math.pow( Math.abs(touchesDiff), 0.85 )) : Math.pow( touchesDiff, 0.85 )) + startTranslate;
  22771. if (isMaterial) {
  22772. $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
  22773. .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
  22774. } else {
  22775. // eslint-disable-next-line
  22776. if (ptr.bottom) {
  22777. $el.children().transform(("translate3d(0," + translate + "px,0)"));
  22778. } else {
  22779. $el.transform(("translate3d(0," + translate + "px,0)"));
  22780. }
  22781. }
  22782. }
  22783. if (((useTranslate || forceUseTranslate) && (Math.pow( Math.abs(touchesDiff), 0.85 )) > triggerDistance) || (!useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2)) {
  22784. refresh = true;
  22785. $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
  22786. } else {
  22787. refresh = false;
  22788. $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
  22789. }
  22790. if (!pullStarted) {
  22791. $el.trigger('ptr:pullstart');
  22792. ptr.emit('local::pullStart ptrPullStart', $el[0]);
  22793. pullStarted = true;
  22794. }
  22795. $el.trigger('ptr:pullmove', {
  22796. event: e,
  22797. scrollTop: scrollTop,
  22798. translate: translate,
  22799. touchesDiff: touchesDiff,
  22800. });
  22801. ptr.emit('local::pullMove ptrPullMove', $el[0], {
  22802. event: e,
  22803. scrollTop: scrollTop,
  22804. translate: translate,
  22805. touchesDiff: touchesDiff,
  22806. });
  22807. } else {
  22808. pullStarted = false;
  22809. $el.removeClass('ptr-pull-up ptr-pull-down');
  22810. refresh = false;
  22811. }
  22812. }
  22813. function handleTouchEnd(e) {
  22814. if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
  22815. if (e.changedTouches[0].identifier !== touchId) {
  22816. isTouched = false;
  22817. isScrolling = false;
  22818. isMoved = false;
  22819. touchId = null;
  22820. return;
  22821. }
  22822. }
  22823. if (!isTouched || !isMoved) {
  22824. isTouched = false;
  22825. isMoved = false;
  22826. return;
  22827. }
  22828. if (translate) {
  22829. $el.addClass('ptr-transitioning');
  22830. translate = 0;
  22831. }
  22832. if (isMaterial) {
  22833. $preloaderEl.transform('')
  22834. .find('.ptr-arrow').transform('');
  22835. } else {
  22836. // eslint-disable-next-line
  22837. if (ptr.bottom) {
  22838. $el.children().transform('');
  22839. } else {
  22840. $el.transform('');
  22841. }
  22842. }
  22843. if (!useTranslate && ptr.bottom && !isMaterial) {
  22844. $el.css('-webkit-overflow-scrolling', '');
  22845. }
  22846. if (refresh) {
  22847. $el.addClass('ptr-refreshing');
  22848. $el.trigger('ptr:refresh', ptr.done);
  22849. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  22850. } else {
  22851. $el.removeClass('ptr-pull-down');
  22852. }
  22853. isTouched = false;
  22854. isMoved = false;
  22855. if (pullStarted) {
  22856. $el.trigger('ptr:pullend');
  22857. ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
  22858. }
  22859. }
  22860. var mousewheelTimeout;
  22861. var mousewheelMoved;
  22862. var mousewheelAllow = true;
  22863. var mousewheelTranslate = 0;
  22864. function handleMouseWheelRelease() {
  22865. mousewheelAllow = true;
  22866. mousewheelMoved = false;
  22867. mousewheelTranslate = 0;
  22868. if (translate) {
  22869. $el.addClass('ptr-transitioning');
  22870. translate = 0;
  22871. }
  22872. if (isMaterial) {
  22873. $preloaderEl.transform('')
  22874. .find('.ptr-arrow').transform('');
  22875. } else {
  22876. // eslint-disable-next-line
  22877. if (ptr.bottom) {
  22878. $el.children().transform('');
  22879. } else {
  22880. $el.transform('');
  22881. }
  22882. }
  22883. if (refresh) {
  22884. $el.addClass('ptr-refreshing');
  22885. $el.trigger('ptr:refresh', ptr.done);
  22886. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  22887. } else {
  22888. $el.removeClass('ptr-pull-down');
  22889. }
  22890. if (pullStarted) {
  22891. $el.trigger('ptr:pullend');
  22892. ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
  22893. }
  22894. }
  22895. function handleMouseWheel(e) {
  22896. if (!mousewheelAllow) { return; }
  22897. var deltaX = e.deltaX;
  22898. var deltaY = e.deltaY;
  22899. if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
  22900. if ($el.hasClass('ptr-refreshing')) {
  22901. return;
  22902. }
  22903. if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
  22904. clearTimeout(mousewheelTimeout);
  22905. scrollTop = $el[0].scrollTop;
  22906. if (!mousewheelMoved) {
  22907. $el.removeClass('ptr-transitioning');
  22908. var targetIsScrollable;
  22909. scrollHeight = $el[0].scrollHeight;
  22910. offsetHeight = $el[0].offsetHeight;
  22911. if (ptr.bottom) {
  22912. maxScrollTop = scrollHeight - offsetHeight;
  22913. }
  22914. if (scrollTop > scrollHeight) {
  22915. mousewheelAllow = false;
  22916. return;
  22917. }
  22918. var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
  22919. if ($ptrWatchScrollable.length) {
  22920. $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
  22921. if (ptrScrollableEl === el) { return; }
  22922. if (
  22923. (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
  22924. && $(ptrScrollableEl).css('overflow') === 'auto'
  22925. && (
  22926. (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
  22927. || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
  22928. )
  22929. ) {
  22930. targetIsScrollable = true;
  22931. }
  22932. });
  22933. }
  22934. if (targetIsScrollable) {
  22935. mousewheelAllow = false;
  22936. return;
  22937. }
  22938. if (dynamicTriggerDistance) {
  22939. triggerDistance = $el.attr('data-ptr-distance');
  22940. if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
  22941. }
  22942. }
  22943. isMoved = true;
  22944. mousewheelTranslate -= deltaY;
  22945. touchesDiff = mousewheelTranslate; // pageY - touchesStart.y;
  22946. if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
  22947. var ptrStarted = ptr.bottom
  22948. ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
  22949. : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
  22950. if (ptrStarted) {
  22951. if (e.cancelable) {
  22952. e.preventDefault();
  22953. }
  22954. translate = touchesDiff;
  22955. if (Math.abs(translate) > triggerDistance) {
  22956. translate = triggerDistance + (Math.pow( (Math.abs(translate) - triggerDistance), 0.7 ));
  22957. if (ptr.bottom) { translate = -translate; }
  22958. }
  22959. if (isMaterial) {
  22960. $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
  22961. .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
  22962. } else {
  22963. // eslint-disable-next-line
  22964. if (ptr.bottom) {
  22965. $el.children().transform(("translate3d(0," + translate + "px,0)"));
  22966. } else {
  22967. $el.transform(("translate3d(0," + translate + "px,0)"));
  22968. }
  22969. }
  22970. if (Math.abs(translate) > triggerDistance) {
  22971. refresh = true;
  22972. $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
  22973. } else {
  22974. refresh = false;
  22975. $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
  22976. }
  22977. if (!pullStarted) {
  22978. $el.trigger('ptr:pullstart');
  22979. ptr.emit('local::pullStart ptrPullStart', $el[0]);
  22980. pullStarted = true;
  22981. }
  22982. $el.trigger('ptr:pullmove', {
  22983. event: e,
  22984. scrollTop: scrollTop,
  22985. translate: translate,
  22986. touchesDiff: touchesDiff,
  22987. });
  22988. ptr.emit('local::pullMove ptrPullMove', $el[0], {
  22989. event: e,
  22990. scrollTop: scrollTop,
  22991. translate: translate,
  22992. touchesDiff: touchesDiff,
  22993. });
  22994. } else {
  22995. pullStarted = false;
  22996. $el.removeClass('ptr-pull-up ptr-pull-down');
  22997. refresh = false;
  22998. }
  22999. mousewheelTimeout = setTimeout(handleMouseWheelRelease, 300);
  23000. }
  23001. if (!$pageEl.length || !$el.length) { return ptr; }
  23002. $el[0].f7PullToRefresh = ptr;
  23003. // Events
  23004. ptr.attachEvents = function attachEvents() {
  23005. var passive = Support.passiveListener ? { passive: true } : false;
  23006. $el.on(app.touchEvents.start, handleTouchStart, passive);
  23007. app.on('touchmove:active', handleTouchMove);
  23008. app.on('touchend:passive', handleTouchEnd);
  23009. if (ptr.mousewheel && !ptr.bottom) {
  23010. $el.on('wheel', handleMouseWheel);
  23011. }
  23012. };
  23013. ptr.detachEvents = function detachEvents() {
  23014. var passive = Support.passiveListener ? { passive: true } : false;
  23015. $el.off(app.touchEvents.start, handleTouchStart, passive);
  23016. app.off('touchmove:active', handleTouchMove);
  23017. app.off('touchend:passive', handleTouchEnd);
  23018. if (ptr.mousewheel && !ptr.bottom) {
  23019. $el.off('wheel', handleMouseWheel);
  23020. }
  23021. };
  23022. // Install Modules
  23023. ptr.useModules();
  23024. // Init
  23025. ptr.init();
  23026. return ptr;
  23027. }
  23028. if ( Framework7Class ) PullToRefresh.__proto__ = Framework7Class;
  23029. PullToRefresh.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  23030. PullToRefresh.prototype.constructor = PullToRefresh;
  23031. PullToRefresh.prototype.init = function init () {
  23032. var ptr = this;
  23033. ptr.attachEvents();
  23034. };
  23035. PullToRefresh.prototype.destroy = function destroy () {
  23036. var ptr = this;
  23037. ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
  23038. ptr.$el.trigger('ptr:beforedestroy');
  23039. delete ptr.el.f7PullToRefresh;
  23040. ptr.detachEvents();
  23041. Utils.deleteProps(ptr);
  23042. ptr = null;
  23043. };
  23044. return PullToRefresh;
  23045. }(Framework7Class));
  23046. var PullToRefresh$1 = {
  23047. name: 'pullToRefresh',
  23048. create: function create() {
  23049. var app = this;
  23050. app.ptr = Utils.extend(
  23051. ConstructorMethods({
  23052. defaultSelector: '.ptr-content',
  23053. constructor: PullToRefresh,
  23054. app: app,
  23055. domProp: 'f7PullToRefresh',
  23056. }),
  23057. {
  23058. done: function done(el) {
  23059. var ptr = app.ptr.get(el);
  23060. if (ptr) { return ptr.done(); }
  23061. return undefined;
  23062. },
  23063. refresh: function refresh(el) {
  23064. var ptr = app.ptr.get(el);
  23065. if (ptr) { return ptr.refresh(); }
  23066. return undefined;
  23067. },
  23068. }
  23069. );
  23070. },
  23071. static: {
  23072. PullToRefresh: PullToRefresh,
  23073. },
  23074. on: {
  23075. tabMounted: function tabMounted(tabEl) {
  23076. var app = this;
  23077. var $tabEl = $(tabEl);
  23078. var $ptrEls = $tabEl.find('.ptr-content');
  23079. if ($tabEl.is('.ptr-content')) { $ptrEls.add($tabEl); }
  23080. $ptrEls.each(function (index, el) {
  23081. app.ptr.create(el);
  23082. });
  23083. },
  23084. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  23085. var $tabEl = $(tabEl);
  23086. var app = this;
  23087. var $ptrEls = $tabEl.find('.ptr-content');
  23088. if ($tabEl.is('.ptr-content')) { $ptrEls.add($tabEl); }
  23089. $ptrEls.each(function (index, el) {
  23090. app.ptr.destroy(el);
  23091. });
  23092. },
  23093. pageInit: function pageInit(page) {
  23094. var app = this;
  23095. page.$el.find('.ptr-content').each(function (index, el) {
  23096. app.ptr.create(el);
  23097. });
  23098. },
  23099. pageBeforeRemove: function pageBeforeRemove(page) {
  23100. var app = this;
  23101. page.$el.find('.ptr-content').each(function (index, el) {
  23102. app.ptr.destroy(el);
  23103. });
  23104. },
  23105. },
  23106. };
  23107. var Lazy = {
  23108. destroy: function destroy(pageEl) {
  23109. var $pageEl = $(pageEl).closest('.page');
  23110. if (!$pageEl.length) { return; }
  23111. if ($pageEl[0].f7LazyDestroy) {
  23112. $pageEl[0].f7LazyDestroy();
  23113. }
  23114. },
  23115. create: function create(pageEl) {
  23116. var app = this;
  23117. var $pageEl = $(pageEl).closest('.page').eq(0);
  23118. // Lazy images
  23119. var $lazyLoadImages = $pageEl.find('.lazy');
  23120. if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) { return; }
  23121. // Placeholder
  23122. var placeholderSrc = app.params.lazy.placeholder;
  23123. if (placeholderSrc !== false) {
  23124. $lazyLoadImages.each(function (index, lazyEl) {
  23125. if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) { $(lazyEl).attr('src', placeholderSrc); }
  23126. });
  23127. }
  23128. // load image
  23129. var imagesSequence = [];
  23130. var imageIsLoading = false;
  23131. function onImageComplete(lazyEl) {
  23132. if (imagesSequence.indexOf(lazyEl) >= 0) {
  23133. imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
  23134. }
  23135. imageIsLoading = false;
  23136. if (app.params.lazy.sequential && imagesSequence.length > 0) {
  23137. imageIsLoading = true;
  23138. app.lazy.loadImage(imagesSequence[0], onImageComplete);
  23139. }
  23140. }
  23141. function observerCallback(entries, observer) {
  23142. entries.forEach(function (entry) {
  23143. if (entry.isIntersecting) {
  23144. if (app.params.lazy.sequential && imageIsLoading) {
  23145. if (imagesSequence.indexOf(entry.target) < 0) { imagesSequence.push(entry.target); }
  23146. return;
  23147. }
  23148. // Load image
  23149. imageIsLoading = true;
  23150. app.lazy.loadImage(entry.target, onImageComplete);
  23151. // Detach
  23152. observer.unobserve(entry.target);
  23153. }
  23154. });
  23155. }
  23156. if (app.params.lazy.observer && Support.intersectionObserver) {
  23157. var observer = $pageEl[0].f7LazyObserver;
  23158. if (!observer) {
  23159. observer = new win.IntersectionObserver(observerCallback, {
  23160. root: $pageEl[0],
  23161. });
  23162. }
  23163. $lazyLoadImages.each(function (index, el) {
  23164. if (el.f7LazyObserverAdded) { return; }
  23165. el.f7LazyObserverAdded = true;
  23166. observer.observe(el);
  23167. });
  23168. if (!$pageEl[0].f7LazyDestroy) {
  23169. $pageEl[0].f7LazyDestroy = function () {
  23170. observer.disconnect();
  23171. delete $pageEl[0].f7LazyDestroy;
  23172. delete $pageEl[0].f7LazyObserver;
  23173. };
  23174. }
  23175. return;
  23176. }
  23177. function lazyHandler() {
  23178. app.lazy.load($pageEl, function (lazyEl) {
  23179. if (app.params.lazy.sequential && imageIsLoading) {
  23180. if (imagesSequence.indexOf(lazyEl) < 0) { imagesSequence.push(lazyEl); }
  23181. return;
  23182. }
  23183. imageIsLoading = true;
  23184. app.lazy.loadImage(lazyEl, onImageComplete);
  23185. });
  23186. }
  23187. function attachEvents() {
  23188. $pageEl[0].f7LazyAttached = true;
  23189. $pageEl.on('lazy', lazyHandler);
  23190. $pageEl.on('scroll', lazyHandler, true);
  23191. $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
  23192. app.on('resize', lazyHandler);
  23193. }
  23194. function detachEvents() {
  23195. $pageEl[0].f7LazyAttached = false;
  23196. delete $pageEl[0].f7LazyAttached;
  23197. $pageEl.off('lazy', lazyHandler);
  23198. $pageEl.off('scroll', lazyHandler, true);
  23199. $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
  23200. app.off('resize', lazyHandler);
  23201. }
  23202. // Store detach function
  23203. if (!$pageEl[0].f7LazyDestroy) {
  23204. $pageEl[0].f7LazyDestroy = detachEvents;
  23205. }
  23206. // Attach events
  23207. if (!$pageEl[0].f7LazyAttached) {
  23208. attachEvents();
  23209. }
  23210. // Run loader on page load/init
  23211. lazyHandler();
  23212. },
  23213. isInViewport: function isInViewport(lazyEl) {
  23214. var app = this;
  23215. var rect = lazyEl.getBoundingClientRect();
  23216. var threshold = app.params.lazy.threshold || 0;
  23217. return (
  23218. rect.top >= (0 - threshold)
  23219. && rect.left >= (0 - threshold)
  23220. && rect.top <= (app.height + threshold)
  23221. && rect.left <= (app.width + threshold)
  23222. );
  23223. },
  23224. loadImage: function loadImage(imageEl, callback) {
  23225. var app = this;
  23226. var $imageEl = $(imageEl);
  23227. var bg = $imageEl.attr('data-background');
  23228. var src = bg || $imageEl.attr('data-src');
  23229. function onLoad() {
  23230. $imageEl.removeClass('lazy').addClass('lazy-loaded');
  23231. if (bg) {
  23232. $imageEl.css('background-image', ("url(" + src + ")"));
  23233. } else if (src) {
  23234. $imageEl.attr('src', src);
  23235. }
  23236. if (callback) { callback(imageEl); }
  23237. $imageEl.trigger('lazy:loaded');
  23238. app.emit('lazyLoaded', $imageEl[0]);
  23239. }
  23240. if (!src) {
  23241. $imageEl.trigger('lazy:load');
  23242. app.emit('lazyLoad', $imageEl[0]);
  23243. onLoad();
  23244. return;
  23245. }
  23246. function onError() {
  23247. $imageEl.removeClass('lazy').addClass('lazy-loaded');
  23248. if (bg) {
  23249. $imageEl.css('background-image', ("url(" + (app.params.lazy.placeholder || '') + ")"));
  23250. } else {
  23251. $imageEl.attr('src', app.params.lazy.placeholder || '');
  23252. }
  23253. if (callback) { callback(imageEl); }
  23254. $imageEl.trigger('lazy:error');
  23255. app.emit('lazyError', $imageEl[0]);
  23256. }
  23257. var image = new win.Image();
  23258. image.onload = onLoad;
  23259. image.onerror = onError;
  23260. image.src = src;
  23261. $imageEl.removeAttr('data-src').removeAttr('data-background');
  23262. // Add loaded callback and events
  23263. $imageEl.trigger('lazy:load');
  23264. app.emit('lazyLoad', $imageEl[0]);
  23265. },
  23266. load: function load(pageEl, callback) {
  23267. var app = this;
  23268. var $pageEl = $(pageEl);
  23269. if (!$pageEl.hasClass('page')) { $pageEl = $pageEl.parents('.page').eq(0); }
  23270. if ($pageEl.length === 0) {
  23271. return;
  23272. }
  23273. $pageEl.find('.lazy').each(function (index, lazyEl) {
  23274. var $lazyEl = $(lazyEl);
  23275. if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
  23276. return;
  23277. }
  23278. if (app.lazy.isInViewport(lazyEl)) {
  23279. if (callback) { callback(lazyEl); }
  23280. else { app.lazy.loadImage(lazyEl); }
  23281. }
  23282. });
  23283. },
  23284. };
  23285. var Lazy$1 = {
  23286. name: 'lazy',
  23287. params: {
  23288. lazy: {
  23289. placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
  23290. threshold: 0,
  23291. sequential: true,
  23292. observer: true,
  23293. },
  23294. },
  23295. create: function create() {
  23296. var app = this;
  23297. Utils.extend(app, {
  23298. lazy: {
  23299. create: Lazy.create.bind(app),
  23300. destroy: Lazy.destroy.bind(app),
  23301. loadImage: Lazy.loadImage.bind(app),
  23302. load: Lazy.load.bind(app),
  23303. isInViewport: Lazy.isInViewport.bind(app),
  23304. },
  23305. });
  23306. },
  23307. on: {
  23308. pageInit: function pageInit(page) {
  23309. var app = this;
  23310. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  23311. app.lazy.create(page.$el);
  23312. }
  23313. },
  23314. pageAfterIn: function pageAfterIn(page) {
  23315. var app = this;
  23316. if (app.params.lazy.observer && Support.intersectionObserver) { return; }
  23317. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  23318. app.lazy.create(page.$el);
  23319. }
  23320. },
  23321. pageBeforeRemove: function pageBeforeRemove(page) {
  23322. var app = this;
  23323. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  23324. app.lazy.destroy(page.$el);
  23325. }
  23326. },
  23327. tabMounted: function tabMounted(tabEl) {
  23328. var app = this;
  23329. var $tabEl = $(tabEl);
  23330. if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
  23331. app.lazy.create($tabEl);
  23332. }
  23333. },
  23334. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  23335. var app = this;
  23336. if (app.params.lazy.observer && Support.intersectionObserver) { return; }
  23337. var $tabEl = $(tabEl);
  23338. if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
  23339. app.lazy.destroy($tabEl);
  23340. }
  23341. },
  23342. },
  23343. };
  23344. var DataTable = /*@__PURE__*/(function (Framework7Class) {
  23345. function DataTable(app, params) {
  23346. if ( params === void 0 ) params = {};
  23347. Framework7Class.call(this, params, [app]);
  23348. var table = this;
  23349. var defaults = {
  23350. };
  23351. // Extend defaults with modules params
  23352. table.useModulesParams(defaults);
  23353. table.params = Utils.extend(defaults, params);
  23354. // El
  23355. var $el = $(table.params.el);
  23356. if ($el.length === 0) { return undefined; }
  23357. table.$el = $el;
  23358. table.el = $el[0];
  23359. if (table.$el[0].f7DataTable) {
  23360. var instance = table.$el[0].f7DataTable;
  23361. table.destroy();
  23362. return instance;
  23363. }
  23364. table.$el[0].f7DataTable = table;
  23365. Utils.extend(table, {
  23366. collapsible: $el.hasClass('data-table-collapsible'),
  23367. // Headers
  23368. $headerEl: $el.find('.data-table-header'),
  23369. $headerSelectedEl: $el.find('.data-table-header-selected'),
  23370. });
  23371. // Events
  23372. function handleChange(e) {
  23373. if (e.detail && e.detail.sentByF7DataTable) {
  23374. // Scripted event, don't do anything
  23375. return;
  23376. }
  23377. var $inputEl = $(this);
  23378. var checked = $inputEl[0].checked;
  23379. var columnIndex = $inputEl.parents('td,th').index();
  23380. if ($inputEl.parents('thead').length > 0) {
  23381. if (columnIndex === 0) {
  23382. $el
  23383. .find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
  23384. }
  23385. $el
  23386. .find(("tbody tr td:nth-child(" + (columnIndex + 1) + ") input"))
  23387. .prop('checked', checked)
  23388. .trigger('change', { sentByF7DataTable: true });
  23389. $inputEl.prop('indeterminate', false);
  23390. } else {
  23391. if (columnIndex === 0) {
  23392. $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
  23393. }
  23394. var checkedRows = $el.find(("tbody .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]:checked")).length;
  23395. var totalRows = $el.find('tbody tr').length;
  23396. var $headCheckboxEl = $el.find(("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]"));
  23397. if (!checked) {
  23398. $headCheckboxEl.prop('checked', false);
  23399. } else if (checkedRows === totalRows) {
  23400. $headCheckboxEl.prop('checked', true).trigger('change', { sentByF7DataTable: true });
  23401. }
  23402. $headCheckboxEl.prop('indeterminate', checkedRows > 0 && checkedRows < totalRows);
  23403. }
  23404. table.checkSelectedHeader();
  23405. }
  23406. function handleSortableClick() {
  23407. var $cellEl = $(this);
  23408. var isActive = $cellEl.hasClass('sortable-cell-active');
  23409. var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
  23410. var newSort;
  23411. if (isActive) {
  23412. newSort = currentSort === 'desc' ? 'asc' : 'desc';
  23413. $cellEl.removeClass('sortable-desc sortable-asc').addClass(("sortable-" + newSort));
  23414. } else {
  23415. $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
  23416. $cellEl.addClass('sortable-cell-active');
  23417. newSort = currentSort;
  23418. }
  23419. $cellEl.trigger('datatable:sort', newSort);
  23420. table.emit('local::sort dataTableSort', table, newSort);
  23421. }
  23422. table.attachEvents = function attachEvents() {
  23423. table.$el.on('change', '.checkbox-cell input[type="checkbox"]', handleChange);
  23424. table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
  23425. };
  23426. table.detachEvents = function detachEvents() {
  23427. table.$el.off('change', '.checkbox-cell input[type="checkbox"]', handleChange);
  23428. table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
  23429. };
  23430. // Install Modules
  23431. table.useModules();
  23432. // Init
  23433. table.init();
  23434. return table;
  23435. }
  23436. if ( Framework7Class ) DataTable.__proto__ = Framework7Class;
  23437. DataTable.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  23438. DataTable.prototype.constructor = DataTable;
  23439. DataTable.prototype.setCollapsibleLabels = function setCollapsibleLabels () {
  23440. var table = this;
  23441. if (!table.collapsible) { return; }
  23442. table.$el.find('tbody td:not(.checkbox-cell)').each(function (index, el) {
  23443. var $el = $(el);
  23444. var elIndex = $el.index();
  23445. var collpsibleTitle = $el.attr('data-collapsible-title');
  23446. if (!collpsibleTitle && collpsibleTitle !== '') {
  23447. $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
  23448. }
  23449. });
  23450. };
  23451. DataTable.prototype.checkSelectedHeader = function checkSelectedHeader () {
  23452. var table = this;
  23453. if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
  23454. var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
  23455. table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
  23456. table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
  23457. }
  23458. };
  23459. DataTable.prototype.init = function init () {
  23460. var table = this;
  23461. table.attachEvents();
  23462. table.setCollapsibleLabels();
  23463. table.checkSelectedHeader();
  23464. };
  23465. DataTable.prototype.destroy = function destroy () {
  23466. var table = this;
  23467. table.$el.trigger('datatable:beforedestroy');
  23468. table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
  23469. table.attachEvents();
  23470. if (table.$el[0]) {
  23471. table.$el[0].f7DataTable = null;
  23472. delete table.$el[0].f7DataTable;
  23473. }
  23474. Utils.deleteProps(table);
  23475. table = null;
  23476. };
  23477. return DataTable;
  23478. }(Framework7Class));
  23479. var DataTable$1 = {
  23480. name: 'dataTable',
  23481. static: {
  23482. DataTable: DataTable,
  23483. },
  23484. create: function create() {
  23485. var app = this;
  23486. app.dataTable = ConstructorMethods({
  23487. defaultSelector: '.data-table',
  23488. constructor: DataTable,
  23489. app: app,
  23490. domProp: 'f7DataTable',
  23491. });
  23492. },
  23493. on: {
  23494. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  23495. var app = this;
  23496. $(tabEl).find('.data-table-init').each(function (index, tableEl) {
  23497. app.dataTable.destroy(tableEl);
  23498. });
  23499. },
  23500. tabMounted: function tabMounted(tabEl) {
  23501. var app = this;
  23502. $(tabEl).find('.data-table-init').each(function (index, tableEl) {
  23503. app.dataTable.create({ el: tableEl });
  23504. });
  23505. },
  23506. pageBeforeRemove: function pageBeforeRemove(page) {
  23507. var app = this;
  23508. page.$el.find('.data-table-init').each(function (index, tableEl) {
  23509. app.dataTable.destroy(tableEl);
  23510. });
  23511. },
  23512. pageInit: function pageInit(page) {
  23513. var app = this;
  23514. page.$el.find('.data-table-init').each(function (index, tableEl) {
  23515. app.dataTable.create({ el: tableEl });
  23516. });
  23517. },
  23518. },
  23519. vnode: {
  23520. 'data-table-init': {
  23521. insert: function insert(vnode) {
  23522. var app = this;
  23523. var tableEl = vnode.elm;
  23524. app.dataTable.create({ el: tableEl });
  23525. },
  23526. destroy: function destroy(vnode) {
  23527. var app = this;
  23528. var tableEl = vnode.elm;
  23529. app.dataTable.destroy(tableEl);
  23530. },
  23531. },
  23532. },
  23533. };
  23534. var Fab = {
  23535. morphOpen: function morphOpen(fabEl, targetEl) {
  23536. var app = this;
  23537. var $fabEl = $(fabEl);
  23538. var $targetEl = $(targetEl);
  23539. if ($targetEl.length === 0) { return; }
  23540. $targetEl.transition(0).addClass('fab-morph-target-visible');
  23541. var target = {
  23542. width: $targetEl[0].offsetWidth,
  23543. height: $targetEl[0].offsetHeight,
  23544. offset: $targetEl.offset(),
  23545. borderRadius: $targetEl.css('border-radius'),
  23546. zIndex: $targetEl.css('z-index'),
  23547. };
  23548. var fab = {
  23549. width: $fabEl[0].offsetWidth,
  23550. height: $fabEl[0].offsetHeight,
  23551. offset: $fabEl.offset(),
  23552. translateX: Utils.getTranslate($fabEl[0], 'x'),
  23553. translateY: Utils.getTranslate($fabEl[0], 'y'),
  23554. };
  23555. $fabEl[0].f7FabMorphData = {
  23556. $targetEl: $targetEl,
  23557. target: target,
  23558. fab: fab,
  23559. };
  23560. var diffX = (fab.offset.left + (fab.width / 2))
  23561. - (target.offset.left + (target.width / 2))
  23562. - fab.translateX;
  23563. var diffY = (fab.offset.top + (fab.height / 2))
  23564. - (target.offset.top + (target.height / 2))
  23565. - fab.translateY;
  23566. var scaleX = target.width / fab.width;
  23567. var scaleY = target.height / fab.height;
  23568. var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
  23569. if (borderRadius > 0) { borderRadius += 2; }
  23570. $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
  23571. $fabEl.transition(0).transform('');
  23572. $targetEl.transition(0);
  23573. target.width = $targetEl[0].offsetWidth;
  23574. target.height = $targetEl[0].offsetHeight;
  23575. target.offset = $targetEl.offset();
  23576. fab.offset = $fabEl.offset();
  23577. var diffXNew = (fab.offset.left + (fab.width / 2))
  23578. - (target.offset.left + (target.width / 2))
  23579. - fab.translateX;
  23580. var diffYNew = (fab.offset.top + (fab.height / 2))
  23581. - (target.offset.top + (target.height / 2))
  23582. - fab.translateY;
  23583. var scaleXNew = target.width / fab.width;
  23584. var scaleYNew = target.height / fab.height;
  23585. $fabEl.transform(("translate3d(" + (-diffXNew) + "px, " + (-diffYNew) + "px, 0) scale(" + scaleXNew + ", " + scaleYNew + ")"));
  23586. };
  23587. $targetEl
  23588. .css('opacity', 0)
  23589. .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  23590. $fabEl
  23591. .addClass('fab-opened')
  23592. .css('z-index', target.zIndex - 1)
  23593. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
  23594. $fabEl.transitionEnd(function () {
  23595. $targetEl.transition('');
  23596. Utils.nextFrame(function () {
  23597. $targetEl.css('opacity', 1).transform('scale(1,1)');
  23598. $fabEl
  23599. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0) scale(" + scaleX + ", " + scaleY + ")"))
  23600. .css('border-radius', (borderRadius + "px"))
  23601. .css('box-shadow', 'none')
  23602. .css('opacity', '0');
  23603. });
  23604. app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
  23605. if ($targetEl.parents('.page-content').length > 0) {
  23606. $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
  23607. }
  23608. });
  23609. },
  23610. morphClose: function morphClose(fabEl) {
  23611. var app = this;
  23612. var $fabEl = $(fabEl);
  23613. var morphData = $fabEl[0].f7FabMorphData;
  23614. if (!morphData) { return; }
  23615. var $targetEl = morphData.$targetEl;
  23616. var target = morphData.target;
  23617. var fab = morphData.fab;
  23618. if ($targetEl.length === 0) { return; }
  23619. var diffX = (fab.offset.left + (fab.width / 2))
  23620. - (target.offset.left + (target.width / 2))
  23621. - fab.translateX;
  23622. var diffY = (fab.offset.top + (fab.height / 2))
  23623. - (target.offset.top + (target.height / 2))
  23624. - fab.translateY;
  23625. var scaleX = target.width / fab.width;
  23626. var scaleY = target.height / fab.height;
  23627. app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
  23628. if ($targetEl.parents('.page-content').length > 0) {
  23629. $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
  23630. }
  23631. $targetEl
  23632. .css('opacity', 0)
  23633. .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  23634. $fabEl
  23635. .transition('')
  23636. .css('box-shadow', '')
  23637. .css('border-radius', '')
  23638. .css('opacity', '1')
  23639. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
  23640. $fabEl.transitionEnd(function () {
  23641. $fabEl
  23642. .css('z-index', '')
  23643. .removeClass('fab-opened')
  23644. .transform('');
  23645. Utils.nextFrame(function () {
  23646. $fabEl.transitionEnd(function () {
  23647. $targetEl
  23648. .removeClass('fab-morph-target-visible')
  23649. .css('opacity', '')
  23650. .transform('')
  23651. .transition('');
  23652. });
  23653. });
  23654. });
  23655. },
  23656. open: function open(fabEl, targetEl) {
  23657. var app = this;
  23658. var $fabEl = $(fabEl).eq(0);
  23659. var $buttonsEl = $fabEl.find('.fab-buttons');
  23660. if (!$fabEl.length) { return; }
  23661. if ($fabEl.hasClass('fab-opened')) { return; }
  23662. if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
  23663. if (app.fab.openedEl) {
  23664. if (app.fab.openedEl === $fabEl[0]) { return; }
  23665. app.fab.close(app.fab.openedEl);
  23666. }
  23667. app.fab.openedEl = $fabEl[0];
  23668. if ($fabEl.hasClass('fab-morph')) {
  23669. app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
  23670. } else {
  23671. $fabEl.addClass('fab-opened');
  23672. }
  23673. $fabEl.siblings('.fab-backdrop').addClass('backdrop-in');
  23674. $fabEl.trigger('fab:open');
  23675. },
  23676. close: function close(fabEl) {
  23677. if ( fabEl === void 0 ) fabEl = '.fab-opened';
  23678. var app = this;
  23679. var $fabEl = $(fabEl).eq(0);
  23680. var $buttonsEl = $fabEl.find('.fab-buttons');
  23681. if (!$fabEl.length) { return; }
  23682. if (!$fabEl.hasClass('fab-opened')) { return; }
  23683. if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
  23684. app.fab.openedEl = null;
  23685. if ($fabEl.hasClass('fab-morph')) {
  23686. app.fab.morphClose($fabEl);
  23687. } else {
  23688. $fabEl.removeClass('fab-opened');
  23689. }
  23690. $fabEl.siblings('.fab-backdrop').removeClass('backdrop-in');
  23691. $fabEl.trigger('fab:close');
  23692. },
  23693. toggle: function toggle(fabEl) {
  23694. var app = this;
  23695. var $fabEl = $(fabEl);
  23696. if (!$fabEl.hasClass('fab-opened')) { app.fab.open(fabEl); }
  23697. else { app.fab.close(fabEl); }
  23698. },
  23699. };
  23700. var Fab$1 = {
  23701. name: 'fab',
  23702. create: function create() {
  23703. var app = this;
  23704. Utils.extend(app, {
  23705. fab: {
  23706. openedEl: null,
  23707. morphOpen: Fab.morphOpen.bind(app),
  23708. morphClose: Fab.morphClose.bind(app),
  23709. open: Fab.open.bind(app),
  23710. close: Fab.close.bind(app),
  23711. toggle: Fab.toggle.bind(app),
  23712. },
  23713. });
  23714. },
  23715. clicks: {
  23716. '.fab > a': function open($clickedEl) {
  23717. var app = this;
  23718. app.fab.toggle($clickedEl.parents('.fab'));
  23719. },
  23720. '.fab-open': function open($clickedEl, data) {
  23721. if ( data === void 0 ) data = {};
  23722. var app = this;
  23723. app.fab.open(data.fab);
  23724. },
  23725. '.fab-close': function close($clickedEl, data) {
  23726. if ( data === void 0 ) data = {};
  23727. var app = this;
  23728. app.fab.close(data.fab);
  23729. },
  23730. '.fab-backdrop': function close() {
  23731. var app = this;
  23732. app.fab.close();
  23733. },
  23734. },
  23735. };
  23736. var Searchbar = /*@__PURE__*/(function (FrameworkClass) {
  23737. function Searchbar(app, params) {
  23738. if ( params === void 0 ) params = {};
  23739. FrameworkClass.call(this, params, [app]);
  23740. var sb = this;
  23741. var defaults = {
  23742. el: undefined,
  23743. inputEl: undefined,
  23744. inputEvents: 'change input compositionend',
  23745. disableButton: true,
  23746. disableButtonEl: undefined,
  23747. backdropEl: undefined,
  23748. searchContainer: undefined, // container to search, HTMLElement or CSS selector
  23749. searchItem: 'li', // single item selector, CSS selector
  23750. searchIn: undefined, // where to search in item, CSS selector
  23751. searchGroup: '.list-group',
  23752. searchGroupTitle: '.item-divider, .list-group-title',
  23753. ignore: '.searchbar-ignore',
  23754. foundEl: '.searchbar-found',
  23755. notFoundEl: '.searchbar-not-found',
  23756. hideOnEnableEl: '.searchbar-hide-on-enable',
  23757. hideOnSearchEl: '.searchbar-hide-on-search',
  23758. backdrop: undefined,
  23759. removeDiacritics: true,
  23760. customSearch: false,
  23761. hideDividers: true,
  23762. hideGroups: true,
  23763. disableOnBackdropClick: true,
  23764. expandable: false,
  23765. inline: false,
  23766. };
  23767. // Extend defaults with modules params
  23768. sb.useModulesParams(defaults);
  23769. sb.params = Utils.extend(defaults, params);
  23770. var $el = $(sb.params.el);
  23771. if ($el.length === 0) { return sb; }
  23772. if ($el[0].f7Searchbar) { return $el[0].f7Searchbar; }
  23773. $el[0].f7Searchbar = sb;
  23774. var $pageEl;
  23775. var $navbarEl = $el.parents('.navbar');
  23776. if ($el.parents('.page').length > 0) {
  23777. $pageEl = $el.parents('.page');
  23778. } else if ($navbarEl.length > 0) {
  23779. $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
  23780. if (!$pageEl.length) {
  23781. var $currentPageEl = $el.parents('.view').find('.page-current');
  23782. if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
  23783. $pageEl = $currentPageEl;
  23784. }
  23785. }
  23786. }
  23787. var $foundEl;
  23788. if (params.foundEl) {
  23789. $foundEl = $(params.foundEl);
  23790. } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
  23791. $foundEl = $pageEl.find(sb.params.foundEl);
  23792. }
  23793. var $notFoundEl;
  23794. if (params.notFoundEl) {
  23795. $notFoundEl = $(params.notFoundEl);
  23796. } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
  23797. $notFoundEl = $pageEl.find(sb.params.notFoundEl);
  23798. }
  23799. var $hideOnEnableEl;
  23800. if (params.hideOnEnableEl) {
  23801. $hideOnEnableEl = $(params.hideOnEnableEl);
  23802. } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
  23803. $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
  23804. }
  23805. var $hideOnSearchEl;
  23806. if (params.hideOnSearchEl) {
  23807. $hideOnSearchEl = $(params.hideOnSearchEl);
  23808. } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
  23809. $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
  23810. }
  23811. var expandable = sb.params.expandable || $el.hasClass('searchbar-expandable');
  23812. var inline = sb.params.inline || $el.hasClass('searchbar-inline');
  23813. if (typeof sb.params.backdrop === 'undefined') {
  23814. if (!inline) { sb.params.backdrop = app.theme !== 'aurora'; }
  23815. else { sb.params.backdrop = false; }
  23816. }
  23817. var $backdropEl;
  23818. if (sb.params.backdrop) {
  23819. if (sb.params.backdropEl) {
  23820. $backdropEl = $(sb.params.backdropEl);
  23821. } else if ($pageEl && $pageEl.length > 0) {
  23822. $backdropEl = $pageEl.find('.searchbar-backdrop');
  23823. } else {
  23824. $backdropEl = $el.siblings('.searchbar-backdrop');
  23825. }
  23826. if ($backdropEl.length === 0) {
  23827. $backdropEl = $('<div class="searchbar-backdrop"></div>');
  23828. if ($pageEl && $pageEl.length) {
  23829. if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
  23830. $backdropEl.insertBefore($el);
  23831. } else {
  23832. $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
  23833. }
  23834. } else {
  23835. $backdropEl.insertBefore($el);
  23836. }
  23837. }
  23838. }
  23839. var $searchContainer;
  23840. if (sb.params.searchContainer) {
  23841. $searchContainer = $(sb.params.searchContainer);
  23842. }
  23843. var $inputEl;
  23844. if (sb.params.inputEl) {
  23845. $inputEl = $(sb.params.inputEl);
  23846. } else {
  23847. $inputEl = $el.find('input[type="search"]').eq(0);
  23848. }
  23849. var $disableButtonEl;
  23850. if (sb.params.disableButton) {
  23851. if (sb.params.disableButtonEl) {
  23852. $disableButtonEl = $(sb.params.disableButtonEl);
  23853. } else {
  23854. $disableButtonEl = $el.find('.searchbar-disable-button');
  23855. }
  23856. }
  23857. Utils.extend(sb, {
  23858. app: app,
  23859. view: app.views.get($el.parents('.view')),
  23860. $el: $el,
  23861. el: $el[0],
  23862. $backdropEl: $backdropEl,
  23863. backdropEl: $backdropEl && $backdropEl[0],
  23864. $searchContainer: $searchContainer,
  23865. searchContainer: $searchContainer && $searchContainer[0],
  23866. $inputEl: $inputEl,
  23867. inputEl: $inputEl[0],
  23868. $disableButtonEl: $disableButtonEl,
  23869. disableButtonEl: $disableButtonEl && $disableButtonEl[0],
  23870. disableButtonHasMargin: false,
  23871. $pageEl: $pageEl,
  23872. pageEl: $pageEl && $pageEl[0],
  23873. $navbarEl: $navbarEl,
  23874. navbarEl: $navbarEl && $navbarEl[0],
  23875. $foundEl: $foundEl,
  23876. foundEl: $foundEl && $foundEl[0],
  23877. $notFoundEl: $notFoundEl,
  23878. notFoundEl: $notFoundEl && $notFoundEl[0],
  23879. $hideOnEnableEl: $hideOnEnableEl,
  23880. hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
  23881. $hideOnSearchEl: $hideOnSearchEl,
  23882. hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
  23883. previousQuery: '',
  23884. query: '',
  23885. isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
  23886. virtualList: undefined,
  23887. enabled: false,
  23888. expandable: expandable,
  23889. inline: inline,
  23890. });
  23891. // Events
  23892. function preventSubmit(e) {
  23893. e.preventDefault();
  23894. }
  23895. function onInputFocus(e) {
  23896. sb.enable(e);
  23897. sb.$el.addClass('searchbar-focused');
  23898. }
  23899. function onInputBlur() {
  23900. sb.$el.removeClass('searchbar-focused');
  23901. if (app.theme === 'aurora' && (!$disableButtonEl || !$disableButtonEl.length || !sb.params.disableButton) && !sb.query) {
  23902. sb.disable();
  23903. }
  23904. }
  23905. function onInputChange() {
  23906. var value = sb.$inputEl.val().trim();
  23907. if (
  23908. (
  23909. (sb.$searchContainer && sb.$searchContainer.length > 0)
  23910. && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem)
  23911. )
  23912. || sb.params.customSearch
  23913. ) {
  23914. sb.search(value, true);
  23915. }
  23916. }
  23917. function onInputClear(e, previousValue) {
  23918. sb.$el.trigger('searchbar:clear', previousValue);
  23919. sb.emit('local::clear searchbarClear', sb, previousValue);
  23920. }
  23921. function disableOnClick(e) {
  23922. sb.disable(e);
  23923. }
  23924. function onPageBeforeOut() {
  23925. if (!sb || (sb && !sb.$el)) { return; }
  23926. if (sb.enabled) {
  23927. sb.$el.removeClass('searchbar-enabled');
  23928. if (sb.expandable) {
  23929. sb.$el.parents('.navbar').removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition');
  23930. }
  23931. }
  23932. }
  23933. function onPageBeforeIn() {
  23934. if (!sb || (sb && !sb.$el)) { return; }
  23935. if (sb.enabled) {
  23936. sb.$el.addClass('searchbar-enabled');
  23937. if (sb.expandable) {
  23938. sb.$el.parents('.navbar').addClass('with-searchbar-expandable-enabled-no-transition');
  23939. }
  23940. }
  23941. }
  23942. sb.attachEvents = function attachEvents() {
  23943. $el.on('submit', preventSubmit);
  23944. if (sb.params.disableButton) {
  23945. sb.$disableButtonEl.on('click', disableOnClick);
  23946. }
  23947. if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
  23948. sb.$backdropEl.on('click', disableOnClick);
  23949. }
  23950. if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
  23951. sb.$pageEl.on('page:beforeout', onPageBeforeOut);
  23952. sb.$pageEl.on('page:beforein', onPageBeforeIn);
  23953. }
  23954. sb.$inputEl.on('focus', onInputFocus);
  23955. sb.$inputEl.on('blur', onInputBlur);
  23956. sb.$inputEl.on(sb.params.inputEvents, onInputChange);
  23957. sb.$inputEl.on('input:clear', onInputClear);
  23958. };
  23959. sb.detachEvents = function detachEvents() {
  23960. $el.off('submit', preventSubmit);
  23961. if (sb.params.disableButton) {
  23962. sb.$disableButtonEl.off('click', disableOnClick);
  23963. }
  23964. if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
  23965. sb.$backdropEl.off('click', disableOnClick);
  23966. }
  23967. if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
  23968. sb.$pageEl.off('page:beforeout', onPageBeforeOut);
  23969. sb.$pageEl.off('page:beforein', onPageBeforeIn);
  23970. }
  23971. sb.$inputEl.off('focus', onInputFocus);
  23972. sb.$inputEl.off('blur', onInputBlur);
  23973. sb.$inputEl.off(sb.params.inputEvents, onInputChange);
  23974. sb.$inputEl.off('input:clear', onInputClear);
  23975. };
  23976. // Install Modules
  23977. sb.useModules();
  23978. // Init
  23979. sb.init();
  23980. return sb;
  23981. }
  23982. if ( FrameworkClass ) Searchbar.__proto__ = FrameworkClass;
  23983. Searchbar.prototype = Object.create( FrameworkClass && FrameworkClass.prototype );
  23984. Searchbar.prototype.constructor = Searchbar;
  23985. Searchbar.prototype.clear = function clear (e) {
  23986. var sb = this;
  23987. if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
  23988. sb.disable();
  23989. return sb;
  23990. }
  23991. var previousQuery = sb.value;
  23992. sb.$inputEl.val('').trigger('change').focus();
  23993. sb.$el.trigger('searchbar:clear', previousQuery);
  23994. sb.emit('local::clear searchbarClear', sb, previousQuery);
  23995. return sb;
  23996. };
  23997. Searchbar.prototype.setDisableButtonMargin = function setDisableButtonMargin () {
  23998. var sb = this;
  23999. if (sb.expandable) { return; }
  24000. var app = sb.app;
  24001. sb.$disableButtonEl.transition(0).show();
  24002. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
  24003. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  24004. sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
  24005. sb.$disableButtonEl.transition('');
  24006. sb.disableButtonHasMargin = true;
  24007. };
  24008. Searchbar.prototype.enable = function enable (setFocus) {
  24009. var sb = this;
  24010. if (sb.enabled) { return sb; }
  24011. var app = sb.app;
  24012. sb.enabled = true;
  24013. function enable() {
  24014. if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
  24015. sb.backdropShow();
  24016. }
  24017. sb.$el.addClass('searchbar-enabled');
  24018. if (!sb.$disableButtonEl || (sb.$disableButtonEl && sb.$disableButtonEl.length === 0)) {
  24019. sb.$el.addClass('searchbar-enabled-no-disable-button');
  24020. }
  24021. if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
  24022. if (!sb.disableButtonHasMargin) {
  24023. sb.setDisableButtonMargin();
  24024. }
  24025. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), '0px');
  24026. }
  24027. if (sb.expandable) {
  24028. var $navbarEl = sb.$el.parents('.navbar');
  24029. if ($navbarEl.hasClass('navbar-large') && sb.$pageEl) {
  24030. var $pageContentEl = sb.$pageEl.find('.page-content');
  24031. var $titleLargeEl = $navbarEl.find('.title-large');
  24032. $pageContentEl.addClass('with-searchbar-expandable-enabled');
  24033. if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length && $pageContentEl.length) {
  24034. $pageContentEl.transition(0);
  24035. $pageContentEl[0].scrollTop -= $titleLargeEl[0].offsetHeight;
  24036. setTimeout(function () {
  24037. $pageContentEl.transition('');
  24038. }, 200);
  24039. }
  24040. }
  24041. if (app.theme === 'md' && $navbarEl.length) {
  24042. $navbarEl.addClass('with-searchbar-expandable-enabled');
  24043. } else {
  24044. $navbarEl.addClass('with-searchbar-expandable-enabled');
  24045. if ($navbarEl.hasClass('navbar-large')) {
  24046. $navbarEl.addClass('navbar-large-collapsed');
  24047. }
  24048. }
  24049. }
  24050. if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.addClass('hidden-by-searchbar'); }
  24051. sb.$el.trigger('searchbar:enable');
  24052. sb.emit('local::enable searchbarEnable', sb);
  24053. }
  24054. var needsFocus = false;
  24055. if (setFocus === true) {
  24056. if (doc.activeElement !== sb.inputEl) {
  24057. needsFocus = true;
  24058. }
  24059. }
  24060. var isIos = app.device.ios && app.theme === 'ios';
  24061. if (isIos) {
  24062. if (sb.expandable) {
  24063. if (needsFocus) { sb.$inputEl.focus(); }
  24064. enable();
  24065. } else {
  24066. if (needsFocus) { sb.$inputEl.focus(); }
  24067. if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
  24068. Utils.nextTick(function () {
  24069. enable();
  24070. }, 400);
  24071. } else {
  24072. enable();
  24073. }
  24074. }
  24075. } else {
  24076. if (needsFocus) { sb.$inputEl.focus(); }
  24077. if (app.theme === 'md' && sb.expandable) {
  24078. sb.$el.parents('.page, .view, .navbar-inner, .navbar').scrollLeft(app.rtl ? 100 : 0);
  24079. }
  24080. enable();
  24081. }
  24082. return sb;
  24083. };
  24084. Searchbar.prototype.disable = function disable () {
  24085. var sb = this;
  24086. if (!sb.enabled) { return sb; }
  24087. var app = sb.app;
  24088. sb.$inputEl.val('').trigger('change');
  24089. sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
  24090. if (sb.expandable) {
  24091. var $navbarEl = sb.$el.parents('.navbar');
  24092. var $pageContentEl = sb.$pageEl && sb.$pageEl.find('.page-content');
  24093. if ($navbarEl.hasClass('navbar-large') && $pageContentEl.length) {
  24094. var $titleLargeEl = $navbarEl.find('.title-large');
  24095. sb.$el.transitionEnd(function () {
  24096. $pageContentEl.removeClass('with-searchbar-expandable-closing');
  24097. });
  24098. if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length) {
  24099. var scrollTop = $pageContentEl[0].scrollTop;
  24100. var titleLargeHeight = $titleLargeEl[0].offsetHeight;
  24101. if (scrollTop > titleLargeHeight) {
  24102. $pageContentEl.transition(0);
  24103. $pageContentEl[0].scrollTop = scrollTop + titleLargeHeight;
  24104. setTimeout(function () {
  24105. $pageContentEl.transition('');
  24106. }, 200);
  24107. }
  24108. }
  24109. $pageContentEl.removeClass('with-searchbar-expandable-enabled').addClass('with-searchbar-expandable-closing');
  24110. }
  24111. if (app.theme === 'md' && $navbarEl.length) {
  24112. $navbarEl
  24113. .removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition')
  24114. .addClass('with-searchbar-expandable-closing');
  24115. sb.$el.transitionEnd(function () {
  24116. $navbarEl.removeClass('with-searchbar-expandable-closing');
  24117. });
  24118. } else {
  24119. $navbarEl
  24120. .removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition')
  24121. .addClass('with-searchbar-expandable-closing');
  24122. sb.$el.transitionEnd(function () {
  24123. $navbarEl.removeClass('with-searchbar-expandable-closing');
  24124. });
  24125. if (sb.$pageEl) {
  24126. sb.$pageEl.find('.page-content').trigger('scroll');
  24127. }
  24128. }
  24129. }
  24130. if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
  24131. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
  24132. }
  24133. if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch)) {
  24134. sb.backdropHide();
  24135. }
  24136. sb.enabled = false;
  24137. sb.$inputEl.blur();
  24138. if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.removeClass('hidden-by-searchbar'); }
  24139. sb.$el.trigger('searchbar:disable');
  24140. sb.emit('local::disable searchbarDisable', sb);
  24141. return sb;
  24142. };
  24143. Searchbar.prototype.toggle = function toggle () {
  24144. var sb = this;
  24145. if (sb.enabled) { sb.disable(); }
  24146. else { sb.enable(true); }
  24147. return sb;
  24148. };
  24149. Searchbar.prototype.backdropShow = function backdropShow () {
  24150. var sb = this;
  24151. if (sb.$backdropEl) {
  24152. sb.$backdropEl.addClass('searchbar-backdrop-in');
  24153. }
  24154. return sb;
  24155. };
  24156. Searchbar.prototype.backdropHide = function backdropHide () {
  24157. var sb = this;
  24158. if (sb.$backdropEl) {
  24159. sb.$backdropEl.removeClass('searchbar-backdrop-in');
  24160. }
  24161. return sb;
  24162. };
  24163. Searchbar.prototype.search = function search (query, internal) {
  24164. var sb = this;
  24165. sb.previousQuery = sb.query || '';
  24166. if (query === sb.previousQuery) { return sb; }
  24167. if (!internal) {
  24168. if (!sb.enabled) {
  24169. sb.enable();
  24170. }
  24171. sb.$inputEl.val(query);
  24172. sb.$inputEl.trigger('input');
  24173. }
  24174. sb.query = query;
  24175. sb.value = query;
  24176. var $searchContainer = sb.$searchContainer;
  24177. var $el = sb.$el;
  24178. var $foundEl = sb.$foundEl;
  24179. var $notFoundEl = sb.$notFoundEl;
  24180. var $hideOnSearchEl = sb.$hideOnSearchEl;
  24181. var isVirtualList = sb.isVirtualList;
  24182. // Hide on search element
  24183. if (query.length > 0 && $hideOnSearchEl) {
  24184. $hideOnSearchEl.addClass('hidden-by-searchbar');
  24185. } else if ($hideOnSearchEl) {
  24186. $hideOnSearchEl.removeClass('hidden-by-searchbar');
  24187. }
  24188. // Add active/inactive classes on overlay
  24189. if (
  24190. ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled'))
  24191. || (sb.params.customSearch && $el.hasClass('searchbar-enabled'))
  24192. ) {
  24193. if (query.length === 0) {
  24194. sb.backdropShow();
  24195. } else {
  24196. sb.backdropHide();
  24197. }
  24198. }
  24199. if (sb.params.customSearch) {
  24200. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery });
  24201. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
  24202. return sb;
  24203. }
  24204. var foundItems = [];
  24205. var vlQuery;
  24206. if (isVirtualList) {
  24207. sb.virtualList = $searchContainer[0].f7VirtualList;
  24208. if (query.trim() === '') {
  24209. sb.virtualList.resetFilter();
  24210. if ($notFoundEl) { $notFoundEl.hide(); }
  24211. if ($foundEl) { $foundEl.show(); }
  24212. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery });
  24213. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
  24214. return sb;
  24215. }
  24216. vlQuery = sb.params.removeDiacritics ? Utils.removeDiacritics(query) : query;
  24217. if (sb.virtualList.params.searchAll) {
  24218. foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
  24219. } else if (sb.virtualList.params.searchByItem) {
  24220. for (var i = 0; i < sb.virtualList.items.length; i += 1) {
  24221. if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
  24222. foundItems.push(i);
  24223. }
  24224. }
  24225. }
  24226. } else {
  24227. var values;
  24228. if (sb.params.removeDiacritics) { values = Utils.removeDiacritics(query.trim().toLowerCase()).split(' '); }
  24229. else {
  24230. values = query.trim().toLowerCase().split(' ');
  24231. }
  24232. $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemIndex, itemEl) {
  24233. var $itemEl = $(itemEl);
  24234. var compareWithText = [];
  24235. var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
  24236. if (sb.params.searchIn === sb.params.searchItem) {
  24237. $searchIn = $itemEl;
  24238. }
  24239. $searchIn.each(function (searchInIndex, searchInEl) {
  24240. var itemText = $(searchInEl).text().trim().toLowerCase();
  24241. if (sb.params.removeDiacritics) { itemText = Utils.removeDiacritics(itemText); }
  24242. compareWithText.push(itemText);
  24243. });
  24244. compareWithText = compareWithText.join(' ');
  24245. var wordsMatch = 0;
  24246. for (var i = 0; i < values.length; i += 1) {
  24247. if (compareWithText.indexOf(values[i]) >= 0) { wordsMatch += 1; }
  24248. }
  24249. if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
  24250. $itemEl.addClass('hidden-by-searchbar');
  24251. } else {
  24252. foundItems.push($itemEl[0]);
  24253. }
  24254. });
  24255. if (sb.params.hideDividers) {
  24256. $searchContainer.find(sb.params.searchGroupTitle).each(function (titleIndex, titleEl) {
  24257. var $titleEl = $(titleEl);
  24258. var $nextElements = $titleEl.nextAll(sb.params.searchItem);
  24259. var hide = true;
  24260. for (var i = 0; i < $nextElements.length; i += 1) {
  24261. var $nextEl = $nextElements.eq(i);
  24262. if ($nextEl.is(sb.params.searchGroupTitle)) { break; }
  24263. if (!$nextEl.hasClass('hidden-by-searchbar')) {
  24264. hide = false;
  24265. }
  24266. }
  24267. var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
  24268. if (hide && !ignore) { $titleEl.addClass('hidden-by-searchbar'); }
  24269. else { $titleEl.removeClass('hidden-by-searchbar'); }
  24270. });
  24271. }
  24272. if (sb.params.hideGroups) {
  24273. $searchContainer.find(sb.params.searchGroup).each(function (groupIndex, groupEl) {
  24274. var $groupEl = $(groupEl);
  24275. var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);
  24276. // eslint-disable-next-line
  24277. var notHidden = $groupEl.find(sb.params.searchItem).filter(function (index, el) {
  24278. return !$(el).hasClass('hidden-by-searchbar');
  24279. });
  24280. if (notHidden.length === 0 && !ignore) {
  24281. $groupEl.addClass('hidden-by-searchbar');
  24282. } else {
  24283. $groupEl.removeClass('hidden-by-searchbar');
  24284. }
  24285. });
  24286. }
  24287. }
  24288. if (foundItems.length === 0) {
  24289. if ($notFoundEl) { $notFoundEl.show(); }
  24290. if ($foundEl) { $foundEl.hide(); }
  24291. } else {
  24292. if ($notFoundEl) { $notFoundEl.hide(); }
  24293. if ($foundEl) { $foundEl.show(); }
  24294. }
  24295. if (isVirtualList && sb.virtualList) {
  24296. sb.virtualList.filterItems(foundItems);
  24297. }
  24298. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery, foundItems: foundItems });
  24299. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
  24300. return sb;
  24301. };
  24302. Searchbar.prototype.init = function init () {
  24303. var sb = this;
  24304. if (sb.expandable && sb.$el) { sb.$el.addClass('searchbar-expandable'); }
  24305. if (sb.inline && sb.$el) { sb.$el.addClass('searchbar-inline'); }
  24306. sb.attachEvents();
  24307. };
  24308. Searchbar.prototype.destroy = function destroy () {
  24309. var sb = this;
  24310. sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
  24311. sb.$el.trigger('searchbar:beforedestroy');
  24312. sb.detachEvents();
  24313. if (sb.$el[0]) {
  24314. sb.$el[0].f7Searchbar = null;
  24315. delete sb.$el[0].f7Searchbar;
  24316. }
  24317. Utils.deleteProps(sb);
  24318. };
  24319. return Searchbar;
  24320. }(Framework7Class));
  24321. var Searchbar$1 = {
  24322. name: 'searchbar',
  24323. static: {
  24324. Searchbar: Searchbar,
  24325. },
  24326. create: function create() {
  24327. var app = this;
  24328. app.searchbar = ConstructorMethods({
  24329. defaultSelector: '.searchbar',
  24330. constructor: Searchbar,
  24331. app: app,
  24332. domProp: 'f7Searchbar',
  24333. addMethods: 'clear enable disable toggle search'.split(' '),
  24334. });
  24335. },
  24336. on: {
  24337. tabMounted: function tabMounted(tabEl) {
  24338. var app = this;
  24339. $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
  24340. var $searchbarEl = $(searchbarEl);
  24341. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  24342. });
  24343. },
  24344. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  24345. $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
  24346. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  24347. searchbarEl.f7Searchbar.destroy();
  24348. }
  24349. });
  24350. },
  24351. pageInit: function pageInit(page) {
  24352. var app = this;
  24353. page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
  24354. var $searchbarEl = $(searchbarEl);
  24355. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  24356. });
  24357. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  24358. page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
  24359. var $searchbarEl = $(searchbarEl);
  24360. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  24361. });
  24362. }
  24363. },
  24364. pageBeforeRemove: function pageBeforeRemove(page) {
  24365. var app = this;
  24366. page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
  24367. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  24368. searchbarEl.f7Searchbar.destroy();
  24369. }
  24370. });
  24371. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  24372. page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
  24373. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  24374. searchbarEl.f7Searchbar.destroy();
  24375. }
  24376. });
  24377. }
  24378. },
  24379. },
  24380. clicks: {
  24381. '.searchbar-clear': function clear($clickedEl, data) {
  24382. if ( data === void 0 ) data = {};
  24383. var app = this;
  24384. var sb = app.searchbar.get(data.searchbar);
  24385. if (sb) { sb.clear(); }
  24386. },
  24387. '.searchbar-enable': function enable($clickedEl, data) {
  24388. if ( data === void 0 ) data = {};
  24389. var app = this;
  24390. var sb = app.searchbar.get(data.searchbar);
  24391. if (sb) { sb.enable(true); }
  24392. },
  24393. '.searchbar-disable': function disable($clickedEl, data) {
  24394. if ( data === void 0 ) data = {};
  24395. var app = this;
  24396. var sb = app.searchbar.get(data.searchbar);
  24397. if (sb) { sb.disable(); }
  24398. },
  24399. '.searchbar-toggle': function toggle($clickedEl, data) {
  24400. if ( data === void 0 ) data = {};
  24401. var app = this;
  24402. var sb = app.searchbar.get(data.searchbar);
  24403. if (sb) { sb.toggle(); }
  24404. },
  24405. },
  24406. vnode: {
  24407. 'searchbar-init': {
  24408. insert: function insert(vnode) {
  24409. var app = this;
  24410. var searchbarEl = vnode.elm;
  24411. var $searchbarEl = $(searchbarEl);
  24412. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  24413. },
  24414. destroy: function destroy(vnode) {
  24415. var searchbarEl = vnode.elm;
  24416. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  24417. searchbarEl.f7Searchbar.destroy();
  24418. }
  24419. },
  24420. },
  24421. },
  24422. };
  24423. var Messages = /*@__PURE__*/(function (Framework7Class) {
  24424. function Messages(app, params) {
  24425. if ( params === void 0 ) params = {};
  24426. Framework7Class.call(this, params, [app]);
  24427. var m = this;
  24428. var defaults = {
  24429. autoLayout: true,
  24430. messages: [],
  24431. newMessagesFirst: false,
  24432. scrollMessages: true,
  24433. scrollMessagesOnEdge: true,
  24434. firstMessageRule: undefined,
  24435. lastMessageRule: undefined,
  24436. tailMessageRule: undefined,
  24437. sameNameMessageRule: undefined,
  24438. sameHeaderMessageRule: undefined,
  24439. sameFooterMessageRule: undefined,
  24440. sameAvatarMessageRule: undefined,
  24441. customClassMessageRule: undefined,
  24442. renderMessage: undefined,
  24443. };
  24444. // Extend defaults with modules params
  24445. m.useModulesParams(defaults);
  24446. m.params = Utils.extend(defaults, params);
  24447. var $el = $(params.el).eq(0);
  24448. if ($el.length === 0) { return m; }
  24449. if ($el[0].f7Messages) { return $el[0].f7Messages; }
  24450. $el[0].f7Messages = m;
  24451. var $pageContentEl = $el.closest('.page-content').eq(0);
  24452. Utils.extend(m, {
  24453. messages: m.params.messages,
  24454. $el: $el,
  24455. el: $el[0],
  24456. $pageContentEl: $pageContentEl,
  24457. pageContentEl: $pageContentEl[0],
  24458. });
  24459. // Install Modules
  24460. m.useModules();
  24461. // Init
  24462. m.init();
  24463. return m;
  24464. }
  24465. if ( Framework7Class ) Messages.__proto__ = Framework7Class;
  24466. Messages.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  24467. Messages.prototype.constructor = Messages;
  24468. // eslint-disable-next-line
  24469. Messages.prototype.getMessageData = function getMessageData (messageEl) {
  24470. var $messageEl = $(messageEl);
  24471. var data = {
  24472. name: $messageEl.find('.message-name').html(),
  24473. header: $messageEl.find('.message-header').html(),
  24474. textHeader: $messageEl.find('.message-text-header').html(),
  24475. textFooter: $messageEl.find('.message-text-footer').html(),
  24476. footer: $messageEl.find('.message-footer').html(),
  24477. isTitle: $messageEl.hasClass('messages-title'),
  24478. type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
  24479. text: $messageEl.find('.message-text').html(),
  24480. image: $messageEl.find('.message-image').html(),
  24481. imageSrc: $messageEl.find('.message-image img').attr('src'),
  24482. typing: $messageEl.hasClass('message-typing'),
  24483. };
  24484. if (data.isTitle) {
  24485. data.text = $messageEl.html();
  24486. }
  24487. if (data.text && data.textHeader) {
  24488. data.text = data.text.replace(("<div class=\"message-text-header\">" + (data.textHeader) + "</div>"), '');
  24489. }
  24490. if (data.text && data.textFooter) {
  24491. data.text = data.text.replace(("<div class=\"message-text-footer\">" + (data.textFooter) + "</div>"), '');
  24492. }
  24493. var avatar = $messageEl.find('.message-avatar').css('background-image');
  24494. if (avatar === 'none' || avatar === '') { avatar = undefined; }
  24495. if (avatar && typeof avatar === 'string') {
  24496. avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g, '').replace(/'/g, '');
  24497. } else {
  24498. avatar = undefined;
  24499. }
  24500. data.avatar = avatar;
  24501. return data;
  24502. };
  24503. Messages.prototype.getMessagesData = function getMessagesData () {
  24504. var m = this;
  24505. var data = [];
  24506. m.$el.find('.message, .messages-title').each(function (index, messageEl) {
  24507. data.push(m.getMessageData(messageEl));
  24508. });
  24509. return data;
  24510. };
  24511. Messages.prototype.renderMessage = function renderMessage (messageToRender) {
  24512. var m = this;
  24513. var message = Utils.extend({
  24514. type: 'sent',
  24515. attrs: {},
  24516. }, messageToRender);
  24517. if (m.params.renderMessage) {
  24518. return m.params.renderMessage.call(m, message);
  24519. }
  24520. if (message.isTitle) {
  24521. return ("<div class=\"messages-title\">" + (message.text) + "</div>");
  24522. }
  24523. var attrs = Object.keys(message.attrs).map(function (attr) { return (attr + "=\"" + (message.attrs[attr]) + "\""); }).join(' ');
  24524. 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 ");
  24525. };
  24526. Messages.prototype.renderMessages = function renderMessages (messagesToRender, method) {
  24527. if ( messagesToRender === void 0 ) messagesToRender = this.messages;
  24528. if ( method === void 0 ) method = this.params.newMessagesFirst ? 'prepend' : 'append';
  24529. var m = this;
  24530. var html = messagesToRender.map(function (message) { return m.renderMessage(message); }).join('');
  24531. m.$el[method](html);
  24532. };
  24533. Messages.prototype.isFirstMessage = function isFirstMessage () {
  24534. var ref;
  24535. var args = [], len = arguments.length;
  24536. while ( len-- ) args[ len ] = arguments[ len ];
  24537. var m = this;
  24538. if (m.params.firstMessageRule) { return (ref = m.params).firstMessageRule.apply(ref, args); }
  24539. return false;
  24540. };
  24541. Messages.prototype.isLastMessage = function isLastMessage () {
  24542. var ref;
  24543. var args = [], len = arguments.length;
  24544. while ( len-- ) args[ len ] = arguments[ len ];
  24545. var m = this;
  24546. if (m.params.lastMessageRule) { return (ref = m.params).lastMessageRule.apply(ref, args); }
  24547. return false;
  24548. };
  24549. Messages.prototype.isTailMessage = function isTailMessage () {
  24550. var ref;
  24551. var args = [], len = arguments.length;
  24552. while ( len-- ) args[ len ] = arguments[ len ];
  24553. var m = this;
  24554. if (m.params.tailMessageRule) { return (ref = m.params).tailMessageRule.apply(ref, args); }
  24555. return false;
  24556. };
  24557. Messages.prototype.isSameNameMessage = function isSameNameMessage () {
  24558. var ref;
  24559. var args = [], len = arguments.length;
  24560. while ( len-- ) args[ len ] = arguments[ len ];
  24561. var m = this;
  24562. if (m.params.sameNameMessageRule) { return (ref = m.params).sameNameMessageRule.apply(ref, args); }
  24563. return false;
  24564. };
  24565. Messages.prototype.isSameHeaderMessage = function isSameHeaderMessage () {
  24566. var ref;
  24567. var args = [], len = arguments.length;
  24568. while ( len-- ) args[ len ] = arguments[ len ];
  24569. var m = this;
  24570. if (m.params.sameHeaderMessageRule) { return (ref = m.params).sameHeaderMessageRule.apply(ref, args); }
  24571. return false;
  24572. };
  24573. Messages.prototype.isSameFooterMessage = function isSameFooterMessage () {
  24574. var ref;
  24575. var args = [], len = arguments.length;
  24576. while ( len-- ) args[ len ] = arguments[ len ];
  24577. var m = this;
  24578. if (m.params.sameFooterMessageRule) { return (ref = m.params).sameFooterMessageRule.apply(ref, args); }
  24579. return false;
  24580. };
  24581. Messages.prototype.isSameAvatarMessage = function isSameAvatarMessage () {
  24582. var ref;
  24583. var args = [], len = arguments.length;
  24584. while ( len-- ) args[ len ] = arguments[ len ];
  24585. var m = this;
  24586. if (m.params.sameAvatarMessageRule) { return (ref = m.params).sameAvatarMessageRule.apply(ref, args); }
  24587. return false;
  24588. };
  24589. Messages.prototype.isCustomClassMessage = function isCustomClassMessage () {
  24590. var ref;
  24591. var args = [], len = arguments.length;
  24592. while ( len-- ) args[ len ] = arguments[ len ];
  24593. var m = this;
  24594. if (m.params.customClassMessageRule) { return (ref = m.params).customClassMessageRule.apply(ref, args); }
  24595. return undefined;
  24596. };
  24597. Messages.prototype.layout = function layout () {
  24598. var m = this;
  24599. m.$el.find('.message, .messages-title').each(function (index, messageEl) {
  24600. var $messageEl = $(messageEl);
  24601. if (!m.messages) {
  24602. m.messages = m.getMessagesData();
  24603. }
  24604. var classes = [];
  24605. var message = m.messages[index];
  24606. var previousMessage = m.messages[index - 1];
  24607. var nextMessage = m.messages[index + 1];
  24608. if (m.isFirstMessage(message, previousMessage, nextMessage)) {
  24609. classes.push('message-first');
  24610. }
  24611. if (m.isLastMessage(message, previousMessage, nextMessage)) {
  24612. classes.push('message-last');
  24613. }
  24614. if (m.isTailMessage(message, previousMessage, nextMessage)) {
  24615. classes.push('message-tail');
  24616. }
  24617. if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
  24618. classes.push('message-same-name');
  24619. }
  24620. if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
  24621. classes.push('message-same-header');
  24622. }
  24623. if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
  24624. classes.push('message-same-footer');
  24625. }
  24626. if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
  24627. classes.push('message-same-avatar');
  24628. }
  24629. var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
  24630. if (customMessageClasses && customMessageClasses.length) {
  24631. if (typeof customMessageClasses === 'string') {
  24632. customMessageClasses = customMessageClasses.split(' ');
  24633. }
  24634. customMessageClasses.forEach(function (customClass) {
  24635. classes.push(customClass);
  24636. });
  24637. }
  24638. $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');
  24639. classes.forEach(function (className) {
  24640. $messageEl.addClass(className);
  24641. });
  24642. });
  24643. };
  24644. Messages.prototype.clear = function clear () {
  24645. var m = this;
  24646. m.messages = [];
  24647. m.$el.html('');
  24648. };
  24649. Messages.prototype.removeMessage = function removeMessage (messageToRemove, layout) {
  24650. if ( layout === void 0 ) layout = true;
  24651. var m = this;
  24652. // Index or El
  24653. var index;
  24654. var $el;
  24655. if (typeof messageToRemove === 'number') {
  24656. index = messageToRemove;
  24657. $el = m.$el.find('.message, .messages-title').eq(index);
  24658. } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
  24659. index = m.messages.indexOf(messageToRemove);
  24660. $el = m.$el.children().eq(index);
  24661. } else {
  24662. $el = $(messageToRemove);
  24663. index = $el.index();
  24664. }
  24665. if ($el.length === 0) {
  24666. return m;
  24667. }
  24668. $el.remove();
  24669. m.messages.splice(index, 1);
  24670. if (m.params.autoLayout && layout) { m.layout(); }
  24671. return m;
  24672. };
  24673. Messages.prototype.removeMessages = function removeMessages (messagesToRemove, layout) {
  24674. if ( layout === void 0 ) layout = true;
  24675. var m = this;
  24676. if (Array.isArray(messagesToRemove)) {
  24677. var messagesToRemoveEls = [];
  24678. messagesToRemove.forEach(function (messageToRemoveIndex) {
  24679. messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));
  24680. });
  24681. messagesToRemoveEls.forEach(function (messageToRemove) {
  24682. m.removeMessage(messageToRemove, false);
  24683. });
  24684. } else {
  24685. $(messagesToRemove).each(function (index, messageToRemove) {
  24686. m.removeMessage(messageToRemove, false);
  24687. });
  24688. }
  24689. if (m.params.autoLayout && layout) { m.layout(); }
  24690. return m;
  24691. };
  24692. Messages.prototype.addMessage = function addMessage () {
  24693. var assign, assign$1;
  24694. var args = [], len = arguments.length;
  24695. while ( len-- ) args[ len ] = arguments[ len ];
  24696. var m = this;
  24697. var messageToAdd;
  24698. var animate;
  24699. var method;
  24700. if (typeof args[1] === 'boolean') {
  24701. (assign = args, messageToAdd = assign[0], animate = assign[1], method = assign[2]);
  24702. } else {
  24703. (assign$1 = args, messageToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
  24704. }
  24705. if (typeof animate === 'undefined') {
  24706. animate = true;
  24707. }
  24708. if (typeof method === 'undefined') {
  24709. method = m.params.newMessagesFirst ? 'prepend' : 'append';
  24710. }
  24711. return m.addMessages([messageToAdd], animate, method);
  24712. };
  24713. Messages.prototype.addMessages = function addMessages () {
  24714. var assign, assign$1;
  24715. var args = [], len = arguments.length;
  24716. while ( len-- ) args[ len ] = arguments[ len ];
  24717. var m = this;
  24718. var messagesToAdd;
  24719. var animate;
  24720. var method;
  24721. if (typeof args[1] === 'boolean') {
  24722. (assign = args, messagesToAdd = assign[0], animate = assign[1], method = assign[2]);
  24723. } else {
  24724. (assign$1 = args, messagesToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
  24725. }
  24726. if (typeof animate === 'undefined') {
  24727. animate = true;
  24728. }
  24729. if (typeof method === 'undefined') {
  24730. method = m.params.newMessagesFirst ? 'prepend' : 'append';
  24731. }
  24732. // Define scroll positions before new messages added
  24733. var scrollHeightBefore = m.pageContentEl.scrollHeight;
  24734. var heightBefore = m.pageContentEl.offsetHeight;
  24735. var scrollBefore = m.pageContentEl.scrollTop;
  24736. // Add message to DOM and data
  24737. var messagesHTML = '';
  24738. var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
  24739. messagesToAdd.forEach(function (messageToAdd) {
  24740. if (typingMessage) {
  24741. if (method === 'append') {
  24742. m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
  24743. } else {
  24744. m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
  24745. }
  24746. } else {
  24747. m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);
  24748. }
  24749. messagesHTML += m.renderMessage(messageToAdd);
  24750. });
  24751. var $messagesEls = $(messagesHTML);
  24752. if (animate) {
  24753. if (method === 'append' && !m.params.newMessagesFirst) {
  24754. $messagesEls.addClass('message-appear-from-bottom');
  24755. }
  24756. if (method === 'prepend' && m.params.newMessagesFirst) {
  24757. $messagesEls.addClass('message-appear-from-top');
  24758. }
  24759. }
  24760. if (typingMessage) {
  24761. if (method === 'append') {
  24762. $messagesEls.insertBefore(m.$el.find('.message-typing'));
  24763. } else {
  24764. $messagesEls.insertAfter(m.$el.find('.message-typing'));
  24765. }
  24766. } else {
  24767. m.$el[method]($messagesEls);
  24768. }
  24769. // Layout
  24770. if (m.params.autoLayout) { m.layout(); }
  24771. if (method === 'prepend' && !typingMessage) {
  24772. m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
  24773. }
  24774. if (m.params.scrollMessages && ((method === 'append' && !m.params.newMessagesFirst) || (method === 'prepend' && m.params.newMessagesFirst && !typingMessage))) {
  24775. if (m.params.scrollMessagesOnEdge) {
  24776. var onEdge = false;
  24777. if (m.params.newMessagesFirst && scrollBefore === 0) {
  24778. onEdge = true;
  24779. }
  24780. if (!m.params.newMessagesFirst && (scrollBefore - (scrollHeightBefore - heightBefore) >= -10)) {
  24781. onEdge = true;
  24782. }
  24783. if (onEdge) { m.scroll(animate ? undefined : 0); }
  24784. } else {
  24785. m.scroll(animate ? undefined : 0);
  24786. }
  24787. }
  24788. return m;
  24789. };
  24790. Messages.prototype.showTyping = function showTyping (message) {
  24791. if ( message === void 0 ) message = {};
  24792. var m = this;
  24793. var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
  24794. if (typingMessage) {
  24795. m.removeMessage(m.messages.indexOf(typingMessage));
  24796. }
  24797. m.addMessage(Utils.extend({
  24798. type: 'received',
  24799. isTyping: true,
  24800. }, message));
  24801. return m;
  24802. };
  24803. Messages.prototype.hideTyping = function hideTyping () {
  24804. var m = this;
  24805. var typingMessageIndex;
  24806. var typingFound;
  24807. m.messages.forEach(function (message, index) {
  24808. if (message.isTyping) { typingMessageIndex = index; }
  24809. });
  24810. if (typeof typingMessageIndex !== 'undefined') {
  24811. if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {
  24812. typingFound = true;
  24813. m.removeMessage(typingMessageIndex);
  24814. }
  24815. }
  24816. if (!typingFound) {
  24817. var $typingMessageEl = m.$el.find('.message-typing');
  24818. if ($typingMessageEl.length) {
  24819. m.removeMessage($typingMessageEl);
  24820. }
  24821. }
  24822. return m;
  24823. };
  24824. Messages.prototype.scroll = function scroll (duration, scrollTop) {
  24825. if ( duration === void 0 ) duration = 300;
  24826. var m = this;
  24827. var currentScroll = m.pageContentEl.scrollTop;
  24828. var newScrollTop;
  24829. if (typeof scrollTop !== 'undefined') { newScrollTop = scrollTop; }
  24830. else {
  24831. newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
  24832. if (newScrollTop === currentScroll) { return m; }
  24833. }
  24834. m.$pageContentEl.scrollTop(newScrollTop, duration);
  24835. return m;
  24836. };
  24837. Messages.prototype.init = function init () {
  24838. var m = this;
  24839. if (!m.messages || m.messages.length === 0) {
  24840. m.messages = m.getMessagesData();
  24841. }
  24842. if (m.params.messages && m.params.messages.length) {
  24843. m.renderMessages();
  24844. }
  24845. if (m.params.autoLayout) { m.layout(); }
  24846. if (m.params.scrollMessages) { m.scroll(0); }
  24847. };
  24848. Messages.prototype.destroy = function destroy () {
  24849. var m = this;
  24850. m.emit('local::beforeDestroy messagesBeforeDestroy', m);
  24851. m.$el.trigger('messages:beforedestroy');
  24852. if (m.$el[0]) {
  24853. m.$el[0].f7Messages = null;
  24854. delete m.$el[0].f7Messages;
  24855. }
  24856. Utils.deleteProps(m);
  24857. };
  24858. return Messages;
  24859. }(Framework7Class));
  24860. var Messages$1 = {
  24861. name: 'messages',
  24862. static: {
  24863. Messages: Messages,
  24864. },
  24865. create: function create() {
  24866. var app = this;
  24867. app.messages = ConstructorMethods({
  24868. defaultSelector: '.messages',
  24869. constructor: Messages,
  24870. app: app,
  24871. domProp: 'f7Messages',
  24872. addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' '),
  24873. });
  24874. },
  24875. on: {
  24876. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  24877. var app = this;
  24878. $(tabEl).find('.messages-init').each(function (index, messagesEl) {
  24879. app.messages.destroy(messagesEl);
  24880. });
  24881. },
  24882. tabMounted: function tabMounted(tabEl) {
  24883. var app = this;
  24884. $(tabEl).find('.messages-init').each(function (index, messagesEl) {
  24885. app.messages.create({ el: messagesEl });
  24886. });
  24887. },
  24888. pageBeforeRemove: function pageBeforeRemove(page) {
  24889. var app = this;
  24890. page.$el.find('.messages-init').each(function (index, messagesEl) {
  24891. app.messages.destroy(messagesEl);
  24892. });
  24893. },
  24894. pageInit: function pageInit(page) {
  24895. var app = this;
  24896. page.$el.find('.messages-init').each(function (index, messagesEl) {
  24897. app.messages.create({ el: messagesEl });
  24898. });
  24899. },
  24900. },
  24901. vnode: {
  24902. 'messages-init': {
  24903. insert: function insert(vnode) {
  24904. var app = this;
  24905. var messagesEl = vnode.elm;
  24906. app.messages.create({ el: messagesEl });
  24907. },
  24908. destroy: function destroy(vnode) {
  24909. var app = this;
  24910. var messagesEl = vnode.elm;
  24911. app.messages.destroy(messagesEl);
  24912. },
  24913. },
  24914. },
  24915. };
  24916. var Messagebar = /*@__PURE__*/(function (Framework7Class) {
  24917. function Messagebar(app, params) {
  24918. if ( params === void 0 ) params = {};
  24919. Framework7Class.call(this, params, [app]);
  24920. var messagebar = this;
  24921. var defaults = {
  24922. top: false,
  24923. topOffset: 0,
  24924. bottomOffset: 0,
  24925. attachments: [],
  24926. renderAttachments: undefined,
  24927. renderAttachment: undefined,
  24928. maxHeight: null,
  24929. resizePage: true,
  24930. };
  24931. // Extend defaults with modules params
  24932. messagebar.useModulesParams(defaults);
  24933. messagebar.params = Utils.extend(defaults, params);
  24934. // El
  24935. var $el = $(messagebar.params.el);
  24936. if ($el.length === 0) { return messagebar; }
  24937. if ($el[0].f7Messagebar) { return $el[0].f7Messagebar; }
  24938. $el[0].f7Messagebar = messagebar;
  24939. // Page and PageContent
  24940. var $pageEl = $el.parents('.page').eq(0);
  24941. var $pageContentEl = $pageEl.find('.page-content').eq(0);
  24942. // Area
  24943. var $areaEl = $el.find('.messagebar-area');
  24944. // Textarea
  24945. var $textareaEl;
  24946. if (messagebar.params.textareaEl) {
  24947. $textareaEl = $(messagebar.params.textareaEl);
  24948. } else {
  24949. $textareaEl = $el.find('textarea');
  24950. }
  24951. // Attachments & Library
  24952. var $attachmentsEl = $el.find('.messagebar-attachments');
  24953. var $sheetEl = $el.find('.messagebar-sheet');
  24954. if (messagebar.params.top) {
  24955. $el.addClass('messagebar-top');
  24956. }
  24957. Utils.extend(messagebar, {
  24958. $el: $el,
  24959. el: $el[0],
  24960. $areaEl: $areaEl,
  24961. areaEl: $areaEl[0],
  24962. $textareaEl: $textareaEl,
  24963. textareaEl: $textareaEl[0],
  24964. $attachmentsEl: $attachmentsEl,
  24965. attachmentsEl: $attachmentsEl[0],
  24966. attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),
  24967. $sheetEl: $sheetEl,
  24968. sheetEl: $sheetEl[0],
  24969. sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),
  24970. $pageEl: $pageEl,
  24971. pageEl: $pageEl[0],
  24972. $pageContentEl: $pageContentEl,
  24973. pageContentEl: $pageContentEl,
  24974. top: $el.hasClass('messagebar-top') || messagebar.params.top,
  24975. attachments: [],
  24976. });
  24977. // Events
  24978. function onAppResize() {
  24979. if (messagebar.params.resizePage) {
  24980. messagebar.resizePage();
  24981. }
  24982. }
  24983. function onSubmit(e) {
  24984. e.preventDefault();
  24985. }
  24986. function onAttachmentClick(e) {
  24987. var index = $(this).index();
  24988. if ($(e.target).closest('.messagebar-attachment-delete').length) {
  24989. $(this).trigger('messagebar:attachmentdelete', index);
  24990. messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);
  24991. } else {
  24992. $(this).trigger('messagebar:attachmentclick', index);
  24993. messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);
  24994. }
  24995. }
  24996. function onTextareaChange() {
  24997. messagebar.checkEmptyState();
  24998. messagebar.$el.trigger('messagebar:change');
  24999. messagebar.emit('local::change messagebarChange', messagebar);
  25000. }
  25001. function onTextareaFocus() {
  25002. messagebar.sheetHide();
  25003. messagebar.$el.addClass('messagebar-focused');
  25004. messagebar.$el.trigger('messagebar:focus');
  25005. messagebar.emit('local::focus messagebarFocus', messagebar);
  25006. }
  25007. function onTextareaBlur() {
  25008. messagebar.$el.removeClass('messagebar-focused');
  25009. messagebar.$el.trigger('messagebar:blur');
  25010. messagebar.emit('local::blur messagebarBlur', messagebar);
  25011. }
  25012. messagebar.attachEvents = function attachEvents() {
  25013. $el.on('textarea:resize', onAppResize);
  25014. $el.on('submit', onSubmit);
  25015. $el.on('click', '.messagebar-attachment', onAttachmentClick);
  25016. $textareaEl.on('change input', onTextareaChange);
  25017. $textareaEl.on('focus', onTextareaFocus);
  25018. $textareaEl.on('blur', onTextareaBlur);
  25019. app.on('resize', onAppResize);
  25020. };
  25021. messagebar.detachEvents = function detachEvents() {
  25022. $el.off('textarea:resize', onAppResize);
  25023. $el.off('submit', onSubmit);
  25024. $el.off('click', '.messagebar-attachment', onAttachmentClick);
  25025. $textareaEl.off('change input', onTextareaChange);
  25026. $textareaEl.off('focus', onTextareaFocus);
  25027. $textareaEl.off('blur', onTextareaBlur);
  25028. app.off('resize', onAppResize);
  25029. };
  25030. // Install Modules
  25031. messagebar.useModules();
  25032. // Init
  25033. messagebar.init();
  25034. return messagebar;
  25035. }
  25036. if ( Framework7Class ) Messagebar.__proto__ = Framework7Class;
  25037. Messagebar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  25038. Messagebar.prototype.constructor = Messagebar;
  25039. Messagebar.prototype.focus = function focus () {
  25040. var messagebar = this;
  25041. messagebar.$textareaEl.focus();
  25042. return messagebar;
  25043. };
  25044. Messagebar.prototype.blur = function blur () {
  25045. var messagebar = this;
  25046. messagebar.$textareaEl.blur();
  25047. return messagebar;
  25048. };
  25049. Messagebar.prototype.clear = function clear () {
  25050. var messagebar = this;
  25051. messagebar.$textareaEl.val('').trigger('change');
  25052. return messagebar;
  25053. };
  25054. Messagebar.prototype.getValue = function getValue () {
  25055. var messagebar = this;
  25056. return messagebar.$textareaEl.val().trim();
  25057. };
  25058. Messagebar.prototype.setValue = function setValue (value) {
  25059. var messagebar = this;
  25060. messagebar.$textareaEl.val(value).trigger('change');
  25061. return messagebar;
  25062. };
  25063. Messagebar.prototype.setPlaceholder = function setPlaceholder (placeholder) {
  25064. var messagebar = this;
  25065. messagebar.$textareaEl.attr('placeholder', placeholder);
  25066. return messagebar;
  25067. };
  25068. Messagebar.prototype.resizePage = function resizePage () {
  25069. var messagebar = this;
  25070. var params = messagebar.params;
  25071. var $el = messagebar.$el;
  25072. var top = messagebar.top;
  25073. var $pageEl = messagebar.$pageEl;
  25074. var $pageContentEl = messagebar.$pageContentEl;
  25075. var $areaEl = messagebar.$areaEl;
  25076. var $textareaEl = messagebar.$textareaEl;
  25077. var $sheetEl = messagebar.$sheetEl;
  25078. var $attachmentsEl = messagebar.$attachmentsEl;
  25079. var elHeight = $el[0].offsetHeight;
  25080. var maxHeight = params.maxHeight;
  25081. if (top) ; else {
  25082. var currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  25083. var requiredPaddingBottom = elHeight + params.bottomOffset;
  25084. if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
  25085. var currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  25086. var pageScrollHeight = $pageContentEl[0].scrollHeight;
  25087. var pageOffsetHeight = $pageContentEl[0].offsetHeight;
  25088. var pageScrollTop = $pageContentEl[0].scrollTop;
  25089. var scrollOnBottom = (pageScrollTop === pageScrollHeight - pageOffsetHeight);
  25090. if (!maxHeight) {
  25091. maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
  25092. }
  25093. $textareaEl.css('max-height', (maxHeight + "px"));
  25094. $pageContentEl.css('padding-bottom', (requiredPaddingBottom + "px"));
  25095. if (scrollOnBottom) {
  25096. $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
  25097. }
  25098. $el.trigger('messagebar:resizepage');
  25099. messagebar.emit('local::resizePage messagebarResizePage', messagebar);
  25100. }
  25101. }
  25102. };
  25103. Messagebar.prototype.checkEmptyState = function checkEmptyState () {
  25104. var messagebar = this;
  25105. var $el = messagebar.$el;
  25106. var $textareaEl = messagebar.$textareaEl;
  25107. var value = $textareaEl.val().trim();
  25108. if (value && value.length) {
  25109. $el.addClass('messagebar-with-value');
  25110. } else {
  25111. $el.removeClass('messagebar-with-value');
  25112. }
  25113. };
  25114. Messagebar.prototype.attachmentsCreate = function attachmentsCreate (innerHTML) {
  25115. if ( innerHTML === void 0 ) innerHTML = '';
  25116. var messagebar = this;
  25117. var $attachmentsEl = $(("<div class=\"messagebar-attachments\">" + innerHTML + "</div>"));
  25118. $attachmentsEl.insertBefore(messagebar.$textareaEl);
  25119. Utils.extend(messagebar, {
  25120. $attachmentsEl: $attachmentsEl,
  25121. attachmentsEl: $attachmentsEl[0],
  25122. });
  25123. return messagebar;
  25124. };
  25125. Messagebar.prototype.attachmentsShow = function attachmentsShow (innerHTML) {
  25126. if ( innerHTML === void 0 ) innerHTML = '';
  25127. var messagebar = this;
  25128. messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');
  25129. if (messagebar.$attachmentsEl.length === 0) {
  25130. messagebar.attachmentsCreate(innerHTML);
  25131. }
  25132. messagebar.$el.addClass('messagebar-attachments-visible');
  25133. messagebar.attachmentsVisible = true;
  25134. if (messagebar.params.resizePage) {
  25135. messagebar.resizePage();
  25136. }
  25137. return messagebar;
  25138. };
  25139. Messagebar.prototype.attachmentsHide = function attachmentsHide () {
  25140. var messagebar = this;
  25141. messagebar.$el.removeClass('messagebar-attachments-visible');
  25142. messagebar.attachmentsVisible = false;
  25143. if (messagebar.params.resizePage) {
  25144. messagebar.resizePage();
  25145. }
  25146. return messagebar;
  25147. };
  25148. Messagebar.prototype.attachmentsToggle = function attachmentsToggle () {
  25149. var messagebar = this;
  25150. if (messagebar.attachmentsVisible) {
  25151. messagebar.attachmentsHide();
  25152. } else {
  25153. messagebar.attachmentsShow();
  25154. }
  25155. return messagebar;
  25156. };
  25157. Messagebar.prototype.renderAttachment = function renderAttachment (attachment) {
  25158. var messagebar = this;
  25159. if (messagebar.params.renderAttachment) {
  25160. return messagebar.params.renderAttachment.call(messagebar, attachment);
  25161. }
  25162. return ("\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ");
  25163. };
  25164. Messagebar.prototype.renderAttachments = function renderAttachments () {
  25165. var messagebar = this;
  25166. var html;
  25167. if (messagebar.params.renderAttachments) {
  25168. html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
  25169. } else {
  25170. html = "" + (messagebar.attachments.map(function (attachment) { return messagebar.renderAttachment(attachment); }).join(''));
  25171. }
  25172. if (messagebar.$attachmentsEl.length === 0) {
  25173. messagebar.attachmentsCreate(html);
  25174. } else {
  25175. messagebar.$attachmentsEl.html(html);
  25176. }
  25177. };
  25178. Messagebar.prototype.sheetCreate = function sheetCreate (innerHTML) {
  25179. if ( innerHTML === void 0 ) innerHTML = '';
  25180. var messagebar = this;
  25181. var $sheetEl = $(("<div class=\"messagebar-sheet\">" + innerHTML + "</div>"));
  25182. messagebar.$el.append($sheetEl);
  25183. Utils.extend(messagebar, {
  25184. $sheetEl: $sheetEl,
  25185. sheetEl: $sheetEl[0],
  25186. });
  25187. return messagebar;
  25188. };
  25189. Messagebar.prototype.sheetShow = function sheetShow (innerHTML) {
  25190. if ( innerHTML === void 0 ) innerHTML = '';
  25191. var messagebar = this;
  25192. messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');
  25193. if (messagebar.$sheetEl.length === 0) {
  25194. messagebar.sheetCreate(innerHTML);
  25195. }
  25196. messagebar.$el.addClass('messagebar-sheet-visible');
  25197. messagebar.sheetVisible = true;
  25198. if (messagebar.params.resizePage) {
  25199. messagebar.resizePage();
  25200. }
  25201. return messagebar;
  25202. };
  25203. Messagebar.prototype.sheetHide = function sheetHide () {
  25204. var messagebar = this;
  25205. messagebar.$el.removeClass('messagebar-sheet-visible');
  25206. messagebar.sheetVisible = false;
  25207. if (messagebar.params.resizePage) {
  25208. messagebar.resizePage();
  25209. }
  25210. return messagebar;
  25211. };
  25212. Messagebar.prototype.sheetToggle = function sheetToggle () {
  25213. var messagebar = this;
  25214. if (messagebar.sheetVisible) {
  25215. messagebar.sheetHide();
  25216. } else {
  25217. messagebar.sheetShow();
  25218. }
  25219. return messagebar;
  25220. };
  25221. Messagebar.prototype.init = function init () {
  25222. var messagebar = this;
  25223. messagebar.attachEvents();
  25224. messagebar.checkEmptyState();
  25225. return messagebar;
  25226. };
  25227. Messagebar.prototype.destroy = function destroy () {
  25228. var messagebar = this;
  25229. messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);
  25230. messagebar.$el.trigger('messagebar:beforedestroy');
  25231. messagebar.detachEvents();
  25232. if (messagebar.$el[0]) {
  25233. messagebar.$el[0].f7Messagebar = null;
  25234. delete messagebar.$el[0].f7Messagebar;
  25235. }
  25236. Utils.deleteProps(messagebar);
  25237. };
  25238. return Messagebar;
  25239. }(Framework7Class));
  25240. var Messagebar$1 = {
  25241. name: 'messagebar',
  25242. static: {
  25243. Messagebar: Messagebar,
  25244. },
  25245. create: function create() {
  25246. var app = this;
  25247. app.messagebar = ConstructorMethods({
  25248. defaultSelector: '.messagebar',
  25249. constructor: Messagebar,
  25250. app: app,
  25251. domProp: 'f7Messagebar',
  25252. addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' '),
  25253. });
  25254. },
  25255. on: {
  25256. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  25257. var app = this;
  25258. $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
  25259. app.messagebar.destroy(messagebarEl);
  25260. });
  25261. },
  25262. tabMounted: function tabMounted(tabEl) {
  25263. var app = this;
  25264. $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
  25265. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  25266. });
  25267. },
  25268. pageBeforeRemove: function pageBeforeRemove(page) {
  25269. var app = this;
  25270. page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
  25271. app.messagebar.destroy(messagebarEl);
  25272. });
  25273. },
  25274. pageInit: function pageInit(page) {
  25275. var app = this;
  25276. page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
  25277. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  25278. });
  25279. },
  25280. },
  25281. vnode: {
  25282. 'messagebar-init': {
  25283. insert: function insert(vnode) {
  25284. var app = this;
  25285. var messagebarEl = vnode.elm;
  25286. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  25287. },
  25288. destroy: function destroy(vnode) {
  25289. var app = this;
  25290. var messagebarEl = vnode.elm;
  25291. app.messagebar.destroy(messagebarEl);
  25292. },
  25293. },
  25294. },
  25295. };
  25296. function updateSize () {
  25297. var swiper = this;
  25298. var width;
  25299. var height;
  25300. var $el = swiper.$el;
  25301. if (typeof swiper.params.width !== 'undefined') {
  25302. width = swiper.params.width;
  25303. } else {
  25304. width = $el[0].clientWidth;
  25305. }
  25306. if (typeof swiper.params.height !== 'undefined') {
  25307. height = swiper.params.height;
  25308. } else {
  25309. height = $el[0].clientHeight;
  25310. }
  25311. if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
  25312. return;
  25313. }
  25314. // Subtract paddings
  25315. width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
  25316. height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
  25317. Utils.extend(swiper, {
  25318. width: width,
  25319. height: height,
  25320. size: swiper.isHorizontal() ? width : height,
  25321. });
  25322. }
  25323. function updateSlides () {
  25324. var swiper = this;
  25325. var params = swiper.params;
  25326. var $wrapperEl = swiper.$wrapperEl;
  25327. var swiperSize = swiper.size;
  25328. var rtl = swiper.rtlTranslate;
  25329. var wrongRTL = swiper.wrongRTL;
  25330. var isVirtual = swiper.virtual && params.virtual.enabled;
  25331. var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
  25332. var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
  25333. var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
  25334. var snapGrid = [];
  25335. var slidesGrid = [];
  25336. var slidesSizesGrid = [];
  25337. function slidesForMargin(slideIndex) {
  25338. if (!params.cssMode) { return true; }
  25339. if (slideIndex === slides.length - 1) {
  25340. return false;
  25341. }
  25342. return true;
  25343. }
  25344. var offsetBefore = params.slidesOffsetBefore;
  25345. if (typeof offsetBefore === 'function') {
  25346. offsetBefore = params.slidesOffsetBefore.call(swiper);
  25347. }
  25348. var offsetAfter = params.slidesOffsetAfter;
  25349. if (typeof offsetAfter === 'function') {
  25350. offsetAfter = params.slidesOffsetAfter.call(swiper);
  25351. }
  25352. var previousSnapGridLength = swiper.snapGrid.length;
  25353. var previousSlidesGridLength = swiper.snapGrid.length;
  25354. var spaceBetween = params.spaceBetween;
  25355. var slidePosition = -offsetBefore;
  25356. var prevSlideSize = 0;
  25357. var index = 0;
  25358. if (typeof swiperSize === 'undefined') {
  25359. return;
  25360. }
  25361. if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
  25362. spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
  25363. }
  25364. swiper.virtualSize = -spaceBetween;
  25365. // reset margins
  25366. if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
  25367. else { slides.css({ marginRight: '', marginBottom: '' }); }
  25368. var slidesNumberEvenToRows;
  25369. if (params.slidesPerColumn > 1) {
  25370. if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
  25371. slidesNumberEvenToRows = slidesLength;
  25372. } else {
  25373. slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
  25374. }
  25375. if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
  25376. slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
  25377. }
  25378. }
  25379. // Calc slides
  25380. var slideSize;
  25381. var slidesPerColumn = params.slidesPerColumn;
  25382. var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
  25383. var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
  25384. for (var i = 0; i < slidesLength; i += 1) {
  25385. slideSize = 0;
  25386. var slide = slides.eq(i);
  25387. if (params.slidesPerColumn > 1) {
  25388. // Set slides order
  25389. var newSlideOrderIndex = (void 0);
  25390. var column = (void 0);
  25391. var row = (void 0);
  25392. if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
  25393. var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
  25394. var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
  25395. var columnsInGroup = groupIndex === 0
  25396. ? params.slidesPerGroup
  25397. : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
  25398. row = Math.floor(slideIndexInGroup / columnsInGroup);
  25399. column = (slideIndexInGroup - row * columnsInGroup) + groupIndex * params.slidesPerGroup;
  25400. newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
  25401. slide
  25402. .css({
  25403. '-webkit-box-ordinal-group': newSlideOrderIndex,
  25404. '-moz-box-ordinal-group': newSlideOrderIndex,
  25405. '-ms-flex-order': newSlideOrderIndex,
  25406. '-webkit-order': newSlideOrderIndex,
  25407. order: newSlideOrderIndex,
  25408. });
  25409. } else if (params.slidesPerColumnFill === 'column') {
  25410. column = Math.floor(i / slidesPerColumn);
  25411. row = i - (column * slidesPerColumn);
  25412. if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
  25413. row += 1;
  25414. if (row >= slidesPerColumn) {
  25415. row = 0;
  25416. column += 1;
  25417. }
  25418. }
  25419. } else {
  25420. row = Math.floor(i / slidesPerRow);
  25421. column = i - (row * slidesPerRow);
  25422. }
  25423. slide.css(
  25424. ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
  25425. (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
  25426. );
  25427. }
  25428. if (slide.css('display') === 'none') { continue; } // eslint-disable-line
  25429. if (params.slidesPerView === 'auto') {
  25430. var slideStyles = win.getComputedStyle(slide[0], null);
  25431. var currentTransform = slide[0].style.transform;
  25432. var currentWebKitTransform = slide[0].style.webkitTransform;
  25433. if (currentTransform) {
  25434. slide[0].style.transform = 'none';
  25435. }
  25436. if (currentWebKitTransform) {
  25437. slide[0].style.webkitTransform = 'none';
  25438. }
  25439. if (params.roundLengths) {
  25440. slideSize = swiper.isHorizontal()
  25441. ? slide.outerWidth(true)
  25442. : slide.outerHeight(true);
  25443. } else {
  25444. // eslint-disable-next-line
  25445. if (swiper.isHorizontal()) {
  25446. var width = parseFloat(slideStyles.getPropertyValue('width'));
  25447. var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
  25448. var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
  25449. var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
  25450. var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
  25451. var boxSizing = slideStyles.getPropertyValue('box-sizing');
  25452. if (boxSizing && boxSizing === 'border-box') {
  25453. slideSize = width + marginLeft + marginRight;
  25454. } else {
  25455. slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
  25456. }
  25457. } else {
  25458. var height = parseFloat(slideStyles.getPropertyValue('height'));
  25459. var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
  25460. var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
  25461. var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
  25462. var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
  25463. var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
  25464. if (boxSizing$1 && boxSizing$1 === 'border-box') {
  25465. slideSize = height + marginTop + marginBottom;
  25466. } else {
  25467. slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
  25468. }
  25469. }
  25470. }
  25471. if (currentTransform) {
  25472. slide[0].style.transform = currentTransform;
  25473. }
  25474. if (currentWebKitTransform) {
  25475. slide[0].style.webkitTransform = currentWebKitTransform;
  25476. }
  25477. if (params.roundLengths) { slideSize = Math.floor(slideSize); }
  25478. } else {
  25479. slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
  25480. if (params.roundLengths) { slideSize = Math.floor(slideSize); }
  25481. if (slides[i]) {
  25482. if (swiper.isHorizontal()) {
  25483. slides[i].style.width = slideSize + "px";
  25484. } else {
  25485. slides[i].style.height = slideSize + "px";
  25486. }
  25487. }
  25488. }
  25489. if (slides[i]) {
  25490. slides[i].swiperSlideSize = slideSize;
  25491. }
  25492. slidesSizesGrid.push(slideSize);
  25493. if (params.centeredSlides) {
  25494. slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
  25495. if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
  25496. if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
  25497. if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
  25498. if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
  25499. if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
  25500. slidesGrid.push(slidePosition);
  25501. } else {
  25502. if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
  25503. if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
  25504. slidesGrid.push(slidePosition);
  25505. slidePosition = slidePosition + slideSize + spaceBetween;
  25506. }
  25507. swiper.virtualSize += slideSize + spaceBetween;
  25508. prevSlideSize = slideSize;
  25509. index += 1;
  25510. }
  25511. swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
  25512. var newSlidesGrid;
  25513. if (
  25514. rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
  25515. $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
  25516. }
  25517. if (params.setWrapperSize) {
  25518. if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  25519. else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  25520. }
  25521. if (params.slidesPerColumn > 1) {
  25522. swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
  25523. swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
  25524. if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  25525. else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  25526. if (params.centeredSlides) {
  25527. newSlidesGrid = [];
  25528. for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
  25529. var slidesGridItem = snapGrid[i$1];
  25530. if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
  25531. if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
  25532. }
  25533. snapGrid = newSlidesGrid;
  25534. }
  25535. }
  25536. // Remove last grid elements depending on width
  25537. if (!params.centeredSlides) {
  25538. newSlidesGrid = [];
  25539. for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
  25540. var slidesGridItem$1 = snapGrid[i$2];
  25541. if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
  25542. if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
  25543. newSlidesGrid.push(slidesGridItem$1);
  25544. }
  25545. }
  25546. snapGrid = newSlidesGrid;
  25547. if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
  25548. snapGrid.push(swiper.virtualSize - swiperSize);
  25549. }
  25550. }
  25551. if (snapGrid.length === 0) { snapGrid = [0]; }
  25552. if (params.spaceBetween !== 0) {
  25553. if (swiper.isHorizontal()) {
  25554. if (rtl) { slides.filter(slidesForMargin).css({ marginLeft: (spaceBetween + "px") }); }
  25555. else { slides.filter(slidesForMargin).css({ marginRight: (spaceBetween + "px") }); }
  25556. } else { slides.filter(slidesForMargin).css({ marginBottom: (spaceBetween + "px") }); }
  25557. }
  25558. if (params.centeredSlides && params.centeredSlidesBounds) {
  25559. var allSlidesSize = 0;
  25560. slidesSizesGrid.forEach(function (slideSizeValue) {
  25561. allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
  25562. });
  25563. allSlidesSize -= params.spaceBetween;
  25564. var maxSnap = allSlidesSize - swiperSize;
  25565. snapGrid = snapGrid.map(function (snap) {
  25566. if (snap < 0) { return -offsetBefore; }
  25567. if (snap > maxSnap) { return maxSnap + offsetAfter; }
  25568. return snap;
  25569. });
  25570. }
  25571. if (params.centerInsufficientSlides) {
  25572. var allSlidesSize$1 = 0;
  25573. slidesSizesGrid.forEach(function (slideSizeValue) {
  25574. allSlidesSize$1 += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
  25575. });
  25576. allSlidesSize$1 -= params.spaceBetween;
  25577. if (allSlidesSize$1 < swiperSize) {
  25578. var allSlidesOffset = (swiperSize - allSlidesSize$1) / 2;
  25579. snapGrid.forEach(function (snap, snapIndex) {
  25580. snapGrid[snapIndex] = snap - allSlidesOffset;
  25581. });
  25582. slidesGrid.forEach(function (snap, snapIndex) {
  25583. slidesGrid[snapIndex] = snap + allSlidesOffset;
  25584. });
  25585. }
  25586. }
  25587. Utils.extend(swiper, {
  25588. slides: slides,
  25589. snapGrid: snapGrid,
  25590. slidesGrid: slidesGrid,
  25591. slidesSizesGrid: slidesSizesGrid,
  25592. });
  25593. if (slidesLength !== previousSlidesLength) {
  25594. swiper.emit('slidesLengthChange');
  25595. }
  25596. if (snapGrid.length !== previousSnapGridLength) {
  25597. if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
  25598. swiper.emit('snapGridLengthChange');
  25599. }
  25600. if (slidesGrid.length !== previousSlidesGridLength) {
  25601. swiper.emit('slidesGridLengthChange');
  25602. }
  25603. if (params.watchSlidesProgress || params.watchSlidesVisibility) {
  25604. swiper.updateSlidesOffset();
  25605. }
  25606. }
  25607. function updateAutoHeight (speed) {
  25608. var swiper = this;
  25609. var activeSlides = [];
  25610. var newHeight = 0;
  25611. var i;
  25612. if (typeof speed === 'number') {
  25613. swiper.setTransition(speed);
  25614. } else if (speed === true) {
  25615. swiper.setTransition(swiper.params.speed);
  25616. }
  25617. // Find slides currently in view
  25618. if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
  25619. if (swiper.params.centeredSlides) {
  25620. swiper.visibleSlides.each(function (index, slide) {
  25621. activeSlides.push(slide);
  25622. });
  25623. } else {
  25624. for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
  25625. var index = swiper.activeIndex + i;
  25626. if (index > swiper.slides.length) { break; }
  25627. activeSlides.push(swiper.slides.eq(index)[0]);
  25628. }
  25629. }
  25630. } else {
  25631. activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
  25632. }
  25633. // Find new height from highest slide in view
  25634. for (i = 0; i < activeSlides.length; i += 1) {
  25635. if (typeof activeSlides[i] !== 'undefined') {
  25636. var height = activeSlides[i].offsetHeight;
  25637. newHeight = height > newHeight ? height : newHeight;
  25638. }
  25639. }
  25640. // Update Height
  25641. if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
  25642. }
  25643. function updateSlidesOffset () {
  25644. var swiper = this;
  25645. var slides = swiper.slides;
  25646. for (var i = 0; i < slides.length; i += 1) {
  25647. slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
  25648. }
  25649. }
  25650. function updateSlidesProgress (translate) {
  25651. if ( translate === void 0 ) translate = (this && this.translate) || 0;
  25652. var swiper = this;
  25653. var params = swiper.params;
  25654. var slides = swiper.slides;
  25655. var rtl = swiper.rtlTranslate;
  25656. if (slides.length === 0) { return; }
  25657. if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
  25658. var offsetCenter = -translate;
  25659. if (rtl) { offsetCenter = translate; }
  25660. // Visible Slides
  25661. slides.removeClass(params.slideVisibleClass);
  25662. swiper.visibleSlidesIndexes = [];
  25663. swiper.visibleSlides = [];
  25664. for (var i = 0; i < slides.length; i += 1) {
  25665. var slide = slides[i];
  25666. var slideProgress = (
  25667. (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
  25668. ) / (slide.swiperSlideSize + params.spaceBetween);
  25669. if (params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) {
  25670. var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
  25671. var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
  25672. var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)
  25673. || (slideAfter > 1 && slideAfter <= swiper.size)
  25674. || (slideBefore <= 0 && slideAfter >= swiper.size);
  25675. if (isVisible) {
  25676. swiper.visibleSlides.push(slide);
  25677. swiper.visibleSlidesIndexes.push(i);
  25678. slides.eq(i).addClass(params.slideVisibleClass);
  25679. }
  25680. }
  25681. slide.progress = rtl ? -slideProgress : slideProgress;
  25682. }
  25683. swiper.visibleSlides = $(swiper.visibleSlides);
  25684. }
  25685. function updateProgress (translate) {
  25686. var swiper = this;
  25687. if (typeof translate === 'undefined') {
  25688. var multiplier = swiper.rtlTranslate ? -1 : 1;
  25689. // eslint-disable-next-line
  25690. translate = (swiper && swiper.translate && (swiper.translate * multiplier)) || 0;
  25691. }
  25692. var params = swiper.params;
  25693. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  25694. var progress = swiper.progress;
  25695. var isBeginning = swiper.isBeginning;
  25696. var isEnd = swiper.isEnd;
  25697. var wasBeginning = isBeginning;
  25698. var wasEnd = isEnd;
  25699. if (translatesDiff === 0) {
  25700. progress = 0;
  25701. isBeginning = true;
  25702. isEnd = true;
  25703. } else {
  25704. progress = (translate - swiper.minTranslate()) / (translatesDiff);
  25705. isBeginning = progress <= 0;
  25706. isEnd = progress >= 1;
  25707. }
  25708. Utils.extend(swiper, {
  25709. progress: progress,
  25710. isBeginning: isBeginning,
  25711. isEnd: isEnd,
  25712. });
  25713. if (params.watchSlidesProgress || params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) { swiper.updateSlidesProgress(translate); }
  25714. if (isBeginning && !wasBeginning) {
  25715. swiper.emit('reachBeginning toEdge');
  25716. }
  25717. if (isEnd && !wasEnd) {
  25718. swiper.emit('reachEnd toEdge');
  25719. }
  25720. if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
  25721. swiper.emit('fromEdge');
  25722. }
  25723. swiper.emit('progress', progress);
  25724. }
  25725. function updateSlidesClasses () {
  25726. var swiper = this;
  25727. var slides = swiper.slides;
  25728. var params = swiper.params;
  25729. var $wrapperEl = swiper.$wrapperEl;
  25730. var activeIndex = swiper.activeIndex;
  25731. var realIndex = swiper.realIndex;
  25732. var isVirtual = swiper.virtual && params.virtual.enabled;
  25733. slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
  25734. var activeSlide;
  25735. if (isVirtual) {
  25736. activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
  25737. } else {
  25738. activeSlide = slides.eq(activeIndex);
  25739. }
  25740. // Active classes
  25741. activeSlide.addClass(params.slideActiveClass);
  25742. if (params.loop) {
  25743. // Duplicate to all looped slides
  25744. if (activeSlide.hasClass(params.slideDuplicateClass)) {
  25745. $wrapperEl
  25746. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
  25747. .addClass(params.slideDuplicateActiveClass);
  25748. } else {
  25749. $wrapperEl
  25750. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
  25751. .addClass(params.slideDuplicateActiveClass);
  25752. }
  25753. }
  25754. // Next Slide
  25755. var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
  25756. if (params.loop && nextSlide.length === 0) {
  25757. nextSlide = slides.eq(0);
  25758. nextSlide.addClass(params.slideNextClass);
  25759. }
  25760. // Prev Slide
  25761. var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
  25762. if (params.loop && prevSlide.length === 0) {
  25763. prevSlide = slides.eq(-1);
  25764. prevSlide.addClass(params.slidePrevClass);
  25765. }
  25766. if (params.loop) {
  25767. // Duplicate to all looped slides
  25768. if (nextSlide.hasClass(params.slideDuplicateClass)) {
  25769. $wrapperEl
  25770. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
  25771. .addClass(params.slideDuplicateNextClass);
  25772. } else {
  25773. $wrapperEl
  25774. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
  25775. .addClass(params.slideDuplicateNextClass);
  25776. }
  25777. if (prevSlide.hasClass(params.slideDuplicateClass)) {
  25778. $wrapperEl
  25779. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
  25780. .addClass(params.slideDuplicatePrevClass);
  25781. } else {
  25782. $wrapperEl
  25783. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
  25784. .addClass(params.slideDuplicatePrevClass);
  25785. }
  25786. }
  25787. }
  25788. function updateActiveIndex (newActiveIndex) {
  25789. var swiper = this;
  25790. var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  25791. var slidesGrid = swiper.slidesGrid;
  25792. var snapGrid = swiper.snapGrid;
  25793. var params = swiper.params;
  25794. var previousIndex = swiper.activeIndex;
  25795. var previousRealIndex = swiper.realIndex;
  25796. var previousSnapIndex = swiper.snapIndex;
  25797. var activeIndex = newActiveIndex;
  25798. var snapIndex;
  25799. if (typeof activeIndex === 'undefined') {
  25800. for (var i = 0; i < slidesGrid.length; i += 1) {
  25801. if (typeof slidesGrid[i + 1] !== 'undefined') {
  25802. if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
  25803. activeIndex = i;
  25804. } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
  25805. activeIndex = i + 1;
  25806. }
  25807. } else if (translate >= slidesGrid[i]) {
  25808. activeIndex = i;
  25809. }
  25810. }
  25811. // Normalize slideIndex
  25812. if (params.normalizeSlideIndex) {
  25813. if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
  25814. }
  25815. }
  25816. if (snapGrid.indexOf(translate) >= 0) {
  25817. snapIndex = snapGrid.indexOf(translate);
  25818. } else {
  25819. var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
  25820. snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
  25821. }
  25822. if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
  25823. if (activeIndex === previousIndex) {
  25824. if (snapIndex !== previousSnapIndex) {
  25825. swiper.snapIndex = snapIndex;
  25826. swiper.emit('snapIndexChange');
  25827. }
  25828. return;
  25829. }
  25830. // Get real index
  25831. var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
  25832. Utils.extend(swiper, {
  25833. snapIndex: snapIndex,
  25834. realIndex: realIndex,
  25835. previousIndex: previousIndex,
  25836. activeIndex: activeIndex,
  25837. });
  25838. swiper.emit('activeIndexChange');
  25839. swiper.emit('snapIndexChange');
  25840. if (previousRealIndex !== realIndex) {
  25841. swiper.emit('realIndexChange');
  25842. }
  25843. if (swiper.initialized || swiper.params.runCallbacksOnInit) {
  25844. swiper.emit('slideChange');
  25845. }
  25846. }
  25847. function updateClickedSlide (e) {
  25848. var swiper = this;
  25849. var params = swiper.params;
  25850. var slide = $(e.target).closest(("." + (params.slideClass)))[0];
  25851. var slideFound = false;
  25852. if (slide) {
  25853. for (var i = 0; i < swiper.slides.length; i += 1) {
  25854. if (swiper.slides[i] === slide) { slideFound = true; }
  25855. }
  25856. }
  25857. if (slide && slideFound) {
  25858. swiper.clickedSlide = slide;
  25859. if (swiper.virtual && swiper.params.virtual.enabled) {
  25860. swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
  25861. } else {
  25862. swiper.clickedIndex = $(slide).index();
  25863. }
  25864. } else {
  25865. swiper.clickedSlide = undefined;
  25866. swiper.clickedIndex = undefined;
  25867. return;
  25868. }
  25869. if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
  25870. swiper.slideToClickedSlide();
  25871. }
  25872. }
  25873. var update = {
  25874. updateSize: updateSize,
  25875. updateSlides: updateSlides,
  25876. updateAutoHeight: updateAutoHeight,
  25877. updateSlidesOffset: updateSlidesOffset,
  25878. updateSlidesProgress: updateSlidesProgress,
  25879. updateProgress: updateProgress,
  25880. updateSlidesClasses: updateSlidesClasses,
  25881. updateActiveIndex: updateActiveIndex,
  25882. updateClickedSlide: updateClickedSlide,
  25883. };
  25884. function getTranslate (axis) {
  25885. if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
  25886. var swiper = this;
  25887. var params = swiper.params;
  25888. var rtl = swiper.rtlTranslate;
  25889. var translate = swiper.translate;
  25890. var $wrapperEl = swiper.$wrapperEl;
  25891. if (params.virtualTranslate) {
  25892. return rtl ? -translate : translate;
  25893. }
  25894. if (params.cssMode) {
  25895. return translate;
  25896. }
  25897. var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
  25898. if (rtl) { currentTranslate = -currentTranslate; }
  25899. return currentTranslate || 0;
  25900. }
  25901. function setTranslate (translate, byController) {
  25902. var swiper = this;
  25903. var rtl = swiper.rtlTranslate;
  25904. var params = swiper.params;
  25905. var $wrapperEl = swiper.$wrapperEl;
  25906. var wrapperEl = swiper.wrapperEl;
  25907. var progress = swiper.progress;
  25908. var x = 0;
  25909. var y = 0;
  25910. var z = 0;
  25911. if (swiper.isHorizontal()) {
  25912. x = rtl ? -translate : translate;
  25913. } else {
  25914. y = translate;
  25915. }
  25916. if (params.roundLengths) {
  25917. x = Math.floor(x);
  25918. y = Math.floor(y);
  25919. }
  25920. if (params.cssMode) {
  25921. wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
  25922. } else if (!params.virtualTranslate) {
  25923. $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)"));
  25924. }
  25925. swiper.previousTranslate = swiper.translate;
  25926. swiper.translate = swiper.isHorizontal() ? x : y;
  25927. // Check if we need to update progress
  25928. var newProgress;
  25929. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  25930. if (translatesDiff === 0) {
  25931. newProgress = 0;
  25932. } else {
  25933. newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
  25934. }
  25935. if (newProgress !== progress) {
  25936. swiper.updateProgress(translate);
  25937. }
  25938. swiper.emit('setTranslate', swiper.translate, byController);
  25939. }
  25940. function minTranslate () {
  25941. return (-this.snapGrid[0]);
  25942. }
  25943. function maxTranslate () {
  25944. return (-this.snapGrid[this.snapGrid.length - 1]);
  25945. }
  25946. function translateTo (translate, speed, runCallbacks, translateBounds, internal) {
  25947. var obj;
  25948. if ( translate === void 0 ) translate = 0;
  25949. if ( speed === void 0 ) speed = this.params.speed;
  25950. if ( runCallbacks === void 0 ) runCallbacks = true;
  25951. if ( translateBounds === void 0 ) translateBounds = true;
  25952. var swiper = this;
  25953. var params = swiper.params;
  25954. var wrapperEl = swiper.wrapperEl;
  25955. if (swiper.animating && params.preventInteractionOnTransition) {
  25956. return false;
  25957. }
  25958. var minTranslate = swiper.minTranslate();
  25959. var maxTranslate = swiper.maxTranslate();
  25960. var newTranslate;
  25961. if (translateBounds && translate > minTranslate) { newTranslate = minTranslate; }
  25962. else if (translateBounds && translate < maxTranslate) { newTranslate = maxTranslate; }
  25963. else { newTranslate = translate; }
  25964. // Update progress
  25965. swiper.updateProgress(newTranslate);
  25966. if (params.cssMode) {
  25967. var isH = swiper.isHorizontal();
  25968. if (speed === 0) {
  25969. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
  25970. } else {
  25971. // eslint-disable-next-line
  25972. if (wrapperEl.scrollTo) {
  25973. wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -newTranslate, obj.behavior = 'smooth', obj ));
  25974. } else {
  25975. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
  25976. }
  25977. }
  25978. return true;
  25979. }
  25980. if (speed === 0) {
  25981. swiper.setTransition(0);
  25982. swiper.setTranslate(newTranslate);
  25983. if (runCallbacks) {
  25984. swiper.emit('beforeTransitionStart', speed, internal);
  25985. swiper.emit('transitionEnd');
  25986. }
  25987. } else {
  25988. swiper.setTransition(speed);
  25989. swiper.setTranslate(newTranslate);
  25990. if (runCallbacks) {
  25991. swiper.emit('beforeTransitionStart', speed, internal);
  25992. swiper.emit('transitionStart');
  25993. }
  25994. if (!swiper.animating) {
  25995. swiper.animating = true;
  25996. if (!swiper.onTranslateToWrapperTransitionEnd) {
  25997. swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
  25998. if (!swiper || swiper.destroyed) { return; }
  25999. if (e.target !== this) { return; }
  26000. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  26001. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
  26002. swiper.onTranslateToWrapperTransitionEnd = null;
  26003. delete swiper.onTranslateToWrapperTransitionEnd;
  26004. if (runCallbacks) {
  26005. swiper.emit('transitionEnd');
  26006. }
  26007. };
  26008. }
  26009. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  26010. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
  26011. }
  26012. }
  26013. return true;
  26014. }
  26015. var translate = {
  26016. getTranslate: getTranslate,
  26017. setTranslate: setTranslate,
  26018. minTranslate: minTranslate,
  26019. maxTranslate: maxTranslate,
  26020. translateTo: translateTo,
  26021. };
  26022. function setTransition (duration, byController) {
  26023. var swiper = this;
  26024. if (!swiper.params.cssMode) {
  26025. swiper.$wrapperEl.transition(duration);
  26026. }
  26027. swiper.emit('setTransition', duration, byController);
  26028. }
  26029. function transitionStart (runCallbacks, direction) {
  26030. if ( runCallbacks === void 0 ) runCallbacks = true;
  26031. var swiper = this;
  26032. var activeIndex = swiper.activeIndex;
  26033. var params = swiper.params;
  26034. var previousIndex = swiper.previousIndex;
  26035. if (params.cssMode) { return; }
  26036. if (params.autoHeight) {
  26037. swiper.updateAutoHeight();
  26038. }
  26039. var dir = direction;
  26040. if (!dir) {
  26041. if (activeIndex > previousIndex) { dir = 'next'; }
  26042. else if (activeIndex < previousIndex) { dir = 'prev'; }
  26043. else { dir = 'reset'; }
  26044. }
  26045. swiper.emit('transitionStart');
  26046. if (runCallbacks && activeIndex !== previousIndex) {
  26047. if (dir === 'reset') {
  26048. swiper.emit('slideResetTransitionStart');
  26049. return;
  26050. }
  26051. swiper.emit('slideChangeTransitionStart');
  26052. if (dir === 'next') {
  26053. swiper.emit('slideNextTransitionStart');
  26054. } else {
  26055. swiper.emit('slidePrevTransitionStart');
  26056. }
  26057. }
  26058. }
  26059. function transitionEnd$1 (runCallbacks, direction) {
  26060. if ( runCallbacks === void 0 ) runCallbacks = true;
  26061. var swiper = this;
  26062. var activeIndex = swiper.activeIndex;
  26063. var previousIndex = swiper.previousIndex;
  26064. var params = swiper.params;
  26065. swiper.animating = false;
  26066. if (params.cssMode) { return; }
  26067. swiper.setTransition(0);
  26068. var dir = direction;
  26069. if (!dir) {
  26070. if (activeIndex > previousIndex) { dir = 'next'; }
  26071. else if (activeIndex < previousIndex) { dir = 'prev'; }
  26072. else { dir = 'reset'; }
  26073. }
  26074. swiper.emit('transitionEnd');
  26075. if (runCallbacks && activeIndex !== previousIndex) {
  26076. if (dir === 'reset') {
  26077. swiper.emit('slideResetTransitionEnd');
  26078. return;
  26079. }
  26080. swiper.emit('slideChangeTransitionEnd');
  26081. if (dir === 'next') {
  26082. swiper.emit('slideNextTransitionEnd');
  26083. } else {
  26084. swiper.emit('slidePrevTransitionEnd');
  26085. }
  26086. }
  26087. }
  26088. var transition$1 = {
  26089. setTransition: setTransition,
  26090. transitionStart: transitionStart,
  26091. transitionEnd: transitionEnd$1,
  26092. };
  26093. function slideTo (index, speed, runCallbacks, internal) {
  26094. var obj;
  26095. if ( index === void 0 ) index = 0;
  26096. if ( speed === void 0 ) speed = this.params.speed;
  26097. if ( runCallbacks === void 0 ) runCallbacks = true;
  26098. var swiper = this;
  26099. var slideIndex = index;
  26100. if (slideIndex < 0) { slideIndex = 0; }
  26101. var params = swiper.params;
  26102. var snapGrid = swiper.snapGrid;
  26103. var slidesGrid = swiper.slidesGrid;
  26104. var previousIndex = swiper.previousIndex;
  26105. var activeIndex = swiper.activeIndex;
  26106. var rtl = swiper.rtlTranslate;
  26107. var wrapperEl = swiper.wrapperEl;
  26108. if (swiper.animating && params.preventInteractionOnTransition) {
  26109. return false;
  26110. }
  26111. var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
  26112. var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
  26113. if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
  26114. if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
  26115. swiper.emit('beforeSlideChangeStart');
  26116. }
  26117. var translate = -snapGrid[snapIndex];
  26118. // Update progress
  26119. swiper.updateProgress(translate);
  26120. // Normalize slideIndex
  26121. if (params.normalizeSlideIndex) {
  26122. for (var i = 0; i < slidesGrid.length; i += 1) {
  26123. if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
  26124. slideIndex = i;
  26125. }
  26126. }
  26127. }
  26128. // Directions locks
  26129. if (swiper.initialized && slideIndex !== activeIndex) {
  26130. if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
  26131. return false;
  26132. }
  26133. if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
  26134. if ((activeIndex || 0) !== slideIndex) { return false; }
  26135. }
  26136. }
  26137. var direction;
  26138. if (slideIndex > activeIndex) { direction = 'next'; }
  26139. else if (slideIndex < activeIndex) { direction = 'prev'; }
  26140. else { direction = 'reset'; }
  26141. // Update Index
  26142. if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
  26143. swiper.updateActiveIndex(slideIndex);
  26144. // Update Height
  26145. if (params.autoHeight) {
  26146. swiper.updateAutoHeight();
  26147. }
  26148. swiper.updateSlidesClasses();
  26149. if (params.effect !== 'slide') {
  26150. swiper.setTranslate(translate);
  26151. }
  26152. if (direction !== 'reset') {
  26153. swiper.transitionStart(runCallbacks, direction);
  26154. swiper.transitionEnd(runCallbacks, direction);
  26155. }
  26156. return false;
  26157. }
  26158. if (params.cssMode) {
  26159. var isH = swiper.isHorizontal();
  26160. var t = -translate;
  26161. if (rtl) {
  26162. t = wrapperEl.scrollWidth - wrapperEl.offsetWidth - t;
  26163. }
  26164. if (speed === 0) {
  26165. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  26166. } else {
  26167. // eslint-disable-next-line
  26168. if (wrapperEl.scrollTo) {
  26169. wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = t, obj.behavior = 'smooth', obj ));
  26170. } else {
  26171. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  26172. }
  26173. }
  26174. return true;
  26175. }
  26176. if (speed === 0) {
  26177. swiper.setTransition(0);
  26178. swiper.setTranslate(translate);
  26179. swiper.updateActiveIndex(slideIndex);
  26180. swiper.updateSlidesClasses();
  26181. swiper.emit('beforeTransitionStart', speed, internal);
  26182. swiper.transitionStart(runCallbacks, direction);
  26183. swiper.transitionEnd(runCallbacks, direction);
  26184. } else {
  26185. swiper.setTransition(speed);
  26186. swiper.setTranslate(translate);
  26187. swiper.updateActiveIndex(slideIndex);
  26188. swiper.updateSlidesClasses();
  26189. swiper.emit('beforeTransitionStart', speed, internal);
  26190. swiper.transitionStart(runCallbacks, direction);
  26191. if (!swiper.animating) {
  26192. swiper.animating = true;
  26193. if (!swiper.onSlideToWrapperTransitionEnd) {
  26194. swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
  26195. if (!swiper || swiper.destroyed) { return; }
  26196. if (e.target !== this) { return; }
  26197. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  26198. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
  26199. swiper.onSlideToWrapperTransitionEnd = null;
  26200. delete swiper.onSlideToWrapperTransitionEnd;
  26201. swiper.transitionEnd(runCallbacks, direction);
  26202. };
  26203. }
  26204. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  26205. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
  26206. }
  26207. }
  26208. return true;
  26209. }
  26210. function slideToLoop (index, speed, runCallbacks, internal) {
  26211. if ( index === void 0 ) index = 0;
  26212. if ( speed === void 0 ) speed = this.params.speed;
  26213. if ( runCallbacks === void 0 ) runCallbacks = true;
  26214. var swiper = this;
  26215. var newIndex = index;
  26216. if (swiper.params.loop) {
  26217. newIndex += swiper.loopedSlides;
  26218. }
  26219. return swiper.slideTo(newIndex, speed, runCallbacks, internal);
  26220. }
  26221. /* eslint no-unused-vars: "off" */
  26222. function slideNext (speed, runCallbacks, internal) {
  26223. if ( speed === void 0 ) speed = this.params.speed;
  26224. if ( runCallbacks === void 0 ) runCallbacks = true;
  26225. var swiper = this;
  26226. var params = swiper.params;
  26227. var animating = swiper.animating;
  26228. var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
  26229. if (params.loop) {
  26230. if (animating) { return false; }
  26231. swiper.loopFix();
  26232. // eslint-disable-next-line
  26233. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  26234. }
  26235. return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
  26236. }
  26237. /* eslint no-unused-vars: "off" */
  26238. function slidePrev (speed, runCallbacks, internal) {
  26239. if ( speed === void 0 ) speed = this.params.speed;
  26240. if ( runCallbacks === void 0 ) runCallbacks = true;
  26241. var swiper = this;
  26242. var params = swiper.params;
  26243. var animating = swiper.animating;
  26244. var snapGrid = swiper.snapGrid;
  26245. var slidesGrid = swiper.slidesGrid;
  26246. var rtlTranslate = swiper.rtlTranslate;
  26247. if (params.loop) {
  26248. if (animating) { return false; }
  26249. swiper.loopFix();
  26250. // eslint-disable-next-line
  26251. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  26252. }
  26253. var translate = rtlTranslate ? swiper.translate : -swiper.translate;
  26254. function normalize(val) {
  26255. if (val < 0) { return -Math.floor(Math.abs(val)); }
  26256. return Math.floor(val);
  26257. }
  26258. var normalizedTranslate = normalize(translate);
  26259. var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
  26260. var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
  26261. var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
  26262. var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
  26263. if (typeof prevSnap === 'undefined' && params.cssMode) {
  26264. snapGrid.forEach(function (snap) {
  26265. if (!prevSnap && normalizedTranslate >= snap) { prevSnap = snap; }
  26266. });
  26267. }
  26268. var prevIndex;
  26269. if (typeof prevSnap !== 'undefined') {
  26270. prevIndex = slidesGrid.indexOf(prevSnap);
  26271. if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
  26272. }
  26273. return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
  26274. }
  26275. /* eslint no-unused-vars: "off" */
  26276. function slideReset (speed, runCallbacks, internal) {
  26277. if ( speed === void 0 ) speed = this.params.speed;
  26278. if ( runCallbacks === void 0 ) runCallbacks = true;
  26279. var swiper = this;
  26280. return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
  26281. }
  26282. /* eslint no-unused-vars: "off" */
  26283. function slideToClosest (speed, runCallbacks, internal, threshold) {
  26284. if ( speed === void 0 ) speed = this.params.speed;
  26285. if ( runCallbacks === void 0 ) runCallbacks = true;
  26286. if ( threshold === void 0 ) threshold = 0.5;
  26287. var swiper = this;
  26288. var index = swiper.activeIndex;
  26289. var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
  26290. var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
  26291. var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  26292. if (translate >= swiper.snapGrid[snapIndex]) {
  26293. // The current translate is on or after the current snap index, so the choice
  26294. // is between the current index and the one after it.
  26295. var currentSnap = swiper.snapGrid[snapIndex];
  26296. var nextSnap = swiper.snapGrid[snapIndex + 1];
  26297. if ((translate - currentSnap) > (nextSnap - currentSnap) * threshold) {
  26298. index += swiper.params.slidesPerGroup;
  26299. }
  26300. } else {
  26301. // The current translate is before the current snap index, so the choice
  26302. // is between the current index and the one before it.
  26303. var prevSnap = swiper.snapGrid[snapIndex - 1];
  26304. var currentSnap$1 = swiper.snapGrid[snapIndex];
  26305. if ((translate - prevSnap) <= (currentSnap$1 - prevSnap) * threshold) {
  26306. index -= swiper.params.slidesPerGroup;
  26307. }
  26308. }
  26309. index = Math.max(index, 0);
  26310. index = Math.min(index, swiper.slidesGrid.length - 1);
  26311. return swiper.slideTo(index, speed, runCallbacks, internal);
  26312. }
  26313. function slideToClickedSlide () {
  26314. var swiper = this;
  26315. var params = swiper.params;
  26316. var $wrapperEl = swiper.$wrapperEl;
  26317. var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
  26318. var slideToIndex = swiper.clickedIndex;
  26319. var realIndex;
  26320. if (params.loop) {
  26321. if (swiper.animating) { return; }
  26322. realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
  26323. if (params.centeredSlides) {
  26324. if (
  26325. (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
  26326. || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
  26327. ) {
  26328. swiper.loopFix();
  26329. slideToIndex = $wrapperEl
  26330. .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
  26331. .eq(0)
  26332. .index();
  26333. Utils.nextTick(function () {
  26334. swiper.slideTo(slideToIndex);
  26335. });
  26336. } else {
  26337. swiper.slideTo(slideToIndex);
  26338. }
  26339. } else if (slideToIndex > swiper.slides.length - slidesPerView) {
  26340. swiper.loopFix();
  26341. slideToIndex = $wrapperEl
  26342. .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
  26343. .eq(0)
  26344. .index();
  26345. Utils.nextTick(function () {
  26346. swiper.slideTo(slideToIndex);
  26347. });
  26348. } else {
  26349. swiper.slideTo(slideToIndex);
  26350. }
  26351. } else {
  26352. swiper.slideTo(slideToIndex);
  26353. }
  26354. }
  26355. var slide = {
  26356. slideTo: slideTo,
  26357. slideToLoop: slideToLoop,
  26358. slideNext: slideNext,
  26359. slidePrev: slidePrev,
  26360. slideReset: slideReset,
  26361. slideToClosest: slideToClosest,
  26362. slideToClickedSlide: slideToClickedSlide,
  26363. };
  26364. function loopCreate () {
  26365. var swiper = this;
  26366. var params = swiper.params;
  26367. var $wrapperEl = swiper.$wrapperEl;
  26368. // Remove duplicated slides
  26369. $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
  26370. var slides = $wrapperEl.children(("." + (params.slideClass)));
  26371. if (params.loopFillGroupWithBlank) {
  26372. var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
  26373. if (blankSlidesNum !== params.slidesPerGroup) {
  26374. for (var i = 0; i < blankSlidesNum; i += 1) {
  26375. var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
  26376. $wrapperEl.append(blankNode);
  26377. }
  26378. slides = $wrapperEl.children(("." + (params.slideClass)));
  26379. }
  26380. }
  26381. if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
  26382. swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
  26383. swiper.loopedSlides += params.loopAdditionalSlides;
  26384. if (swiper.loopedSlides > slides.length) {
  26385. swiper.loopedSlides = slides.length;
  26386. }
  26387. var prependSlides = [];
  26388. var appendSlides = [];
  26389. slides.each(function (index, el) {
  26390. var slide = $(el);
  26391. if (index < swiper.loopedSlides) { appendSlides.push(el); }
  26392. if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
  26393. slide.attr('data-swiper-slide-index', index);
  26394. });
  26395. for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
  26396. $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
  26397. }
  26398. for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
  26399. $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
  26400. }
  26401. }
  26402. function loopFix () {
  26403. var swiper = this;
  26404. swiper.emit('beforeLoopFix');
  26405. var activeIndex = swiper.activeIndex;
  26406. var slides = swiper.slides;
  26407. var loopedSlides = swiper.loopedSlides;
  26408. var allowSlidePrev = swiper.allowSlidePrev;
  26409. var allowSlideNext = swiper.allowSlideNext;
  26410. var snapGrid = swiper.snapGrid;
  26411. var rtl = swiper.rtlTranslate;
  26412. var newIndex;
  26413. swiper.allowSlidePrev = true;
  26414. swiper.allowSlideNext = true;
  26415. var snapTranslate = -snapGrid[activeIndex];
  26416. var diff = snapTranslate - swiper.getTranslate();
  26417. // Fix For Negative Oversliding
  26418. if (activeIndex < loopedSlides) {
  26419. newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
  26420. newIndex += loopedSlides;
  26421. var slideChanged = swiper.slideTo(newIndex, 0, false, true);
  26422. if (slideChanged && diff !== 0) {
  26423. swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
  26424. }
  26425. } else if (activeIndex >= slides.length - loopedSlides) {
  26426. // Fix For Positive Oversliding
  26427. newIndex = -slides.length + activeIndex + loopedSlides;
  26428. newIndex += loopedSlides;
  26429. var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
  26430. if (slideChanged$1 && diff !== 0) {
  26431. swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
  26432. }
  26433. }
  26434. swiper.allowSlidePrev = allowSlidePrev;
  26435. swiper.allowSlideNext = allowSlideNext;
  26436. swiper.emit('loopFix');
  26437. }
  26438. function loopDestroy () {
  26439. var swiper = this;
  26440. var $wrapperEl = swiper.$wrapperEl;
  26441. var params = swiper.params;
  26442. var slides = swiper.slides;
  26443. $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
  26444. slides.removeAttr('data-swiper-slide-index');
  26445. }
  26446. var loop = {
  26447. loopCreate: loopCreate,
  26448. loopFix: loopFix,
  26449. loopDestroy: loopDestroy,
  26450. };
  26451. function setGrabCursor (moving) {
  26452. var swiper = this;
  26453. if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
  26454. var el = swiper.el;
  26455. el.style.cursor = 'move';
  26456. el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
  26457. el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
  26458. el.style.cursor = moving ? 'grabbing' : 'grab';
  26459. }
  26460. function unsetGrabCursor () {
  26461. var swiper = this;
  26462. if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
  26463. swiper.el.style.cursor = '';
  26464. }
  26465. var grabCursor = {
  26466. setGrabCursor: setGrabCursor,
  26467. unsetGrabCursor: unsetGrabCursor,
  26468. };
  26469. function appendSlide (slides) {
  26470. var swiper = this;
  26471. var $wrapperEl = swiper.$wrapperEl;
  26472. var params = swiper.params;
  26473. if (params.loop) {
  26474. swiper.loopDestroy();
  26475. }
  26476. if (typeof slides === 'object' && 'length' in slides) {
  26477. for (var i = 0; i < slides.length; i += 1) {
  26478. if (slides[i]) { $wrapperEl.append(slides[i]); }
  26479. }
  26480. } else {
  26481. $wrapperEl.append(slides);
  26482. }
  26483. if (params.loop) {
  26484. swiper.loopCreate();
  26485. }
  26486. if (!(params.observer && Support.observer)) {
  26487. swiper.update();
  26488. }
  26489. }
  26490. function prependSlide (slides) {
  26491. var swiper = this;
  26492. var params = swiper.params;
  26493. var $wrapperEl = swiper.$wrapperEl;
  26494. var activeIndex = swiper.activeIndex;
  26495. if (params.loop) {
  26496. swiper.loopDestroy();
  26497. }
  26498. var newActiveIndex = activeIndex + 1;
  26499. if (typeof slides === 'object' && 'length' in slides) {
  26500. for (var i = 0; i < slides.length; i += 1) {
  26501. if (slides[i]) { $wrapperEl.prepend(slides[i]); }
  26502. }
  26503. newActiveIndex = activeIndex + slides.length;
  26504. } else {
  26505. $wrapperEl.prepend(slides);
  26506. }
  26507. if (params.loop) {
  26508. swiper.loopCreate();
  26509. }
  26510. if (!(params.observer && Support.observer)) {
  26511. swiper.update();
  26512. }
  26513. swiper.slideTo(newActiveIndex, 0, false);
  26514. }
  26515. function addSlide (index, slides) {
  26516. var swiper = this;
  26517. var $wrapperEl = swiper.$wrapperEl;
  26518. var params = swiper.params;
  26519. var activeIndex = swiper.activeIndex;
  26520. var activeIndexBuffer = activeIndex;
  26521. if (params.loop) {
  26522. activeIndexBuffer -= swiper.loopedSlides;
  26523. swiper.loopDestroy();
  26524. swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
  26525. }
  26526. var baseLength = swiper.slides.length;
  26527. if (index <= 0) {
  26528. swiper.prependSlide(slides);
  26529. return;
  26530. }
  26531. if (index >= baseLength) {
  26532. swiper.appendSlide(slides);
  26533. return;
  26534. }
  26535. var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
  26536. var slidesBuffer = [];
  26537. for (var i = baseLength - 1; i >= index; i -= 1) {
  26538. var currentSlide = swiper.slides.eq(i);
  26539. currentSlide.remove();
  26540. slidesBuffer.unshift(currentSlide);
  26541. }
  26542. if (typeof slides === 'object' && 'length' in slides) {
  26543. for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
  26544. if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
  26545. }
  26546. newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
  26547. } else {
  26548. $wrapperEl.append(slides);
  26549. }
  26550. for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
  26551. $wrapperEl.append(slidesBuffer[i$2]);
  26552. }
  26553. if (params.loop) {
  26554. swiper.loopCreate();
  26555. }
  26556. if (!(params.observer && Support.observer)) {
  26557. swiper.update();
  26558. }
  26559. if (params.loop) {
  26560. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  26561. } else {
  26562. swiper.slideTo(newActiveIndex, 0, false);
  26563. }
  26564. }
  26565. function removeSlide (slidesIndexes) {
  26566. var swiper = this;
  26567. var params = swiper.params;
  26568. var $wrapperEl = swiper.$wrapperEl;
  26569. var activeIndex = swiper.activeIndex;
  26570. var activeIndexBuffer = activeIndex;
  26571. if (params.loop) {
  26572. activeIndexBuffer -= swiper.loopedSlides;
  26573. swiper.loopDestroy();
  26574. swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
  26575. }
  26576. var newActiveIndex = activeIndexBuffer;
  26577. var indexToRemove;
  26578. if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
  26579. for (var i = 0; i < slidesIndexes.length; i += 1) {
  26580. indexToRemove = slidesIndexes[i];
  26581. if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
  26582. if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
  26583. }
  26584. newActiveIndex = Math.max(newActiveIndex, 0);
  26585. } else {
  26586. indexToRemove = slidesIndexes;
  26587. if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
  26588. if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
  26589. newActiveIndex = Math.max(newActiveIndex, 0);
  26590. }
  26591. if (params.loop) {
  26592. swiper.loopCreate();
  26593. }
  26594. if (!(params.observer && Support.observer)) {
  26595. swiper.update();
  26596. }
  26597. if (params.loop) {
  26598. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  26599. } else {
  26600. swiper.slideTo(newActiveIndex, 0, false);
  26601. }
  26602. }
  26603. function removeAllSlides () {
  26604. var swiper = this;
  26605. var slidesIndexes = [];
  26606. for (var i = 0; i < swiper.slides.length; i += 1) {
  26607. slidesIndexes.push(i);
  26608. }
  26609. swiper.removeSlide(slidesIndexes);
  26610. }
  26611. var manipulation = {
  26612. appendSlide: appendSlide,
  26613. prependSlide: prependSlide,
  26614. addSlide: addSlide,
  26615. removeSlide: removeSlide,
  26616. removeAllSlides: removeAllSlides,
  26617. };
  26618. function onTouchStart (event) {
  26619. var swiper = this;
  26620. var data = swiper.touchEventsData;
  26621. var params = swiper.params;
  26622. var touches = swiper.touches;
  26623. if (swiper.animating && params.preventInteractionOnTransition) {
  26624. return;
  26625. }
  26626. var e = event;
  26627. if (e.originalEvent) { e = e.originalEvent; }
  26628. var $targetEl = $(e.target);
  26629. if (params.touchEventsTarget === 'wrapper') {
  26630. if (!$targetEl.closest(swiper.wrapperEl).length) { return; }
  26631. }
  26632. data.isTouchEvent = e.type === 'touchstart';
  26633. if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
  26634. if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
  26635. if (data.isTouched && data.isMoved) { return; }
  26636. if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
  26637. swiper.allowClick = true;
  26638. return;
  26639. }
  26640. if (params.swipeHandler) {
  26641. if (!$targetEl.closest(params.swipeHandler)[0]) { return; }
  26642. }
  26643. touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  26644. touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  26645. var startX = touches.currentX;
  26646. var startY = touches.currentY;
  26647. // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
  26648. var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
  26649. var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
  26650. if (
  26651. edgeSwipeDetection
  26652. && ((startX <= edgeSwipeThreshold)
  26653. || (startX >= win.screen.width - edgeSwipeThreshold))
  26654. ) {
  26655. return;
  26656. }
  26657. Utils.extend(data, {
  26658. isTouched: true,
  26659. isMoved: false,
  26660. allowTouchCallbacks: true,
  26661. isScrolling: undefined,
  26662. startMoving: undefined,
  26663. });
  26664. touches.startX = startX;
  26665. touches.startY = startY;
  26666. data.touchStartTime = Utils.now();
  26667. swiper.allowClick = true;
  26668. swiper.updateSize();
  26669. swiper.swipeDirection = undefined;
  26670. if (params.threshold > 0) { data.allowThresholdMove = false; }
  26671. if (e.type !== 'touchstart') {
  26672. var preventDefault = true;
  26673. if ($targetEl.is(data.formElements)) { preventDefault = false; }
  26674. if (
  26675. doc.activeElement
  26676. && $(doc.activeElement).is(data.formElements)
  26677. && doc.activeElement !== $targetEl[0]
  26678. ) {
  26679. doc.activeElement.blur();
  26680. }
  26681. var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
  26682. if (params.touchStartForcePreventDefault || shouldPreventDefault) {
  26683. e.preventDefault();
  26684. }
  26685. }
  26686. swiper.emit('touchStart', e);
  26687. }
  26688. function onTouchMove (event) {
  26689. var swiper = this;
  26690. var data = swiper.touchEventsData;
  26691. var params = swiper.params;
  26692. var touches = swiper.touches;
  26693. var rtl = swiper.rtlTranslate;
  26694. var e = event;
  26695. if (e.originalEvent) { e = e.originalEvent; }
  26696. if (!data.isTouched) {
  26697. if (data.startMoving && data.isScrolling) {
  26698. swiper.emit('touchMoveOpposite', e);
  26699. }
  26700. return;
  26701. }
  26702. if (data.isTouchEvent && e.type !== 'touchmove') { return; }
  26703. var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
  26704. var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
  26705. var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
  26706. if (e.preventedByNestedSwiper) {
  26707. touches.startX = pageX;
  26708. touches.startY = pageY;
  26709. return;
  26710. }
  26711. if (!swiper.allowTouchMove) {
  26712. // isMoved = true;
  26713. swiper.allowClick = false;
  26714. if (data.isTouched) {
  26715. Utils.extend(touches, {
  26716. startX: pageX,
  26717. startY: pageY,
  26718. currentX: pageX,
  26719. currentY: pageY,
  26720. });
  26721. data.touchStartTime = Utils.now();
  26722. }
  26723. return;
  26724. }
  26725. if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
  26726. if (swiper.isVertical()) {
  26727. // Vertical
  26728. if (
  26729. (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
  26730. || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
  26731. ) {
  26732. data.isTouched = false;
  26733. data.isMoved = false;
  26734. return;
  26735. }
  26736. } else if (
  26737. (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
  26738. || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
  26739. ) {
  26740. return;
  26741. }
  26742. }
  26743. if (data.isTouchEvent && doc.activeElement) {
  26744. if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
  26745. data.isMoved = true;
  26746. swiper.allowClick = false;
  26747. return;
  26748. }
  26749. }
  26750. if (data.allowTouchCallbacks) {
  26751. swiper.emit('touchMove', e);
  26752. }
  26753. if (e.targetTouches && e.targetTouches.length > 1) { return; }
  26754. touches.currentX = pageX;
  26755. touches.currentY = pageY;
  26756. var diffX = touches.currentX - touches.startX;
  26757. var diffY = touches.currentY - touches.startY;
  26758. if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
  26759. if (typeof data.isScrolling === 'undefined') {
  26760. var touchAngle;
  26761. if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
  26762. data.isScrolling = false;
  26763. } else {
  26764. // eslint-disable-next-line
  26765. if ((diffX * diffX) + (diffY * diffY) >= 25) {
  26766. touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
  26767. data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
  26768. }
  26769. }
  26770. }
  26771. if (data.isScrolling) {
  26772. swiper.emit('touchMoveOpposite', e);
  26773. }
  26774. if (typeof data.startMoving === 'undefined') {
  26775. if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
  26776. data.startMoving = true;
  26777. }
  26778. }
  26779. if (data.isScrolling) {
  26780. data.isTouched = false;
  26781. return;
  26782. }
  26783. if (!data.startMoving) {
  26784. return;
  26785. }
  26786. swiper.allowClick = false;
  26787. if (!params.cssMode && e.cancelable) {
  26788. e.preventDefault();
  26789. }
  26790. if (params.touchMoveStopPropagation && !params.nested) {
  26791. e.stopPropagation();
  26792. }
  26793. if (!data.isMoved) {
  26794. if (params.loop) {
  26795. swiper.loopFix();
  26796. }
  26797. data.startTranslate = swiper.getTranslate();
  26798. swiper.setTransition(0);
  26799. if (swiper.animating) {
  26800. swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
  26801. }
  26802. data.allowMomentumBounce = false;
  26803. // Grab Cursor
  26804. if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  26805. swiper.setGrabCursor(true);
  26806. }
  26807. swiper.emit('sliderFirstMove', e);
  26808. }
  26809. swiper.emit('sliderMove', e);
  26810. data.isMoved = true;
  26811. var diff = swiper.isHorizontal() ? diffX : diffY;
  26812. touches.diff = diff;
  26813. diff *= params.touchRatio;
  26814. if (rtl) { diff = -diff; }
  26815. swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
  26816. data.currentTranslate = diff + data.startTranslate;
  26817. var disableParentSwiper = true;
  26818. var resistanceRatio = params.resistanceRatio;
  26819. if (params.touchReleaseOnEdges) {
  26820. resistanceRatio = 0;
  26821. }
  26822. if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
  26823. disableParentSwiper = false;
  26824. if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
  26825. } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
  26826. disableParentSwiper = false;
  26827. if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
  26828. }
  26829. if (disableParentSwiper) {
  26830. e.preventedByNestedSwiper = true;
  26831. }
  26832. // Directions locks
  26833. if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
  26834. data.currentTranslate = data.startTranslate;
  26835. }
  26836. if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
  26837. data.currentTranslate = data.startTranslate;
  26838. }
  26839. // Threshold
  26840. if (params.threshold > 0) {
  26841. if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
  26842. if (!data.allowThresholdMove) {
  26843. data.allowThresholdMove = true;
  26844. touches.startX = touches.currentX;
  26845. touches.startY = touches.currentY;
  26846. data.currentTranslate = data.startTranslate;
  26847. touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
  26848. return;
  26849. }
  26850. } else {
  26851. data.currentTranslate = data.startTranslate;
  26852. return;
  26853. }
  26854. }
  26855. if (!params.followFinger || params.cssMode) { return; }
  26856. // Update active index in free mode
  26857. if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
  26858. swiper.updateActiveIndex();
  26859. swiper.updateSlidesClasses();
  26860. }
  26861. if (params.freeMode) {
  26862. // Velocity
  26863. if (data.velocities.length === 0) {
  26864. data.velocities.push({
  26865. position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
  26866. time: data.touchStartTime,
  26867. });
  26868. }
  26869. data.velocities.push({
  26870. position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
  26871. time: Utils.now(),
  26872. });
  26873. }
  26874. // Update progress
  26875. swiper.updateProgress(data.currentTranslate);
  26876. // Update translate
  26877. swiper.setTranslate(data.currentTranslate);
  26878. }
  26879. function onTouchEnd (event) {
  26880. var swiper = this;
  26881. var data = swiper.touchEventsData;
  26882. var params = swiper.params;
  26883. var touches = swiper.touches;
  26884. var rtl = swiper.rtlTranslate;
  26885. var $wrapperEl = swiper.$wrapperEl;
  26886. var slidesGrid = swiper.slidesGrid;
  26887. var snapGrid = swiper.snapGrid;
  26888. var e = event;
  26889. if (e.originalEvent) { e = e.originalEvent; }
  26890. if (data.allowTouchCallbacks) {
  26891. swiper.emit('touchEnd', e);
  26892. }
  26893. data.allowTouchCallbacks = false;
  26894. if (!data.isTouched) {
  26895. if (data.isMoved && params.grabCursor) {
  26896. swiper.setGrabCursor(false);
  26897. }
  26898. data.isMoved = false;
  26899. data.startMoving = false;
  26900. return;
  26901. }
  26902. // Return Grab Cursor
  26903. if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  26904. swiper.setGrabCursor(false);
  26905. }
  26906. // Time diff
  26907. var touchEndTime = Utils.now();
  26908. var timeDiff = touchEndTime - data.touchStartTime;
  26909. // Tap, doubleTap, Click
  26910. if (swiper.allowClick) {
  26911. swiper.updateClickedSlide(e);
  26912. swiper.emit('tap click', e);
  26913. if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
  26914. swiper.emit('doubleTap doubleClick', e);
  26915. }
  26916. }
  26917. data.lastClickTime = Utils.now();
  26918. Utils.nextTick(function () {
  26919. if (!swiper.destroyed) { swiper.allowClick = true; }
  26920. });
  26921. if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
  26922. data.isTouched = false;
  26923. data.isMoved = false;
  26924. data.startMoving = false;
  26925. return;
  26926. }
  26927. data.isTouched = false;
  26928. data.isMoved = false;
  26929. data.startMoving = false;
  26930. var currentPos;
  26931. if (params.followFinger) {
  26932. currentPos = rtl ? swiper.translate : -swiper.translate;
  26933. } else {
  26934. currentPos = -data.currentTranslate;
  26935. }
  26936. if (params.cssMode) {
  26937. return;
  26938. }
  26939. if (params.freeMode) {
  26940. if (currentPos < -swiper.minTranslate()) {
  26941. swiper.slideTo(swiper.activeIndex);
  26942. return;
  26943. }
  26944. if (currentPos > -swiper.maxTranslate()) {
  26945. if (swiper.slides.length < snapGrid.length) {
  26946. swiper.slideTo(snapGrid.length - 1);
  26947. } else {
  26948. swiper.slideTo(swiper.slides.length - 1);
  26949. }
  26950. return;
  26951. }
  26952. if (params.freeModeMomentum) {
  26953. if (data.velocities.length > 1) {
  26954. var lastMoveEvent = data.velocities.pop();
  26955. var velocityEvent = data.velocities.pop();
  26956. var distance = lastMoveEvent.position - velocityEvent.position;
  26957. var time = lastMoveEvent.time - velocityEvent.time;
  26958. swiper.velocity = distance / time;
  26959. swiper.velocity /= 2;
  26960. if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
  26961. swiper.velocity = 0;
  26962. }
  26963. // this implies that the user stopped moving a finger then released.
  26964. // There would be no events with distance zero, so the last event is stale.
  26965. if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
  26966. swiper.velocity = 0;
  26967. }
  26968. } else {
  26969. swiper.velocity = 0;
  26970. }
  26971. swiper.velocity *= params.freeModeMomentumVelocityRatio;
  26972. data.velocities.length = 0;
  26973. var momentumDuration = 1000 * params.freeModeMomentumRatio;
  26974. var momentumDistance = swiper.velocity * momentumDuration;
  26975. var newPosition = swiper.translate + momentumDistance;
  26976. if (rtl) { newPosition = -newPosition; }
  26977. var doBounce = false;
  26978. var afterBouncePosition;
  26979. var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
  26980. var needsLoopFix;
  26981. if (newPosition < swiper.maxTranslate()) {
  26982. if (params.freeModeMomentumBounce) {
  26983. if (newPosition + swiper.maxTranslate() < -bounceAmount) {
  26984. newPosition = swiper.maxTranslate() - bounceAmount;
  26985. }
  26986. afterBouncePosition = swiper.maxTranslate();
  26987. doBounce = true;
  26988. data.allowMomentumBounce = true;
  26989. } else {
  26990. newPosition = swiper.maxTranslate();
  26991. }
  26992. if (params.loop && params.centeredSlides) { needsLoopFix = true; }
  26993. } else if (newPosition > swiper.minTranslate()) {
  26994. if (params.freeModeMomentumBounce) {
  26995. if (newPosition - swiper.minTranslate() > bounceAmount) {
  26996. newPosition = swiper.minTranslate() + bounceAmount;
  26997. }
  26998. afterBouncePosition = swiper.minTranslate();
  26999. doBounce = true;
  27000. data.allowMomentumBounce = true;
  27001. } else {
  27002. newPosition = swiper.minTranslate();
  27003. }
  27004. if (params.loop && params.centeredSlides) { needsLoopFix = true; }
  27005. } else if (params.freeModeSticky) {
  27006. var nextSlide;
  27007. for (var j = 0; j < snapGrid.length; j += 1) {
  27008. if (snapGrid[j] > -newPosition) {
  27009. nextSlide = j;
  27010. break;
  27011. }
  27012. }
  27013. if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
  27014. newPosition = snapGrid[nextSlide];
  27015. } else {
  27016. newPosition = snapGrid[nextSlide - 1];
  27017. }
  27018. newPosition = -newPosition;
  27019. }
  27020. if (needsLoopFix) {
  27021. swiper.once('transitionEnd', function () {
  27022. swiper.loopFix();
  27023. });
  27024. }
  27025. // Fix duration
  27026. if (swiper.velocity !== 0) {
  27027. if (rtl) {
  27028. momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
  27029. } else {
  27030. momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
  27031. }
  27032. if (params.freeModeSticky) {
  27033. // If freeModeSticky is active and the user ends a swipe with a slow-velocity
  27034. // event, then durations can be 20+ seconds to slide one (or zero!) slides.
  27035. // It's easy to see this when simulating touch with mouse events. To fix this,
  27036. // limit single-slide swipes to the default slide duration. This also has the
  27037. // nice side effect of matching slide speed if the user stopped moving before
  27038. // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
  27039. // For faster swipes, also apply limits (albeit higher ones).
  27040. var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
  27041. var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
  27042. if (moveDistance < currentSlideSize) {
  27043. momentumDuration = params.speed;
  27044. } else if (moveDistance < 2 * currentSlideSize) {
  27045. momentumDuration = params.speed * 1.5;
  27046. } else {
  27047. momentumDuration = params.speed * 2.5;
  27048. }
  27049. }
  27050. } else if (params.freeModeSticky) {
  27051. swiper.slideToClosest();
  27052. return;
  27053. }
  27054. if (params.freeModeMomentumBounce && doBounce) {
  27055. swiper.updateProgress(afterBouncePosition);
  27056. swiper.setTransition(momentumDuration);
  27057. swiper.setTranslate(newPosition);
  27058. swiper.transitionStart(true, swiper.swipeDirection);
  27059. swiper.animating = true;
  27060. $wrapperEl.transitionEnd(function () {
  27061. if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
  27062. swiper.emit('momentumBounce');
  27063. swiper.setTransition(params.speed);
  27064. setTimeout(function () {
  27065. swiper.setTranslate(afterBouncePosition);
  27066. $wrapperEl.transitionEnd(function () {
  27067. if (!swiper || swiper.destroyed) { return; }
  27068. swiper.transitionEnd();
  27069. });
  27070. }, 0);
  27071. });
  27072. } else if (swiper.velocity) {
  27073. swiper.updateProgress(newPosition);
  27074. swiper.setTransition(momentumDuration);
  27075. swiper.setTranslate(newPosition);
  27076. swiper.transitionStart(true, swiper.swipeDirection);
  27077. if (!swiper.animating) {
  27078. swiper.animating = true;
  27079. $wrapperEl.transitionEnd(function () {
  27080. if (!swiper || swiper.destroyed) { return; }
  27081. swiper.transitionEnd();
  27082. });
  27083. }
  27084. } else {
  27085. swiper.updateProgress(newPosition);
  27086. }
  27087. swiper.updateActiveIndex();
  27088. swiper.updateSlidesClasses();
  27089. } else if (params.freeModeSticky) {
  27090. swiper.slideToClosest();
  27091. return;
  27092. }
  27093. if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
  27094. swiper.updateProgress();
  27095. swiper.updateActiveIndex();
  27096. swiper.updateSlidesClasses();
  27097. }
  27098. return;
  27099. }
  27100. // Find current slide
  27101. var stopIndex = 0;
  27102. var groupSize = swiper.slidesSizesGrid[0];
  27103. for (var i = 0; i < slidesGrid.length; i += (i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup)) {
  27104. var increment$1 = (i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
  27105. if (typeof slidesGrid[i + increment$1] !== 'undefined') {
  27106. if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment$1]) {
  27107. stopIndex = i;
  27108. groupSize = slidesGrid[i + increment$1] - slidesGrid[i];
  27109. }
  27110. } else if (currentPos >= slidesGrid[i]) {
  27111. stopIndex = i;
  27112. groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
  27113. }
  27114. }
  27115. // Find current slide size
  27116. var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
  27117. var increment = (stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
  27118. if (timeDiff > params.longSwipesMs) {
  27119. // Long touches
  27120. if (!params.longSwipes) {
  27121. swiper.slideTo(swiper.activeIndex);
  27122. return;
  27123. }
  27124. if (swiper.swipeDirection === 'next') {
  27125. if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + increment); }
  27126. else { swiper.slideTo(stopIndex); }
  27127. }
  27128. if (swiper.swipeDirection === 'prev') {
  27129. if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + increment); }
  27130. else { swiper.slideTo(stopIndex); }
  27131. }
  27132. } else {
  27133. // Short swipes
  27134. if (!params.shortSwipes) {
  27135. swiper.slideTo(swiper.activeIndex);
  27136. return;
  27137. }
  27138. var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
  27139. if (!isNavButtonTarget) {
  27140. if (swiper.swipeDirection === 'next') {
  27141. swiper.slideTo(stopIndex + increment);
  27142. }
  27143. if (swiper.swipeDirection === 'prev') {
  27144. swiper.slideTo(stopIndex);
  27145. }
  27146. } else if (e.target === swiper.navigation.nextEl) {
  27147. swiper.slideTo(stopIndex + increment);
  27148. } else {
  27149. swiper.slideTo(stopIndex);
  27150. }
  27151. }
  27152. }
  27153. function onResize () {
  27154. var swiper = this;
  27155. var params = swiper.params;
  27156. var el = swiper.el;
  27157. if (el && el.offsetWidth === 0) { return; }
  27158. // Breakpoints
  27159. if (params.breakpoints) {
  27160. swiper.setBreakpoint();
  27161. }
  27162. // Save locks
  27163. var allowSlideNext = swiper.allowSlideNext;
  27164. var allowSlidePrev = swiper.allowSlidePrev;
  27165. var snapGrid = swiper.snapGrid;
  27166. // Disable locks on resize
  27167. swiper.allowSlideNext = true;
  27168. swiper.allowSlidePrev = true;
  27169. swiper.updateSize();
  27170. swiper.updateSlides();
  27171. swiper.updateSlidesClasses();
  27172. if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
  27173. swiper.slideTo(swiper.slides.length - 1, 0, false, true);
  27174. } else {
  27175. swiper.slideTo(swiper.activeIndex, 0, false, true);
  27176. }
  27177. if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
  27178. swiper.autoplay.run();
  27179. }
  27180. // Return locks after resize
  27181. swiper.allowSlidePrev = allowSlidePrev;
  27182. swiper.allowSlideNext = allowSlideNext;
  27183. if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
  27184. swiper.checkOverflow();
  27185. }
  27186. }
  27187. function onClick (e) {
  27188. var swiper = this;
  27189. if (!swiper.allowClick) {
  27190. if (swiper.params.preventClicks) { e.preventDefault(); }
  27191. if (swiper.params.preventClicksPropagation && swiper.animating) {
  27192. e.stopPropagation();
  27193. e.stopImmediatePropagation();
  27194. }
  27195. }
  27196. }
  27197. function onScroll () {
  27198. var swiper = this;
  27199. var wrapperEl = swiper.wrapperEl;
  27200. var rtlTranslate = swiper.rtlTranslate;
  27201. swiper.previousTranslate = swiper.translate;
  27202. if (swiper.isHorizontal()) {
  27203. if (rtlTranslate) {
  27204. swiper.translate = ((wrapperEl.scrollWidth - wrapperEl.offsetWidth) - wrapperEl.scrollLeft);
  27205. } else {
  27206. swiper.translate = -wrapperEl.scrollLeft;
  27207. }
  27208. } else {
  27209. swiper.translate = -wrapperEl.scrollTop;
  27210. }
  27211. // eslint-disable-next-line
  27212. if (swiper.translate === -0) { swiper.translate = 0; }
  27213. swiper.updateActiveIndex();
  27214. swiper.updateSlidesClasses();
  27215. var newProgress;
  27216. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  27217. if (translatesDiff === 0) {
  27218. newProgress = 0;
  27219. } else {
  27220. newProgress = (swiper.translate - swiper.minTranslate()) / (translatesDiff);
  27221. }
  27222. if (newProgress !== swiper.progress) {
  27223. swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
  27224. }
  27225. swiper.emit('setTranslate', swiper.translate, false);
  27226. }
  27227. var dummyEventAttached = false;
  27228. function dummyEventListener() {}
  27229. function attachEvents() {
  27230. var swiper = this;
  27231. var params = swiper.params;
  27232. var touchEvents = swiper.touchEvents;
  27233. var el = swiper.el;
  27234. var wrapperEl = swiper.wrapperEl;
  27235. swiper.onTouchStart = onTouchStart.bind(swiper);
  27236. swiper.onTouchMove = onTouchMove.bind(swiper);
  27237. swiper.onTouchEnd = onTouchEnd.bind(swiper);
  27238. if (params.cssMode) {
  27239. swiper.onScroll = onScroll.bind(swiper);
  27240. }
  27241. swiper.onClick = onClick.bind(swiper);
  27242. var capture = !!params.nested;
  27243. // Touch Events
  27244. if (!Support.touch && Support.pointerEvents) {
  27245. el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
  27246. doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
  27247. doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
  27248. } else {
  27249. if (Support.touch) {
  27250. var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  27251. el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
  27252. el.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
  27253. el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
  27254. if (touchEvents.cancel) {
  27255. el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
  27256. }
  27257. if (!dummyEventAttached) {
  27258. doc.addEventListener('touchstart', dummyEventListener);
  27259. dummyEventAttached = true;
  27260. }
  27261. }
  27262. if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
  27263. el.addEventListener('mousedown', swiper.onTouchStart, false);
  27264. doc.addEventListener('mousemove', swiper.onTouchMove, capture);
  27265. doc.addEventListener('mouseup', swiper.onTouchEnd, false);
  27266. }
  27267. }
  27268. // Prevent Links Clicks
  27269. if (params.preventClicks || params.preventClicksPropagation) {
  27270. el.addEventListener('click', swiper.onClick, true);
  27271. }
  27272. if (params.cssMode) {
  27273. wrapperEl.addEventListener('scroll', swiper.onScroll);
  27274. }
  27275. // Resize handler
  27276. if (params.updateOnWindowResize) {
  27277. swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
  27278. } else {
  27279. swiper.on('observerUpdate', onResize, true);
  27280. }
  27281. }
  27282. function detachEvents() {
  27283. var swiper = this;
  27284. var params = swiper.params;
  27285. var touchEvents = swiper.touchEvents;
  27286. var el = swiper.el;
  27287. var wrapperEl = swiper.wrapperEl;
  27288. var capture = !!params.nested;
  27289. // Touch Events
  27290. if (!Support.touch && Support.pointerEvents) {
  27291. el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
  27292. doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
  27293. doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
  27294. } else {
  27295. if (Support.touch) {
  27296. var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  27297. el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
  27298. el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
  27299. el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
  27300. if (touchEvents.cancel) {
  27301. el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
  27302. }
  27303. }
  27304. if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
  27305. el.removeEventListener('mousedown', swiper.onTouchStart, false);
  27306. doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
  27307. doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
  27308. }
  27309. }
  27310. // Prevent Links Clicks
  27311. if (params.preventClicks || params.preventClicksPropagation) {
  27312. el.removeEventListener('click', swiper.onClick, true);
  27313. }
  27314. if (params.cssMode) {
  27315. wrapperEl.removeEventListener('scroll', swiper.onScroll);
  27316. }
  27317. // Resize handler
  27318. swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
  27319. }
  27320. var events = {
  27321. attachEvents: attachEvents,
  27322. detachEvents: detachEvents,
  27323. };
  27324. function setBreakpoint () {
  27325. var swiper = this;
  27326. var activeIndex = swiper.activeIndex;
  27327. var initialized = swiper.initialized;
  27328. var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
  27329. var params = swiper.params;
  27330. var $el = swiper.$el;
  27331. var breakpoints = params.breakpoints;
  27332. if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
  27333. // Get breakpoint for window width and update parameters
  27334. var breakpoint = swiper.getBreakpoint(breakpoints);
  27335. if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
  27336. var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
  27337. if (breakpointOnlyParams) {
  27338. ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
  27339. var paramValue = breakpointOnlyParams[param];
  27340. if (typeof paramValue === 'undefined') { return; }
  27341. if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
  27342. breakpointOnlyParams[param] = 'auto';
  27343. } else if (param === 'slidesPerView') {
  27344. breakpointOnlyParams[param] = parseFloat(paramValue);
  27345. } else {
  27346. breakpointOnlyParams[param] = parseInt(paramValue, 10);
  27347. }
  27348. });
  27349. }
  27350. var breakpointParams = breakpointOnlyParams || swiper.originalParams;
  27351. var wasMultiRow = params.slidesPerColumn > 1;
  27352. var isMultiRow = breakpointParams.slidesPerColumn > 1;
  27353. if (wasMultiRow && !isMultiRow) {
  27354. $el.removeClass(((params.containerModifierClass) + "multirow " + (params.containerModifierClass) + "multirow-column"));
  27355. } else if (!wasMultiRow && isMultiRow) {
  27356. $el.addClass(((params.containerModifierClass) + "multirow"));
  27357. if (breakpointParams.slidesPerColumnFill === 'column') {
  27358. $el.addClass(((params.containerModifierClass) + "multirow-column"));
  27359. }
  27360. }
  27361. var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
  27362. var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
  27363. if (directionChanged && initialized) {
  27364. swiper.changeDirection();
  27365. }
  27366. Utils.extend(swiper.params, breakpointParams);
  27367. Utils.extend(swiper, {
  27368. allowTouchMove: swiper.params.allowTouchMove,
  27369. allowSlideNext: swiper.params.allowSlideNext,
  27370. allowSlidePrev: swiper.params.allowSlidePrev,
  27371. });
  27372. swiper.currentBreakpoint = breakpoint;
  27373. if (needsReLoop && initialized) {
  27374. swiper.loopDestroy();
  27375. swiper.loopCreate();
  27376. swiper.updateSlides();
  27377. swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
  27378. }
  27379. swiper.emit('breakpoint', breakpointParams);
  27380. }
  27381. }
  27382. function getBreakpoint (breakpoints) {
  27383. // Get breakpoint for window width
  27384. if (!breakpoints) { return undefined; }
  27385. var breakpoint = false;
  27386. var points = Object.keys(breakpoints).map(function (point) {
  27387. if (typeof point === 'string' && point.indexOf('@') === 0) {
  27388. var minRatio = parseFloat(point.substr(1));
  27389. var value = win.innerHeight * minRatio;
  27390. return { value: value, point: point };
  27391. }
  27392. return { value: point, point: point };
  27393. });
  27394. points.sort(function (a, b) { return parseInt(a.value, 10) - parseInt(b.value, 10); });
  27395. for (var i = 0; i < points.length; i += 1) {
  27396. var ref = points[i];
  27397. var point = ref.point;
  27398. var value = ref.value;
  27399. if (value <= win.innerWidth) {
  27400. breakpoint = point;
  27401. }
  27402. }
  27403. return breakpoint || 'max';
  27404. }
  27405. var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
  27406. function addClasses () {
  27407. var swiper = this;
  27408. var classNames = swiper.classNames;
  27409. var params = swiper.params;
  27410. var rtl = swiper.rtl;
  27411. var $el = swiper.$el;
  27412. var suffixes = [];
  27413. suffixes.push('initialized');
  27414. suffixes.push(params.direction);
  27415. if (params.freeMode) {
  27416. suffixes.push('free-mode');
  27417. }
  27418. if (params.autoHeight) {
  27419. suffixes.push('autoheight');
  27420. }
  27421. if (rtl) {
  27422. suffixes.push('rtl');
  27423. }
  27424. if (params.slidesPerColumn > 1) {
  27425. suffixes.push('multirow');
  27426. if (params.slidesPerColumnFill === 'column') {
  27427. suffixes.push('multirow-column');
  27428. }
  27429. }
  27430. if (Device.android) {
  27431. suffixes.push('android');
  27432. }
  27433. if (Device.ios) {
  27434. suffixes.push('ios');
  27435. }
  27436. if (params.cssMode) {
  27437. suffixes.push('css-mode');
  27438. }
  27439. suffixes.forEach(function (suffix) {
  27440. classNames.push(params.containerModifierClass + suffix);
  27441. });
  27442. $el.addClass(classNames.join(' '));
  27443. }
  27444. function removeClasses () {
  27445. var swiper = this;
  27446. var $el = swiper.$el;
  27447. var classNames = swiper.classNames;
  27448. $el.removeClass(classNames.join(' '));
  27449. }
  27450. var classes = { addClasses: addClasses, removeClasses: removeClasses };
  27451. function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
  27452. var image;
  27453. function onReady() {
  27454. if (callback) { callback(); }
  27455. }
  27456. var isPicture = $(imageEl).parent('picture')[0];
  27457. if (!isPicture && (!imageEl.complete || !checkForComplete)) {
  27458. if (src) {
  27459. image = new win.Image();
  27460. image.onload = onReady;
  27461. image.onerror = onReady;
  27462. if (sizes) {
  27463. image.sizes = sizes;
  27464. }
  27465. if (srcset) {
  27466. image.srcset = srcset;
  27467. }
  27468. if (src) {
  27469. image.src = src;
  27470. }
  27471. } else {
  27472. onReady();
  27473. }
  27474. } else {
  27475. // image already loaded...
  27476. onReady();
  27477. }
  27478. }
  27479. function preloadImages () {
  27480. var swiper = this;
  27481. swiper.imagesToLoad = swiper.$el.find('img');
  27482. function onReady() {
  27483. if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
  27484. if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
  27485. if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
  27486. if (swiper.params.updateOnImagesReady) { swiper.update(); }
  27487. swiper.emit('imagesReady');
  27488. }
  27489. }
  27490. for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
  27491. var imageEl = swiper.imagesToLoad[i];
  27492. swiper.loadImage(
  27493. imageEl,
  27494. imageEl.currentSrc || imageEl.getAttribute('src'),
  27495. imageEl.srcset || imageEl.getAttribute('srcset'),
  27496. imageEl.sizes || imageEl.getAttribute('sizes'),
  27497. true,
  27498. onReady
  27499. );
  27500. }
  27501. }
  27502. var images = {
  27503. loadImage: loadImage,
  27504. preloadImages: preloadImages,
  27505. };
  27506. function checkOverflow() {
  27507. var swiper = this;
  27508. var params = swiper.params;
  27509. var wasLocked = swiper.isLocked;
  27510. var lastSlidePosition = swiper.slides.length > 0 && (params.slidesOffsetBefore + (params.spaceBetween * (swiper.slides.length - 1)) + ((swiper.slides[0]).offsetWidth) * swiper.slides.length);
  27511. if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
  27512. swiper.isLocked = lastSlidePosition <= swiper.size;
  27513. } else {
  27514. swiper.isLocked = swiper.snapGrid.length === 1;
  27515. }
  27516. swiper.allowSlideNext = !swiper.isLocked;
  27517. swiper.allowSlidePrev = !swiper.isLocked;
  27518. // events
  27519. if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
  27520. if (wasLocked && wasLocked !== swiper.isLocked) {
  27521. swiper.isEnd = false;
  27522. swiper.navigation.update();
  27523. }
  27524. }
  27525. var checkOverflow$1 = { checkOverflow: checkOverflow };
  27526. var defaults = {
  27527. init: true,
  27528. direction: 'horizontal',
  27529. touchEventsTarget: 'container',
  27530. initialSlide: 0,
  27531. speed: 300,
  27532. cssMode: false,
  27533. updateOnWindowResize: true,
  27534. //
  27535. preventInteractionOnTransition: false,
  27536. // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
  27537. edgeSwipeDetection: false,
  27538. edgeSwipeThreshold: 20,
  27539. // Free mode
  27540. freeMode: false,
  27541. freeModeMomentum: true,
  27542. freeModeMomentumRatio: 1,
  27543. freeModeMomentumBounce: true,
  27544. freeModeMomentumBounceRatio: 1,
  27545. freeModeMomentumVelocityRatio: 1,
  27546. freeModeSticky: false,
  27547. freeModeMinimumVelocity: 0.02,
  27548. // Autoheight
  27549. autoHeight: false,
  27550. // Set wrapper width
  27551. setWrapperSize: false,
  27552. // Virtual Translate
  27553. virtualTranslate: false,
  27554. // Effects
  27555. effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
  27556. // Breakpoints
  27557. breakpoints: undefined,
  27558. // Slides grid
  27559. spaceBetween: 0,
  27560. slidesPerView: 1,
  27561. slidesPerColumn: 1,
  27562. slidesPerColumnFill: 'column',
  27563. slidesPerGroup: 1,
  27564. slidesPerGroupSkip: 0,
  27565. centeredSlides: false,
  27566. centeredSlidesBounds: false,
  27567. slidesOffsetBefore: 0, // in px
  27568. slidesOffsetAfter: 0, // in px
  27569. normalizeSlideIndex: true,
  27570. centerInsufficientSlides: false,
  27571. // Disable swiper and hide navigation when container not overflow
  27572. watchOverflow: false,
  27573. // Round length
  27574. roundLengths: false,
  27575. // Touches
  27576. touchRatio: 1,
  27577. touchAngle: 45,
  27578. simulateTouch: true,
  27579. shortSwipes: true,
  27580. longSwipes: true,
  27581. longSwipesRatio: 0.5,
  27582. longSwipesMs: 300,
  27583. followFinger: true,
  27584. allowTouchMove: true,
  27585. threshold: 0,
  27586. touchMoveStopPropagation: false,
  27587. touchStartPreventDefault: true,
  27588. touchStartForcePreventDefault: false,
  27589. touchReleaseOnEdges: false,
  27590. // Unique Navigation Elements
  27591. uniqueNavElements: true,
  27592. // Resistance
  27593. resistance: true,
  27594. resistanceRatio: 0.85,
  27595. // Progress
  27596. watchSlidesProgress: false,
  27597. watchSlidesVisibility: false,
  27598. // Cursor
  27599. grabCursor: false,
  27600. // Clicks
  27601. preventClicks: true,
  27602. preventClicksPropagation: true,
  27603. slideToClickedSlide: false,
  27604. // Images
  27605. preloadImages: true,
  27606. updateOnImagesReady: true,
  27607. // loop
  27608. loop: false,
  27609. loopAdditionalSlides: 0,
  27610. loopedSlides: null,
  27611. loopFillGroupWithBlank: false,
  27612. // Swiping/no swiping
  27613. allowSlidePrev: true,
  27614. allowSlideNext: true,
  27615. swipeHandler: null, // '.swipe-handler',
  27616. noSwiping: true,
  27617. noSwipingClass: 'swiper-no-swiping',
  27618. noSwipingSelector: null,
  27619. // Passive Listeners
  27620. passiveListeners: true,
  27621. // NS
  27622. containerModifierClass: 'swiper-container-', // NEW
  27623. slideClass: 'swiper-slide',
  27624. slideBlankClass: 'swiper-slide-invisible-blank',
  27625. slideActiveClass: 'swiper-slide-active',
  27626. slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
  27627. slideVisibleClass: 'swiper-slide-visible',
  27628. slideDuplicateClass: 'swiper-slide-duplicate',
  27629. slideNextClass: 'swiper-slide-next',
  27630. slideDuplicateNextClass: 'swiper-slide-duplicate-next',
  27631. slidePrevClass: 'swiper-slide-prev',
  27632. slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
  27633. wrapperClass: 'swiper-wrapper',
  27634. // Callbacks
  27635. runCallbacksOnInit: true,
  27636. };
  27637. /* eslint no-param-reassign: "off" */
  27638. var prototypes = {
  27639. update: update,
  27640. translate: translate,
  27641. transition: transition$1,
  27642. slide: slide,
  27643. loop: loop,
  27644. grabCursor: grabCursor,
  27645. manipulation: manipulation,
  27646. events: events,
  27647. breakpoints: breakpoints,
  27648. checkOverflow: checkOverflow$1,
  27649. classes: classes,
  27650. images: images,
  27651. };
  27652. var extendedDefaults = {};
  27653. var Swiper = /*@__PURE__*/(function (SwiperClass) {
  27654. function Swiper() {
  27655. var assign;
  27656. var args = [], len = arguments.length;
  27657. while ( len-- ) args[ len ] = arguments[ len ];
  27658. var el;
  27659. var params;
  27660. if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
  27661. params = args[0];
  27662. } else {
  27663. (assign = args, el = assign[0], params = assign[1]);
  27664. }
  27665. if (!params) { params = {}; }
  27666. params = Utils.extend({}, params);
  27667. if (el && !params.el) { params.el = el; }
  27668. SwiperClass.call(this, params);
  27669. Object.keys(prototypes).forEach(function (prototypeGroup) {
  27670. Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
  27671. if (!Swiper.prototype[protoMethod]) {
  27672. Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
  27673. }
  27674. });
  27675. });
  27676. // Swiper Instance
  27677. var swiper = this;
  27678. if (typeof swiper.modules === 'undefined') {
  27679. swiper.modules = {};
  27680. }
  27681. Object.keys(swiper.modules).forEach(function (moduleName) {
  27682. var module = swiper.modules[moduleName];
  27683. if (module.params) {
  27684. var moduleParamName = Object.keys(module.params)[0];
  27685. var moduleParams = module.params[moduleParamName];
  27686. if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
  27687. if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
  27688. if (params[moduleParamName] === true) {
  27689. params[moduleParamName] = { enabled: true };
  27690. }
  27691. if (
  27692. typeof params[moduleParamName] === 'object'
  27693. && !('enabled' in params[moduleParamName])
  27694. ) {
  27695. params[moduleParamName].enabled = true;
  27696. }
  27697. if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
  27698. }
  27699. });
  27700. // Extend defaults with modules params
  27701. var swiperParams = Utils.extend({}, defaults);
  27702. swiper.useModulesParams(swiperParams);
  27703. // Extend defaults with passed params
  27704. swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
  27705. swiper.originalParams = Utils.extend({}, swiper.params);
  27706. swiper.passedParams = Utils.extend({}, params);
  27707. // Save Dom lib
  27708. swiper.$ = $;
  27709. // Find el
  27710. var $el = $(swiper.params.el);
  27711. el = $el[0];
  27712. if (!el) {
  27713. return undefined;
  27714. }
  27715. if ($el.length > 1) {
  27716. var swipers = [];
  27717. $el.each(function (index, containerEl) {
  27718. var newParams = Utils.extend({}, params, { el: containerEl });
  27719. swipers.push(new Swiper(newParams));
  27720. });
  27721. return swipers;
  27722. }
  27723. el.swiper = swiper;
  27724. $el.data('swiper', swiper);
  27725. // Find Wrapper
  27726. var $wrapperEl;
  27727. if (el && el.shadowRoot && el.shadowRoot.querySelector) {
  27728. $wrapperEl = $(el.shadowRoot.querySelector(("." + (swiper.params.wrapperClass))));
  27729. // Children needs to return slot items
  27730. $wrapperEl.children = function (options) { return $el.children(options); };
  27731. } else {
  27732. $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
  27733. }
  27734. // Extend Swiper
  27735. Utils.extend(swiper, {
  27736. $el: $el,
  27737. el: el,
  27738. $wrapperEl: $wrapperEl,
  27739. wrapperEl: $wrapperEl[0],
  27740. // Classes
  27741. classNames: [],
  27742. // Slides
  27743. slides: $(),
  27744. slidesGrid: [],
  27745. snapGrid: [],
  27746. slidesSizesGrid: [],
  27747. // isDirection
  27748. isHorizontal: function isHorizontal() {
  27749. return swiper.params.direction === 'horizontal';
  27750. },
  27751. isVertical: function isVertical() {
  27752. return swiper.params.direction === 'vertical';
  27753. },
  27754. // RTL
  27755. rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
  27756. rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
  27757. wrongRTL: $wrapperEl.css('display') === '-webkit-box',
  27758. // Indexes
  27759. activeIndex: 0,
  27760. realIndex: 0,
  27761. //
  27762. isBeginning: true,
  27763. isEnd: false,
  27764. // Props
  27765. translate: 0,
  27766. previousTranslate: 0,
  27767. progress: 0,
  27768. velocity: 0,
  27769. animating: false,
  27770. // Locks
  27771. allowSlideNext: swiper.params.allowSlideNext,
  27772. allowSlidePrev: swiper.params.allowSlidePrev,
  27773. // Touch Events
  27774. touchEvents: (function touchEvents() {
  27775. var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
  27776. var desktop = ['mousedown', 'mousemove', 'mouseup'];
  27777. if (Support.pointerEvents) {
  27778. desktop = ['pointerdown', 'pointermove', 'pointerup'];
  27779. }
  27780. swiper.touchEventsTouch = {
  27781. start: touch[0],
  27782. move: touch[1],
  27783. end: touch[2],
  27784. cancel: touch[3],
  27785. };
  27786. swiper.touchEventsDesktop = {
  27787. start: desktop[0],
  27788. move: desktop[1],
  27789. end: desktop[2],
  27790. };
  27791. return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
  27792. }()),
  27793. touchEventsData: {
  27794. isTouched: undefined,
  27795. isMoved: undefined,
  27796. allowTouchCallbacks: undefined,
  27797. touchStartTime: undefined,
  27798. isScrolling: undefined,
  27799. currentTranslate: undefined,
  27800. startTranslate: undefined,
  27801. allowThresholdMove: undefined,
  27802. // Form elements to match
  27803. formElements: 'input, select, option, textarea, button, video, label',
  27804. // Last click time
  27805. lastClickTime: Utils.now(),
  27806. clickTimeout: undefined,
  27807. // Velocities
  27808. velocities: [],
  27809. allowMomentumBounce: undefined,
  27810. isTouchEvent: undefined,
  27811. startMoving: undefined,
  27812. },
  27813. // Clicks
  27814. allowClick: true,
  27815. // Touches
  27816. allowTouchMove: swiper.params.allowTouchMove,
  27817. touches: {
  27818. startX: 0,
  27819. startY: 0,
  27820. currentX: 0,
  27821. currentY: 0,
  27822. diff: 0,
  27823. },
  27824. // Images
  27825. imagesToLoad: [],
  27826. imagesLoaded: 0,
  27827. });
  27828. // Install Modules
  27829. swiper.useModules();
  27830. // Init
  27831. if (swiper.params.init) {
  27832. swiper.init();
  27833. }
  27834. // Return app instance
  27835. return swiper;
  27836. }
  27837. if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
  27838. Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
  27839. Swiper.prototype.constructor = Swiper;
  27840. var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
  27841. Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
  27842. var swiper = this;
  27843. var params = swiper.params;
  27844. var slides = swiper.slides;
  27845. var slidesGrid = swiper.slidesGrid;
  27846. var swiperSize = swiper.size;
  27847. var activeIndex = swiper.activeIndex;
  27848. var spv = 1;
  27849. if (params.centeredSlides) {
  27850. var slideSize = slides[activeIndex].swiperSlideSize;
  27851. var breakLoop;
  27852. for (var i = activeIndex + 1; i < slides.length; i += 1) {
  27853. if (slides[i] && !breakLoop) {
  27854. slideSize += slides[i].swiperSlideSize;
  27855. spv += 1;
  27856. if (slideSize > swiperSize) { breakLoop = true; }
  27857. }
  27858. }
  27859. for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
  27860. if (slides[i$1] && !breakLoop) {
  27861. slideSize += slides[i$1].swiperSlideSize;
  27862. spv += 1;
  27863. if (slideSize > swiperSize) { breakLoop = true; }
  27864. }
  27865. }
  27866. } else {
  27867. for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
  27868. if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
  27869. spv += 1;
  27870. }
  27871. }
  27872. }
  27873. return spv;
  27874. };
  27875. Swiper.prototype.update = function update () {
  27876. var swiper = this;
  27877. if (!swiper || swiper.destroyed) { return; }
  27878. var snapGrid = swiper.snapGrid;
  27879. var params = swiper.params;
  27880. // Breakpoints
  27881. if (params.breakpoints) {
  27882. swiper.setBreakpoint();
  27883. }
  27884. swiper.updateSize();
  27885. swiper.updateSlides();
  27886. swiper.updateProgress();
  27887. swiper.updateSlidesClasses();
  27888. function setTranslate() {
  27889. var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
  27890. var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
  27891. swiper.setTranslate(newTranslate);
  27892. swiper.updateActiveIndex();
  27893. swiper.updateSlidesClasses();
  27894. }
  27895. var translated;
  27896. if (swiper.params.freeMode) {
  27897. setTranslate();
  27898. if (swiper.params.autoHeight) {
  27899. swiper.updateAutoHeight();
  27900. }
  27901. } else {
  27902. if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
  27903. translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
  27904. } else {
  27905. translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
  27906. }
  27907. if (!translated) {
  27908. setTranslate();
  27909. }
  27910. }
  27911. if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
  27912. swiper.checkOverflow();
  27913. }
  27914. swiper.emit('update');
  27915. };
  27916. Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
  27917. if ( needUpdate === void 0 ) needUpdate = true;
  27918. var swiper = this;
  27919. var currentDirection = swiper.params.direction;
  27920. if (!newDirection) {
  27921. // eslint-disable-next-line
  27922. newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
  27923. }
  27924. if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
  27925. return swiper;
  27926. }
  27927. swiper.$el
  27928. .removeClass(("" + (swiper.params.containerModifierClass) + currentDirection))
  27929. .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
  27930. swiper.params.direction = newDirection;
  27931. swiper.slides.each(function (slideIndex, slideEl) {
  27932. if (newDirection === 'vertical') {
  27933. slideEl.style.width = '';
  27934. } else {
  27935. slideEl.style.height = '';
  27936. }
  27937. });
  27938. swiper.emit('changeDirection');
  27939. if (needUpdate) { swiper.update(); }
  27940. return swiper;
  27941. };
  27942. Swiper.prototype.init = function init () {
  27943. var swiper = this;
  27944. if (swiper.initialized) { return; }
  27945. swiper.emit('beforeInit');
  27946. // Set breakpoint
  27947. if (swiper.params.breakpoints) {
  27948. swiper.setBreakpoint();
  27949. }
  27950. // Add Classes
  27951. swiper.addClasses();
  27952. // Create loop
  27953. if (swiper.params.loop) {
  27954. swiper.loopCreate();
  27955. }
  27956. // Update size
  27957. swiper.updateSize();
  27958. // Update slides
  27959. swiper.updateSlides();
  27960. if (swiper.params.watchOverflow) {
  27961. swiper.checkOverflow();
  27962. }
  27963. // Set Grab Cursor
  27964. if (swiper.params.grabCursor) {
  27965. swiper.setGrabCursor();
  27966. }
  27967. if (swiper.params.preloadImages) {
  27968. swiper.preloadImages();
  27969. }
  27970. // Slide To Initial Slide
  27971. if (swiper.params.loop) {
  27972. swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
  27973. } else {
  27974. swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
  27975. }
  27976. // Attach events
  27977. swiper.attachEvents();
  27978. // Init Flag
  27979. swiper.initialized = true;
  27980. // Emit
  27981. swiper.emit('init');
  27982. };
  27983. Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
  27984. if ( deleteInstance === void 0 ) deleteInstance = true;
  27985. if ( cleanStyles === void 0 ) cleanStyles = true;
  27986. var swiper = this;
  27987. var params = swiper.params;
  27988. var $el = swiper.$el;
  27989. var $wrapperEl = swiper.$wrapperEl;
  27990. var slides = swiper.slides;
  27991. if (typeof swiper.params === 'undefined' || swiper.destroyed) {
  27992. return null;
  27993. }
  27994. swiper.emit('beforeDestroy');
  27995. // Init Flag
  27996. swiper.initialized = false;
  27997. // Detach events
  27998. swiper.detachEvents();
  27999. // Destroy loop
  28000. if (params.loop) {
  28001. swiper.loopDestroy();
  28002. }
  28003. // Cleanup styles
  28004. if (cleanStyles) {
  28005. swiper.removeClasses();
  28006. $el.removeAttr('style');
  28007. $wrapperEl.removeAttr('style');
  28008. if (slides && slides.length) {
  28009. slides
  28010. .removeClass([
  28011. params.slideVisibleClass,
  28012. params.slideActiveClass,
  28013. params.slideNextClass,
  28014. params.slidePrevClass ].join(' '))
  28015. .removeAttr('style')
  28016. .removeAttr('data-swiper-slide-index');
  28017. }
  28018. }
  28019. swiper.emit('destroy');
  28020. // Detach emitter events
  28021. Object.keys(swiper.eventsListeners).forEach(function (eventName) {
  28022. swiper.off(eventName);
  28023. });
  28024. if (deleteInstance !== false) {
  28025. swiper.$el[0].swiper = null;
  28026. swiper.$el.data('swiper', null);
  28027. Utils.deleteProps(swiper);
  28028. }
  28029. swiper.destroyed = true;
  28030. return null;
  28031. };
  28032. Swiper.extendDefaults = function extendDefaults (newDefaults) {
  28033. Utils.extend(extendedDefaults, newDefaults);
  28034. };
  28035. staticAccessors.extendedDefaults.get = function () {
  28036. return extendedDefaults;
  28037. };
  28038. staticAccessors.defaults.get = function () {
  28039. return defaults;
  28040. };
  28041. staticAccessors.Class.get = function () {
  28042. return SwiperClass;
  28043. };
  28044. staticAccessors.$.get = function () {
  28045. return $;
  28046. };
  28047. Object.defineProperties( Swiper, staticAccessors );
  28048. return Swiper;
  28049. }(Framework7Class));
  28050. var Device$1 = {
  28051. name: 'device',
  28052. proto: {
  28053. device: Device,
  28054. },
  28055. static: {
  28056. device: Device,
  28057. },
  28058. };
  28059. var Support$1 = {
  28060. name: 'support',
  28061. proto: {
  28062. support: Support,
  28063. },
  28064. static: {
  28065. support: Support,
  28066. },
  28067. };
  28068. var Browser = (function Browser() {
  28069. function isSafari() {
  28070. var ua = win.navigator.userAgent.toLowerCase();
  28071. return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
  28072. }
  28073. return {
  28074. isEdge: !!win.navigator.userAgent.match(/Edge/g),
  28075. isSafari: isSafari(),
  28076. isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
  28077. };
  28078. }());
  28079. var Browser$1 = {
  28080. name: 'browser',
  28081. proto: {
  28082. browser: Browser,
  28083. },
  28084. static: {
  28085. browser: Browser,
  28086. },
  28087. };
  28088. var Resize = {
  28089. name: 'resize',
  28090. create: function create() {
  28091. var swiper = this;
  28092. Utils.extend(swiper, {
  28093. resize: {
  28094. resizeHandler: function resizeHandler() {
  28095. if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
  28096. swiper.emit('beforeResize');
  28097. swiper.emit('resize');
  28098. },
  28099. orientationChangeHandler: function orientationChangeHandler() {
  28100. if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
  28101. swiper.emit('orientationchange');
  28102. },
  28103. },
  28104. });
  28105. },
  28106. on: {
  28107. init: function init() {
  28108. var swiper = this;
  28109. // Emit resize
  28110. win.addEventListener('resize', swiper.resize.resizeHandler);
  28111. // Emit orientationchange
  28112. win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
  28113. },
  28114. destroy: function destroy() {
  28115. var swiper = this;
  28116. win.removeEventListener('resize', swiper.resize.resizeHandler);
  28117. win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
  28118. },
  28119. },
  28120. };
  28121. var Observer = {
  28122. func: win.MutationObserver || win.WebkitMutationObserver,
  28123. attach: function attach(target, options) {
  28124. if ( options === void 0 ) options = {};
  28125. var swiper = this;
  28126. var ObserverFunc = Observer.func;
  28127. var observer = new ObserverFunc(function (mutations) {
  28128. // The observerUpdate event should only be triggered
  28129. // once despite the number of mutations. Additional
  28130. // triggers are redundant and are very costly
  28131. if (mutations.length === 1) {
  28132. swiper.emit('observerUpdate', mutations[0]);
  28133. return;
  28134. }
  28135. var observerUpdate = function observerUpdate() {
  28136. swiper.emit('observerUpdate', mutations[0]);
  28137. };
  28138. if (win.requestAnimationFrame) {
  28139. win.requestAnimationFrame(observerUpdate);
  28140. } else {
  28141. win.setTimeout(observerUpdate, 0);
  28142. }
  28143. });
  28144. observer.observe(target, {
  28145. attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
  28146. childList: typeof options.childList === 'undefined' ? true : options.childList,
  28147. characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
  28148. });
  28149. swiper.observer.observers.push(observer);
  28150. },
  28151. init: function init() {
  28152. var swiper = this;
  28153. if (!Support.observer || !swiper.params.observer) { return; }
  28154. if (swiper.params.observeParents) {
  28155. var containerParents = swiper.$el.parents();
  28156. for (var i = 0; i < containerParents.length; i += 1) {
  28157. swiper.observer.attach(containerParents[i]);
  28158. }
  28159. }
  28160. // Observe container
  28161. swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
  28162. // Observe wrapper
  28163. swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
  28164. },
  28165. destroy: function destroy() {
  28166. var swiper = this;
  28167. swiper.observer.observers.forEach(function (observer) {
  28168. observer.disconnect();
  28169. });
  28170. swiper.observer.observers = [];
  28171. },
  28172. };
  28173. var Observer$1 = {
  28174. name: 'observer',
  28175. params: {
  28176. observer: false,
  28177. observeParents: false,
  28178. observeSlideChildren: false,
  28179. },
  28180. create: function create() {
  28181. var swiper = this;
  28182. Utils.extend(swiper, {
  28183. observer: {
  28184. init: Observer.init.bind(swiper),
  28185. attach: Observer.attach.bind(swiper),
  28186. destroy: Observer.destroy.bind(swiper),
  28187. observers: [],
  28188. },
  28189. });
  28190. },
  28191. on: {
  28192. init: function init() {
  28193. var swiper = this;
  28194. swiper.observer.init();
  28195. },
  28196. destroy: function destroy() {
  28197. var swiper = this;
  28198. swiper.observer.destroy();
  28199. },
  28200. },
  28201. };
  28202. var Virtual = {
  28203. update: function update(force) {
  28204. var swiper = this;
  28205. var ref = swiper.params;
  28206. var slidesPerView = ref.slidesPerView;
  28207. var slidesPerGroup = ref.slidesPerGroup;
  28208. var centeredSlides = ref.centeredSlides;
  28209. var ref$1 = swiper.params.virtual;
  28210. var addSlidesBefore = ref$1.addSlidesBefore;
  28211. var addSlidesAfter = ref$1.addSlidesAfter;
  28212. var ref$2 = swiper.virtual;
  28213. var previousFrom = ref$2.from;
  28214. var previousTo = ref$2.to;
  28215. var slides = ref$2.slides;
  28216. var previousSlidesGrid = ref$2.slidesGrid;
  28217. var renderSlide = ref$2.renderSlide;
  28218. var previousOffset = ref$2.offset;
  28219. swiper.updateActiveIndex();
  28220. var activeIndex = swiper.activeIndex || 0;
  28221. var offsetProp;
  28222. if (swiper.rtlTranslate) { offsetProp = 'right'; }
  28223. else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
  28224. var slidesAfter;
  28225. var slidesBefore;
  28226. if (centeredSlides) {
  28227. slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
  28228. slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
  28229. } else {
  28230. slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
  28231. slidesBefore = slidesPerGroup + addSlidesAfter;
  28232. }
  28233. var from = Math.max((activeIndex || 0) - slidesBefore, 0);
  28234. var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
  28235. var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
  28236. Utils.extend(swiper.virtual, {
  28237. from: from,
  28238. to: to,
  28239. offset: offset,
  28240. slidesGrid: swiper.slidesGrid,
  28241. });
  28242. function onRendered() {
  28243. swiper.updateSlides();
  28244. swiper.updateProgress();
  28245. swiper.updateSlidesClasses();
  28246. if (swiper.lazy && swiper.params.lazy.enabled) {
  28247. swiper.lazy.load();
  28248. }
  28249. }
  28250. if (previousFrom === from && previousTo === to && !force) {
  28251. if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
  28252. swiper.slides.css(offsetProp, (offset + "px"));
  28253. }
  28254. swiper.updateProgress();
  28255. return;
  28256. }
  28257. if (swiper.params.virtual.renderExternal) {
  28258. swiper.params.virtual.renderExternal.call(swiper, {
  28259. offset: offset,
  28260. from: from,
  28261. to: to,
  28262. slides: (function getSlides() {
  28263. var slidesToRender = [];
  28264. for (var i = from; i <= to; i += 1) {
  28265. slidesToRender.push(slides[i]);
  28266. }
  28267. return slidesToRender;
  28268. }()),
  28269. });
  28270. onRendered();
  28271. return;
  28272. }
  28273. var prependIndexes = [];
  28274. var appendIndexes = [];
  28275. if (force) {
  28276. swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
  28277. } else {
  28278. for (var i = previousFrom; i <= previousTo; i += 1) {
  28279. if (i < from || i > to) {
  28280. swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
  28281. }
  28282. }
  28283. }
  28284. for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
  28285. if (i$1 >= from && i$1 <= to) {
  28286. if (typeof previousTo === 'undefined' || force) {
  28287. appendIndexes.push(i$1);
  28288. } else {
  28289. if (i$1 > previousTo) { appendIndexes.push(i$1); }
  28290. if (i$1 < previousFrom) { prependIndexes.push(i$1); }
  28291. }
  28292. }
  28293. }
  28294. appendIndexes.forEach(function (index) {
  28295. swiper.$wrapperEl.append(renderSlide(slides[index], index));
  28296. });
  28297. prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
  28298. swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
  28299. });
  28300. swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
  28301. onRendered();
  28302. },
  28303. renderSlide: function renderSlide(slide, index) {
  28304. var swiper = this;
  28305. var params = swiper.params.virtual;
  28306. if (params.cache && swiper.virtual.cache[index]) {
  28307. return swiper.virtual.cache[index];
  28308. }
  28309. var $slideEl = params.renderSlide
  28310. ? $(params.renderSlide.call(swiper, slide, index))
  28311. : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
  28312. if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
  28313. if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
  28314. return $slideEl;
  28315. },
  28316. appendSlide: function appendSlide(slides) {
  28317. var swiper = this;
  28318. if (typeof slides === 'object' && 'length' in slides) {
  28319. for (var i = 0; i < slides.length; i += 1) {
  28320. if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
  28321. }
  28322. } else {
  28323. swiper.virtual.slides.push(slides);
  28324. }
  28325. swiper.virtual.update(true);
  28326. },
  28327. prependSlide: function prependSlide(slides) {
  28328. var swiper = this;
  28329. var activeIndex = swiper.activeIndex;
  28330. var newActiveIndex = activeIndex + 1;
  28331. var numberOfNewSlides = 1;
  28332. if (Array.isArray(slides)) {
  28333. for (var i = 0; i < slides.length; i += 1) {
  28334. if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
  28335. }
  28336. newActiveIndex = activeIndex + slides.length;
  28337. numberOfNewSlides = slides.length;
  28338. } else {
  28339. swiper.virtual.slides.unshift(slides);
  28340. }
  28341. if (swiper.params.virtual.cache) {
  28342. var cache = swiper.virtual.cache;
  28343. var newCache = {};
  28344. Object.keys(cache).forEach(function (cachedIndex) {
  28345. var $cachedEl = cache[cachedIndex];
  28346. var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
  28347. if (cachedElIndex) {
  28348. $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
  28349. }
  28350. newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
  28351. });
  28352. swiper.virtual.cache = newCache;
  28353. }
  28354. swiper.virtual.update(true);
  28355. swiper.slideTo(newActiveIndex, 0);
  28356. },
  28357. removeSlide: function removeSlide(slidesIndexes) {
  28358. var swiper = this;
  28359. if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
  28360. var activeIndex = swiper.activeIndex;
  28361. if (Array.isArray(slidesIndexes)) {
  28362. for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
  28363. swiper.virtual.slides.splice(slidesIndexes[i], 1);
  28364. if (swiper.params.virtual.cache) {
  28365. delete swiper.virtual.cache[slidesIndexes[i]];
  28366. }
  28367. if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
  28368. activeIndex = Math.max(activeIndex, 0);
  28369. }
  28370. } else {
  28371. swiper.virtual.slides.splice(slidesIndexes, 1);
  28372. if (swiper.params.virtual.cache) {
  28373. delete swiper.virtual.cache[slidesIndexes];
  28374. }
  28375. if (slidesIndexes < activeIndex) { activeIndex -= 1; }
  28376. activeIndex = Math.max(activeIndex, 0);
  28377. }
  28378. swiper.virtual.update(true);
  28379. swiper.slideTo(activeIndex, 0);
  28380. },
  28381. removeAllSlides: function removeAllSlides() {
  28382. var swiper = this;
  28383. swiper.virtual.slides = [];
  28384. if (swiper.params.virtual.cache) {
  28385. swiper.virtual.cache = {};
  28386. }
  28387. swiper.virtual.update(true);
  28388. swiper.slideTo(0, 0);
  28389. },
  28390. };
  28391. var Virtual$1 = {
  28392. name: 'virtual',
  28393. params: {
  28394. virtual: {
  28395. enabled: false,
  28396. slides: [],
  28397. cache: true,
  28398. renderSlide: null,
  28399. renderExternal: null,
  28400. addSlidesBefore: 0,
  28401. addSlidesAfter: 0,
  28402. },
  28403. },
  28404. create: function create() {
  28405. var swiper = this;
  28406. Utils.extend(swiper, {
  28407. virtual: {
  28408. update: Virtual.update.bind(swiper),
  28409. appendSlide: Virtual.appendSlide.bind(swiper),
  28410. prependSlide: Virtual.prependSlide.bind(swiper),
  28411. removeSlide: Virtual.removeSlide.bind(swiper),
  28412. removeAllSlides: Virtual.removeAllSlides.bind(swiper),
  28413. renderSlide: Virtual.renderSlide.bind(swiper),
  28414. slides: swiper.params.virtual.slides,
  28415. cache: {},
  28416. },
  28417. });
  28418. },
  28419. on: {
  28420. beforeInit: function beforeInit() {
  28421. var swiper = this;
  28422. if (!swiper.params.virtual.enabled) { return; }
  28423. swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
  28424. var overwriteParams = {
  28425. watchSlidesProgress: true,
  28426. };
  28427. Utils.extend(swiper.params, overwriteParams);
  28428. Utils.extend(swiper.originalParams, overwriteParams);
  28429. if (!swiper.params.initialSlide) {
  28430. swiper.virtual.update();
  28431. }
  28432. },
  28433. setTranslate: function setTranslate() {
  28434. var swiper = this;
  28435. if (!swiper.params.virtual.enabled) { return; }
  28436. swiper.virtual.update();
  28437. },
  28438. },
  28439. };
  28440. var Keyboard = {
  28441. handle: function handle(event) {
  28442. var swiper = this;
  28443. var rtl = swiper.rtlTranslate;
  28444. var e = event;
  28445. if (e.originalEvent) { e = e.originalEvent; } // jquery fix
  28446. var kc = e.keyCode || e.charCode;
  28447. // Directions locks
  28448. if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {
  28449. return false;
  28450. }
  28451. if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {
  28452. return false;
  28453. }
  28454. if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
  28455. return undefined;
  28456. }
  28457. if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {
  28458. return undefined;
  28459. }
  28460. if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {
  28461. var inView = false;
  28462. // Check that swiper should be inside of visible area of window
  28463. if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) {
  28464. return undefined;
  28465. }
  28466. var windowWidth = win.innerWidth;
  28467. var windowHeight = win.innerHeight;
  28468. var swiperOffset = swiper.$el.offset();
  28469. if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }
  28470. var swiperCoord = [
  28471. [swiperOffset.left, swiperOffset.top],
  28472. [swiperOffset.left + swiper.width, swiperOffset.top],
  28473. [swiperOffset.left, swiperOffset.top + swiper.height],
  28474. [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];
  28475. for (var i = 0; i < swiperCoord.length; i += 1) {
  28476. var point = swiperCoord[i];
  28477. if (
  28478. point[0] >= 0 && point[0] <= windowWidth
  28479. && point[1] >= 0 && point[1] <= windowHeight
  28480. ) {
  28481. inView = true;
  28482. }
  28483. }
  28484. if (!inView) { return undefined; }
  28485. }
  28486. if (swiper.isHorizontal()) {
  28487. if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {
  28488. if (e.preventDefault) { e.preventDefault(); }
  28489. else { e.returnValue = false; }
  28490. }
  28491. if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }
  28492. if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }
  28493. } else {
  28494. if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {
  28495. if (e.preventDefault) { e.preventDefault(); }
  28496. else { e.returnValue = false; }
  28497. }
  28498. if (kc === 34 || kc === 40) { swiper.slideNext(); }
  28499. if (kc === 33 || kc === 38) { swiper.slidePrev(); }
  28500. }
  28501. swiper.emit('keyPress', kc);
  28502. return undefined;
  28503. },
  28504. enable: function enable() {
  28505. var swiper = this;
  28506. if (swiper.keyboard.enabled) { return; }
  28507. $(doc).on('keydown', swiper.keyboard.handle);
  28508. swiper.keyboard.enabled = true;
  28509. },
  28510. disable: function disable() {
  28511. var swiper = this;
  28512. if (!swiper.keyboard.enabled) { return; }
  28513. $(doc).off('keydown', swiper.keyboard.handle);
  28514. swiper.keyboard.enabled = false;
  28515. },
  28516. };
  28517. var Keyboard$1 = {
  28518. name: 'keyboard',
  28519. params: {
  28520. keyboard: {
  28521. enabled: false,
  28522. onlyInViewport: true,
  28523. },
  28524. },
  28525. create: function create() {
  28526. var swiper = this;
  28527. Utils.extend(swiper, {
  28528. keyboard: {
  28529. enabled: false,
  28530. enable: Keyboard.enable.bind(swiper),
  28531. disable: Keyboard.disable.bind(swiper),
  28532. handle: Keyboard.handle.bind(swiper),
  28533. },
  28534. });
  28535. },
  28536. on: {
  28537. init: function init() {
  28538. var swiper = this;
  28539. if (swiper.params.keyboard.enabled) {
  28540. swiper.keyboard.enable();
  28541. }
  28542. },
  28543. destroy: function destroy() {
  28544. var swiper = this;
  28545. if (swiper.keyboard.enabled) {
  28546. swiper.keyboard.disable();
  28547. }
  28548. },
  28549. },
  28550. };
  28551. function isEventSupported() {
  28552. var eventName = 'onwheel';
  28553. var isSupported = eventName in doc;
  28554. if (!isSupported) {
  28555. var element = doc.createElement('div');
  28556. element.setAttribute(eventName, 'return;');
  28557. isSupported = typeof element[eventName] === 'function';
  28558. }
  28559. if (!isSupported
  28560. && doc.implementation
  28561. && doc.implementation.hasFeature
  28562. // always returns true in newer browsers as per the standard.
  28563. // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
  28564. && doc.implementation.hasFeature('', '') !== true
  28565. ) {
  28566. // This is the only way to test support for the `wheel` event in IE9+.
  28567. isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');
  28568. }
  28569. return isSupported;
  28570. }
  28571. var Mousewheel = {
  28572. lastScrollTime: Utils.now(),
  28573. lastEventBeforeSnap: undefined,
  28574. recentWheelEvents: [],
  28575. event: function event() {
  28576. if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }
  28577. return isEventSupported() ? 'wheel' : 'mousewheel';
  28578. },
  28579. normalize: function normalize(e) {
  28580. // Reasonable defaults
  28581. var PIXEL_STEP = 10;
  28582. var LINE_HEIGHT = 40;
  28583. var PAGE_HEIGHT = 800;
  28584. var sX = 0;
  28585. var sY = 0; // spinX, spinY
  28586. var pX = 0;
  28587. var pY = 0; // pixelX, pixelY
  28588. // Legacy
  28589. if ('detail' in e) {
  28590. sY = e.detail;
  28591. }
  28592. if ('wheelDelta' in e) {
  28593. sY = -e.wheelDelta / 120;
  28594. }
  28595. if ('wheelDeltaY' in e) {
  28596. sY = -e.wheelDeltaY / 120;
  28597. }
  28598. if ('wheelDeltaX' in e) {
  28599. sX = -e.wheelDeltaX / 120;
  28600. }
  28601. // side scrolling on FF with DOMMouseScroll
  28602. if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
  28603. sX = sY;
  28604. sY = 0;
  28605. }
  28606. pX = sX * PIXEL_STEP;
  28607. pY = sY * PIXEL_STEP;
  28608. if ('deltaY' in e) {
  28609. pY = e.deltaY;
  28610. }
  28611. if ('deltaX' in e) {
  28612. pX = e.deltaX;
  28613. }
  28614. if (e.shiftKey && !pX) { // if user scrolls with shift he wants horizontal scroll
  28615. pX = pY;
  28616. pY = 0;
  28617. }
  28618. if ((pX || pY) && e.deltaMode) {
  28619. if (e.deltaMode === 1) { // delta in LINE units
  28620. pX *= LINE_HEIGHT;
  28621. pY *= LINE_HEIGHT;
  28622. } else { // delta in PAGE units
  28623. pX *= PAGE_HEIGHT;
  28624. pY *= PAGE_HEIGHT;
  28625. }
  28626. }
  28627. // Fall-back if spin cannot be determined
  28628. if (pX && !sX) {
  28629. sX = (pX < 1) ? -1 : 1;
  28630. }
  28631. if (pY && !sY) {
  28632. sY = (pY < 1) ? -1 : 1;
  28633. }
  28634. return {
  28635. spinX: sX,
  28636. spinY: sY,
  28637. pixelX: pX,
  28638. pixelY: pY,
  28639. };
  28640. },
  28641. handleMouseEnter: function handleMouseEnter() {
  28642. var swiper = this;
  28643. swiper.mouseEntered = true;
  28644. },
  28645. handleMouseLeave: function handleMouseLeave() {
  28646. var swiper = this;
  28647. swiper.mouseEntered = false;
  28648. },
  28649. handle: function handle(event) {
  28650. var e = event;
  28651. var swiper = this;
  28652. var params = swiper.params.mousewheel;
  28653. if (swiper.params.cssMode) {
  28654. e.preventDefault();
  28655. }
  28656. var target = swiper.$el;
  28657. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  28658. target = $(swiper.params.mousewheel.eventsTarged);
  28659. }
  28660. if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) { return true; }
  28661. if (e.originalEvent) { e = e.originalEvent; } // jquery fix
  28662. var delta = 0;
  28663. var rtlFactor = swiper.rtlTranslate ? -1 : 1;
  28664. var data = Mousewheel.normalize(e);
  28665. if (params.forceToAxis) {
  28666. if (swiper.isHorizontal()) {
  28667. if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }
  28668. else { return true; }
  28669. } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }
  28670. else { return true; }
  28671. } else {
  28672. delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
  28673. }
  28674. if (delta === 0) { return true; }
  28675. if (params.invert) { delta = -delta; }
  28676. if (!swiper.params.freeMode) {
  28677. // Register the new event in a variable which stores the relevant data
  28678. var newEvent = {
  28679. time: Utils.now(),
  28680. delta: Math.abs(delta),
  28681. direction: Math.sign(delta),
  28682. raw: event,
  28683. };
  28684. // Keep the most recent events
  28685. var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
  28686. if (recentWheelEvents.length >= 2) {
  28687. recentWheelEvents.shift(); // only store the last N events
  28688. }
  28689. var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
  28690. recentWheelEvents.push(newEvent);
  28691. // If there is at least one previous recorded event:
  28692. // If direction has changed or
  28693. // if the scroll is quicker than the previous one:
  28694. // Animate the slider.
  28695. // Else (this is the first time the wheel is moved):
  28696. // Animate the slider.
  28697. if (prevEvent) {
  28698. if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
  28699. swiper.mousewheel.animateSlider(newEvent);
  28700. }
  28701. } else {
  28702. swiper.mousewheel.animateSlider(newEvent);
  28703. }
  28704. // If it's time to release the scroll:
  28705. // Return now so you don't hit the preventDefault.
  28706. if (swiper.mousewheel.releaseScroll(newEvent)) {
  28707. return true;
  28708. }
  28709. } else {
  28710. // Freemode or scrollContainer:
  28711. // If we recently snapped after a momentum scroll, then ignore wheel events
  28712. // to give time for the deceleration to finish. Stop ignoring after 500 msecs
  28713. // or if it's a new scroll (larger delta or inverse sign as last event before
  28714. // an end-of-momentum snap).
  28715. var newEvent$1 = { time: Utils.now(), delta: Math.abs(delta), direction: Math.sign(delta) };
  28716. var ref = swiper.mousewheel;
  28717. var lastEventBeforeSnap = ref.lastEventBeforeSnap;
  28718. var ignoreWheelEvents = lastEventBeforeSnap
  28719. && newEvent$1.time < lastEventBeforeSnap.time + 500
  28720. && newEvent$1.delta <= lastEventBeforeSnap.delta
  28721. && newEvent$1.direction === lastEventBeforeSnap.direction;
  28722. if (!ignoreWheelEvents) {
  28723. swiper.mousewheel.lastEventBeforeSnap = undefined;
  28724. if (swiper.params.loop) {
  28725. swiper.loopFix();
  28726. }
  28727. var position = swiper.getTranslate() + (delta * params.sensitivity);
  28728. var wasBeginning = swiper.isBeginning;
  28729. var wasEnd = swiper.isEnd;
  28730. if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }
  28731. if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }
  28732. swiper.setTransition(0);
  28733. swiper.setTranslate(position);
  28734. swiper.updateProgress();
  28735. swiper.updateActiveIndex();
  28736. swiper.updateSlidesClasses();
  28737. if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {
  28738. swiper.updateSlidesClasses();
  28739. }
  28740. if (swiper.params.freeModeSticky) {
  28741. // When wheel scrolling starts with sticky (aka snap) enabled, then detect
  28742. // the end of a momentum scroll by storing recent (N=15?) wheel events.
  28743. // 1. do all N events have decreasing or same (absolute value) delta?
  28744. // 2. did all N events arrive in the last M (M=500?) msecs?
  28745. // 3. does the earliest event have an (absolute value) delta that's
  28746. // at least P (P=1?) larger than the most recent event's delta?
  28747. // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
  28748. // If 1-4 are "yes" then we're near the end of a momuntum scroll deceleration.
  28749. // Snap immediately and ignore remaining wheel events in this scroll.
  28750. // See comment above for "remaining wheel events in this scroll" determination.
  28751. // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
  28752. clearTimeout(swiper.mousewheel.timeout);
  28753. swiper.mousewheel.timeout = undefined;
  28754. var recentWheelEvents$1 = swiper.mousewheel.recentWheelEvents;
  28755. if (recentWheelEvents$1.length >= 15) {
  28756. recentWheelEvents$1.shift(); // only store the last N events
  28757. }
  28758. var prevEvent$1 = recentWheelEvents$1.length ? recentWheelEvents$1[recentWheelEvents$1.length - 1] : undefined;
  28759. var firstEvent = recentWheelEvents$1[0];
  28760. recentWheelEvents$1.push(newEvent$1);
  28761. if (prevEvent$1 && (newEvent$1.delta > prevEvent$1.delta || newEvent$1.direction !== prevEvent$1.direction)) {
  28762. // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
  28763. recentWheelEvents$1.splice(0);
  28764. } else if (recentWheelEvents$1.length >= 15
  28765. && newEvent$1.time - firstEvent.time < 500
  28766. && firstEvent.delta - newEvent$1.delta >= 1
  28767. && newEvent$1.delta <= 6
  28768. ) {
  28769. // We're at the end of the deceleration of a momentum scroll, so there's no need
  28770. // to wait for more events. Snap ASAP on the next tick.
  28771. // Also, because there's some remaining momentum we'll bias the snap in the
  28772. // direction of the ongoing scroll because it's better UX for the scroll to snap
  28773. // in the same direction as the scroll instead of reversing to snap. Therefore,
  28774. // if it's already scrolled more than 20% in the current direction, keep going.
  28775. var snapToThreshold = delta > 0 ? 0.8 : 0.2;
  28776. swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
  28777. recentWheelEvents$1.splice(0);
  28778. swiper.mousewheel.timeout = Utils.nextTick(function () {
  28779. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  28780. }, 0); // no delay; move on next tick
  28781. }
  28782. if (!swiper.mousewheel.timeout) {
  28783. // if we get here, then we haven't detected the end of a momentum scroll, so
  28784. // we'll consider a scroll "complete" when there haven't been any wheel events
  28785. // for 500ms.
  28786. swiper.mousewheel.timeout = Utils.nextTick(function () {
  28787. var snapToThreshold = 0.5;
  28788. swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
  28789. recentWheelEvents$1.splice(0);
  28790. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  28791. }, 500);
  28792. }
  28793. }
  28794. // Emit event
  28795. if (!ignoreWheelEvents) { swiper.emit('scroll', e); }
  28796. // Stop autoplay
  28797. if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }
  28798. // Return page scroll on edge positions
  28799. if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }
  28800. }
  28801. }
  28802. if (e.preventDefault) { e.preventDefault(); }
  28803. else { e.returnValue = false; }
  28804. return false;
  28805. },
  28806. animateSlider: function animateSlider(newEvent) {
  28807. var swiper = this;
  28808. // If the movement is NOT big enough and
  28809. // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
  28810. // Don't go any further (avoid insignificant scroll movement).
  28811. if (newEvent.delta >= 6 && Utils.now() - swiper.mousewheel.lastScrollTime < 60) {
  28812. // Return false as a default
  28813. return true;
  28814. }
  28815. // If user is scrolling towards the end:
  28816. // If the slider hasn't hit the latest slide or
  28817. // if the slider is a loop and
  28818. // if the slider isn't moving right now:
  28819. // Go to next slide and
  28820. // emit a scroll event.
  28821. // Else (the user is scrolling towards the beginning) and
  28822. // if the slider hasn't hit the first slide or
  28823. // if the slider is a loop and
  28824. // if the slider isn't moving right now:
  28825. // Go to prev slide and
  28826. // emit a scroll event.
  28827. if (newEvent.direction < 0) {
  28828. if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
  28829. swiper.slideNext();
  28830. swiper.emit('scroll', newEvent.raw);
  28831. }
  28832. } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
  28833. swiper.slidePrev();
  28834. swiper.emit('scroll', newEvent.raw);
  28835. }
  28836. // If you got here is because an animation has been triggered so store the current time
  28837. swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();
  28838. // Return false as a default
  28839. return false;
  28840. },
  28841. releaseScroll: function releaseScroll(newEvent) {
  28842. var swiper = this;
  28843. var params = swiper.params.mousewheel;
  28844. if (newEvent.direction < 0) {
  28845. if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
  28846. // Return true to animate scroll on edges
  28847. return true;
  28848. }
  28849. } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
  28850. // Return true to animate scroll on edges
  28851. return true;
  28852. }
  28853. return false;
  28854. },
  28855. enable: function enable() {
  28856. var swiper = this;
  28857. var event = Mousewheel.event();
  28858. if (swiper.params.cssMode) {
  28859. swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
  28860. return true;
  28861. }
  28862. if (!event) { return false; }
  28863. if (swiper.mousewheel.enabled) { return false; }
  28864. var target = swiper.$el;
  28865. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  28866. target = $(swiper.params.mousewheel.eventsTarged);
  28867. }
  28868. target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
  28869. target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
  28870. target.on(event, swiper.mousewheel.handle);
  28871. swiper.mousewheel.enabled = true;
  28872. return true;
  28873. },
  28874. disable: function disable() {
  28875. var swiper = this;
  28876. var event = Mousewheel.event();
  28877. if (swiper.params.cssMode) {
  28878. swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
  28879. return true;
  28880. }
  28881. if (!event) { return false; }
  28882. if (!swiper.mousewheel.enabled) { return false; }
  28883. var target = swiper.$el;
  28884. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  28885. target = $(swiper.params.mousewheel.eventsTarged);
  28886. }
  28887. target.off(event, swiper.mousewheel.handle);
  28888. swiper.mousewheel.enabled = false;
  28889. return true;
  28890. },
  28891. };
  28892. var Mousewheel$1 = {
  28893. name: 'mousewheel',
  28894. params: {
  28895. mousewheel: {
  28896. enabled: false,
  28897. releaseOnEdges: false,
  28898. invert: false,
  28899. forceToAxis: false,
  28900. sensitivity: 1,
  28901. eventsTarged: 'container',
  28902. },
  28903. },
  28904. create: function create() {
  28905. var swiper = this;
  28906. Utils.extend(swiper, {
  28907. mousewheel: {
  28908. enabled: false,
  28909. enable: Mousewheel.enable.bind(swiper),
  28910. disable: Mousewheel.disable.bind(swiper),
  28911. handle: Mousewheel.handle.bind(swiper),
  28912. handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),
  28913. handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),
  28914. animateSlider: Mousewheel.animateSlider.bind(swiper),
  28915. releaseScroll: Mousewheel.releaseScroll.bind(swiper),
  28916. lastScrollTime: Utils.now(),
  28917. lastEventBeforeSnap: undefined,
  28918. recentWheelEvents: [],
  28919. },
  28920. });
  28921. },
  28922. on: {
  28923. init: function init() {
  28924. var swiper = this;
  28925. if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
  28926. swiper.mousewheel.disable();
  28927. }
  28928. if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }
  28929. },
  28930. destroy: function destroy() {
  28931. var swiper = this;
  28932. if (swiper.params.cssMode) {
  28933. swiper.mousewheel.enable();
  28934. }
  28935. if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }
  28936. },
  28937. },
  28938. };
  28939. var Navigation = {
  28940. update: function update() {
  28941. // Update Navigation Buttons
  28942. var swiper = this;
  28943. var params = swiper.params.navigation;
  28944. if (swiper.params.loop) { return; }
  28945. var ref = swiper.navigation;
  28946. var $nextEl = ref.$nextEl;
  28947. var $prevEl = ref.$prevEl;
  28948. if ($prevEl && $prevEl.length > 0) {
  28949. if (swiper.isBeginning) {
  28950. $prevEl.addClass(params.disabledClass);
  28951. } else {
  28952. $prevEl.removeClass(params.disabledClass);
  28953. }
  28954. $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  28955. }
  28956. if ($nextEl && $nextEl.length > 0) {
  28957. if (swiper.isEnd) {
  28958. $nextEl.addClass(params.disabledClass);
  28959. } else {
  28960. $nextEl.removeClass(params.disabledClass);
  28961. }
  28962. $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  28963. }
  28964. },
  28965. onPrevClick: function onPrevClick(e) {
  28966. var swiper = this;
  28967. e.preventDefault();
  28968. if (swiper.isBeginning && !swiper.params.loop) { return; }
  28969. swiper.slidePrev();
  28970. },
  28971. onNextClick: function onNextClick(e) {
  28972. var swiper = this;
  28973. e.preventDefault();
  28974. if (swiper.isEnd && !swiper.params.loop) { return; }
  28975. swiper.slideNext();
  28976. },
  28977. init: function init() {
  28978. var swiper = this;
  28979. var params = swiper.params.navigation;
  28980. if (!(params.nextEl || params.prevEl)) { return; }
  28981. var $nextEl;
  28982. var $prevEl;
  28983. if (params.nextEl) {
  28984. $nextEl = $(params.nextEl);
  28985. if (
  28986. swiper.params.uniqueNavElements
  28987. && typeof params.nextEl === 'string'
  28988. && $nextEl.length > 1
  28989. && swiper.$el.find(params.nextEl).length === 1
  28990. ) {
  28991. $nextEl = swiper.$el.find(params.nextEl);
  28992. }
  28993. }
  28994. if (params.prevEl) {
  28995. $prevEl = $(params.prevEl);
  28996. if (
  28997. swiper.params.uniqueNavElements
  28998. && typeof params.prevEl === 'string'
  28999. && $prevEl.length > 1
  29000. && swiper.$el.find(params.prevEl).length === 1
  29001. ) {
  29002. $prevEl = swiper.$el.find(params.prevEl);
  29003. }
  29004. }
  29005. if ($nextEl && $nextEl.length > 0) {
  29006. $nextEl.on('click', swiper.navigation.onNextClick);
  29007. }
  29008. if ($prevEl && $prevEl.length > 0) {
  29009. $prevEl.on('click', swiper.navigation.onPrevClick);
  29010. }
  29011. Utils.extend(swiper.navigation, {
  29012. $nextEl: $nextEl,
  29013. nextEl: $nextEl && $nextEl[0],
  29014. $prevEl: $prevEl,
  29015. prevEl: $prevEl && $prevEl[0],
  29016. });
  29017. },
  29018. destroy: function destroy() {
  29019. var swiper = this;
  29020. var ref = swiper.navigation;
  29021. var $nextEl = ref.$nextEl;
  29022. var $prevEl = ref.$prevEl;
  29023. if ($nextEl && $nextEl.length) {
  29024. $nextEl.off('click', swiper.navigation.onNextClick);
  29025. $nextEl.removeClass(swiper.params.navigation.disabledClass);
  29026. }
  29027. if ($prevEl && $prevEl.length) {
  29028. $prevEl.off('click', swiper.navigation.onPrevClick);
  29029. $prevEl.removeClass(swiper.params.navigation.disabledClass);
  29030. }
  29031. },
  29032. };
  29033. var Navigation$1 = {
  29034. name: 'navigation',
  29035. params: {
  29036. navigation: {
  29037. nextEl: null,
  29038. prevEl: null,
  29039. hideOnClick: false,
  29040. disabledClass: 'swiper-button-disabled',
  29041. hiddenClass: 'swiper-button-hidden',
  29042. lockClass: 'swiper-button-lock',
  29043. },
  29044. },
  29045. create: function create() {
  29046. var swiper = this;
  29047. Utils.extend(swiper, {
  29048. navigation: {
  29049. init: Navigation.init.bind(swiper),
  29050. update: Navigation.update.bind(swiper),
  29051. destroy: Navigation.destroy.bind(swiper),
  29052. onNextClick: Navigation.onNextClick.bind(swiper),
  29053. onPrevClick: Navigation.onPrevClick.bind(swiper),
  29054. },
  29055. });
  29056. },
  29057. on: {
  29058. init: function init() {
  29059. var swiper = this;
  29060. swiper.navigation.init();
  29061. swiper.navigation.update();
  29062. },
  29063. toEdge: function toEdge() {
  29064. var swiper = this;
  29065. swiper.navigation.update();
  29066. },
  29067. fromEdge: function fromEdge() {
  29068. var swiper = this;
  29069. swiper.navigation.update();
  29070. },
  29071. destroy: function destroy() {
  29072. var swiper = this;
  29073. swiper.navigation.destroy();
  29074. },
  29075. click: function click(e) {
  29076. var swiper = this;
  29077. var ref = swiper.navigation;
  29078. var $nextEl = ref.$nextEl;
  29079. var $prevEl = ref.$prevEl;
  29080. if (
  29081. swiper.params.navigation.hideOnClick
  29082. && !$(e.target).is($prevEl)
  29083. && !$(e.target).is($nextEl)
  29084. ) {
  29085. var isHidden;
  29086. if ($nextEl) {
  29087. isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
  29088. } else if ($prevEl) {
  29089. isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
  29090. }
  29091. if (isHidden === true) {
  29092. swiper.emit('navigationShow', swiper);
  29093. } else {
  29094. swiper.emit('navigationHide', swiper);
  29095. }
  29096. if ($nextEl) {
  29097. $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
  29098. }
  29099. if ($prevEl) {
  29100. $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
  29101. }
  29102. }
  29103. },
  29104. },
  29105. };
  29106. var Pagination = {
  29107. update: function update() {
  29108. // Render || Update Pagination bullets/items
  29109. var swiper = this;
  29110. var rtl = swiper.rtl;
  29111. var params = swiper.params.pagination;
  29112. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  29113. var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  29114. var $el = swiper.pagination.$el;
  29115. // Current/Total
  29116. var current;
  29117. var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  29118. if (swiper.params.loop) {
  29119. current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
  29120. if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
  29121. current -= (slidesLength - (swiper.loopedSlides * 2));
  29122. }
  29123. if (current > total - 1) { current -= total; }
  29124. if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
  29125. } else if (typeof swiper.snapIndex !== 'undefined') {
  29126. current = swiper.snapIndex;
  29127. } else {
  29128. current = swiper.activeIndex || 0;
  29129. }
  29130. // Types
  29131. if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
  29132. var bullets = swiper.pagination.bullets;
  29133. var firstIndex;
  29134. var lastIndex;
  29135. var midIndex;
  29136. if (params.dynamicBullets) {
  29137. swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
  29138. $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
  29139. if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
  29140. swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
  29141. if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
  29142. swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
  29143. } else if (swiper.pagination.dynamicBulletIndex < 0) {
  29144. swiper.pagination.dynamicBulletIndex = 0;
  29145. }
  29146. }
  29147. firstIndex = current - swiper.pagination.dynamicBulletIndex;
  29148. lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
  29149. midIndex = (lastIndex + firstIndex) / 2;
  29150. }
  29151. bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
  29152. if ($el.length > 1) {
  29153. bullets.each(function (index, bullet) {
  29154. var $bullet = $(bullet);
  29155. var bulletIndex = $bullet.index();
  29156. if (bulletIndex === current) {
  29157. $bullet.addClass(params.bulletActiveClass);
  29158. }
  29159. if (params.dynamicBullets) {
  29160. if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
  29161. $bullet.addClass(((params.bulletActiveClass) + "-main"));
  29162. }
  29163. if (bulletIndex === firstIndex) {
  29164. $bullet
  29165. .prev()
  29166. .addClass(((params.bulletActiveClass) + "-prev"))
  29167. .prev()
  29168. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  29169. }
  29170. if (bulletIndex === lastIndex) {
  29171. $bullet
  29172. .next()
  29173. .addClass(((params.bulletActiveClass) + "-next"))
  29174. .next()
  29175. .addClass(((params.bulletActiveClass) + "-next-next"));
  29176. }
  29177. }
  29178. });
  29179. } else {
  29180. var $bullet = bullets.eq(current);
  29181. var bulletIndex = $bullet.index();
  29182. $bullet.addClass(params.bulletActiveClass);
  29183. if (params.dynamicBullets) {
  29184. var $firstDisplayedBullet = bullets.eq(firstIndex);
  29185. var $lastDisplayedBullet = bullets.eq(lastIndex);
  29186. for (var i = firstIndex; i <= lastIndex; i += 1) {
  29187. bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
  29188. }
  29189. if (swiper.params.loop) {
  29190. if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
  29191. for (var i$1 = params.dynamicMainBullets; i$1 >= 0; i$1 -= 1) {
  29192. bullets.eq(bullets.length - i$1).addClass(((params.bulletActiveClass) + "-main"));
  29193. }
  29194. bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(((params.bulletActiveClass) + "-prev"));
  29195. } else {
  29196. $firstDisplayedBullet
  29197. .prev()
  29198. .addClass(((params.bulletActiveClass) + "-prev"))
  29199. .prev()
  29200. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  29201. $lastDisplayedBullet
  29202. .next()
  29203. .addClass(((params.bulletActiveClass) + "-next"))
  29204. .next()
  29205. .addClass(((params.bulletActiveClass) + "-next-next"));
  29206. }
  29207. } else {
  29208. $firstDisplayedBullet
  29209. .prev()
  29210. .addClass(((params.bulletActiveClass) + "-prev"))
  29211. .prev()
  29212. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  29213. $lastDisplayedBullet
  29214. .next()
  29215. .addClass(((params.bulletActiveClass) + "-next"))
  29216. .next()
  29217. .addClass(((params.bulletActiveClass) + "-next-next"));
  29218. }
  29219. }
  29220. }
  29221. if (params.dynamicBullets) {
  29222. var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
  29223. var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
  29224. var offsetProp = rtl ? 'right' : 'left';
  29225. bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
  29226. }
  29227. }
  29228. if (params.type === 'fraction') {
  29229. $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
  29230. $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
  29231. }
  29232. if (params.type === 'progressbar') {
  29233. var progressbarDirection;
  29234. if (params.progressbarOpposite) {
  29235. progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
  29236. } else {
  29237. progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
  29238. }
  29239. var scale = (current + 1) / total;
  29240. var scaleX = 1;
  29241. var scaleY = 1;
  29242. if (progressbarDirection === 'horizontal') {
  29243. scaleX = scale;
  29244. } else {
  29245. scaleY = scale;
  29246. }
  29247. $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
  29248. }
  29249. if (params.type === 'custom' && params.renderCustom) {
  29250. $el.html(params.renderCustom(swiper, current + 1, total));
  29251. swiper.emit('paginationRender', swiper, $el[0]);
  29252. } else {
  29253. swiper.emit('paginationUpdate', swiper, $el[0]);
  29254. }
  29255. $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  29256. },
  29257. render: function render() {
  29258. // Render Container
  29259. var swiper = this;
  29260. var params = swiper.params.pagination;
  29261. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  29262. var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  29263. var $el = swiper.pagination.$el;
  29264. var paginationHTML = '';
  29265. if (params.type === 'bullets') {
  29266. var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  29267. for (var i = 0; i < numberOfBullets; i += 1) {
  29268. if (params.renderBullet) {
  29269. paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
  29270. } else {
  29271. paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
  29272. }
  29273. }
  29274. $el.html(paginationHTML);
  29275. swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
  29276. }
  29277. if (params.type === 'fraction') {
  29278. if (params.renderFraction) {
  29279. paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
  29280. } else {
  29281. paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
  29282. + ' / '
  29283. + "<span class=\"" + (params.totalClass) + "\"></span>";
  29284. }
  29285. $el.html(paginationHTML);
  29286. }
  29287. if (params.type === 'progressbar') {
  29288. if (params.renderProgressbar) {
  29289. paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
  29290. } else {
  29291. paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
  29292. }
  29293. $el.html(paginationHTML);
  29294. }
  29295. if (params.type !== 'custom') {
  29296. swiper.emit('paginationRender', swiper.pagination.$el[0]);
  29297. }
  29298. },
  29299. init: function init() {
  29300. var swiper = this;
  29301. var params = swiper.params.pagination;
  29302. if (!params.el) { return; }
  29303. var $el = $(params.el);
  29304. if ($el.length === 0) { return; }
  29305. if (
  29306. swiper.params.uniqueNavElements
  29307. && typeof params.el === 'string'
  29308. && $el.length > 1
  29309. && swiper.$el.find(params.el).length === 1
  29310. ) {
  29311. $el = swiper.$el.find(params.el);
  29312. }
  29313. if (params.type === 'bullets' && params.clickable) {
  29314. $el.addClass(params.clickableClass);
  29315. }
  29316. $el.addClass(params.modifierClass + params.type);
  29317. if (params.type === 'bullets' && params.dynamicBullets) {
  29318. $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
  29319. swiper.pagination.dynamicBulletIndex = 0;
  29320. if (params.dynamicMainBullets < 1) {
  29321. params.dynamicMainBullets = 1;
  29322. }
  29323. }
  29324. if (params.type === 'progressbar' && params.progressbarOpposite) {
  29325. $el.addClass(params.progressbarOppositeClass);
  29326. }
  29327. if (params.clickable) {
  29328. $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
  29329. e.preventDefault();
  29330. var index = $(this).index() * swiper.params.slidesPerGroup;
  29331. if (swiper.params.loop) { index += swiper.loopedSlides; }
  29332. swiper.slideTo(index);
  29333. });
  29334. }
  29335. Utils.extend(swiper.pagination, {
  29336. $el: $el,
  29337. el: $el[0],
  29338. });
  29339. },
  29340. destroy: function destroy() {
  29341. var swiper = this;
  29342. var params = swiper.params.pagination;
  29343. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  29344. var $el = swiper.pagination.$el;
  29345. $el.removeClass(params.hiddenClass);
  29346. $el.removeClass(params.modifierClass + params.type);
  29347. if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
  29348. if (params.clickable) {
  29349. $el.off('click', ("." + (params.bulletClass)));
  29350. }
  29351. },
  29352. };
  29353. var Pagination$1 = {
  29354. name: 'pagination',
  29355. params: {
  29356. pagination: {
  29357. el: null,
  29358. bulletElement: 'span',
  29359. clickable: false,
  29360. hideOnClick: false,
  29361. renderBullet: null,
  29362. renderProgressbar: null,
  29363. renderFraction: null,
  29364. renderCustom: null,
  29365. progressbarOpposite: false,
  29366. type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
  29367. dynamicBullets: false,
  29368. dynamicMainBullets: 1,
  29369. formatFractionCurrent: function (number) { return number; },
  29370. formatFractionTotal: function (number) { return number; },
  29371. bulletClass: 'swiper-pagination-bullet',
  29372. bulletActiveClass: 'swiper-pagination-bullet-active',
  29373. modifierClass: 'swiper-pagination-', // NEW
  29374. currentClass: 'swiper-pagination-current',
  29375. totalClass: 'swiper-pagination-total',
  29376. hiddenClass: 'swiper-pagination-hidden',
  29377. progressbarFillClass: 'swiper-pagination-progressbar-fill',
  29378. progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
  29379. clickableClass: 'swiper-pagination-clickable', // NEW
  29380. lockClass: 'swiper-pagination-lock',
  29381. },
  29382. },
  29383. create: function create() {
  29384. var swiper = this;
  29385. Utils.extend(swiper, {
  29386. pagination: {
  29387. init: Pagination.init.bind(swiper),
  29388. render: Pagination.render.bind(swiper),
  29389. update: Pagination.update.bind(swiper),
  29390. destroy: Pagination.destroy.bind(swiper),
  29391. dynamicBulletIndex: 0,
  29392. },
  29393. });
  29394. },
  29395. on: {
  29396. init: function init() {
  29397. var swiper = this;
  29398. swiper.pagination.init();
  29399. swiper.pagination.render();
  29400. swiper.pagination.update();
  29401. },
  29402. activeIndexChange: function activeIndexChange() {
  29403. var swiper = this;
  29404. if (swiper.params.loop) {
  29405. swiper.pagination.update();
  29406. } else if (typeof swiper.snapIndex === 'undefined') {
  29407. swiper.pagination.update();
  29408. }
  29409. },
  29410. snapIndexChange: function snapIndexChange() {
  29411. var swiper = this;
  29412. if (!swiper.params.loop) {
  29413. swiper.pagination.update();
  29414. }
  29415. },
  29416. slidesLengthChange: function slidesLengthChange() {
  29417. var swiper = this;
  29418. if (swiper.params.loop) {
  29419. swiper.pagination.render();
  29420. swiper.pagination.update();
  29421. }
  29422. },
  29423. snapGridLengthChange: function snapGridLengthChange() {
  29424. var swiper = this;
  29425. if (!swiper.params.loop) {
  29426. swiper.pagination.render();
  29427. swiper.pagination.update();
  29428. }
  29429. },
  29430. destroy: function destroy() {
  29431. var swiper = this;
  29432. swiper.pagination.destroy();
  29433. },
  29434. click: function click(e) {
  29435. var swiper = this;
  29436. if (
  29437. swiper.params.pagination.el
  29438. && swiper.params.pagination.hideOnClick
  29439. && swiper.pagination.$el.length > 0
  29440. && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
  29441. ) {
  29442. var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
  29443. if (isHidden === true) {
  29444. swiper.emit('paginationShow', swiper);
  29445. } else {
  29446. swiper.emit('paginationHide', swiper);
  29447. }
  29448. swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
  29449. }
  29450. },
  29451. },
  29452. };
  29453. var Scrollbar = {
  29454. setTranslate: function setTranslate() {
  29455. var swiper = this;
  29456. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  29457. var scrollbar = swiper.scrollbar;
  29458. var rtl = swiper.rtlTranslate;
  29459. var progress = swiper.progress;
  29460. var dragSize = scrollbar.dragSize;
  29461. var trackSize = scrollbar.trackSize;
  29462. var $dragEl = scrollbar.$dragEl;
  29463. var $el = scrollbar.$el;
  29464. var params = swiper.params.scrollbar;
  29465. var newSize = dragSize;
  29466. var newPos = (trackSize - dragSize) * progress;
  29467. if (rtl) {
  29468. newPos = -newPos;
  29469. if (newPos > 0) {
  29470. newSize = dragSize - newPos;
  29471. newPos = 0;
  29472. } else if (-newPos + dragSize > trackSize) {
  29473. newSize = trackSize + newPos;
  29474. }
  29475. } else if (newPos < 0) {
  29476. newSize = dragSize + newPos;
  29477. newPos = 0;
  29478. } else if (newPos + dragSize > trackSize) {
  29479. newSize = trackSize - newPos;
  29480. }
  29481. if (swiper.isHorizontal()) {
  29482. $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
  29483. $dragEl[0].style.width = newSize + "px";
  29484. } else {
  29485. $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
  29486. $dragEl[0].style.height = newSize + "px";
  29487. }
  29488. if (params.hide) {
  29489. clearTimeout(swiper.scrollbar.timeout);
  29490. $el[0].style.opacity = 1;
  29491. swiper.scrollbar.timeout = setTimeout(function () {
  29492. $el[0].style.opacity = 0;
  29493. $el.transition(400);
  29494. }, 1000);
  29495. }
  29496. },
  29497. setTransition: function setTransition(duration) {
  29498. var swiper = this;
  29499. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  29500. swiper.scrollbar.$dragEl.transition(duration);
  29501. },
  29502. updateSize: function updateSize() {
  29503. var swiper = this;
  29504. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  29505. var scrollbar = swiper.scrollbar;
  29506. var $dragEl = scrollbar.$dragEl;
  29507. var $el = scrollbar.$el;
  29508. $dragEl[0].style.width = '';
  29509. $dragEl[0].style.height = '';
  29510. var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
  29511. var divider = swiper.size / swiper.virtualSize;
  29512. var moveDivider = divider * (trackSize / swiper.size);
  29513. var dragSize;
  29514. if (swiper.params.scrollbar.dragSize === 'auto') {
  29515. dragSize = trackSize * divider;
  29516. } else {
  29517. dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
  29518. }
  29519. if (swiper.isHorizontal()) {
  29520. $dragEl[0].style.width = dragSize + "px";
  29521. } else {
  29522. $dragEl[0].style.height = dragSize + "px";
  29523. }
  29524. if (divider >= 1) {
  29525. $el[0].style.display = 'none';
  29526. } else {
  29527. $el[0].style.display = '';
  29528. }
  29529. if (swiper.params.scrollbar.hide) {
  29530. $el[0].style.opacity = 0;
  29531. }
  29532. Utils.extend(scrollbar, {
  29533. trackSize: trackSize,
  29534. divider: divider,
  29535. moveDivider: moveDivider,
  29536. dragSize: dragSize,
  29537. });
  29538. scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
  29539. },
  29540. getPointerPosition: function getPointerPosition(e) {
  29541. var swiper = this;
  29542. if (swiper.isHorizontal()) {
  29543. return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientX : e.clientX);
  29544. }
  29545. return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientY : e.clientY);
  29546. },
  29547. setDragPosition: function setDragPosition(e) {
  29548. var swiper = this;
  29549. var scrollbar = swiper.scrollbar;
  29550. var rtl = swiper.rtlTranslate;
  29551. var $el = scrollbar.$el;
  29552. var dragSize = scrollbar.dragSize;
  29553. var trackSize = scrollbar.trackSize;
  29554. var dragStartPos = scrollbar.dragStartPos;
  29555. var positionRatio;
  29556. positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']
  29557. - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
  29558. positionRatio = Math.max(Math.min(positionRatio, 1), 0);
  29559. if (rtl) {
  29560. positionRatio = 1 - positionRatio;
  29561. }
  29562. var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
  29563. swiper.updateProgress(position);
  29564. swiper.setTranslate(position);
  29565. swiper.updateActiveIndex();
  29566. swiper.updateSlidesClasses();
  29567. },
  29568. onDragStart: function onDragStart(e) {
  29569. var swiper = this;
  29570. var params = swiper.params.scrollbar;
  29571. var scrollbar = swiper.scrollbar;
  29572. var $wrapperEl = swiper.$wrapperEl;
  29573. var $el = scrollbar.$el;
  29574. var $dragEl = scrollbar.$dragEl;
  29575. swiper.scrollbar.isTouched = true;
  29576. swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)
  29577. ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
  29578. e.preventDefault();
  29579. e.stopPropagation();
  29580. $wrapperEl.transition(100);
  29581. $dragEl.transition(100);
  29582. scrollbar.setDragPosition(e);
  29583. clearTimeout(swiper.scrollbar.dragTimeout);
  29584. $el.transition(0);
  29585. if (params.hide) {
  29586. $el.css('opacity', 1);
  29587. }
  29588. if (swiper.params.cssMode) {
  29589. swiper.$wrapperEl.css('scroll-snap-type', 'none');
  29590. }
  29591. swiper.emit('scrollbarDragStart', e);
  29592. },
  29593. onDragMove: function onDragMove(e) {
  29594. var swiper = this;
  29595. var scrollbar = swiper.scrollbar;
  29596. var $wrapperEl = swiper.$wrapperEl;
  29597. var $el = scrollbar.$el;
  29598. var $dragEl = scrollbar.$dragEl;
  29599. if (!swiper.scrollbar.isTouched) { return; }
  29600. if (e.preventDefault) { e.preventDefault(); }
  29601. else { e.returnValue = false; }
  29602. scrollbar.setDragPosition(e);
  29603. $wrapperEl.transition(0);
  29604. $el.transition(0);
  29605. $dragEl.transition(0);
  29606. swiper.emit('scrollbarDragMove', e);
  29607. },
  29608. onDragEnd: function onDragEnd(e) {
  29609. var swiper = this;
  29610. var params = swiper.params.scrollbar;
  29611. var scrollbar = swiper.scrollbar;
  29612. var $wrapperEl = swiper.$wrapperEl;
  29613. var $el = scrollbar.$el;
  29614. if (!swiper.scrollbar.isTouched) { return; }
  29615. swiper.scrollbar.isTouched = false;
  29616. if (swiper.params.cssMode) {
  29617. swiper.$wrapperEl.css('scroll-snap-type', '');
  29618. $wrapperEl.transition('');
  29619. }
  29620. if (params.hide) {
  29621. clearTimeout(swiper.scrollbar.dragTimeout);
  29622. swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
  29623. $el.css('opacity', 0);
  29624. $el.transition(400);
  29625. }, 1000);
  29626. }
  29627. swiper.emit('scrollbarDragEnd', e);
  29628. if (params.snapOnRelease) {
  29629. swiper.slideToClosest();
  29630. }
  29631. },
  29632. enableDraggable: function enableDraggable() {
  29633. var swiper = this;
  29634. if (!swiper.params.scrollbar.el) { return; }
  29635. var scrollbar = swiper.scrollbar;
  29636. var touchEventsTouch = swiper.touchEventsTouch;
  29637. var touchEventsDesktop = swiper.touchEventsDesktop;
  29638. var params = swiper.params;
  29639. var $el = scrollbar.$el;
  29640. var target = $el[0];
  29641. var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
  29642. var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  29643. if (!Support.touch) {
  29644. target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
  29645. doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
  29646. doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
  29647. } else {
  29648. target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
  29649. target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
  29650. target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
  29651. }
  29652. },
  29653. disableDraggable: function disableDraggable() {
  29654. var swiper = this;
  29655. if (!swiper.params.scrollbar.el) { return; }
  29656. var scrollbar = swiper.scrollbar;
  29657. var touchEventsTouch = swiper.touchEventsTouch;
  29658. var touchEventsDesktop = swiper.touchEventsDesktop;
  29659. var params = swiper.params;
  29660. var $el = scrollbar.$el;
  29661. var target = $el[0];
  29662. var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
  29663. var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  29664. if (!Support.touch) {
  29665. target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
  29666. doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
  29667. doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
  29668. } else {
  29669. target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
  29670. target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
  29671. target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
  29672. }
  29673. },
  29674. init: function init() {
  29675. var swiper = this;
  29676. if (!swiper.params.scrollbar.el) { return; }
  29677. var scrollbar = swiper.scrollbar;
  29678. var $swiperEl = swiper.$el;
  29679. var params = swiper.params.scrollbar;
  29680. var $el = $(params.el);
  29681. if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
  29682. $el = $swiperEl.find(params.el);
  29683. }
  29684. var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
  29685. if ($dragEl.length === 0) {
  29686. $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
  29687. $el.append($dragEl);
  29688. }
  29689. Utils.extend(scrollbar, {
  29690. $el: $el,
  29691. el: $el[0],
  29692. $dragEl: $dragEl,
  29693. dragEl: $dragEl[0],
  29694. });
  29695. if (params.draggable) {
  29696. scrollbar.enableDraggable();
  29697. }
  29698. },
  29699. destroy: function destroy() {
  29700. var swiper = this;
  29701. swiper.scrollbar.disableDraggable();
  29702. },
  29703. };
  29704. var Scrollbar$1 = {
  29705. name: 'scrollbar',
  29706. params: {
  29707. scrollbar: {
  29708. el: null,
  29709. dragSize: 'auto',
  29710. hide: false,
  29711. draggable: false,
  29712. snapOnRelease: true,
  29713. lockClass: 'swiper-scrollbar-lock',
  29714. dragClass: 'swiper-scrollbar-drag',
  29715. },
  29716. },
  29717. create: function create() {
  29718. var swiper = this;
  29719. Utils.extend(swiper, {
  29720. scrollbar: {
  29721. init: Scrollbar.init.bind(swiper),
  29722. destroy: Scrollbar.destroy.bind(swiper),
  29723. updateSize: Scrollbar.updateSize.bind(swiper),
  29724. setTranslate: Scrollbar.setTranslate.bind(swiper),
  29725. setTransition: Scrollbar.setTransition.bind(swiper),
  29726. enableDraggable: Scrollbar.enableDraggable.bind(swiper),
  29727. disableDraggable: Scrollbar.disableDraggable.bind(swiper),
  29728. setDragPosition: Scrollbar.setDragPosition.bind(swiper),
  29729. getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),
  29730. onDragStart: Scrollbar.onDragStart.bind(swiper),
  29731. onDragMove: Scrollbar.onDragMove.bind(swiper),
  29732. onDragEnd: Scrollbar.onDragEnd.bind(swiper),
  29733. isTouched: false,
  29734. timeout: null,
  29735. dragTimeout: null,
  29736. },
  29737. });
  29738. },
  29739. on: {
  29740. init: function init() {
  29741. var swiper = this;
  29742. swiper.scrollbar.init();
  29743. swiper.scrollbar.updateSize();
  29744. swiper.scrollbar.setTranslate();
  29745. },
  29746. update: function update() {
  29747. var swiper = this;
  29748. swiper.scrollbar.updateSize();
  29749. },
  29750. resize: function resize() {
  29751. var swiper = this;
  29752. swiper.scrollbar.updateSize();
  29753. },
  29754. observerUpdate: function observerUpdate() {
  29755. var swiper = this;
  29756. swiper.scrollbar.updateSize();
  29757. },
  29758. setTranslate: function setTranslate() {
  29759. var swiper = this;
  29760. swiper.scrollbar.setTranslate();
  29761. },
  29762. setTransition: function setTransition(duration) {
  29763. var swiper = this;
  29764. swiper.scrollbar.setTransition(duration);
  29765. },
  29766. destroy: function destroy() {
  29767. var swiper = this;
  29768. swiper.scrollbar.destroy();
  29769. },
  29770. },
  29771. };
  29772. var Parallax = {
  29773. setTransform: function setTransform(el, progress) {
  29774. var swiper = this;
  29775. var rtl = swiper.rtl;
  29776. var $el = $(el);
  29777. var rtlFactor = rtl ? -1 : 1;
  29778. var p = $el.attr('data-swiper-parallax') || '0';
  29779. var x = $el.attr('data-swiper-parallax-x');
  29780. var y = $el.attr('data-swiper-parallax-y');
  29781. var scale = $el.attr('data-swiper-parallax-scale');
  29782. var opacity = $el.attr('data-swiper-parallax-opacity');
  29783. if (x || y) {
  29784. x = x || '0';
  29785. y = y || '0';
  29786. } else if (swiper.isHorizontal()) {
  29787. x = p;
  29788. y = '0';
  29789. } else {
  29790. y = p;
  29791. x = '0';
  29792. }
  29793. if ((x).indexOf('%') >= 0) {
  29794. x = (parseInt(x, 10) * progress * rtlFactor) + "%";
  29795. } else {
  29796. x = (x * progress * rtlFactor) + "px";
  29797. }
  29798. if ((y).indexOf('%') >= 0) {
  29799. y = (parseInt(y, 10) * progress) + "%";
  29800. } else {
  29801. y = (y * progress) + "px";
  29802. }
  29803. if (typeof opacity !== 'undefined' && opacity !== null) {
  29804. var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
  29805. $el[0].style.opacity = currentOpacity;
  29806. }
  29807. if (typeof scale === 'undefined' || scale === null) {
  29808. $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
  29809. } else {
  29810. var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
  29811. $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
  29812. }
  29813. },
  29814. setTranslate: function setTranslate() {
  29815. var swiper = this;
  29816. var $el = swiper.$el;
  29817. var slides = swiper.slides;
  29818. var progress = swiper.progress;
  29819. var snapGrid = swiper.snapGrid;
  29820. $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  29821. .each(function (index, el) {
  29822. swiper.parallax.setTransform(el, progress);
  29823. });
  29824. slides.each(function (slideIndex, slideEl) {
  29825. var slideProgress = slideEl.progress;
  29826. if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
  29827. slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
  29828. }
  29829. slideProgress = Math.min(Math.max(slideProgress, -1), 1);
  29830. $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  29831. .each(function (index, el) {
  29832. swiper.parallax.setTransform(el, slideProgress);
  29833. });
  29834. });
  29835. },
  29836. setTransition: function setTransition(duration) {
  29837. if ( duration === void 0 ) duration = this.params.speed;
  29838. var swiper = this;
  29839. var $el = swiper.$el;
  29840. $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  29841. .each(function (index, parallaxEl) {
  29842. var $parallaxEl = $(parallaxEl);
  29843. var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
  29844. if (duration === 0) { parallaxDuration = 0; }
  29845. $parallaxEl.transition(parallaxDuration);
  29846. });
  29847. },
  29848. };
  29849. var Parallax$1 = {
  29850. name: 'parallax',
  29851. params: {
  29852. parallax: {
  29853. enabled: false,
  29854. },
  29855. },
  29856. create: function create() {
  29857. var swiper = this;
  29858. Utils.extend(swiper, {
  29859. parallax: {
  29860. setTransform: Parallax.setTransform.bind(swiper),
  29861. setTranslate: Parallax.setTranslate.bind(swiper),
  29862. setTransition: Parallax.setTransition.bind(swiper),
  29863. },
  29864. });
  29865. },
  29866. on: {
  29867. beforeInit: function beforeInit() {
  29868. var swiper = this;
  29869. if (!swiper.params.parallax.enabled) { return; }
  29870. swiper.params.watchSlidesProgress = true;
  29871. swiper.originalParams.watchSlidesProgress = true;
  29872. },
  29873. init: function init() {
  29874. var swiper = this;
  29875. if (!swiper.params.parallax.enabled) { return; }
  29876. swiper.parallax.setTranslate();
  29877. },
  29878. setTranslate: function setTranslate() {
  29879. var swiper = this;
  29880. if (!swiper.params.parallax.enabled) { return; }
  29881. swiper.parallax.setTranslate();
  29882. },
  29883. setTransition: function setTransition(duration) {
  29884. var swiper = this;
  29885. if (!swiper.params.parallax.enabled) { return; }
  29886. swiper.parallax.setTransition(duration);
  29887. },
  29888. },
  29889. };
  29890. var Zoom = {
  29891. // Calc Scale From Multi-touches
  29892. getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
  29893. if (e.targetTouches.length < 2) { return 1; }
  29894. var x1 = e.targetTouches[0].pageX;
  29895. var y1 = e.targetTouches[0].pageY;
  29896. var x2 = e.targetTouches[1].pageX;
  29897. var y2 = e.targetTouches[1].pageY;
  29898. var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
  29899. return distance;
  29900. },
  29901. // Events
  29902. onGestureStart: function onGestureStart(e) {
  29903. var swiper = this;
  29904. var params = swiper.params.zoom;
  29905. var zoom = swiper.zoom;
  29906. var gesture = zoom.gesture;
  29907. zoom.fakeGestureTouched = false;
  29908. zoom.fakeGestureMoved = false;
  29909. if (!Support.gestures) {
  29910. if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
  29911. return;
  29912. }
  29913. zoom.fakeGestureTouched = true;
  29914. gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
  29915. }
  29916. if (!gesture.$slideEl || !gesture.$slideEl.length) {
  29917. gesture.$slideEl = $(e.target).closest(("." + (swiper.params.slideClass)));
  29918. if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
  29919. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  29920. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  29921. gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  29922. if (gesture.$imageWrapEl.length === 0) {
  29923. gesture.$imageEl = undefined;
  29924. return;
  29925. }
  29926. }
  29927. if (gesture.$imageEl) {
  29928. gesture.$imageEl.transition(0);
  29929. }
  29930. swiper.zoom.isScaling = true;
  29931. },
  29932. onGestureChange: function onGestureChange(e) {
  29933. var swiper = this;
  29934. var params = swiper.params.zoom;
  29935. var zoom = swiper.zoom;
  29936. var gesture = zoom.gesture;
  29937. if (!Support.gestures) {
  29938. if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
  29939. return;
  29940. }
  29941. zoom.fakeGestureMoved = true;
  29942. gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
  29943. }
  29944. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  29945. if (Support.gestures) {
  29946. zoom.scale = e.scale * zoom.currentScale;
  29947. } else {
  29948. zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
  29949. }
  29950. if (zoom.scale > gesture.maxRatio) {
  29951. zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
  29952. }
  29953. if (zoom.scale < params.minRatio) {
  29954. zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
  29955. }
  29956. gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  29957. },
  29958. onGestureEnd: function onGestureEnd(e) {
  29959. var swiper = this;
  29960. var params = swiper.params.zoom;
  29961. var zoom = swiper.zoom;
  29962. var gesture = zoom.gesture;
  29963. if (!Support.gestures) {
  29964. if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
  29965. return;
  29966. }
  29967. if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
  29968. return;
  29969. }
  29970. zoom.fakeGestureTouched = false;
  29971. zoom.fakeGestureMoved = false;
  29972. }
  29973. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  29974. zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
  29975. gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  29976. zoom.currentScale = zoom.scale;
  29977. zoom.isScaling = false;
  29978. if (zoom.scale === 1) { gesture.$slideEl = undefined; }
  29979. },
  29980. onTouchStart: function onTouchStart(e) {
  29981. var swiper = this;
  29982. var zoom = swiper.zoom;
  29983. var gesture = zoom.gesture;
  29984. var image = zoom.image;
  29985. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  29986. if (image.isTouched) { return; }
  29987. if (Device.android && e.cancelable) { e.preventDefault(); }
  29988. image.isTouched = true;
  29989. image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  29990. image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  29991. },
  29992. onTouchMove: function onTouchMove(e) {
  29993. var swiper = this;
  29994. var zoom = swiper.zoom;
  29995. var gesture = zoom.gesture;
  29996. var image = zoom.image;
  29997. var velocity = zoom.velocity;
  29998. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  29999. swiper.allowClick = false;
  30000. if (!image.isTouched || !gesture.$slideEl) { return; }
  30001. if (!image.isMoved) {
  30002. image.width = gesture.$imageEl[0].offsetWidth;
  30003. image.height = gesture.$imageEl[0].offsetHeight;
  30004. image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
  30005. image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
  30006. gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
  30007. gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
  30008. gesture.$imageWrapEl.transition(0);
  30009. if (swiper.rtl) {
  30010. image.startX = -image.startX;
  30011. image.startY = -image.startY;
  30012. }
  30013. }
  30014. // Define if we need image drag
  30015. var scaledWidth = image.width * zoom.scale;
  30016. var scaledHeight = image.height * zoom.scale;
  30017. if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
  30018. image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
  30019. image.maxX = -image.minX;
  30020. image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
  30021. image.maxY = -image.minY;
  30022. image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  30023. image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  30024. if (!image.isMoved && !zoom.isScaling) {
  30025. if (
  30026. swiper.isHorizontal()
  30027. && (
  30028. (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
  30029. || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
  30030. )
  30031. ) {
  30032. image.isTouched = false;
  30033. return;
  30034. } if (
  30035. !swiper.isHorizontal()
  30036. && (
  30037. (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
  30038. || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
  30039. )
  30040. ) {
  30041. image.isTouched = false;
  30042. return;
  30043. }
  30044. }
  30045. if (e.cancelable) {
  30046. e.preventDefault();
  30047. }
  30048. e.stopPropagation();
  30049. image.isMoved = true;
  30050. image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
  30051. image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
  30052. if (image.currentX < image.minX) {
  30053. image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
  30054. }
  30055. if (image.currentX > image.maxX) {
  30056. image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
  30057. }
  30058. if (image.currentY < image.minY) {
  30059. image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
  30060. }
  30061. if (image.currentY > image.maxY) {
  30062. image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
  30063. }
  30064. // Velocity
  30065. if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
  30066. if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
  30067. if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
  30068. velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
  30069. velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
  30070. if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
  30071. if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
  30072. velocity.prevPositionX = image.touchesCurrent.x;
  30073. velocity.prevPositionY = image.touchesCurrent.y;
  30074. velocity.prevTime = Date.now();
  30075. gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
  30076. },
  30077. onTouchEnd: function onTouchEnd() {
  30078. var swiper = this;
  30079. var zoom = swiper.zoom;
  30080. var gesture = zoom.gesture;
  30081. var image = zoom.image;
  30082. var velocity = zoom.velocity;
  30083. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  30084. if (!image.isTouched || !image.isMoved) {
  30085. image.isTouched = false;
  30086. image.isMoved = false;
  30087. return;
  30088. }
  30089. image.isTouched = false;
  30090. image.isMoved = false;
  30091. var momentumDurationX = 300;
  30092. var momentumDurationY = 300;
  30093. var momentumDistanceX = velocity.x * momentumDurationX;
  30094. var newPositionX = image.currentX + momentumDistanceX;
  30095. var momentumDistanceY = velocity.y * momentumDurationY;
  30096. var newPositionY = image.currentY + momentumDistanceY;
  30097. // Fix duration
  30098. if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
  30099. if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
  30100. var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
  30101. image.currentX = newPositionX;
  30102. image.currentY = newPositionY;
  30103. // Define if we need image drag
  30104. var scaledWidth = image.width * zoom.scale;
  30105. var scaledHeight = image.height * zoom.scale;
  30106. image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
  30107. image.maxX = -image.minX;
  30108. image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
  30109. image.maxY = -image.minY;
  30110. image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
  30111. image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
  30112. gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
  30113. },
  30114. onTransitionEnd: function onTransitionEnd() {
  30115. var swiper = this;
  30116. var zoom = swiper.zoom;
  30117. var gesture = zoom.gesture;
  30118. if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
  30119. if (gesture.$imageEl) {
  30120. gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
  30121. }
  30122. if (gesture.$imageWrapEl) {
  30123. gesture.$imageWrapEl.transform('translate3d(0,0,0)');
  30124. }
  30125. zoom.scale = 1;
  30126. zoom.currentScale = 1;
  30127. gesture.$slideEl = undefined;
  30128. gesture.$imageEl = undefined;
  30129. gesture.$imageWrapEl = undefined;
  30130. }
  30131. },
  30132. // Toggle Zoom
  30133. toggle: function toggle(e) {
  30134. var swiper = this;
  30135. var zoom = swiper.zoom;
  30136. if (zoom.scale && zoom.scale !== 1) {
  30137. // Zoom Out
  30138. zoom.out();
  30139. } else {
  30140. // Zoom In
  30141. zoom.in(e);
  30142. }
  30143. },
  30144. in: function in$1(e) {
  30145. var swiper = this;
  30146. var zoom = swiper.zoom;
  30147. var params = swiper.params.zoom;
  30148. var gesture = zoom.gesture;
  30149. var image = zoom.image;
  30150. if (!gesture.$slideEl) {
  30151. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  30152. gesture.$slideEl = swiper.$wrapperEl.children(("." + (swiper.params.slideActiveClass)));
  30153. } else {
  30154. gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
  30155. }
  30156. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  30157. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  30158. }
  30159. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  30160. gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
  30161. var touchX;
  30162. var touchY;
  30163. var offsetX;
  30164. var offsetY;
  30165. var diffX;
  30166. var diffY;
  30167. var translateX;
  30168. var translateY;
  30169. var imageWidth;
  30170. var imageHeight;
  30171. var scaledWidth;
  30172. var scaledHeight;
  30173. var translateMinX;
  30174. var translateMinY;
  30175. var translateMaxX;
  30176. var translateMaxY;
  30177. var slideWidth;
  30178. var slideHeight;
  30179. if (typeof image.touchesStart.x === 'undefined' && e) {
  30180. touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
  30181. touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
  30182. } else {
  30183. touchX = image.touchesStart.x;
  30184. touchY = image.touchesStart.y;
  30185. }
  30186. zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  30187. zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  30188. if (e) {
  30189. slideWidth = gesture.$slideEl[0].offsetWidth;
  30190. slideHeight = gesture.$slideEl[0].offsetHeight;
  30191. offsetX = gesture.$slideEl.offset().left;
  30192. offsetY = gesture.$slideEl.offset().top;
  30193. diffX = (offsetX + (slideWidth / 2)) - touchX;
  30194. diffY = (offsetY + (slideHeight / 2)) - touchY;
  30195. imageWidth = gesture.$imageEl[0].offsetWidth;
  30196. imageHeight = gesture.$imageEl[0].offsetHeight;
  30197. scaledWidth = imageWidth * zoom.scale;
  30198. scaledHeight = imageHeight * zoom.scale;
  30199. translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
  30200. translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
  30201. translateMaxX = -translateMinX;
  30202. translateMaxY = -translateMinY;
  30203. translateX = diffX * zoom.scale;
  30204. translateY = diffY * zoom.scale;
  30205. if (translateX < translateMinX) {
  30206. translateX = translateMinX;
  30207. }
  30208. if (translateX > translateMaxX) {
  30209. translateX = translateMaxX;
  30210. }
  30211. if (translateY < translateMinY) {
  30212. translateY = translateMinY;
  30213. }
  30214. if (translateY > translateMaxY) {
  30215. translateY = translateMaxY;
  30216. }
  30217. } else {
  30218. translateX = 0;
  30219. translateY = 0;
  30220. }
  30221. gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
  30222. gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  30223. },
  30224. out: function out() {
  30225. var swiper = this;
  30226. var zoom = swiper.zoom;
  30227. var params = swiper.params.zoom;
  30228. var gesture = zoom.gesture;
  30229. if (!gesture.$slideEl) {
  30230. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  30231. gesture.$slideEl = swiper.$wrapperEl.children(("." + (swiper.params.slideActiveClass)));
  30232. } else {
  30233. gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
  30234. }
  30235. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  30236. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  30237. }
  30238. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  30239. zoom.scale = 1;
  30240. zoom.currentScale = 1;
  30241. gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
  30242. gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
  30243. gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
  30244. gesture.$slideEl = undefined;
  30245. },
  30246. // Attach/Detach Events
  30247. enable: function enable() {
  30248. var swiper = this;
  30249. var zoom = swiper.zoom;
  30250. if (zoom.enabled) { return; }
  30251. zoom.enabled = true;
  30252. var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
  30253. var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
  30254. var slideSelector = "." + (swiper.params.slideClass);
  30255. // Scale image
  30256. if (Support.gestures) {
  30257. swiper.$wrapperEl.on('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
  30258. swiper.$wrapperEl.on('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
  30259. swiper.$wrapperEl.on('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
  30260. } else if (swiper.touchEvents.start === 'touchstart') {
  30261. swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
  30262. swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
  30263. swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
  30264. if (swiper.touchEvents.cancel) {
  30265. swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
  30266. }
  30267. }
  30268. // Move image
  30269. swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
  30270. },
  30271. disable: function disable() {
  30272. var swiper = this;
  30273. var zoom = swiper.zoom;
  30274. if (!zoom.enabled) { return; }
  30275. swiper.zoom.enabled = false;
  30276. var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
  30277. var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
  30278. var slideSelector = "." + (swiper.params.slideClass);
  30279. // Scale image
  30280. if (Support.gestures) {
  30281. swiper.$wrapperEl.off('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
  30282. swiper.$wrapperEl.off('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
  30283. swiper.$wrapperEl.off('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
  30284. } else if (swiper.touchEvents.start === 'touchstart') {
  30285. swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
  30286. swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
  30287. swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
  30288. if (swiper.touchEvents.cancel) {
  30289. swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
  30290. }
  30291. }
  30292. // Move image
  30293. swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
  30294. },
  30295. };
  30296. var Zoom$1 = {
  30297. name: 'zoom',
  30298. params: {
  30299. zoom: {
  30300. enabled: false,
  30301. maxRatio: 3,
  30302. minRatio: 1,
  30303. toggle: true,
  30304. containerClass: 'swiper-zoom-container',
  30305. zoomedSlideClass: 'swiper-slide-zoomed',
  30306. },
  30307. },
  30308. create: function create() {
  30309. var swiper = this;
  30310. var zoom = {
  30311. enabled: false,
  30312. scale: 1,
  30313. currentScale: 1,
  30314. isScaling: false,
  30315. gesture: {
  30316. $slideEl: undefined,
  30317. slideWidth: undefined,
  30318. slideHeight: undefined,
  30319. $imageEl: undefined,
  30320. $imageWrapEl: undefined,
  30321. maxRatio: 3,
  30322. },
  30323. image: {
  30324. isTouched: undefined,
  30325. isMoved: undefined,
  30326. currentX: undefined,
  30327. currentY: undefined,
  30328. minX: undefined,
  30329. minY: undefined,
  30330. maxX: undefined,
  30331. maxY: undefined,
  30332. width: undefined,
  30333. height: undefined,
  30334. startX: undefined,
  30335. startY: undefined,
  30336. touchesStart: {},
  30337. touchesCurrent: {},
  30338. },
  30339. velocity: {
  30340. x: undefined,
  30341. y: undefined,
  30342. prevPositionX: undefined,
  30343. prevPositionY: undefined,
  30344. prevTime: undefined,
  30345. },
  30346. };
  30347. ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
  30348. zoom[methodName] = Zoom[methodName].bind(swiper);
  30349. });
  30350. Utils.extend(swiper, {
  30351. zoom: zoom,
  30352. });
  30353. var scale = 1;
  30354. Object.defineProperty(swiper.zoom, 'scale', {
  30355. get: function get() {
  30356. return scale;
  30357. },
  30358. set: function set(value) {
  30359. if (scale !== value) {
  30360. var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
  30361. var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
  30362. swiper.emit('zoomChange', value, imageEl, slideEl);
  30363. }
  30364. scale = value;
  30365. },
  30366. });
  30367. },
  30368. on: {
  30369. init: function init() {
  30370. var swiper = this;
  30371. if (swiper.params.zoom.enabled) {
  30372. swiper.zoom.enable();
  30373. }
  30374. },
  30375. destroy: function destroy() {
  30376. var swiper = this;
  30377. swiper.zoom.disable();
  30378. },
  30379. touchStart: function touchStart(e) {
  30380. var swiper = this;
  30381. if (!swiper.zoom.enabled) { return; }
  30382. swiper.zoom.onTouchStart(e);
  30383. },
  30384. touchEnd: function touchEnd(e) {
  30385. var swiper = this;
  30386. if (!swiper.zoom.enabled) { return; }
  30387. swiper.zoom.onTouchEnd(e);
  30388. },
  30389. doubleTap: function doubleTap(e) {
  30390. var swiper = this;
  30391. if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
  30392. swiper.zoom.toggle(e);
  30393. }
  30394. },
  30395. transitionEnd: function transitionEnd() {
  30396. var swiper = this;
  30397. if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
  30398. swiper.zoom.onTransitionEnd();
  30399. }
  30400. },
  30401. slideChange: function slideChange() {
  30402. var swiper = this;
  30403. if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
  30404. swiper.zoom.onTransitionEnd();
  30405. }
  30406. },
  30407. },
  30408. };
  30409. var Lazy$2 = {
  30410. loadInSlide: function loadInSlide(index, loadInDuplicate) {
  30411. if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
  30412. var swiper = this;
  30413. var params = swiper.params.lazy;
  30414. if (typeof index === 'undefined') { return; }
  30415. if (swiper.slides.length === 0) { return; }
  30416. var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  30417. var $slideEl = isVirtual
  30418. ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
  30419. : swiper.slides.eq(index);
  30420. var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
  30421. if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
  30422. $images = $images.add($slideEl[0]);
  30423. }
  30424. if ($images.length === 0) { return; }
  30425. $images.each(function (imageIndex, imageEl) {
  30426. var $imageEl = $(imageEl);
  30427. $imageEl.addClass(params.loadingClass);
  30428. var background = $imageEl.attr('data-background');
  30429. var src = $imageEl.attr('data-src');
  30430. var srcset = $imageEl.attr('data-srcset');
  30431. var sizes = $imageEl.attr('data-sizes');
  30432. var $pictureEl = $imageEl.parent('picture');
  30433. swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
  30434. if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
  30435. if (background) {
  30436. $imageEl.css('background-image', ("url(\"" + background + "\")"));
  30437. $imageEl.removeAttr('data-background');
  30438. } else {
  30439. if (srcset) {
  30440. $imageEl.attr('srcset', srcset);
  30441. $imageEl.removeAttr('data-srcset');
  30442. }
  30443. if (sizes) {
  30444. $imageEl.attr('sizes', sizes);
  30445. $imageEl.removeAttr('data-sizes');
  30446. }
  30447. if ($pictureEl.length) {
  30448. $pictureEl.children('source').each(function (sourceIndex, sourceEl) {
  30449. var $source = $(sourceEl);
  30450. if ($source.attr('data-srcset')) {
  30451. $source.attr('srcset', $source.attr('data-srcset'));
  30452. $source.removeAttr('data-srcset');
  30453. }
  30454. });
  30455. }
  30456. if (src) {
  30457. $imageEl.attr('src', src);
  30458. $imageEl.removeAttr('data-src');
  30459. }
  30460. }
  30461. $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
  30462. $slideEl.find(("." + (params.preloaderClass))).remove();
  30463. if (swiper.params.loop && loadInDuplicate) {
  30464. var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
  30465. if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
  30466. var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
  30467. swiper.lazy.loadInSlide(originalSlide.index(), false);
  30468. } else {
  30469. var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
  30470. swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
  30471. }
  30472. }
  30473. swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
  30474. if (swiper.params.autoHeight) {
  30475. swiper.updateAutoHeight();
  30476. }
  30477. });
  30478. swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
  30479. });
  30480. },
  30481. load: function load() {
  30482. var swiper = this;
  30483. var $wrapperEl = swiper.$wrapperEl;
  30484. var swiperParams = swiper.params;
  30485. var slides = swiper.slides;
  30486. var activeIndex = swiper.activeIndex;
  30487. var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
  30488. var params = swiperParams.lazy;
  30489. var slidesPerView = swiperParams.slidesPerView;
  30490. if (slidesPerView === 'auto') {
  30491. slidesPerView = 0;
  30492. }
  30493. function slideExist(index) {
  30494. if (isVirtual) {
  30495. if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
  30496. return true;
  30497. }
  30498. } else if (slides[index]) { return true; }
  30499. return false;
  30500. }
  30501. function slideIndex(slideEl) {
  30502. if (isVirtual) {
  30503. return $(slideEl).attr('data-swiper-slide-index');
  30504. }
  30505. return $(slideEl).index();
  30506. }
  30507. if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
  30508. if (swiper.params.watchSlidesVisibility) {
  30509. $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
  30510. var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
  30511. swiper.lazy.loadInSlide(index);
  30512. });
  30513. } else if (slidesPerView > 1) {
  30514. for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
  30515. if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
  30516. }
  30517. } else {
  30518. swiper.lazy.loadInSlide(activeIndex);
  30519. }
  30520. if (params.loadPrevNext) {
  30521. if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
  30522. var amount = params.loadPrevNextAmount;
  30523. var spv = slidesPerView;
  30524. var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
  30525. var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
  30526. // Next Slides
  30527. for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
  30528. if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
  30529. }
  30530. // Prev Slides
  30531. for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
  30532. if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
  30533. }
  30534. } else {
  30535. var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
  30536. if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
  30537. var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
  30538. if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
  30539. }
  30540. }
  30541. },
  30542. };
  30543. var Lazy$3 = {
  30544. name: 'lazy',
  30545. params: {
  30546. lazy: {
  30547. enabled: false,
  30548. loadPrevNext: false,
  30549. loadPrevNextAmount: 1,
  30550. loadOnTransitionStart: false,
  30551. elementClass: 'swiper-lazy',
  30552. loadingClass: 'swiper-lazy-loading',
  30553. loadedClass: 'swiper-lazy-loaded',
  30554. preloaderClass: 'swiper-lazy-preloader',
  30555. },
  30556. },
  30557. create: function create() {
  30558. var swiper = this;
  30559. Utils.extend(swiper, {
  30560. lazy: {
  30561. initialImageLoaded: false,
  30562. load: Lazy$2.load.bind(swiper),
  30563. loadInSlide: Lazy$2.loadInSlide.bind(swiper),
  30564. },
  30565. });
  30566. },
  30567. on: {
  30568. beforeInit: function beforeInit() {
  30569. var swiper = this;
  30570. if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
  30571. swiper.params.preloadImages = false;
  30572. }
  30573. },
  30574. init: function init() {
  30575. var swiper = this;
  30576. if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
  30577. swiper.lazy.load();
  30578. }
  30579. },
  30580. scroll: function scroll() {
  30581. var swiper = this;
  30582. if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
  30583. swiper.lazy.load();
  30584. }
  30585. },
  30586. resize: function resize() {
  30587. var swiper = this;
  30588. if (swiper.params.lazy.enabled) {
  30589. swiper.lazy.load();
  30590. }
  30591. },
  30592. scrollbarDragMove: function scrollbarDragMove() {
  30593. var swiper = this;
  30594. if (swiper.params.lazy.enabled) {
  30595. swiper.lazy.load();
  30596. }
  30597. },
  30598. transitionStart: function transitionStart() {
  30599. var swiper = this;
  30600. if (swiper.params.lazy.enabled) {
  30601. if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
  30602. swiper.lazy.load();
  30603. }
  30604. }
  30605. },
  30606. transitionEnd: function transitionEnd() {
  30607. var swiper = this;
  30608. if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
  30609. swiper.lazy.load();
  30610. }
  30611. },
  30612. slideChange: function slideChange() {
  30613. var swiper = this;
  30614. if (swiper.params.lazy.enabled && swiper.params.cssMode) {
  30615. swiper.lazy.load();
  30616. }
  30617. },
  30618. },
  30619. };
  30620. /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
  30621. var Controller = {
  30622. LinearSpline: function LinearSpline(x, y) {
  30623. var binarySearch = (function search() {
  30624. var maxIndex;
  30625. var minIndex;
  30626. var guess;
  30627. return function (array, val) {
  30628. minIndex = -1;
  30629. maxIndex = array.length;
  30630. while (maxIndex - minIndex > 1) {
  30631. guess = maxIndex + minIndex >> 1;
  30632. if (array[guess] <= val) {
  30633. minIndex = guess;
  30634. } else {
  30635. maxIndex = guess;
  30636. }
  30637. }
  30638. return maxIndex;
  30639. };
  30640. }());
  30641. this.x = x;
  30642. this.y = y;
  30643. this.lastIndex = x.length - 1;
  30644. // Given an x value (x2), return the expected y2 value:
  30645. // (x1,y1) is the known point before given value,
  30646. // (x3,y3) is the known point after given value.
  30647. var i1;
  30648. var i3;
  30649. this.interpolate = function interpolate(x2) {
  30650. if (!x2) { return 0; }
  30651. // Get the indexes of x1 and x3 (the array indexes before and after given x2):
  30652. i3 = binarySearch(this.x, x2);
  30653. i1 = i3 - 1;
  30654. // We have our indexes i1 & i3, so we can calculate already:
  30655. // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
  30656. return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
  30657. };
  30658. return this;
  30659. },
  30660. // xxx: for now i will just save one spline function to to
  30661. getInterpolateFunction: function getInterpolateFunction(c) {
  30662. var swiper = this;
  30663. if (!swiper.controller.spline) {
  30664. swiper.controller.spline = swiper.params.loop
  30665. ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
  30666. : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
  30667. }
  30668. },
  30669. setTranslate: function setTranslate(setTranslate$1, byController) {
  30670. var swiper = this;
  30671. var controlled = swiper.controller.control;
  30672. var multiplier;
  30673. var controlledTranslate;
  30674. function setControlledTranslate(c) {
  30675. // this will create an Interpolate function based on the snapGrids
  30676. // x is the Grid of the scrolled scroller and y will be the controlled scroller
  30677. // it makes sense to create this only once and recall it for the interpolation
  30678. // the function does a lot of value caching for performance
  30679. var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
  30680. if (swiper.params.controller.by === 'slide') {
  30681. swiper.controller.getInterpolateFunction(c);
  30682. // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
  30683. // but it did not work out
  30684. controlledTranslate = -swiper.controller.spline.interpolate(-translate);
  30685. }
  30686. if (!controlledTranslate || swiper.params.controller.by === 'container') {
  30687. multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
  30688. controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
  30689. }
  30690. if (swiper.params.controller.inverse) {
  30691. controlledTranslate = c.maxTranslate() - controlledTranslate;
  30692. }
  30693. c.updateProgress(controlledTranslate);
  30694. c.setTranslate(controlledTranslate, swiper);
  30695. c.updateActiveIndex();
  30696. c.updateSlidesClasses();
  30697. }
  30698. if (Array.isArray(controlled)) {
  30699. for (var i = 0; i < controlled.length; i += 1) {
  30700. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  30701. setControlledTranslate(controlled[i]);
  30702. }
  30703. }
  30704. } else if (controlled instanceof Swiper && byController !== controlled) {
  30705. setControlledTranslate(controlled);
  30706. }
  30707. },
  30708. setTransition: function setTransition(duration, byController) {
  30709. var swiper = this;
  30710. var controlled = swiper.controller.control;
  30711. var i;
  30712. function setControlledTransition(c) {
  30713. c.setTransition(duration, swiper);
  30714. if (duration !== 0) {
  30715. c.transitionStart();
  30716. if (c.params.autoHeight) {
  30717. Utils.nextTick(function () {
  30718. c.updateAutoHeight();
  30719. });
  30720. }
  30721. c.$wrapperEl.transitionEnd(function () {
  30722. if (!controlled) { return; }
  30723. if (c.params.loop && swiper.params.controller.by === 'slide') {
  30724. c.loopFix();
  30725. }
  30726. c.transitionEnd();
  30727. });
  30728. }
  30729. }
  30730. if (Array.isArray(controlled)) {
  30731. for (i = 0; i < controlled.length; i += 1) {
  30732. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  30733. setControlledTransition(controlled[i]);
  30734. }
  30735. }
  30736. } else if (controlled instanceof Swiper && byController !== controlled) {
  30737. setControlledTransition(controlled);
  30738. }
  30739. },
  30740. };
  30741. var Controller$1 = {
  30742. name: 'controller',
  30743. params: {
  30744. controller: {
  30745. control: undefined,
  30746. inverse: false,
  30747. by: 'slide', // or 'container'
  30748. },
  30749. },
  30750. create: function create() {
  30751. var swiper = this;
  30752. Utils.extend(swiper, {
  30753. controller: {
  30754. control: swiper.params.controller.control,
  30755. getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
  30756. setTranslate: Controller.setTranslate.bind(swiper),
  30757. setTransition: Controller.setTransition.bind(swiper),
  30758. },
  30759. });
  30760. },
  30761. on: {
  30762. update: function update() {
  30763. var swiper = this;
  30764. if (!swiper.controller.control) { return; }
  30765. if (swiper.controller.spline) {
  30766. swiper.controller.spline = undefined;
  30767. delete swiper.controller.spline;
  30768. }
  30769. },
  30770. resize: function resize() {
  30771. var swiper = this;
  30772. if (!swiper.controller.control) { return; }
  30773. if (swiper.controller.spline) {
  30774. swiper.controller.spline = undefined;
  30775. delete swiper.controller.spline;
  30776. }
  30777. },
  30778. observerUpdate: function observerUpdate() {
  30779. var swiper = this;
  30780. if (!swiper.controller.control) { return; }
  30781. if (swiper.controller.spline) {
  30782. swiper.controller.spline = undefined;
  30783. delete swiper.controller.spline;
  30784. }
  30785. },
  30786. setTranslate: function setTranslate(translate, byController) {
  30787. var swiper = this;
  30788. if (!swiper.controller.control) { return; }
  30789. swiper.controller.setTranslate(translate, byController);
  30790. },
  30791. setTransition: function setTransition(duration, byController) {
  30792. var swiper = this;
  30793. if (!swiper.controller.control) { return; }
  30794. swiper.controller.setTransition(duration, byController);
  30795. },
  30796. },
  30797. };
  30798. var History$1 = {
  30799. init: function init() {
  30800. var swiper = this;
  30801. if (!swiper.params.history) { return; }
  30802. if (!win.history || !win.history.pushState) {
  30803. swiper.params.history.enabled = false;
  30804. swiper.params.hashNavigation.enabled = true;
  30805. return;
  30806. }
  30807. var history = swiper.history;
  30808. history.initialized = true;
  30809. history.paths = History$1.getPathValues();
  30810. if (!history.paths.key && !history.paths.value) { return; }
  30811. history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
  30812. if (!swiper.params.history.replaceState) {
  30813. win.addEventListener('popstate', swiper.history.setHistoryPopState);
  30814. }
  30815. },
  30816. destroy: function destroy() {
  30817. var swiper = this;
  30818. if (!swiper.params.history.replaceState) {
  30819. win.removeEventListener('popstate', swiper.history.setHistoryPopState);
  30820. }
  30821. },
  30822. setHistoryPopState: function setHistoryPopState() {
  30823. var swiper = this;
  30824. swiper.history.paths = History$1.getPathValues();
  30825. swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
  30826. },
  30827. getPathValues: function getPathValues() {
  30828. var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });
  30829. var total = pathArray.length;
  30830. var key = pathArray[total - 2];
  30831. var value = pathArray[total - 1];
  30832. return { key: key, value: value };
  30833. },
  30834. setHistory: function setHistory(key, index) {
  30835. var swiper = this;
  30836. if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }
  30837. var slide = swiper.slides.eq(index);
  30838. var value = History$1.slugify(slide.attr('data-history'));
  30839. if (!win.location.pathname.includes(key)) {
  30840. value = key + "/" + value;
  30841. }
  30842. var currentState = win.history.state;
  30843. if (currentState && currentState.value === value) {
  30844. return;
  30845. }
  30846. if (swiper.params.history.replaceState) {
  30847. win.history.replaceState({ value: value }, null, value);
  30848. } else {
  30849. win.history.pushState({ value: value }, null, value);
  30850. }
  30851. },
  30852. slugify: function slugify(text) {
  30853. return text.toString()
  30854. .replace(/\s+/g, '-')
  30855. .replace(/[^\w-]+/g, '')
  30856. .replace(/--+/g, '-')
  30857. .replace(/^-+/, '')
  30858. .replace(/-+$/, '');
  30859. },
  30860. scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
  30861. var swiper = this;
  30862. if (value) {
  30863. for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
  30864. var slide = swiper.slides.eq(i);
  30865. var slideHistory = History$1.slugify(slide.attr('data-history'));
  30866. if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
  30867. var index = slide.index();
  30868. swiper.slideTo(index, speed, runCallbacks);
  30869. }
  30870. }
  30871. } else {
  30872. swiper.slideTo(0, speed, runCallbacks);
  30873. }
  30874. },
  30875. };
  30876. var History$2 = {
  30877. name: 'history',
  30878. params: {
  30879. history: {
  30880. enabled: false,
  30881. replaceState: false,
  30882. key: 'slides',
  30883. },
  30884. },
  30885. create: function create() {
  30886. var swiper = this;
  30887. Utils.extend(swiper, {
  30888. history: {
  30889. init: History$1.init.bind(swiper),
  30890. setHistory: History$1.setHistory.bind(swiper),
  30891. setHistoryPopState: History$1.setHistoryPopState.bind(swiper),
  30892. scrollToSlide: History$1.scrollToSlide.bind(swiper),
  30893. destroy: History$1.destroy.bind(swiper),
  30894. },
  30895. });
  30896. },
  30897. on: {
  30898. init: function init() {
  30899. var swiper = this;
  30900. if (swiper.params.history.enabled) {
  30901. swiper.history.init();
  30902. }
  30903. },
  30904. destroy: function destroy() {
  30905. var swiper = this;
  30906. if (swiper.params.history.enabled) {
  30907. swiper.history.destroy();
  30908. }
  30909. },
  30910. transitionEnd: function transitionEnd() {
  30911. var swiper = this;
  30912. if (swiper.history.initialized) {
  30913. swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
  30914. }
  30915. },
  30916. slideChange: function slideChange() {
  30917. var swiper = this;
  30918. if (swiper.history.initialized && swiper.params.cssMode) {
  30919. swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
  30920. }
  30921. },
  30922. },
  30923. };
  30924. var HashNavigation = {
  30925. onHashCange: function onHashCange() {
  30926. var swiper = this;
  30927. swiper.emit('hashChange');
  30928. var newHash = doc.location.hash.replace('#', '');
  30929. var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
  30930. if (newHash !== activeSlideHash) {
  30931. var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index();
  30932. if (typeof newIndex === 'undefined') { return; }
  30933. swiper.slideTo(newIndex);
  30934. }
  30935. },
  30936. setHash: function setHash() {
  30937. var swiper = this;
  30938. if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }
  30939. if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {
  30940. win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));
  30941. swiper.emit('hashSet');
  30942. } else {
  30943. var slide = swiper.slides.eq(swiper.activeIndex);
  30944. var hash = slide.attr('data-hash') || slide.attr('data-history');
  30945. doc.location.hash = hash || '';
  30946. swiper.emit('hashSet');
  30947. }
  30948. },
  30949. init: function init() {
  30950. var swiper = this;
  30951. if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }
  30952. swiper.hashNavigation.initialized = true;
  30953. var hash = doc.location.hash.replace('#', '');
  30954. if (hash) {
  30955. var speed = 0;
  30956. for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
  30957. var slide = swiper.slides.eq(i);
  30958. var slideHash = slide.attr('data-hash') || slide.attr('data-history');
  30959. if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
  30960. var index = slide.index();
  30961. swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
  30962. }
  30963. }
  30964. }
  30965. if (swiper.params.hashNavigation.watchState) {
  30966. $(win).on('hashchange', swiper.hashNavigation.onHashCange);
  30967. }
  30968. },
  30969. destroy: function destroy() {
  30970. var swiper = this;
  30971. if (swiper.params.hashNavigation.watchState) {
  30972. $(win).off('hashchange', swiper.hashNavigation.onHashCange);
  30973. }
  30974. },
  30975. };
  30976. var HashNavigation$1 = {
  30977. name: 'hash-navigation',
  30978. params: {
  30979. hashNavigation: {
  30980. enabled: false,
  30981. replaceState: false,
  30982. watchState: false,
  30983. },
  30984. },
  30985. create: function create() {
  30986. var swiper = this;
  30987. Utils.extend(swiper, {
  30988. hashNavigation: {
  30989. initialized: false,
  30990. init: HashNavigation.init.bind(swiper),
  30991. destroy: HashNavigation.destroy.bind(swiper),
  30992. setHash: HashNavigation.setHash.bind(swiper),
  30993. onHashCange: HashNavigation.onHashCange.bind(swiper),
  30994. },
  30995. });
  30996. },
  30997. on: {
  30998. init: function init() {
  30999. var swiper = this;
  31000. if (swiper.params.hashNavigation.enabled) {
  31001. swiper.hashNavigation.init();
  31002. }
  31003. },
  31004. destroy: function destroy() {
  31005. var swiper = this;
  31006. if (swiper.params.hashNavigation.enabled) {
  31007. swiper.hashNavigation.destroy();
  31008. }
  31009. },
  31010. transitionEnd: function transitionEnd() {
  31011. var swiper = this;
  31012. if (swiper.hashNavigation.initialized) {
  31013. swiper.hashNavigation.setHash();
  31014. }
  31015. },
  31016. slideChange: function slideChange() {
  31017. var swiper = this;
  31018. if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
  31019. swiper.hashNavigation.setHash();
  31020. }
  31021. },
  31022. },
  31023. };
  31024. var a11y = {
  31025. makeElFocusable: function makeElFocusable($el) {
  31026. $el.attr('tabIndex', '0');
  31027. return $el;
  31028. },
  31029. makeElNotFocusable: function makeElNotFocusable($el) {
  31030. $el.attr('tabIndex', '-1');
  31031. return $el;
  31032. },
  31033. addElRole: function addElRole($el, role) {
  31034. $el.attr('role', role);
  31035. return $el;
  31036. },
  31037. addElLabel: function addElLabel($el, label) {
  31038. $el.attr('aria-label', label);
  31039. return $el;
  31040. },
  31041. disableEl: function disableEl($el) {
  31042. $el.attr('aria-disabled', true);
  31043. return $el;
  31044. },
  31045. enableEl: function enableEl($el) {
  31046. $el.attr('aria-disabled', false);
  31047. return $el;
  31048. },
  31049. onEnterKey: function onEnterKey(e) {
  31050. var swiper = this;
  31051. var params = swiper.params.a11y;
  31052. if (e.keyCode !== 13) { return; }
  31053. var $targetEl = $(e.target);
  31054. if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
  31055. if (!(swiper.isEnd && !swiper.params.loop)) {
  31056. swiper.slideNext();
  31057. }
  31058. if (swiper.isEnd) {
  31059. swiper.a11y.notify(params.lastSlideMessage);
  31060. } else {
  31061. swiper.a11y.notify(params.nextSlideMessage);
  31062. }
  31063. }
  31064. if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
  31065. if (!(swiper.isBeginning && !swiper.params.loop)) {
  31066. swiper.slidePrev();
  31067. }
  31068. if (swiper.isBeginning) {
  31069. swiper.a11y.notify(params.firstSlideMessage);
  31070. } else {
  31071. swiper.a11y.notify(params.prevSlideMessage);
  31072. }
  31073. }
  31074. if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
  31075. $targetEl[0].click();
  31076. }
  31077. },
  31078. notify: function notify(message) {
  31079. var swiper = this;
  31080. var notification = swiper.a11y.liveRegion;
  31081. if (notification.length === 0) { return; }
  31082. notification.html('');
  31083. notification.html(message);
  31084. },
  31085. updateNavigation: function updateNavigation() {
  31086. var swiper = this;
  31087. if (swiper.params.loop || !swiper.navigation) { return; }
  31088. var ref = swiper.navigation;
  31089. var $nextEl = ref.$nextEl;
  31090. var $prevEl = ref.$prevEl;
  31091. if ($prevEl && $prevEl.length > 0) {
  31092. if (swiper.isBeginning) {
  31093. swiper.a11y.disableEl($prevEl);
  31094. swiper.a11y.makeElNotFocusable($prevEl);
  31095. } else {
  31096. swiper.a11y.enableEl($prevEl);
  31097. swiper.a11y.makeElFocusable($prevEl);
  31098. }
  31099. }
  31100. if ($nextEl && $nextEl.length > 0) {
  31101. if (swiper.isEnd) {
  31102. swiper.a11y.disableEl($nextEl);
  31103. swiper.a11y.makeElNotFocusable($nextEl);
  31104. } else {
  31105. swiper.a11y.enableEl($nextEl);
  31106. swiper.a11y.makeElFocusable($nextEl);
  31107. }
  31108. }
  31109. },
  31110. updatePagination: function updatePagination() {
  31111. var swiper = this;
  31112. var params = swiper.params.a11y;
  31113. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  31114. swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
  31115. var $bulletEl = $(bulletEl);
  31116. swiper.a11y.makeElFocusable($bulletEl);
  31117. swiper.a11y.addElRole($bulletEl, 'button');
  31118. swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1));
  31119. });
  31120. }
  31121. },
  31122. init: function init() {
  31123. var swiper = this;
  31124. swiper.$el.append(swiper.a11y.liveRegion);
  31125. // Navigation
  31126. var params = swiper.params.a11y;
  31127. var $nextEl;
  31128. var $prevEl;
  31129. if (swiper.navigation && swiper.navigation.$nextEl) {
  31130. $nextEl = swiper.navigation.$nextEl;
  31131. }
  31132. if (swiper.navigation && swiper.navigation.$prevEl) {
  31133. $prevEl = swiper.navigation.$prevEl;
  31134. }
  31135. if ($nextEl) {
  31136. swiper.a11y.makeElFocusable($nextEl);
  31137. swiper.a11y.addElRole($nextEl, 'button');
  31138. swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
  31139. $nextEl.on('keydown', swiper.a11y.onEnterKey);
  31140. }
  31141. if ($prevEl) {
  31142. swiper.a11y.makeElFocusable($prevEl);
  31143. swiper.a11y.addElRole($prevEl, 'button');
  31144. swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
  31145. $prevEl.on('keydown', swiper.a11y.onEnterKey);
  31146. }
  31147. // Pagination
  31148. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  31149. swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
  31150. }
  31151. },
  31152. destroy: function destroy() {
  31153. var swiper = this;
  31154. if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
  31155. var $nextEl;
  31156. var $prevEl;
  31157. if (swiper.navigation && swiper.navigation.$nextEl) {
  31158. $nextEl = swiper.navigation.$nextEl;
  31159. }
  31160. if (swiper.navigation && swiper.navigation.$prevEl) {
  31161. $prevEl = swiper.navigation.$prevEl;
  31162. }
  31163. if ($nextEl) {
  31164. $nextEl.off('keydown', swiper.a11y.onEnterKey);
  31165. }
  31166. if ($prevEl) {
  31167. $prevEl.off('keydown', swiper.a11y.onEnterKey);
  31168. }
  31169. // Pagination
  31170. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  31171. swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
  31172. }
  31173. },
  31174. };
  31175. var A11y = {
  31176. name: 'a11y',
  31177. params: {
  31178. a11y: {
  31179. enabled: true,
  31180. notificationClass: 'swiper-notification',
  31181. prevSlideMessage: 'Previous slide',
  31182. nextSlideMessage: 'Next slide',
  31183. firstSlideMessage: 'This is the first slide',
  31184. lastSlideMessage: 'This is the last slide',
  31185. paginationBulletMessage: 'Go to slide {{index}}',
  31186. },
  31187. },
  31188. create: function create() {
  31189. var swiper = this;
  31190. Utils.extend(swiper, {
  31191. a11y: {
  31192. liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
  31193. },
  31194. });
  31195. Object.keys(a11y).forEach(function (methodName) {
  31196. swiper.a11y[methodName] = a11y[methodName].bind(swiper);
  31197. });
  31198. },
  31199. on: {
  31200. init: function init() {
  31201. var swiper = this;
  31202. if (!swiper.params.a11y.enabled) { return; }
  31203. swiper.a11y.init();
  31204. swiper.a11y.updateNavigation();
  31205. },
  31206. toEdge: function toEdge() {
  31207. var swiper = this;
  31208. if (!swiper.params.a11y.enabled) { return; }
  31209. swiper.a11y.updateNavigation();
  31210. },
  31211. fromEdge: function fromEdge() {
  31212. var swiper = this;
  31213. if (!swiper.params.a11y.enabled) { return; }
  31214. swiper.a11y.updateNavigation();
  31215. },
  31216. paginationUpdate: function paginationUpdate() {
  31217. var swiper = this;
  31218. if (!swiper.params.a11y.enabled) { return; }
  31219. swiper.a11y.updatePagination();
  31220. },
  31221. destroy: function destroy() {
  31222. var swiper = this;
  31223. if (!swiper.params.a11y.enabled) { return; }
  31224. swiper.a11y.destroy();
  31225. },
  31226. },
  31227. };
  31228. /* eslint no-underscore-dangle: "off" */
  31229. var Autoplay = {
  31230. run: function run() {
  31231. var swiper = this;
  31232. var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
  31233. var delay = swiper.params.autoplay.delay;
  31234. if ($activeSlideEl.attr('data-swiper-autoplay')) {
  31235. delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
  31236. }
  31237. clearTimeout(swiper.autoplay.timeout);
  31238. swiper.autoplay.timeout = Utils.nextTick(function () {
  31239. if (swiper.params.autoplay.reverseDirection) {
  31240. if (swiper.params.loop) {
  31241. swiper.loopFix();
  31242. swiper.slidePrev(swiper.params.speed, true, true);
  31243. swiper.emit('autoplay');
  31244. } else if (!swiper.isBeginning) {
  31245. swiper.slidePrev(swiper.params.speed, true, true);
  31246. swiper.emit('autoplay');
  31247. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  31248. swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
  31249. swiper.emit('autoplay');
  31250. } else {
  31251. swiper.autoplay.stop();
  31252. }
  31253. } else if (swiper.params.loop) {
  31254. swiper.loopFix();
  31255. swiper.slideNext(swiper.params.speed, true, true);
  31256. swiper.emit('autoplay');
  31257. } else if (!swiper.isEnd) {
  31258. swiper.slideNext(swiper.params.speed, true, true);
  31259. swiper.emit('autoplay');
  31260. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  31261. swiper.slideTo(0, swiper.params.speed, true, true);
  31262. swiper.emit('autoplay');
  31263. } else {
  31264. swiper.autoplay.stop();
  31265. }
  31266. if (swiper.params.cssMode && swiper.autoplay.running) { swiper.autoplay.run(); }
  31267. }, delay);
  31268. },
  31269. start: function start() {
  31270. var swiper = this;
  31271. if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
  31272. if (swiper.autoplay.running) { return false; }
  31273. swiper.autoplay.running = true;
  31274. swiper.emit('autoplayStart');
  31275. swiper.autoplay.run();
  31276. return true;
  31277. },
  31278. stop: function stop() {
  31279. var swiper = this;
  31280. if (!swiper.autoplay.running) { return false; }
  31281. if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
  31282. if (swiper.autoplay.timeout) {
  31283. clearTimeout(swiper.autoplay.timeout);
  31284. swiper.autoplay.timeout = undefined;
  31285. }
  31286. swiper.autoplay.running = false;
  31287. swiper.emit('autoplayStop');
  31288. return true;
  31289. },
  31290. pause: function pause(speed) {
  31291. var swiper = this;
  31292. if (!swiper.autoplay.running) { return; }
  31293. if (swiper.autoplay.paused) { return; }
  31294. if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
  31295. swiper.autoplay.paused = true;
  31296. if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
  31297. swiper.autoplay.paused = false;
  31298. swiper.autoplay.run();
  31299. } else {
  31300. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
  31301. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
  31302. }
  31303. },
  31304. };
  31305. var Autoplay$1 = {
  31306. name: 'autoplay',
  31307. params: {
  31308. autoplay: {
  31309. enabled: false,
  31310. delay: 3000,
  31311. waitForTransition: true,
  31312. disableOnInteraction: true,
  31313. stopOnLastSlide: false,
  31314. reverseDirection: false,
  31315. },
  31316. },
  31317. create: function create() {
  31318. var swiper = this;
  31319. Utils.extend(swiper, {
  31320. autoplay: {
  31321. running: false,
  31322. paused: false,
  31323. run: Autoplay.run.bind(swiper),
  31324. start: Autoplay.start.bind(swiper),
  31325. stop: Autoplay.stop.bind(swiper),
  31326. pause: Autoplay.pause.bind(swiper),
  31327. onVisibilityChange: function onVisibilityChange() {
  31328. if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
  31329. swiper.autoplay.pause();
  31330. }
  31331. if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
  31332. swiper.autoplay.run();
  31333. swiper.autoplay.paused = false;
  31334. }
  31335. },
  31336. onTransitionEnd: function onTransitionEnd(e) {
  31337. if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
  31338. if (e.target !== this) { return; }
  31339. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
  31340. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
  31341. swiper.autoplay.paused = false;
  31342. if (!swiper.autoplay.running) {
  31343. swiper.autoplay.stop();
  31344. } else {
  31345. swiper.autoplay.run();
  31346. }
  31347. },
  31348. },
  31349. });
  31350. },
  31351. on: {
  31352. init: function init() {
  31353. var swiper = this;
  31354. if (swiper.params.autoplay.enabled) {
  31355. swiper.autoplay.start();
  31356. document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
  31357. }
  31358. },
  31359. beforeTransitionStart: function beforeTransitionStart(speed, internal) {
  31360. var swiper = this;
  31361. if (swiper.autoplay.running) {
  31362. if (internal || !swiper.params.autoplay.disableOnInteraction) {
  31363. swiper.autoplay.pause(speed);
  31364. } else {
  31365. swiper.autoplay.stop();
  31366. }
  31367. }
  31368. },
  31369. sliderFirstMove: function sliderFirstMove() {
  31370. var swiper = this;
  31371. if (swiper.autoplay.running) {
  31372. if (swiper.params.autoplay.disableOnInteraction) {
  31373. swiper.autoplay.stop();
  31374. } else {
  31375. swiper.autoplay.pause();
  31376. }
  31377. }
  31378. },
  31379. touchEnd: function touchEnd() {
  31380. var swiper = this;
  31381. if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
  31382. swiper.autoplay.run();
  31383. }
  31384. },
  31385. destroy: function destroy() {
  31386. var swiper = this;
  31387. if (swiper.autoplay.running) {
  31388. swiper.autoplay.stop();
  31389. }
  31390. document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
  31391. },
  31392. },
  31393. };
  31394. var Fade = {
  31395. setTranslate: function setTranslate() {
  31396. var swiper = this;
  31397. var slides = swiper.slides;
  31398. for (var i = 0; i < slides.length; i += 1) {
  31399. var $slideEl = swiper.slides.eq(i);
  31400. var offset = $slideEl[0].swiperSlideOffset;
  31401. var tx = -offset;
  31402. if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
  31403. var ty = 0;
  31404. if (!swiper.isHorizontal()) {
  31405. ty = tx;
  31406. tx = 0;
  31407. }
  31408. var slideOpacity = swiper.params.fadeEffect.crossFade
  31409. ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
  31410. : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
  31411. $slideEl
  31412. .css({
  31413. opacity: slideOpacity,
  31414. })
  31415. .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
  31416. }
  31417. },
  31418. setTransition: function setTransition(duration) {
  31419. var swiper = this;
  31420. var slides = swiper.slides;
  31421. var $wrapperEl = swiper.$wrapperEl;
  31422. slides.transition(duration);
  31423. if (swiper.params.virtualTranslate && duration !== 0) {
  31424. var eventTriggered = false;
  31425. slides.transitionEnd(function () {
  31426. if (eventTriggered) { return; }
  31427. if (!swiper || swiper.destroyed) { return; }
  31428. eventTriggered = true;
  31429. swiper.animating = false;
  31430. var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
  31431. for (var i = 0; i < triggerEvents.length; i += 1) {
  31432. $wrapperEl.trigger(triggerEvents[i]);
  31433. }
  31434. });
  31435. }
  31436. },
  31437. };
  31438. var EffectFade = {
  31439. name: 'effect-fade',
  31440. params: {
  31441. fadeEffect: {
  31442. crossFade: false,
  31443. },
  31444. },
  31445. create: function create() {
  31446. var swiper = this;
  31447. Utils.extend(swiper, {
  31448. fadeEffect: {
  31449. setTranslate: Fade.setTranslate.bind(swiper),
  31450. setTransition: Fade.setTransition.bind(swiper),
  31451. },
  31452. });
  31453. },
  31454. on: {
  31455. beforeInit: function beforeInit() {
  31456. var swiper = this;
  31457. if (swiper.params.effect !== 'fade') { return; }
  31458. swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
  31459. var overwriteParams = {
  31460. slidesPerView: 1,
  31461. slidesPerColumn: 1,
  31462. slidesPerGroup: 1,
  31463. watchSlidesProgress: true,
  31464. spaceBetween: 0,
  31465. virtualTranslate: true,
  31466. };
  31467. Utils.extend(swiper.params, overwriteParams);
  31468. Utils.extend(swiper.originalParams, overwriteParams);
  31469. },
  31470. setTranslate: function setTranslate() {
  31471. var swiper = this;
  31472. if (swiper.params.effect !== 'fade') { return; }
  31473. swiper.fadeEffect.setTranslate();
  31474. },
  31475. setTransition: function setTransition(duration) {
  31476. var swiper = this;
  31477. if (swiper.params.effect !== 'fade') { return; }
  31478. swiper.fadeEffect.setTransition(duration);
  31479. },
  31480. },
  31481. };
  31482. var Cube = {
  31483. setTranslate: function setTranslate() {
  31484. var swiper = this;
  31485. var $el = swiper.$el;
  31486. var $wrapperEl = swiper.$wrapperEl;
  31487. var slides = swiper.slides;
  31488. var swiperWidth = swiper.width;
  31489. var swiperHeight = swiper.height;
  31490. var rtl = swiper.rtlTranslate;
  31491. var swiperSize = swiper.size;
  31492. var params = swiper.params.cubeEffect;
  31493. var isHorizontal = swiper.isHorizontal();
  31494. var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  31495. var wrapperRotate = 0;
  31496. var $cubeShadowEl;
  31497. if (params.shadow) {
  31498. if (isHorizontal) {
  31499. $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
  31500. if ($cubeShadowEl.length === 0) {
  31501. $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
  31502. $wrapperEl.append($cubeShadowEl);
  31503. }
  31504. $cubeShadowEl.css({ height: (swiperWidth + "px") });
  31505. } else {
  31506. $cubeShadowEl = $el.find('.swiper-cube-shadow');
  31507. if ($cubeShadowEl.length === 0) {
  31508. $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
  31509. $el.append($cubeShadowEl);
  31510. }
  31511. }
  31512. }
  31513. for (var i = 0; i < slides.length; i += 1) {
  31514. var $slideEl = slides.eq(i);
  31515. var slideIndex = i;
  31516. if (isVirtual) {
  31517. slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
  31518. }
  31519. var slideAngle = slideIndex * 90;
  31520. var round = Math.floor(slideAngle / 360);
  31521. if (rtl) {
  31522. slideAngle = -slideAngle;
  31523. round = Math.floor(-slideAngle / 360);
  31524. }
  31525. var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
  31526. var tx = 0;
  31527. var ty = 0;
  31528. var tz = 0;
  31529. if (slideIndex % 4 === 0) {
  31530. tx = -round * 4 * swiperSize;
  31531. tz = 0;
  31532. } else if ((slideIndex - 1) % 4 === 0) {
  31533. tx = 0;
  31534. tz = -round * 4 * swiperSize;
  31535. } else if ((slideIndex - 2) % 4 === 0) {
  31536. tx = swiperSize + (round * 4 * swiperSize);
  31537. tz = swiperSize;
  31538. } else if ((slideIndex - 3) % 4 === 0) {
  31539. tx = -swiperSize;
  31540. tz = (3 * swiperSize) + (swiperSize * 4 * round);
  31541. }
  31542. if (rtl) {
  31543. tx = -tx;
  31544. }
  31545. if (!isHorizontal) {
  31546. ty = tx;
  31547. tx = 0;
  31548. }
  31549. var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
  31550. if (progress <= 1 && progress > -1) {
  31551. wrapperRotate = (slideIndex * 90) + (progress * 90);
  31552. if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
  31553. }
  31554. $slideEl.transform(transform);
  31555. if (params.slideShadows) {
  31556. // Set shadows
  31557. var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  31558. var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  31559. if (shadowBefore.length === 0) {
  31560. shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
  31561. $slideEl.append(shadowBefore);
  31562. }
  31563. if (shadowAfter.length === 0) {
  31564. shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
  31565. $slideEl.append(shadowAfter);
  31566. }
  31567. if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
  31568. if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
  31569. }
  31570. }
  31571. $wrapperEl.css({
  31572. '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  31573. '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  31574. '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  31575. 'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  31576. });
  31577. if (params.shadow) {
  31578. if (isHorizontal) {
  31579. $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
  31580. } else {
  31581. var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
  31582. var multiplier = 1.5 - (
  31583. (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
  31584. + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
  31585. );
  31586. var scale1 = params.shadowScale;
  31587. var scale2 = params.shadowScale / multiplier;
  31588. var offset = params.shadowOffset;
  31589. $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
  31590. }
  31591. }
  31592. var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
  31593. $wrapperEl
  31594. .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
  31595. },
  31596. setTransition: function setTransition(duration) {
  31597. var swiper = this;
  31598. var $el = swiper.$el;
  31599. var slides = swiper.slides;
  31600. slides
  31601. .transition(duration)
  31602. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  31603. .transition(duration);
  31604. if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
  31605. $el.find('.swiper-cube-shadow').transition(duration);
  31606. }
  31607. },
  31608. };
  31609. var EffectCube = {
  31610. name: 'effect-cube',
  31611. params: {
  31612. cubeEffect: {
  31613. slideShadows: true,
  31614. shadow: true,
  31615. shadowOffset: 20,
  31616. shadowScale: 0.94,
  31617. },
  31618. },
  31619. create: function create() {
  31620. var swiper = this;
  31621. Utils.extend(swiper, {
  31622. cubeEffect: {
  31623. setTranslate: Cube.setTranslate.bind(swiper),
  31624. setTransition: Cube.setTransition.bind(swiper),
  31625. },
  31626. });
  31627. },
  31628. on: {
  31629. beforeInit: function beforeInit() {
  31630. var swiper = this;
  31631. if (swiper.params.effect !== 'cube') { return; }
  31632. swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
  31633. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  31634. var overwriteParams = {
  31635. slidesPerView: 1,
  31636. slidesPerColumn: 1,
  31637. slidesPerGroup: 1,
  31638. watchSlidesProgress: true,
  31639. resistanceRatio: 0,
  31640. spaceBetween: 0,
  31641. centeredSlides: false,
  31642. virtualTranslate: true,
  31643. };
  31644. Utils.extend(swiper.params, overwriteParams);
  31645. Utils.extend(swiper.originalParams, overwriteParams);
  31646. },
  31647. setTranslate: function setTranslate() {
  31648. var swiper = this;
  31649. if (swiper.params.effect !== 'cube') { return; }
  31650. swiper.cubeEffect.setTranslate();
  31651. },
  31652. setTransition: function setTransition(duration) {
  31653. var swiper = this;
  31654. if (swiper.params.effect !== 'cube') { return; }
  31655. swiper.cubeEffect.setTransition(duration);
  31656. },
  31657. },
  31658. };
  31659. var Flip = {
  31660. setTranslate: function setTranslate() {
  31661. var swiper = this;
  31662. var slides = swiper.slides;
  31663. var rtl = swiper.rtlTranslate;
  31664. for (var i = 0; i < slides.length; i += 1) {
  31665. var $slideEl = slides.eq(i);
  31666. var progress = $slideEl[0].progress;
  31667. if (swiper.params.flipEffect.limitRotation) {
  31668. progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
  31669. }
  31670. var offset = $slideEl[0].swiperSlideOffset;
  31671. var rotate = -180 * progress;
  31672. var rotateY = rotate;
  31673. var rotateX = 0;
  31674. var tx = -offset;
  31675. var ty = 0;
  31676. if (!swiper.isHorizontal()) {
  31677. ty = tx;
  31678. tx = 0;
  31679. rotateX = -rotateY;
  31680. rotateY = 0;
  31681. } else if (rtl) {
  31682. rotateY = -rotateY;
  31683. }
  31684. $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
  31685. if (swiper.params.flipEffect.slideShadows) {
  31686. // Set shadows
  31687. var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  31688. var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  31689. if (shadowBefore.length === 0) {
  31690. shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
  31691. $slideEl.append(shadowBefore);
  31692. }
  31693. if (shadowAfter.length === 0) {
  31694. shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
  31695. $slideEl.append(shadowAfter);
  31696. }
  31697. if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
  31698. if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
  31699. }
  31700. $slideEl
  31701. .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
  31702. }
  31703. },
  31704. setTransition: function setTransition(duration) {
  31705. var swiper = this;
  31706. var slides = swiper.slides;
  31707. var activeIndex = swiper.activeIndex;
  31708. var $wrapperEl = swiper.$wrapperEl;
  31709. slides
  31710. .transition(duration)
  31711. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  31712. .transition(duration);
  31713. if (swiper.params.virtualTranslate && duration !== 0) {
  31714. var eventTriggered = false;
  31715. // eslint-disable-next-line
  31716. slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
  31717. if (eventTriggered) { return; }
  31718. if (!swiper || swiper.destroyed) { return; }
  31719. // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
  31720. eventTriggered = true;
  31721. swiper.animating = false;
  31722. var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
  31723. for (var i = 0; i < triggerEvents.length; i += 1) {
  31724. $wrapperEl.trigger(triggerEvents[i]);
  31725. }
  31726. });
  31727. }
  31728. },
  31729. };
  31730. var EffectFlip = {
  31731. name: 'effect-flip',
  31732. params: {
  31733. flipEffect: {
  31734. slideShadows: true,
  31735. limitRotation: true,
  31736. },
  31737. },
  31738. create: function create() {
  31739. var swiper = this;
  31740. Utils.extend(swiper, {
  31741. flipEffect: {
  31742. setTranslate: Flip.setTranslate.bind(swiper),
  31743. setTransition: Flip.setTransition.bind(swiper),
  31744. },
  31745. });
  31746. },
  31747. on: {
  31748. beforeInit: function beforeInit() {
  31749. var swiper = this;
  31750. if (swiper.params.effect !== 'flip') { return; }
  31751. swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
  31752. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  31753. var overwriteParams = {
  31754. slidesPerView: 1,
  31755. slidesPerColumn: 1,
  31756. slidesPerGroup: 1,
  31757. watchSlidesProgress: true,
  31758. spaceBetween: 0,
  31759. virtualTranslate: true,
  31760. };
  31761. Utils.extend(swiper.params, overwriteParams);
  31762. Utils.extend(swiper.originalParams, overwriteParams);
  31763. },
  31764. setTranslate: function setTranslate() {
  31765. var swiper = this;
  31766. if (swiper.params.effect !== 'flip') { return; }
  31767. swiper.flipEffect.setTranslate();
  31768. },
  31769. setTransition: function setTransition(duration) {
  31770. var swiper = this;
  31771. if (swiper.params.effect !== 'flip') { return; }
  31772. swiper.flipEffect.setTransition(duration);
  31773. },
  31774. },
  31775. };
  31776. var Coverflow = {
  31777. setTranslate: function setTranslate() {
  31778. var swiper = this;
  31779. var swiperWidth = swiper.width;
  31780. var swiperHeight = swiper.height;
  31781. var slides = swiper.slides;
  31782. var $wrapperEl = swiper.$wrapperEl;
  31783. var slidesSizesGrid = swiper.slidesSizesGrid;
  31784. var params = swiper.params.coverflowEffect;
  31785. var isHorizontal = swiper.isHorizontal();
  31786. var transform = swiper.translate;
  31787. var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
  31788. var rotate = isHorizontal ? params.rotate : -params.rotate;
  31789. var translate = params.depth;
  31790. // Each slide offset from center
  31791. for (var i = 0, length = slides.length; i < length; i += 1) {
  31792. var $slideEl = slides.eq(i);
  31793. var slideSize = slidesSizesGrid[i];
  31794. var slideOffset = $slideEl[0].swiperSlideOffset;
  31795. var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
  31796. var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
  31797. var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
  31798. // var rotateZ = 0
  31799. var translateZ = -translate * Math.abs(offsetMultiplier);
  31800. var stretch = params.stretch;
  31801. // Allow percentage to make a relative stretch for responsive sliders
  31802. if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
  31803. stretch = ((parseFloat(params.stretch) / 100) * slideSize);
  31804. }
  31805. var translateY = isHorizontal ? 0 : stretch * (offsetMultiplier);
  31806. var translateX = isHorizontal ? stretch * (offsetMultiplier) : 0;
  31807. // Fix for ultra small values
  31808. if (Math.abs(translateX) < 0.001) { translateX = 0; }
  31809. if (Math.abs(translateY) < 0.001) { translateY = 0; }
  31810. if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
  31811. if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
  31812. if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
  31813. var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
  31814. $slideEl.transform(slideTransform);
  31815. $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
  31816. if (params.slideShadows) {
  31817. // Set shadows
  31818. var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  31819. var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  31820. if ($shadowBeforeEl.length === 0) {
  31821. $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
  31822. $slideEl.append($shadowBeforeEl);
  31823. }
  31824. if ($shadowAfterEl.length === 0) {
  31825. $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
  31826. $slideEl.append($shadowAfterEl);
  31827. }
  31828. if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
  31829. if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
  31830. }
  31831. }
  31832. // Set correct perspective for IE10
  31833. if (Support.pointerEvents || Support.prefixedPointerEvents) {
  31834. var ws = $wrapperEl[0].style;
  31835. ws.perspectiveOrigin = center + "px 50%";
  31836. }
  31837. },
  31838. setTransition: function setTransition(duration) {
  31839. var swiper = this;
  31840. swiper.slides
  31841. .transition(duration)
  31842. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  31843. .transition(duration);
  31844. },
  31845. };
  31846. var EffectCoverflow = {
  31847. name: 'effect-coverflow',
  31848. params: {
  31849. coverflowEffect: {
  31850. rotate: 50,
  31851. stretch: 0,
  31852. depth: 100,
  31853. modifier: 1,
  31854. slideShadows: true,
  31855. },
  31856. },
  31857. create: function create() {
  31858. var swiper = this;
  31859. Utils.extend(swiper, {
  31860. coverflowEffect: {
  31861. setTranslate: Coverflow.setTranslate.bind(swiper),
  31862. setTransition: Coverflow.setTransition.bind(swiper),
  31863. },
  31864. });
  31865. },
  31866. on: {
  31867. beforeInit: function beforeInit() {
  31868. var swiper = this;
  31869. if (swiper.params.effect !== 'coverflow') { return; }
  31870. swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
  31871. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  31872. swiper.params.watchSlidesProgress = true;
  31873. swiper.originalParams.watchSlidesProgress = true;
  31874. },
  31875. setTranslate: function setTranslate() {
  31876. var swiper = this;
  31877. if (swiper.params.effect !== 'coverflow') { return; }
  31878. swiper.coverflowEffect.setTranslate();
  31879. },
  31880. setTransition: function setTransition(duration) {
  31881. var swiper = this;
  31882. if (swiper.params.effect !== 'coverflow') { return; }
  31883. swiper.coverflowEffect.setTransition(duration);
  31884. },
  31885. },
  31886. };
  31887. var Thumbs = {
  31888. init: function init() {
  31889. var swiper = this;
  31890. var ref = swiper.params;
  31891. var thumbsParams = ref.thumbs;
  31892. var SwiperClass = swiper.constructor;
  31893. if (thumbsParams.swiper instanceof SwiperClass) {
  31894. swiper.thumbs.swiper = thumbsParams.swiper;
  31895. Utils.extend(swiper.thumbs.swiper.originalParams, {
  31896. watchSlidesProgress: true,
  31897. slideToClickedSlide: false,
  31898. });
  31899. Utils.extend(swiper.thumbs.swiper.params, {
  31900. watchSlidesProgress: true,
  31901. slideToClickedSlide: false,
  31902. });
  31903. } else if (Utils.isObject(thumbsParams.swiper)) {
  31904. swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
  31905. watchSlidesVisibility: true,
  31906. watchSlidesProgress: true,
  31907. slideToClickedSlide: false,
  31908. }));
  31909. swiper.thumbs.swiperCreated = true;
  31910. }
  31911. swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
  31912. swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
  31913. },
  31914. onThumbClick: function onThumbClick() {
  31915. var swiper = this;
  31916. var thumbsSwiper = swiper.thumbs.swiper;
  31917. if (!thumbsSwiper) { return; }
  31918. var clickedIndex = thumbsSwiper.clickedIndex;
  31919. var clickedSlide = thumbsSwiper.clickedSlide;
  31920. if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
  31921. if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
  31922. var slideToIndex;
  31923. if (thumbsSwiper.params.loop) {
  31924. slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
  31925. } else {
  31926. slideToIndex = clickedIndex;
  31927. }
  31928. if (swiper.params.loop) {
  31929. var currentIndex = swiper.activeIndex;
  31930. if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
  31931. swiper.loopFix();
  31932. // eslint-disable-next-line
  31933. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  31934. currentIndex = swiper.activeIndex;
  31935. }
  31936. var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
  31937. var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
  31938. if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
  31939. else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
  31940. else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
  31941. else { slideToIndex = prevIndex; }
  31942. }
  31943. swiper.slideTo(slideToIndex);
  31944. },
  31945. update: function update(initial) {
  31946. var swiper = this;
  31947. var thumbsSwiper = swiper.thumbs.swiper;
  31948. if (!thumbsSwiper) { return; }
  31949. var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
  31950. ? thumbsSwiper.slidesPerViewDynamic()
  31951. : thumbsSwiper.params.slidesPerView;
  31952. var autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
  31953. var useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
  31954. if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
  31955. var currentThumbsIndex = thumbsSwiper.activeIndex;
  31956. var newThumbsIndex;
  31957. var direction;
  31958. if (thumbsSwiper.params.loop) {
  31959. if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
  31960. thumbsSwiper.loopFix();
  31961. // eslint-disable-next-line
  31962. thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
  31963. currentThumbsIndex = thumbsSwiper.activeIndex;
  31964. }
  31965. // Find actual thumbs index to slide to
  31966. var prevThumbsIndex = thumbsSwiper.slides
  31967. .eq(currentThumbsIndex)
  31968. .prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0)
  31969. .index();
  31970. var nextThumbsIndex = thumbsSwiper.slides
  31971. .eq(currentThumbsIndex)
  31972. .nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0)
  31973. .index();
  31974. if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
  31975. else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
  31976. else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
  31977. else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
  31978. else { newThumbsIndex = prevThumbsIndex; }
  31979. direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
  31980. } else {
  31981. newThumbsIndex = swiper.realIndex;
  31982. direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
  31983. }
  31984. if (useOffset) {
  31985. newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
  31986. }
  31987. if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
  31988. if (thumbsSwiper.params.centeredSlides) {
  31989. if (newThumbsIndex > currentThumbsIndex) {
  31990. newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
  31991. } else {
  31992. newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
  31993. }
  31994. } else if (newThumbsIndex > currentThumbsIndex) {
  31995. newThumbsIndex = newThumbsIndex - slidesPerView + 1;
  31996. }
  31997. thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
  31998. }
  31999. }
  32000. // Activate thumbs
  32001. var thumbsToActivate = 1;
  32002. var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
  32003. if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
  32004. thumbsToActivate = swiper.params.slidesPerView;
  32005. }
  32006. if (!swiper.params.thumbs.multipleActiveThumbs) {
  32007. thumbsToActivate = 1;
  32008. }
  32009. thumbsToActivate = Math.floor(thumbsToActivate);
  32010. thumbsSwiper.slides.removeClass(thumbActiveClass);
  32011. if (thumbsSwiper.params.loop || (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)) {
  32012. for (var i = 0; i < thumbsToActivate; i += 1) {
  32013. thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
  32014. }
  32015. } else {
  32016. for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
  32017. thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
  32018. }
  32019. }
  32020. },
  32021. };
  32022. var Thumbs$1 = {
  32023. name: 'thumbs',
  32024. params: {
  32025. thumbs: {
  32026. swiper: null,
  32027. multipleActiveThumbs: true,
  32028. autoScrollOffset: 0,
  32029. slideThumbActiveClass: 'swiper-slide-thumb-active',
  32030. thumbsContainerClass: 'swiper-container-thumbs',
  32031. },
  32032. },
  32033. create: function create() {
  32034. var swiper = this;
  32035. Utils.extend(swiper, {
  32036. thumbs: {
  32037. swiper: null,
  32038. init: Thumbs.init.bind(swiper),
  32039. update: Thumbs.update.bind(swiper),
  32040. onThumbClick: Thumbs.onThumbClick.bind(swiper),
  32041. },
  32042. });
  32043. },
  32044. on: {
  32045. beforeInit: function beforeInit() {
  32046. var swiper = this;
  32047. var ref = swiper.params;
  32048. var thumbs = ref.thumbs;
  32049. if (!thumbs || !thumbs.swiper) { return; }
  32050. swiper.thumbs.init();
  32051. swiper.thumbs.update(true);
  32052. },
  32053. slideChange: function slideChange() {
  32054. var swiper = this;
  32055. if (!swiper.thumbs.swiper) { return; }
  32056. swiper.thumbs.update();
  32057. },
  32058. update: function update() {
  32059. var swiper = this;
  32060. if (!swiper.thumbs.swiper) { return; }
  32061. swiper.thumbs.update();
  32062. },
  32063. resize: function resize() {
  32064. var swiper = this;
  32065. if (!swiper.thumbs.swiper) { return; }
  32066. swiper.thumbs.update();
  32067. },
  32068. observerUpdate: function observerUpdate() {
  32069. var swiper = this;
  32070. if (!swiper.thumbs.swiper) { return; }
  32071. swiper.thumbs.update();
  32072. },
  32073. setTransition: function setTransition(duration) {
  32074. var swiper = this;
  32075. var thumbsSwiper = swiper.thumbs.swiper;
  32076. if (!thumbsSwiper) { return; }
  32077. thumbsSwiper.setTransition(duration);
  32078. },
  32079. beforeDestroy: function beforeDestroy() {
  32080. var swiper = this;
  32081. var thumbsSwiper = swiper.thumbs.swiper;
  32082. if (!thumbsSwiper) { return; }
  32083. if (swiper.thumbs.swiperCreated && thumbsSwiper) {
  32084. thumbsSwiper.destroy();
  32085. }
  32086. },
  32087. },
  32088. };
  32089. // Swiper Class
  32090. Swiper.use([
  32091. Device$1,
  32092. Browser$1,
  32093. Support$1,
  32094. Resize,
  32095. Observer$1,
  32096. Virtual$1,
  32097. Keyboard$1,
  32098. Mousewheel$1,
  32099. Navigation$1,
  32100. Pagination$1,
  32101. Scrollbar$1,
  32102. Parallax$1,
  32103. Zoom$1,
  32104. Lazy$3,
  32105. Controller$1,
  32106. History$2,
  32107. HashNavigation$1,
  32108. A11y,
  32109. Autoplay$1,
  32110. EffectFade,
  32111. EffectCube,
  32112. EffectFlip,
  32113. EffectCoverflow,
  32114. Thumbs$1 ]);
  32115. function initSwiper(swiperEl) {
  32116. var app = this;
  32117. var $swiperEl = $(swiperEl);
  32118. if ($swiperEl.length === 0) { return; }
  32119. if ($swiperEl[0].swiper) { return; }
  32120. var initialSlide;
  32121. var params = {};
  32122. var isTabs;
  32123. var isRoutableTabs;
  32124. if ($swiperEl.hasClass('tabs-swipeable-wrap')) {
  32125. $swiperEl
  32126. .addClass('swiper-container')
  32127. .children('.tabs')
  32128. .addClass('swiper-wrapper')
  32129. .children('.tab')
  32130. .addClass('swiper-slide');
  32131. initialSlide = $swiperEl.children('.tabs').children('.tab-active').index();
  32132. isTabs = true;
  32133. isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;
  32134. }
  32135. if ($swiperEl.attr('data-swiper')) {
  32136. params = JSON.parse($swiperEl.attr('data-swiper'));
  32137. } else if ($swiperEl[0].f7SwiperParams) {
  32138. params = $swiperEl[0].f7SwiperParams;
  32139. } else {
  32140. params = $swiperEl.dataset();
  32141. Object.keys(params).forEach(function (key) {
  32142. var value = params[key];
  32143. if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {
  32144. try {
  32145. params[key] = JSON.parse(value);
  32146. } catch (e) {
  32147. // not JSON
  32148. }
  32149. }
  32150. });
  32151. }
  32152. if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {
  32153. params.initialSlide = initialSlide;
  32154. }
  32155. var swiper = app.swiper.create($swiperEl[0], params);
  32156. function updateSwiper() {
  32157. swiper.update();
  32158. }
  32159. var $tabEl = $swiperEl.parents('.tab').filter(function (tabElIndex, tabEl) {
  32160. return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
  32161. }).eq(0);
  32162. $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').on('modal:open', updateSwiper);
  32163. $swiperEl.parents('.panel').on('panel:open', updateSwiper);
  32164. if ($tabEl && $tabEl.length) {
  32165. $tabEl.on('tab:show', updateSwiper);
  32166. }
  32167. swiper.on('beforeDestroy', function () {
  32168. $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').off('modal:open', updateSwiper);
  32169. $swiperEl.parents('.panel').off('panel:open', updateSwiper);
  32170. if ($tabEl && $tabEl.length) {
  32171. $tabEl.off('tab:show', updateSwiper);
  32172. }
  32173. });
  32174. if (isTabs) {
  32175. swiper.on('slideChange', function () {
  32176. if (isRoutableTabs) {
  32177. var view = app.views.get($swiperEl.parents('.view'));
  32178. if (!view) { view = app.views.main; }
  32179. var router = view.router;
  32180. var tabRoute = router.findTabRoute(swiper.slides.eq(swiper.activeIndex)[0]);
  32181. if (tabRoute) {
  32182. setTimeout(function () {
  32183. router.navigate(tabRoute.path);
  32184. }, 0);
  32185. }
  32186. } else {
  32187. app.tab.show({
  32188. tabEl: swiper.slides.eq(swiper.activeIndex),
  32189. });
  32190. }
  32191. });
  32192. }
  32193. }
  32194. var Swiper$1 = {
  32195. name: 'swiper',
  32196. static: {
  32197. Swiper: Swiper,
  32198. },
  32199. create: function create() {
  32200. var app = this;
  32201. app.swiper = ConstructorMethods({
  32202. defaultSelector: '.swiper-container',
  32203. constructor: Swiper,
  32204. domProp: 'swiper',
  32205. });
  32206. },
  32207. on: {
  32208. pageBeforeRemove: function pageBeforeRemove(page) {
  32209. var app = this;
  32210. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32211. app.swiper.destroy(swiperEl);
  32212. });
  32213. },
  32214. pageMounted: function pageMounted(page) {
  32215. var app = this;
  32216. page.$el.find('.tabs-swipeable-wrap').each(function (index, swiperEl) {
  32217. initSwiper.call(app, swiperEl);
  32218. });
  32219. },
  32220. pageInit: function pageInit(page) {
  32221. var app = this;
  32222. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32223. initSwiper.call(app, swiperEl);
  32224. });
  32225. },
  32226. pageReinit: function pageReinit(page) {
  32227. var app = this;
  32228. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32229. var swiper = app.swiper.get(swiperEl);
  32230. if (swiper && swiper.update) { swiper.update(); }
  32231. });
  32232. },
  32233. tabMounted: function tabMounted(tabEl) {
  32234. var app = this;
  32235. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32236. initSwiper.call(app, swiperEl);
  32237. });
  32238. },
  32239. tabShow: function tabShow(tabEl) {
  32240. var app = this;
  32241. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32242. var swiper = app.swiper.get(swiperEl);
  32243. if (swiper && swiper.update) { swiper.update(); }
  32244. });
  32245. },
  32246. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  32247. var app = this;
  32248. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  32249. app.swiper.destroy(swiperEl);
  32250. });
  32251. },
  32252. },
  32253. vnode: {
  32254. 'swiper-init': {
  32255. insert: function insert(vnode) {
  32256. var app = this;
  32257. var swiperEl = vnode.elm;
  32258. initSwiper.call(app, swiperEl);
  32259. },
  32260. destroy: function destroy(vnode) {
  32261. var app = this;
  32262. var swiperEl = vnode.elm;
  32263. app.swiper.destroy(swiperEl);
  32264. },
  32265. },
  32266. 'tabs-swipeable-wrap': {
  32267. insert: function insert(vnode) {
  32268. var app = this;
  32269. var swiperEl = vnode.elm;
  32270. initSwiper.call(app, swiperEl);
  32271. },
  32272. destroy: function destroy(vnode) {
  32273. var app = this;
  32274. var swiperEl = vnode.elm;
  32275. app.swiper.destroy(swiperEl);
  32276. },
  32277. },
  32278. },
  32279. };
  32280. /* eslint indent: ["off"] */
  32281. var PhotoBrowser = /*@__PURE__*/(function (Framework7Class) {
  32282. function PhotoBrowser(app, params) {
  32283. if ( params === void 0 ) params = {};
  32284. Framework7Class.call(this, params, [app]);
  32285. var pb = this;
  32286. pb.app = app;
  32287. var defaults = Utils.extend({
  32288. on: {},
  32289. }, app.params.photoBrowser);
  32290. // Extend defaults with modules params
  32291. pb.useModulesParams(defaults);
  32292. pb.params = Utils.extend(defaults, params);
  32293. Utils.extend(pb, {
  32294. exposed: false,
  32295. opened: false,
  32296. activeIndex: pb.params.swiper.initialSlide,
  32297. url: pb.params.url,
  32298. swipeToClose: {
  32299. allow: true,
  32300. isTouched: false,
  32301. diff: undefined,
  32302. start: undefined,
  32303. current: undefined,
  32304. started: false,
  32305. activeSlide: undefined,
  32306. timeStart: undefined,
  32307. },
  32308. });
  32309. // Install Modules
  32310. pb.useModules();
  32311. // Init
  32312. pb.init();
  32313. }
  32314. if ( Framework7Class ) PhotoBrowser.__proto__ = Framework7Class;
  32315. PhotoBrowser.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  32316. PhotoBrowser.prototype.constructor = PhotoBrowser;
  32317. var prototypeAccessors = { view: { configurable: true } };
  32318. prototypeAccessors.view.get = function () {
  32319. var ref = this;
  32320. var params = ref.params;
  32321. var app = ref.app;
  32322. return params.view || app.views.main;
  32323. };
  32324. PhotoBrowser.prototype.onSlideChange = function onSlideChange (swiper) {
  32325. var pb = this;
  32326. pb.activeIndex = swiper.activeIndex;
  32327. var current = swiper.activeIndex + 1;
  32328. var total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;
  32329. if (swiper.params.loop) {
  32330. total -= 2;
  32331. current -= swiper.loopedSlides;
  32332. if (current < 1) { current = total + current; }
  32333. if (current > total) { current -= total; }
  32334. }
  32335. var $activeSlideEl = pb.params.virtualSlides
  32336. ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.activeIndex) + "\"]"))
  32337. : swiper.slides.eq(swiper.activeIndex);
  32338. var $previousSlideEl = pb.params.virtualSlides
  32339. ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.previousIndex) + "\"]"))
  32340. : swiper.slides.eq(swiper.previousIndex);
  32341. var $currentEl = pb.$el.find('.photo-browser-current');
  32342. var $totalEl = pb.$el.find('.photo-browser-total');
  32343. var navbarEl;
  32344. if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {
  32345. navbarEl = pb.app.navbar.getElByPage(pb.$el);
  32346. if (navbarEl) {
  32347. $currentEl = $(navbarEl).find('.photo-browser-current');
  32348. $totalEl = $(navbarEl).find('.photo-browser-total');
  32349. }
  32350. }
  32351. if ($currentEl.length && $totalEl.length) {
  32352. $currentEl.text(current);
  32353. $totalEl.text(total);
  32354. if (!navbarEl) { navbarEl = $currentEl.parents('.navbar')[0]; }
  32355. if (navbarEl) {
  32356. pb.app.navbar.size(navbarEl);
  32357. }
  32358. }
  32359. // Update captions
  32360. if (pb.captions.length > 0) {
  32361. var captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;
  32362. pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
  32363. pb.$captionsContainerEl.find(("[data-caption-index=\"" + captionIndex + "\"]")).addClass('photo-browser-caption-active');
  32364. }
  32365. // Stop Video
  32366. var previousSlideVideo = $previousSlideEl.find('video');
  32367. if (previousSlideVideo.length > 0) {
  32368. if ('pause' in previousSlideVideo[0]) { previousSlideVideo[0].pause(); }
  32369. }
  32370. };
  32371. PhotoBrowser.prototype.onTouchStart = function onTouchStart () {
  32372. var pb = this;
  32373. var swipeToClose = pb.swipeToClose;
  32374. if (!swipeToClose.allow) { return; }
  32375. swipeToClose.isTouched = true;
  32376. };
  32377. PhotoBrowser.prototype.onTouchMove = function onTouchMove (e) {
  32378. var pb = this;
  32379. var swipeToClose = pb.swipeToClose;
  32380. if (!swipeToClose.isTouched) { return; }
  32381. if (!swipeToClose.started) {
  32382. swipeToClose.started = true;
  32383. swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  32384. if (pb.params.virtualSlides) {
  32385. swipeToClose.activeSlide = pb.swiper.$wrapperEl.children('.swiper-slide-active');
  32386. } else {
  32387. swipeToClose.activeSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);
  32388. }
  32389. swipeToClose.timeStart = Utils.now();
  32390. }
  32391. e.preventDefault();
  32392. swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  32393. swipeToClose.diff = swipeToClose.start - swipeToClose.current;
  32394. pb.$el.transition(0).transform(("translate3d(0," + (-swipeToClose.diff) + "px,0)"));
  32395. };
  32396. PhotoBrowser.prototype.onTouchEnd = function onTouchEnd () {
  32397. var pb = this;
  32398. var swipeToClose = pb.swipeToClose;
  32399. swipeToClose.isTouched = false;
  32400. if (!swipeToClose.started) {
  32401. swipeToClose.started = false;
  32402. return;
  32403. }
  32404. swipeToClose.started = false;
  32405. swipeToClose.allow = false;
  32406. var diff = Math.abs(swipeToClose.diff);
  32407. var timeDiff = (new Date()).getTime() - swipeToClose.timeStart;
  32408. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
  32409. Utils.nextTick(function () {
  32410. if (pb.$el) {
  32411. if (swipeToClose.diff < 0) { pb.$el.addClass('swipe-close-to-bottom'); }
  32412. else { pb.$el.addClass('swipe-close-to-top'); }
  32413. }
  32414. pb.emit('local::swipeToClose', pb);
  32415. pb.$el.transform('').transition('');
  32416. pb.close();
  32417. swipeToClose.allow = true;
  32418. });
  32419. return;
  32420. }
  32421. if (diff !== 0) {
  32422. pb.$el.addClass('photo-browser-transitioning').transitionEnd(function () {
  32423. swipeToClose.allow = true;
  32424. pb.$el.removeClass('photo-browser-transitioning');
  32425. });
  32426. } else {
  32427. swipeToClose.allow = true;
  32428. }
  32429. Utils.nextTick(function () {
  32430. pb.$el.transform('').transition('');
  32431. });
  32432. };
  32433. // Render Functions
  32434. PhotoBrowser.prototype.renderNavbar = function renderNavbar () {
  32435. var pb = this;
  32436. if (pb.params.renderNavbar) { return pb.params.renderNavbar.call(pb); }
  32437. var iconsColor = pb.params.iconsColor;
  32438. if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
  32439. var pageBackLinkText = (pb.app.theme === 'ios' || pb.app.theme === 'aurora') && pb.params.pageBackLinkText ? pb.params.pageBackLinkText : '';
  32440. var renderNavbarCount = typeof pb.params.navbarShowCount === 'undefined' ? pb.params.photos.length > 1 : pb.params.navbarShowCount;
  32441. var isPopup = pb.params.type !== 'page';
  32442. 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();
  32443. return navbarHtml;
  32444. };
  32445. PhotoBrowser.prototype.renderToolbar = function renderToolbar () {
  32446. var pb = this;
  32447. if (pb.params.renderToolbar) { return pb.params.renderToolbar.call(pb); }
  32448. var iconsColor = pb.params.iconsColor;
  32449. if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
  32450. 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();
  32451. return toolbarHtml;
  32452. };
  32453. PhotoBrowser.prototype.renderCaption = function renderCaption (caption, index) {
  32454. var pb = this;
  32455. if (pb.params.renderCaption) { return pb.params.renderCaption.call(pb, caption, index); }
  32456. var captionHtml = ("\n <div class=\"photo-browser-caption\" data-caption-index=\"" + index + "\">\n " + caption + "\n </div>\n ").trim();
  32457. return captionHtml;
  32458. };
  32459. PhotoBrowser.prototype.renderObject = function renderObject (photo, index) {
  32460. var pb = this;
  32461. if (pb.params.renderObject) { return pb.params.renderObject.call(pb, photo, index); }
  32462. 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 ";
  32463. return objHtml;
  32464. };
  32465. PhotoBrowser.prototype.renderLazyPhoto = function renderLazyPhoto (photo, index) {
  32466. var pb = this;
  32467. if (pb.params.renderLazyPhoto) { return pb.params.renderLazyPhoto.call(pb, photo, index); }
  32468. 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();
  32469. return photoHtml;
  32470. };
  32471. PhotoBrowser.prototype.renderPhoto = function renderPhoto (photo, index) {
  32472. var pb = this;
  32473. if (pb.params.renderPhoto) { return pb.params.renderPhoto.call(pb, photo, index); }
  32474. 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();
  32475. return photoHtml;
  32476. };
  32477. PhotoBrowser.prototype.render = function render () {
  32478. var pb = this;
  32479. if (pb.params.render) { return pb.params.render.call(pb, pb.params); }
  32480. 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) {
  32481. if (photo.caption) { return pb.renderCaption(photo.caption, index); }
  32482. return '';
  32483. }).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) {
  32484. if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
  32485. return pb.renderObject(photo, index);
  32486. }
  32487. if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
  32488. return pb.renderLazyPhoto(photo, index);
  32489. }
  32490. return pb.renderPhoto(photo, index);
  32491. }).join(' ')) + "\n </div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
  32492. return html;
  32493. };
  32494. PhotoBrowser.prototype.renderStandalone = function renderStandalone () {
  32495. var pb = this;
  32496. if (pb.params.renderStandalone) { return pb.params.renderStandalone.call(pb); }
  32497. var standaloneHtml = "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + (pb.render()) + "</div>";
  32498. return standaloneHtml;
  32499. };
  32500. PhotoBrowser.prototype.renderPage = function renderPage () {
  32501. var pb = this;
  32502. if (pb.params.renderPage) { return pb.params.renderPage.call(pb); }
  32503. var pageHtml = pb.render();
  32504. return pageHtml;
  32505. };
  32506. PhotoBrowser.prototype.renderPopup = function renderPopup () {
  32507. var pb = this;
  32508. if (pb.params.renderPopup) { return pb.params.renderPopup.call(pb); }
  32509. var popupHtml = "<div class=\"popup photo-browser-popup\">" + (pb.render()) + "</div>";
  32510. return popupHtml;
  32511. };
  32512. // Callbacks
  32513. PhotoBrowser.prototype.onOpen = function onOpen (type, el) {
  32514. var pb = this;
  32515. var app = pb.app;
  32516. var $el = $(el);
  32517. $el[0].f7PhotoBrowser = pb;
  32518. pb.$el = $el;
  32519. pb.el = $el[0];
  32520. pb.openedIn = type;
  32521. pb.opened = true;
  32522. pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');
  32523. pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');
  32524. pb.slides = pb.$el.find('.photo-browser-slide');
  32525. pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');
  32526. pb.captions = pb.$el.find('.photo-browser-caption');
  32527. // Init Swiper
  32528. var clickTimeout;
  32529. var swiperParams = Utils.extend({}, pb.params.swiper, {
  32530. initialSlide: pb.activeIndex,
  32531. on: {
  32532. click: function click(e) {
  32533. clearTimeout(clickTimeout);
  32534. if (pb.params.exposition) {
  32535. clickTimeout = setTimeout(function () {
  32536. pb.expositionToggle();
  32537. }, 350);
  32538. }
  32539. pb.emit('local::tap', e);
  32540. pb.emit('local::click', e);
  32541. },
  32542. doubleClick: function doubleClick(e) {
  32543. clearTimeout(clickTimeout);
  32544. pb.emit('local::doubleTap', e);
  32545. pb.emit('local::doubleClick', e);
  32546. },
  32547. slideChange: function slideChange() {
  32548. var args = [], len = arguments.length;
  32549. while ( len-- ) args[ len ] = arguments[ len ];
  32550. var swiper = this;
  32551. pb.onSlideChange(swiper);
  32552. pb.emit.apply(pb, [ 'local::slideChange' ].concat( args ));
  32553. },
  32554. transitionStart: function transitionStart() {
  32555. var args = [], len = arguments.length;
  32556. while ( len-- ) args[ len ] = arguments[ len ];
  32557. pb.emit.apply(pb, [ 'local::transitionStart' ].concat( args ));
  32558. },
  32559. transitionEnd: function transitionEnd() {
  32560. var args = [], len = arguments.length;
  32561. while ( len-- ) args[ len ] = arguments[ len ];
  32562. pb.emit.apply(pb, [ 'local::transitionEnd' ].concat( args ));
  32563. },
  32564. slideChangeTransitionStart: function slideChangeTransitionStart() {
  32565. var args = [], len = arguments.length;
  32566. while ( len-- ) args[ len ] = arguments[ len ];
  32567. var swiper = this;
  32568. pb.onSlideChange(swiper);
  32569. pb.emit.apply(pb, [ 'local::slideChangeTransitionStart' ].concat( args ));
  32570. },
  32571. slideChangeTransitionEnd: function slideChangeTransitionEnd() {
  32572. var args = [], len = arguments.length;
  32573. while ( len-- ) args[ len ] = arguments[ len ];
  32574. pb.emit.apply(pb, [ 'local::slideChangeTransitionEnd' ].concat( args ));
  32575. },
  32576. lazyImageLoad: function lazyImageLoad() {
  32577. var args = [], len = arguments.length;
  32578. while ( len-- ) args[ len ] = arguments[ len ];
  32579. pb.emit.apply(pb, [ 'local::lazyImageLoad' ].concat( args ));
  32580. },
  32581. lazyImageReady: function lazyImageReady() {
  32582. var args = [], len = arguments.length;
  32583. while ( len-- ) args[ len ] = arguments[ len ];
  32584. var slideEl = args[0];
  32585. $(slideEl).removeClass('photo-browser-slide-lazy');
  32586. pb.emit.apply(pb, [ 'local::lazyImageReady' ].concat( args ));
  32587. },
  32588. },
  32589. });
  32590. if (pb.params.swipeToClose && pb.params.type !== 'page') {
  32591. Utils.extend(swiperParams.on, {
  32592. touchStart: function touchStart(e) {
  32593. pb.onTouchStart(e);
  32594. pb.emit('local::touchStart', e);
  32595. },
  32596. touchMoveOpposite: function touchMoveOpposite(e) {
  32597. pb.onTouchMove(e);
  32598. pb.emit('local::touchMoveOpposite', e);
  32599. },
  32600. touchEnd: function touchEnd(e) {
  32601. pb.onTouchEnd(e);
  32602. pb.emit('local::touchEnd', e);
  32603. },
  32604. });
  32605. }
  32606. if (pb.params.virtualSlides) {
  32607. Utils.extend(swiperParams, {
  32608. virtual: {
  32609. slides: pb.params.photos,
  32610. renderSlide: function renderSlide(photo, index) {
  32611. if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
  32612. return pb.renderObject(photo, index);
  32613. }
  32614. if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
  32615. return pb.renderLazyPhoto(photo, index);
  32616. }
  32617. return pb.renderPhoto(photo, index);
  32618. },
  32619. },
  32620. });
  32621. }
  32622. pb.swiper = app.swiper.create(pb.$swiperContainerEl, swiperParams);
  32623. if (pb.activeIndex === 0) {
  32624. pb.onSlideChange(pb.swiper);
  32625. }
  32626. if (pb.$el) {
  32627. pb.$el.trigger('photobrowser:open');
  32628. }
  32629. pb.emit('local::open photoBrowserOpen', pb);
  32630. };
  32631. PhotoBrowser.prototype.onOpened = function onOpened () {
  32632. var pb = this;
  32633. if (pb.$el && pb.params.type === 'standalone') {
  32634. pb.$el.css('animation', 'none');
  32635. }
  32636. if (pb.$el) {
  32637. pb.$el.trigger('photobrowser:opened');
  32638. }
  32639. pb.emit('local::opened photoBrowserOpened', pb);
  32640. };
  32641. PhotoBrowser.prototype.onClose = function onClose () {
  32642. var pb = this;
  32643. if (pb.destroyed) { return; }
  32644. // Destroy Swiper
  32645. if (pb.swiper && pb.swiper.destroy) {
  32646. pb.swiper.destroy(true, false);
  32647. pb.swiper = null;
  32648. delete pb.swiper;
  32649. }
  32650. if (pb.$el) {
  32651. pb.$el.trigger('photobrowser:close');
  32652. }
  32653. pb.emit('local::close photoBrowserClose', pb);
  32654. };
  32655. PhotoBrowser.prototype.onClosed = function onClosed () {
  32656. var pb = this;
  32657. if (pb.destroyed) { return; }
  32658. pb.opened = false;
  32659. pb.$el = null;
  32660. pb.el = null;
  32661. delete pb.$el;
  32662. delete pb.el;
  32663. if (pb.$el) {
  32664. pb.$el.trigger('photobrowser:closed');
  32665. }
  32666. pb.emit('local::closed photoBrowserClosed', pb);
  32667. };
  32668. // Open
  32669. PhotoBrowser.prototype.openPage = function openPage () {
  32670. var pb = this;
  32671. if (pb.opened) { return pb; }
  32672. var pageHtml = pb.renderPage();
  32673. pb.view.router.navigate({
  32674. url: pb.url,
  32675. route: {
  32676. content: pageHtml,
  32677. path: pb.url,
  32678. on: {
  32679. pageBeforeIn: function pageBeforeIn(e, page) {
  32680. pb.view.$el.addClass(("with-photo-browser-page with-photo-browser-page-" + (pb.params.theme)));
  32681. pb.onOpen('page', page.el);
  32682. },
  32683. pageAfterIn: function pageAfterIn(e, page) {
  32684. pb.onOpened('page', page.el);
  32685. },
  32686. pageBeforeOut: function pageBeforeOut(e, page) {
  32687. pb.view.$el.removeClass(("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + (pb.params.theme)));
  32688. pb.onClose('page', page.el);
  32689. },
  32690. pageAfterOut: function pageAfterOut(e, page) {
  32691. pb.onClosed('page', page.el);
  32692. },
  32693. },
  32694. },
  32695. });
  32696. return pb;
  32697. };
  32698. PhotoBrowser.prototype.openStandalone = function openStandalone () {
  32699. var pb = this;
  32700. if (pb.opened) { return pb; }
  32701. var standaloneHtml = pb.renderStandalone();
  32702. var popupParams = {
  32703. backdrop: false,
  32704. content: standaloneHtml,
  32705. on: {
  32706. popupOpen: function popupOpen(popup) {
  32707. pb.onOpen('popup', popup.el);
  32708. },
  32709. popupOpened: function popupOpened(popup) {
  32710. pb.onOpened('popup', popup.el);
  32711. },
  32712. popupClose: function popupClose(popup) {
  32713. pb.onClose('popup', popup.el);
  32714. },
  32715. popupClosed: function popupClosed(popup) {
  32716. pb.onClosed('popup', popup.el);
  32717. },
  32718. },
  32719. };
  32720. if (pb.params.routableModals && pb.view) {
  32721. pb.view.router.navigate({
  32722. url: pb.url,
  32723. route: {
  32724. path: pb.url,
  32725. popup: popupParams,
  32726. },
  32727. });
  32728. } else {
  32729. pb.modal = pb.app.popup.create(popupParams).open();
  32730. }
  32731. return pb;
  32732. };
  32733. PhotoBrowser.prototype.openPopup = function openPopup () {
  32734. var pb = this;
  32735. if (pb.opened) { return pb; }
  32736. var popupHtml = pb.renderPopup();
  32737. var popupParams = {
  32738. content: popupHtml,
  32739. push: pb.params.popupPush,
  32740. on: {
  32741. popupOpen: function popupOpen(popup) {
  32742. pb.onOpen('popup', popup.el);
  32743. },
  32744. popupOpened: function popupOpened(popup) {
  32745. pb.onOpened('popup', popup.el);
  32746. },
  32747. popupClose: function popupClose(popup) {
  32748. pb.onClose('popup', popup.el);
  32749. },
  32750. popupClosed: function popupClosed(popup) {
  32751. pb.onClosed('popup', popup.el);
  32752. },
  32753. },
  32754. };
  32755. if (pb.params.routableModals && pb.view) {
  32756. pb.view.router.navigate({
  32757. url: pb.url,
  32758. route: {
  32759. path: pb.url,
  32760. popup: popupParams,
  32761. },
  32762. });
  32763. } else {
  32764. pb.modal = pb.app.popup.create(popupParams).open();
  32765. }
  32766. return pb;
  32767. };
  32768. // Exposition
  32769. PhotoBrowser.prototype.expositionEnable = function expositionEnable () {
  32770. var pb = this;
  32771. if (pb.params.type === 'page') {
  32772. pb.view.$el.addClass('with-photo-browser-page-exposed');
  32773. }
  32774. if (pb.$el) { pb.$el.addClass('photo-browser-exposed'); }
  32775. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.addClass('photo-browser-captions-exposed'); }
  32776. pb.exposed = true;
  32777. return pb;
  32778. };
  32779. PhotoBrowser.prototype.expositionDisable = function expositionDisable () {
  32780. var pb = this;
  32781. if (pb.params.type === 'page') {
  32782. pb.view.$el.removeClass('with-photo-browser-page-exposed');
  32783. }
  32784. if (pb.$el) { pb.$el.removeClass('photo-browser-exposed'); }
  32785. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed'); }
  32786. pb.exposed = false;
  32787. return pb;
  32788. };
  32789. PhotoBrowser.prototype.expositionToggle = function expositionToggle () {
  32790. var pb = this;
  32791. if (pb.params.type === 'page') {
  32792. pb.view.$el.toggleClass('with-photo-browser-page-exposed');
  32793. }
  32794. if (pb.$el) { pb.$el.toggleClass('photo-browser-exposed'); }
  32795. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed'); }
  32796. pb.exposed = !pb.exposed;
  32797. return pb;
  32798. };
  32799. PhotoBrowser.prototype.open = function open (index) {
  32800. var pb = this;
  32801. var type = pb.params.type;
  32802. if (pb.opened) {
  32803. if (pb.swiper && typeof index !== 'undefined') {
  32804. pb.swiper.slideTo(parseInt(index, 10));
  32805. }
  32806. return pb;
  32807. }
  32808. if (typeof index !== 'undefined') {
  32809. pb.activeIndex = index;
  32810. }
  32811. if (type === 'standalone') {
  32812. pb.openStandalone();
  32813. }
  32814. if (type === 'page') {
  32815. pb.openPage();
  32816. }
  32817. if (type === 'popup') {
  32818. pb.openPopup();
  32819. }
  32820. return pb;
  32821. };
  32822. PhotoBrowser.prototype.close = function close () {
  32823. var pb = this;
  32824. if (!pb.opened) { return pb; }
  32825. if ((pb.params.routableModals && pb.view) || pb.openedIn === 'page') {
  32826. pb.view.router.back();
  32827. } else {
  32828. pb.modal.once('modalClosed', function () {
  32829. Utils.nextTick(function () {
  32830. if (pb.destroyed) { return; }
  32831. pb.modal.destroy();
  32832. delete pb.modal;
  32833. });
  32834. });
  32835. pb.modal.close();
  32836. }
  32837. return pb;
  32838. };
  32839. // eslint-disable-next-line
  32840. PhotoBrowser.prototype.init = function init () {};
  32841. PhotoBrowser.prototype.destroy = function destroy () {
  32842. var pb = this;
  32843. pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);
  32844. if (pb.$el) {
  32845. pb.$el.trigger('photobrowser:beforedestroy');
  32846. pb.$el[0].f7PhotoBrowser = null;
  32847. delete pb.$el[0].f7PhotoBrowser;
  32848. }
  32849. Utils.deleteProps(pb);
  32850. pb.destroyed = true;
  32851. pb = null;
  32852. };
  32853. Object.defineProperties( PhotoBrowser.prototype, prototypeAccessors );
  32854. return PhotoBrowser;
  32855. }(Framework7Class));
  32856. var PhotoBrowser$1 = {
  32857. name: 'photoBrowser',
  32858. params: {
  32859. photoBrowser: {
  32860. photos: [],
  32861. exposition: true,
  32862. expositionHideCaptions: false,
  32863. type: 'standalone',
  32864. navbar: true,
  32865. toolbar: true,
  32866. theme: 'light',
  32867. captionsTheme: undefined,
  32868. iconsColor: undefined,
  32869. popupPush: false,
  32870. swipeToClose: true,
  32871. pageBackLinkText: 'Back',
  32872. popupCloseLinkText: 'Close',
  32873. navbarOfText: 'of',
  32874. navbarShowCount: undefined,
  32875. view: undefined,
  32876. url: 'photos/',
  32877. routableModals: true,
  32878. virtualSlides: true,
  32879. renderNavbar: undefined,
  32880. renderToolbar: undefined,
  32881. renderCaption: undefined,
  32882. renderObject: undefined,
  32883. renderLazyPhoto: undefined,
  32884. renderPhoto: undefined,
  32885. renderPage: undefined,
  32886. renderPopup: undefined,
  32887. renderStandalone: undefined,
  32888. swiper: {
  32889. initialSlide: 0,
  32890. spaceBetween: 20,
  32891. speed: 300,
  32892. loop: false,
  32893. preloadImages: true,
  32894. navigation: {
  32895. nextEl: '.photo-browser-next',
  32896. prevEl: '.photo-browser-prev',
  32897. },
  32898. zoom: {
  32899. enabled: true,
  32900. maxRatio: 3,
  32901. minRatio: 1,
  32902. },
  32903. lazy: {
  32904. enabled: true,
  32905. },
  32906. },
  32907. },
  32908. },
  32909. create: function create() {
  32910. var app = this;
  32911. app.photoBrowser = ConstructorMethods({
  32912. defaultSelector: '.photo-browser-popup, .photo-browser-page',
  32913. constructor: PhotoBrowser,
  32914. app: app,
  32915. domProp: 'f7PhotoBrowser',
  32916. });
  32917. },
  32918. static: {
  32919. PhotoBrowser: PhotoBrowser,
  32920. },
  32921. };
  32922. var Notification = /*@__PURE__*/(function (Modal) {
  32923. function Notification(app, params) {
  32924. var extendedParams = Utils.extend({
  32925. on: {},
  32926. }, app.params.notification, params);
  32927. // Extends with open/close Modal methods;
  32928. Modal.call(this, app, extendedParams);
  32929. var notification = this;
  32930. notification.app = app;
  32931. notification.params = extendedParams;
  32932. var ref = notification.params;
  32933. var icon = ref.icon;
  32934. var title = ref.title;
  32935. var titleRightText = ref.titleRightText;
  32936. var subtitle = ref.subtitle;
  32937. var text = ref.text;
  32938. var closeButton = ref.closeButton;
  32939. var closeTimeout = ref.closeTimeout;
  32940. var cssClass = ref.cssClass;
  32941. var closeOnClick = ref.closeOnClick;
  32942. var $el;
  32943. if (!notification.params.el) {
  32944. // Find Element
  32945. var notificationHtml = notification.render({
  32946. icon: icon,
  32947. title: title,
  32948. titleRightText: titleRightText,
  32949. subtitle: subtitle,
  32950. text: text,
  32951. closeButton: closeButton,
  32952. cssClass: cssClass,
  32953. });
  32954. $el = $(notificationHtml);
  32955. } else {
  32956. $el = $(notification.params.el);
  32957. }
  32958. if ($el && $el.length > 0 && $el[0].f7Modal) {
  32959. return $el[0].f7Modal;
  32960. }
  32961. if ($el.length === 0) {
  32962. return notification.destroy();
  32963. }
  32964. Utils.extend(notification, {
  32965. $el: $el,
  32966. el: $el[0],
  32967. type: 'notification',
  32968. });
  32969. $el[0].f7Modal = notification;
  32970. if (closeButton) {
  32971. $el.find('.notification-close-button').on('click', function () {
  32972. notification.close();
  32973. });
  32974. }
  32975. $el.on('click', function (e) {
  32976. if (closeButton && $(e.target).closest('.notification-close-button').length) {
  32977. return;
  32978. }
  32979. notification.emit('local::click notificationClick', notification);
  32980. if (closeOnClick) { notification.close(); }
  32981. });
  32982. notification.on('beforeDestroy', function () {
  32983. $el.off('click');
  32984. });
  32985. /* Touch Events */
  32986. var isTouched;
  32987. var isMoved;
  32988. var isScrolling;
  32989. var touchesDiff;
  32990. var touchStartTime;
  32991. var notificationHeight;
  32992. var touchesStart = {};
  32993. function handleTouchStart(e) {
  32994. if (isTouched) { return; }
  32995. isTouched = true;
  32996. isMoved = false;
  32997. isScrolling = undefined;
  32998. touchStartTime = Utils.now();
  32999. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  33000. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  33001. }
  33002. function handleTouchMove(e) {
  33003. if (!isTouched) { return; }
  33004. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  33005. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  33006. if (typeof isScrolling === 'undefined') {
  33007. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));
  33008. }
  33009. if (isScrolling) {
  33010. isTouched = false;
  33011. return;
  33012. }
  33013. e.preventDefault();
  33014. if (!isMoved) {
  33015. notification.$el.removeClass('notification-transitioning');
  33016. notification.$el.transition(0);
  33017. notificationHeight = notification.$el[0].offsetHeight / 2;
  33018. }
  33019. isMoved = true;
  33020. touchesDiff = (pageY - touchesStart.y);
  33021. var newTranslate = touchesDiff;
  33022. if (touchesDiff > 0) {
  33023. newTranslate = Math.pow( touchesDiff, 0.8 );
  33024. }
  33025. notification.$el.transform(("translate3d(0, " + newTranslate + "px, 0)"));
  33026. }
  33027. function handleTouchEnd() {
  33028. if (!isTouched || !isMoved) {
  33029. isTouched = false;
  33030. isMoved = false;
  33031. return;
  33032. }
  33033. isTouched = false;
  33034. isMoved = false;
  33035. if (touchesDiff === 0) {
  33036. return;
  33037. }
  33038. var timeDiff = Utils.now() - touchStartTime;
  33039. notification.$el.transition('');
  33040. notification.$el.addClass('notification-transitioning');
  33041. notification.$el.transform('');
  33042. if (
  33043. (touchesDiff < -10 && timeDiff < 300)
  33044. || (-touchesDiff >= notificationHeight / 1)
  33045. ) {
  33046. notification.close();
  33047. }
  33048. }
  33049. function attachTouchEvents() {
  33050. notification.$el.on(app.touchEvents.start, handleTouchStart, { passive: true });
  33051. app.on('touchmove:active', handleTouchMove);
  33052. app.on('touchend:passive', handleTouchEnd);
  33053. }
  33054. function detachTouchEvents() {
  33055. notification.$el.off(app.touchEvents.start, handleTouchStart, { passive: true });
  33056. app.off('touchmove:active', handleTouchMove);
  33057. app.off('touchend:passive', handleTouchEnd);
  33058. }
  33059. var timeoutId;
  33060. function closeOnTimeout() {
  33061. timeoutId = Utils.nextTick(function () {
  33062. if (isTouched && isMoved) {
  33063. closeOnTimeout();
  33064. return;
  33065. }
  33066. notification.close();
  33067. }, closeTimeout);
  33068. }
  33069. notification.on('open', function () {
  33070. if (notification.params.swipeToClose) {
  33071. attachTouchEvents();
  33072. }
  33073. $('.notification.modal-in').each(function (index, openedEl) {
  33074. var notificationInstance = app.notification.get(openedEl);
  33075. if (openedEl !== notification.el && notificationInstance) {
  33076. notificationInstance.close();
  33077. }
  33078. });
  33079. if (closeTimeout) {
  33080. closeOnTimeout();
  33081. }
  33082. });
  33083. notification.on('close beforeDestroy', function () {
  33084. if (notification.params.swipeToClose) {
  33085. detachTouchEvents();
  33086. }
  33087. win.clearTimeout(timeoutId);
  33088. });
  33089. return notification;
  33090. }
  33091. if ( Modal ) Notification.__proto__ = Modal;
  33092. Notification.prototype = Object.create( Modal && Modal.prototype );
  33093. Notification.prototype.constructor = Notification;
  33094. Notification.prototype.render = function render () {
  33095. var notification = this;
  33096. if (notification.params.render) { return notification.params.render.call(notification, notification); }
  33097. var ref = notification.params;
  33098. var icon = ref.icon;
  33099. var title = ref.title;
  33100. var titleRightText = ref.titleRightText;
  33101. var subtitle = ref.subtitle;
  33102. var text = ref.text;
  33103. var closeButton = ref.closeButton;
  33104. var cssClass = ref.cssClass;
  33105. 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();
  33106. };
  33107. return Notification;
  33108. }(Modal));
  33109. var Notification$1 = {
  33110. name: 'notification',
  33111. static: {
  33112. Notification: Notification,
  33113. },
  33114. create: function create() {
  33115. var app = this;
  33116. app.notification = Utils.extend(
  33117. {},
  33118. ModalMethods({
  33119. app: app,
  33120. constructor: Notification,
  33121. defaultSelector: '.notification.modal-in',
  33122. })
  33123. );
  33124. },
  33125. params: {
  33126. notification: {
  33127. icon: null,
  33128. title: null,
  33129. titleRightText: null,
  33130. subtitle: null,
  33131. text: null,
  33132. closeButton: false,
  33133. closeTimeout: null,
  33134. closeOnClick: false,
  33135. swipeToClose: true,
  33136. cssClass: null,
  33137. render: null,
  33138. },
  33139. },
  33140. };
  33141. /* eslint "no-useless-escape": "off" */
  33142. var Autocomplete = /*@__PURE__*/(function (Framework7Class) {
  33143. function Autocomplete(app, params) {
  33144. if ( params === void 0 ) params = {};
  33145. Framework7Class.call(this, params, [app]);
  33146. var ac = this;
  33147. ac.app = app;
  33148. var defaults = Utils.extend({
  33149. on: {},
  33150. }, app.params.autocomplete);
  33151. if (typeof defaults.searchbarDisableButton === 'undefined') {
  33152. defaults.searchbarDisableButton = app.theme !== 'aurora';
  33153. }
  33154. // Extend defaults with modules params
  33155. ac.useModulesParams(defaults);
  33156. ac.params = Utils.extend(defaults, params);
  33157. var $openerEl;
  33158. if (ac.params.openerEl) {
  33159. $openerEl = $(ac.params.openerEl);
  33160. if ($openerEl.length) { $openerEl[0].f7Autocomplete = ac; }
  33161. }
  33162. var $inputEl;
  33163. if (ac.params.inputEl) {
  33164. $inputEl = $(ac.params.inputEl);
  33165. if ($inputEl.length) { $inputEl[0].f7Autocomplete = ac; }
  33166. }
  33167. var id = Utils.id();
  33168. var url = params.url;
  33169. if (!url && $openerEl && $openerEl.length) {
  33170. if ($openerEl.attr('href')) { url = $openerEl.attr('href'); }
  33171. else if ($openerEl.find('a').length > 0) {
  33172. url = $openerEl.find('a').attr('href');
  33173. }
  33174. }
  33175. if (!url || url === '#' || url === '') { url = ac.params.url; }
  33176. var inputType = ac.params.multiple ? 'checkbox' : 'radio';
  33177. Utils.extend(ac, {
  33178. $openerEl: $openerEl,
  33179. openerEl: $openerEl && $openerEl[0],
  33180. $inputEl: $inputEl,
  33181. inputEl: $inputEl && $inputEl[0],
  33182. id: id,
  33183. url: url,
  33184. value: ac.params.value || [],
  33185. inputType: inputType,
  33186. inputName: (inputType + "-" + id),
  33187. $modalEl: undefined,
  33188. $dropdownEl: undefined,
  33189. });
  33190. var previousQuery = '';
  33191. function onInputChange() {
  33192. var query = ac.$inputEl.val().trim();
  33193. if (!ac.params.source) { return; }
  33194. ac.params.source.call(ac, query, function (items) {
  33195. var itemsHTML = '';
  33196. var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
  33197. ac.items = items;
  33198. var regExp;
  33199. if (ac.params.highlightMatches) {
  33200. query = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
  33201. regExp = new RegExp(("(" + query + ")"), 'i');
  33202. }
  33203. var firstValue;
  33204. var firstItem;
  33205. for (var i = 0; i < limit; i += 1) {
  33206. var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
  33207. var itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];
  33208. if (i === 0) {
  33209. firstValue = itemValue;
  33210. firstItem = ac.items[i];
  33211. }
  33212. itemsHTML += ac.renderItem({
  33213. value: itemValue,
  33214. text: ac.params.highlightMatches ? itemText.replace(regExp, '<b>$1</b>') : itemText,
  33215. }, i);
  33216. }
  33217. if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {
  33218. itemsHTML += ac.renderItem({
  33219. placeholder: true,
  33220. text: ac.params.dropdownPlaceholderText,
  33221. });
  33222. }
  33223. ac.$dropdownEl.find('ul').html(itemsHTML);
  33224. if (ac.params.typeahead) {
  33225. if (!firstValue || !firstItem) {
  33226. return;
  33227. }
  33228. if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {
  33229. return;
  33230. }
  33231. if (previousQuery.toLowerCase() === query.toLowerCase()) {
  33232. ac.value = [];
  33233. return;
  33234. }
  33235. if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {
  33236. previousQuery = query;
  33237. ac.value = [];
  33238. return;
  33239. }
  33240. $inputEl.val(firstValue);
  33241. $inputEl[0].setSelectionRange(query.length, firstValue.length);
  33242. var previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];
  33243. if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {
  33244. ac.value = [firstItem];
  33245. ac.emit('local::change autocompleteChange', [firstItem]);
  33246. }
  33247. }
  33248. previousQuery = query;
  33249. });
  33250. }
  33251. function onPageInputChange() {
  33252. var input = this;
  33253. var value = input.value;
  33254. var isValues = $(input).parents('.autocomplete-values').length > 0;
  33255. var item;
  33256. var itemValue;
  33257. var aValue;
  33258. if (isValues) {
  33259. if (ac.inputType === 'checkbox' && !input.checked) {
  33260. for (var i = 0; i < ac.value.length; i += 1) {
  33261. aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];
  33262. if (aValue === value || aValue * 1 === value * 1) {
  33263. ac.value.splice(i, 1);
  33264. }
  33265. }
  33266. ac.updateValues();
  33267. ac.emit('local::change autocompleteChange', ac.value);
  33268. }
  33269. return;
  33270. }
  33271. // Find Related Item
  33272. for (var i$1 = 0; i$1 < ac.items.length; i$1 += 1) {
  33273. itemValue = typeof ac.items[i$1] === 'object' ? ac.items[i$1][ac.params.valueProperty] : ac.items[i$1];
  33274. if (itemValue === value || itemValue * 1 === value * 1) { item = ac.items[i$1]; }
  33275. }
  33276. if (ac.inputType === 'radio') {
  33277. ac.value = [item];
  33278. } else if (input.checked) {
  33279. ac.value.push(item);
  33280. } else {
  33281. for (var i$2 = 0; i$2 < ac.value.length; i$2 += 1) {
  33282. aValue = typeof ac.value[i$2] === 'object' ? ac.value[i$2][ac.params.valueProperty] : ac.value[i$2];
  33283. if (aValue === value || aValue * 1 === value * 1) {
  33284. ac.value.splice(i$2, 1);
  33285. }
  33286. }
  33287. }
  33288. // Update Values Block
  33289. ac.updateValues();
  33290. // On Select Callback
  33291. if (((ac.inputType === 'radio' && input.checked) || ac.inputType === 'checkbox')) {
  33292. ac.emit('local::change autocompleteChange', ac.value);
  33293. }
  33294. }
  33295. function onHtmlClick(e) {
  33296. var $targetEl = $(e.target);
  33297. if ($targetEl.is(ac.$inputEl[0]) || (ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length)) { return; }
  33298. ac.close();
  33299. }
  33300. function onOpenerClick() {
  33301. ac.open();
  33302. }
  33303. function onInputFocus() {
  33304. ac.open();
  33305. }
  33306. function onInputBlur() {
  33307. if (ac.$dropdownEl.find('label.active-state').length > 0) { return; }
  33308. setTimeout(function () {
  33309. ac.close();
  33310. }, 0);
  33311. }
  33312. function onResize() {
  33313. ac.positionDropdown();
  33314. }
  33315. function onKeyDown(e) {
  33316. if (!ac.opened) { return; }
  33317. if (e.keyCode === 27) {
  33318. // ESC
  33319. e.preventDefault();
  33320. ac.$inputEl.blur();
  33321. return;
  33322. }
  33323. if (e.keyCode === 13) {
  33324. // Enter
  33325. var $selectedItemLabel = ac.$dropdownEl.find('.autocomplete-dropdown-selected label');
  33326. if ($selectedItemLabel.length) {
  33327. e.preventDefault();
  33328. $selectedItemLabel.trigger('click');
  33329. ac.$inputEl.blur();
  33330. return;
  33331. }
  33332. if (ac.params.typeahead) {
  33333. e.preventDefault();
  33334. ac.$inputEl.blur();
  33335. }
  33336. return;
  33337. }
  33338. if (e.keyCode !== 40 && e.keyCode !== 38) { return; }
  33339. e.preventDefault();
  33340. var $selectedItem = ac.$dropdownEl.find('.autocomplete-dropdown-selected');
  33341. var $newItem;
  33342. if ($selectedItem.length) {
  33343. $newItem = $selectedItem[e.keyCode === 40 ? 'next' : 'prev']('li');
  33344. if (!$newItem.length) {
  33345. $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
  33346. }
  33347. } else {
  33348. $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
  33349. }
  33350. if ($newItem.hasClass('autocomplete-dropdown-placeholder')) { return; }
  33351. $selectedItem.removeClass('autocomplete-dropdown-selected');
  33352. $newItem.addClass('autocomplete-dropdown-selected');
  33353. }
  33354. function onDropdownClick() {
  33355. var $clickedEl = $(this);
  33356. var clickedItem;
  33357. for (var i = 0; i < ac.items.length; i += 1) {
  33358. var itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];
  33359. var value = $clickedEl.attr('data-value');
  33360. if (itemValue === value || itemValue * 1 === value * 1) {
  33361. clickedItem = ac.items[i];
  33362. }
  33363. }
  33364. if (ac.params.updateInputValueOnSelect) {
  33365. ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);
  33366. ac.$inputEl.trigger('input change');
  33367. }
  33368. ac.value = [clickedItem];
  33369. ac.emit('local::change autocompleteChange', [clickedItem]);
  33370. ac.close();
  33371. }
  33372. ac.attachEvents = function attachEvents() {
  33373. if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
  33374. ac.$openerEl.on('click', onOpenerClick);
  33375. }
  33376. if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
  33377. ac.$inputEl.on('focus', onInputFocus);
  33378. ac.$inputEl.on(ac.params.inputEvents, onInputChange);
  33379. if (app.device.android) {
  33380. $('html').on('click', onHtmlClick);
  33381. } else {
  33382. ac.$inputEl.on('blur', onInputBlur);
  33383. }
  33384. ac.$inputEl.on('keydown', onKeyDown);
  33385. }
  33386. };
  33387. ac.detachEvents = function attachEvents() {
  33388. if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
  33389. ac.$openerEl.off('click', onOpenerClick);
  33390. }
  33391. if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
  33392. ac.$inputEl.off('focus', onInputFocus);
  33393. ac.$inputEl.off(ac.params.inputEvents, onInputChange);
  33394. if (app.device.android) {
  33395. $('html').off('click', onHtmlClick);
  33396. } else {
  33397. ac.$inputEl.off('blur', onInputBlur);
  33398. }
  33399. ac.$inputEl.off('keydown', onKeyDown);
  33400. }
  33401. };
  33402. ac.attachDropdownEvents = function attachDropdownEvents() {
  33403. ac.$dropdownEl.on('click', 'label', onDropdownClick);
  33404. app.on('resize', onResize);
  33405. };
  33406. ac.detachDropdownEvents = function detachDropdownEvents() {
  33407. ac.$dropdownEl.off('click', 'label', onDropdownClick);
  33408. app.off('resize', onResize);
  33409. };
  33410. ac.attachPageEvents = function attachPageEvents() {
  33411. ac.$el.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
  33412. if (ac.params.closeOnSelect && !ac.params.multiple) {
  33413. ac.$el.once('click', '.list label', function () {
  33414. Utils.nextTick(function () {
  33415. ac.close();
  33416. });
  33417. });
  33418. }
  33419. };
  33420. ac.detachPageEvents = function detachPageEvents() {
  33421. ac.$el.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
  33422. };
  33423. // Install Modules
  33424. ac.useModules();
  33425. // Init
  33426. ac.init();
  33427. return ac;
  33428. }
  33429. if ( Framework7Class ) Autocomplete.__proto__ = Framework7Class;
  33430. Autocomplete.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  33431. Autocomplete.prototype.constructor = Autocomplete;
  33432. var prototypeAccessors = { view: { configurable: true } };
  33433. prototypeAccessors.view.get = function () {
  33434. var ac = this;
  33435. var $openerEl = ac.$openerEl;
  33436. var $inputEl = ac.$inputEl;
  33437. var app = ac.app;
  33438. var view;
  33439. if (ac.params.view) {
  33440. view = ac.params.view;
  33441. } else if ($openerEl || $inputEl) {
  33442. var $el = $openerEl || $inputEl;
  33443. view = $el.closest('.view').length && $el.closest('.view')[0].f7View;
  33444. }
  33445. if (!view) { view = app.views.main; }
  33446. return view;
  33447. };
  33448. Autocomplete.prototype.positionDropdown = function positionDropdown () {
  33449. var obj;
  33450. var ac = this;
  33451. var $inputEl = ac.$inputEl;
  33452. var app = ac.app;
  33453. var $dropdownEl = ac.$dropdownEl;
  33454. var $pageContentEl = $inputEl.parents('.page-content');
  33455. if ($pageContentEl.length === 0) { return; }
  33456. var inputOffset = $inputEl.offset();
  33457. var inputOffsetWidth = $inputEl[0].offsetWidth;
  33458. var inputOffsetHeight = $inputEl[0].offsetHeight;
  33459. var $listEl = $inputEl.parents('.list');
  33460. var $listParent;
  33461. $listEl.parents().each(function (index, parentEl) {
  33462. if ($listParent) { return; }
  33463. var $parentEl = $(parentEl);
  33464. if ($parentEl.parent($pageContentEl).length) { $listParent = $parentEl; }
  33465. });
  33466. var listOffset = $listEl.offset();
  33467. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  33468. var listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;
  33469. var inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);
  33470. var inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);
  33471. var maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;
  33472. var paddingProp = app.rtl ? 'padding-right' : 'padding-left';
  33473. var paddingValue;
  33474. if ($listEl.length && !ac.params.expandInput) {
  33475. paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);
  33476. }
  33477. $dropdownEl.css({
  33478. left: (($listEl.length > 0 ? listOffsetLeft : inputOffsetLeft) + "px"),
  33479. top: ((inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight) + "px"),
  33480. width: (($listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth) + "px"),
  33481. });
  33482. $dropdownEl.children('.autocomplete-dropdown-inner').css(( obj = {
  33483. maxHeight: (maxHeight + "px")
  33484. }, obj[paddingProp] = $listEl.length > 0 && !ac.params.expandInput ? (paddingValue + "px") : '', obj ));
  33485. };
  33486. Autocomplete.prototype.focus = function focus () {
  33487. var ac = this;
  33488. ac.$el.find('input[type=search]').focus();
  33489. };
  33490. Autocomplete.prototype.source = function source (query) {
  33491. var ac = this;
  33492. if (!ac.params.source) { return; }
  33493. var $el = ac.$el;
  33494. ac.params.source.call(ac, query, function (items) {
  33495. var itemsHTML = '';
  33496. var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
  33497. ac.items = items;
  33498. for (var i = 0; i < limit; i += 1) {
  33499. var selected = false;
  33500. var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
  33501. for (var j = 0; j < ac.value.length; j += 1) {
  33502. var aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];
  33503. if (aValue === itemValue || aValue * 1 === itemValue * 1) { selected = true; }
  33504. }
  33505. itemsHTML += ac.renderItem({
  33506. value: itemValue,
  33507. text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],
  33508. inputType: ac.inputType,
  33509. id: ac.id,
  33510. inputName: ac.inputName,
  33511. selected: selected,
  33512. }, i);
  33513. }
  33514. $el.find('.autocomplete-found ul').html(itemsHTML);
  33515. if (items.length === 0) {
  33516. if (query.length !== 0) {
  33517. $el.find('.autocomplete-not-found').show();
  33518. $el.find('.autocomplete-found, .autocomplete-values').hide();
  33519. } else {
  33520. $el.find('.autocomplete-values').show();
  33521. $el.find('.autocomplete-found, .autocomplete-not-found').hide();
  33522. }
  33523. } else {
  33524. $el.find('.autocomplete-found').show();
  33525. $el.find('.autocomplete-not-found, .autocomplete-values').hide();
  33526. }
  33527. });
  33528. };
  33529. Autocomplete.prototype.updateValues = function updateValues () {
  33530. var ac = this;
  33531. var valuesHTML = '';
  33532. for (var i = 0; i < ac.value.length; i += 1) {
  33533. valuesHTML += ac.renderItem({
  33534. value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],
  33535. text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],
  33536. inputType: ac.inputType,
  33537. id: ac.id,
  33538. inputName: ((ac.inputName) + "-checked}"),
  33539. selected: true,
  33540. }, i);
  33541. }
  33542. ac.$el.find('.autocomplete-values ul').html(valuesHTML);
  33543. };
  33544. Autocomplete.prototype.preloaderHide = function preloaderHide () {
  33545. var ac = this;
  33546. if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
  33547. ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
  33548. } else {
  33549. $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
  33550. }
  33551. };
  33552. Autocomplete.prototype.preloaderShow = function preloaderShow () {
  33553. var ac = this;
  33554. if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
  33555. ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
  33556. } else {
  33557. $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
  33558. }
  33559. };
  33560. Autocomplete.prototype.renderPreloader = function renderPreloader () {
  33561. var ac = this;
  33562. return ("\n <div class=\"autocomplete-preloader preloader " + (ac.params.preloaderColor ? ("color-" + (ac.params.preloaderColor)) : '') + "\">" + (Utils[((ac.app.theme) + "PreloaderContent")] || '') + "</div>\n ").trim();
  33563. };
  33564. Autocomplete.prototype.renderSearchbar = function renderSearchbar () {
  33565. var ac = this;
  33566. if (ac.params.renderSearchbar) { return ac.params.renderSearchbar.call(ac); }
  33567. 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();
  33568. return searchbarHTML;
  33569. };
  33570. Autocomplete.prototype.renderItem = function renderItem (item, index) {
  33571. var ac = this;
  33572. if (ac.params.renderItem) { return ac.params.renderItem.call(ac, item, index); }
  33573. var itemHtml;
  33574. var itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/"/g, '&quot;') : item.value;
  33575. if (ac.params.openIn !== 'dropdown') {
  33576. 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 ";
  33577. } else if (!item.placeholder) {
  33578. // Dropdown
  33579. 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 ";
  33580. } else {
  33581. // Dropwdown placeholder
  33582. 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 ";
  33583. }
  33584. return itemHtml.trim();
  33585. };
  33586. Autocomplete.prototype.renderNavbar = function renderNavbar () {
  33587. var ac = this;
  33588. if (ac.params.renderNavbar) { return ac.params.renderNavbar.call(ac); }
  33589. var pageTitle = ac.params.pageTitle;
  33590. if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
  33591. pageTitle = ac.$openerEl.find('.item-title').text().trim();
  33592. }
  33593. var inPopup = ac.params.openIn === 'popup';
  33594. var navbarLeft = inPopup
  33595. ? ("\n " + (ac.params.preloader ? ("\n <div class=\"left\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ")
  33596. : ("\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 ");
  33597. var navbarRight = inPopup
  33598. ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".autocomplete-popup\">\n " + (ac.params.popupCloseLinkText) + "\n </a>\n </div>\n ")
  33599. : ("\n " + (ac.params.preloader ? ("\n <div class=\"right\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ");
  33600. 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();
  33601. return navbarHtml;
  33602. };
  33603. Autocomplete.prototype.renderDropdown = function renderDropdown () {
  33604. var ac = this;
  33605. if (ac.params.renderDropdown) { return ac.params.renderDropdown.call(ac, ac.items); }
  33606. 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();
  33607. return dropdownHtml;
  33608. };
  33609. Autocomplete.prototype.renderPage = function renderPage (inPopup) {
  33610. var ac = this;
  33611. if (ac.params.renderPage) { return ac.params.renderPage.call(ac, ac.items); }
  33612. 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();
  33613. return pageHtml;
  33614. };
  33615. Autocomplete.prototype.renderPopup = function renderPopup () {
  33616. var ac = this;
  33617. if (ac.params.renderPopup) { return ac.params.renderPopup.call(ac, ac.items); }
  33618. var popupHtml = ("\n <div class=\"popup autocomplete-popup\">\n <div class=\"view\">\n " + (ac.renderPage(true)) + ";\n </div>\n </div>\n ").trim();
  33619. return popupHtml;
  33620. };
  33621. Autocomplete.prototype.onOpen = function onOpen (type, el) {
  33622. var ac = this;
  33623. var app = ac.app;
  33624. var $el = $(el);
  33625. ac.$el = $el;
  33626. ac.el = $el[0];
  33627. ac.openedIn = type;
  33628. ac.opened = true;
  33629. if (ac.params.openIn === 'dropdown') {
  33630. ac.attachDropdownEvents();
  33631. ac.$dropdownEl.addClass('autocomplete-dropdown-in');
  33632. ac.$inputEl.trigger('input');
  33633. } else {
  33634. // Init SB
  33635. var $searchbarEl = $el.find('.searchbar');
  33636. if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
  33637. $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
  33638. }
  33639. ac.searchbar = app.searchbar.create({
  33640. el: $searchbarEl,
  33641. backdropEl: $el.find('.searchbar-backdrop'),
  33642. customSearch: true,
  33643. on: {
  33644. search: function search(sb, query) {
  33645. if (query.length === 0 && ac.searchbar.enabled) {
  33646. ac.searchbar.backdropShow();
  33647. } else {
  33648. ac.searchbar.backdropHide();
  33649. }
  33650. ac.source(query);
  33651. },
  33652. },
  33653. });
  33654. // Attach page events
  33655. ac.attachPageEvents();
  33656. // Update Values On Page Init
  33657. ac.updateValues();
  33658. // Source on load
  33659. if (ac.params.requestSourceOnOpen) { ac.source(''); }
  33660. }
  33661. ac.emit('local::open autocompleteOpen', ac);
  33662. };
  33663. Autocomplete.prototype.autoFocus = function autoFocus () {
  33664. var ac = this;
  33665. if (ac.searchbar && ac.searchbar.$inputEl) {
  33666. ac.searchbar.$inputEl.focus();
  33667. }
  33668. return ac;
  33669. };
  33670. Autocomplete.prototype.onOpened = function onOpened () {
  33671. var ac = this;
  33672. if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
  33673. ac.autoFocus();
  33674. }
  33675. ac.emit('local::opened autocompleteOpened', ac);
  33676. };
  33677. Autocomplete.prototype.onClose = function onClose () {
  33678. var ac = this;
  33679. if (ac.destroyed) { return; }
  33680. // Destroy SB
  33681. if (ac.searchbar && ac.searchbar.destroy) {
  33682. ac.searchbar.destroy();
  33683. ac.searchbar = null;
  33684. delete ac.searchbar;
  33685. }
  33686. if (ac.params.openIn === 'dropdown') {
  33687. ac.detachDropdownEvents();
  33688. ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
  33689. ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
  33690. } else {
  33691. ac.detachPageEvents();
  33692. }
  33693. ac.emit('local::close autocompleteClose', ac);
  33694. };
  33695. Autocomplete.prototype.onClosed = function onClosed () {
  33696. var ac = this;
  33697. if (ac.destroyed) { return; }
  33698. ac.opened = false;
  33699. ac.$el = null;
  33700. ac.el = null;
  33701. delete ac.$el;
  33702. delete ac.el;
  33703. ac.emit('local::closed autocompleteClosed', ac);
  33704. };
  33705. Autocomplete.prototype.openPage = function openPage () {
  33706. var ac = this;
  33707. if (ac.opened) { return ac; }
  33708. var pageHtml = ac.renderPage();
  33709. ac.view.router.navigate({
  33710. url: ac.url,
  33711. route: {
  33712. content: pageHtml,
  33713. path: ac.url,
  33714. on: {
  33715. pageBeforeIn: function pageBeforeIn(e, page) {
  33716. ac.onOpen('page', page.el);
  33717. },
  33718. pageAfterIn: function pageAfterIn(e, page) {
  33719. ac.onOpened('page', page.el);
  33720. },
  33721. pageBeforeOut: function pageBeforeOut(e, page) {
  33722. ac.onClose('page', page.el);
  33723. },
  33724. pageAfterOut: function pageAfterOut(e, page) {
  33725. ac.onClosed('page', page.el);
  33726. },
  33727. },
  33728. options: {
  33729. animate: ac.params.animate,
  33730. },
  33731. },
  33732. });
  33733. return ac;
  33734. };
  33735. Autocomplete.prototype.openPopup = function openPopup () {
  33736. var ac = this;
  33737. if (ac.opened) { return ac; }
  33738. var popupHtml = ac.renderPopup();
  33739. var popupParams = {
  33740. content: popupHtml,
  33741. animate: ac.params.animate,
  33742. push: ac.params.popupPush,
  33743. swipeToClose: ac.params.popupSwipeToClose,
  33744. on: {
  33745. popupOpen: function popupOpen(popup) {
  33746. ac.onOpen('popup', popup.el);
  33747. },
  33748. popupOpened: function popupOpened(popup) {
  33749. ac.onOpened('popup', popup.el);
  33750. },
  33751. popupClose: function popupClose(popup) {
  33752. ac.onClose('popup', popup.el);
  33753. },
  33754. popupClosed: function popupClosed(popup) {
  33755. ac.onClosed('popup', popup.el);
  33756. },
  33757. },
  33758. };
  33759. if (ac.params.routableModals && ac.view) {
  33760. ac.view.router.navigate({
  33761. url: ac.url,
  33762. route: {
  33763. path: ac.url,
  33764. popup: popupParams,
  33765. },
  33766. });
  33767. } else {
  33768. ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
  33769. }
  33770. return ac;
  33771. };
  33772. Autocomplete.prototype.openDropdown = function openDropdown () {
  33773. var ac = this;
  33774. if (!ac.$dropdownEl) {
  33775. ac.$dropdownEl = $(ac.renderDropdown());
  33776. }
  33777. var $listEl = ac.$inputEl.parents('.list');
  33778. if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
  33779. ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
  33780. }
  33781. var $pageContentEl = ac.$inputEl.parents('.page-content');
  33782. if (ac.params.dropdownContainerEl) {
  33783. $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
  33784. } else if ($pageContentEl.length === 0) {
  33785. ac.$dropdownEl.insertAfter(ac.$inputEl);
  33786. } else {
  33787. ac.positionDropdown();
  33788. $pageContentEl.append(ac.$dropdownEl);
  33789. }
  33790. ac.onOpen('dropdown', ac.$dropdownEl);
  33791. ac.onOpened('dropdown', ac.$dropdownEl);
  33792. };
  33793. Autocomplete.prototype.open = function open () {
  33794. var ac = this;
  33795. if (ac.opened) { return ac; }
  33796. var openIn = ac.params.openIn;
  33797. ac[("open" + (openIn.split('').map(function (el, index) {
  33798. if (index === 0) { return el.toUpperCase(); }
  33799. return el;
  33800. }).join('')))]();
  33801. return ac;
  33802. };
  33803. Autocomplete.prototype.close = function close () {
  33804. var ac = this;
  33805. if (!ac.opened) { return ac; }
  33806. if (ac.params.openIn === 'dropdown') {
  33807. ac.onClose();
  33808. ac.onClosed();
  33809. } else if ((ac.params.routableModals && ac.view) || ac.openedIn === 'page') {
  33810. ac.view.router.back({ animate: ac.params.animate });
  33811. } else {
  33812. ac.modal.once('modalClosed', function () {
  33813. Utils.nextTick(function () {
  33814. if (ac.destroyed) { return; }
  33815. ac.modal.destroy();
  33816. delete ac.modal;
  33817. });
  33818. });
  33819. ac.modal.close();
  33820. }
  33821. return ac;
  33822. };
  33823. Autocomplete.prototype.init = function init () {
  33824. var ac = this;
  33825. ac.attachEvents();
  33826. };
  33827. Autocomplete.prototype.destroy = function destroy () {
  33828. var ac = this;
  33829. ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
  33830. ac.detachEvents();
  33831. if (ac.$inputEl && ac.$inputEl[0]) {
  33832. delete ac.$inputEl[0].f7Autocomplete;
  33833. }
  33834. if (ac.$openerEl && ac.$openerEl[0]) {
  33835. delete ac.$openerEl[0].f7Autocomplete;
  33836. }
  33837. Utils.deleteProps(ac);
  33838. ac.destroyed = true;
  33839. };
  33840. Object.defineProperties( Autocomplete.prototype, prototypeAccessors );
  33841. return Autocomplete;
  33842. }(Framework7Class));
  33843. var Autocomplete$1 = {
  33844. name: 'autocomplete',
  33845. params: {
  33846. autocomplete: {
  33847. openerEl: undefined,
  33848. inputEl: undefined,
  33849. view: undefined,
  33850. // DropDown
  33851. dropdownContainerEl: undefined,
  33852. dropdownPlaceholderText: undefined,
  33853. typeahead: false,
  33854. highlightMatches: true,
  33855. expandInput: false,
  33856. updateInputValueOnSelect: true,
  33857. inputEvents: 'input',
  33858. value: undefined,
  33859. multiple: false,
  33860. source: undefined,
  33861. limit: undefined,
  33862. valueProperty: 'id',
  33863. textProperty: 'text',
  33864. openIn: 'page', // or 'popup' or 'dropdown'
  33865. pageBackLinkText: 'Back',
  33866. popupCloseLinkText: 'Close',
  33867. pageTitle: undefined,
  33868. searchbarPlaceholder: 'Search...',
  33869. searchbarDisableText: 'Cancel',
  33870. searchbarDisableButton: undefined,
  33871. searchbarSpellcheck: false,
  33872. popupPush: false,
  33873. popupSwipeToClose: undefined,
  33874. animate: true,
  33875. autoFocus: false,
  33876. closeOnSelect: false,
  33877. notFoundText: 'Nothing found',
  33878. requestSourceOnOpen: false,
  33879. // Preloader
  33880. preloaderColor: undefined,
  33881. preloader: false,
  33882. // Colors
  33883. formColorTheme: undefined,
  33884. navbarColorTheme: undefined,
  33885. // Routing
  33886. routableModals: true,
  33887. url: 'select/',
  33888. // Custom render functions
  33889. renderDropdown: undefined,
  33890. renderPage: undefined,
  33891. renderPopup: undefined,
  33892. renderItem: undefined,
  33893. renderSearchbar: undefined,
  33894. renderNavbar: undefined,
  33895. },
  33896. },
  33897. static: {
  33898. Autocomplete: Autocomplete,
  33899. },
  33900. create: function create() {
  33901. var app = this;
  33902. app.autocomplete = Utils.extend(
  33903. ConstructorMethods({
  33904. defaultSelector: undefined,
  33905. constructor: Autocomplete,
  33906. app: app,
  33907. domProp: 'f7Autocomplete',
  33908. }),
  33909. {
  33910. open: function open(autocompleteEl) {
  33911. var ac = app.autocomplete.get(autocompleteEl);
  33912. if (ac && ac.open) { return ac.open(); }
  33913. return undefined;
  33914. },
  33915. close: function close(autocompleteEl) {
  33916. var ac = app.autocomplete.get(autocompleteEl);
  33917. if (ac && ac.close) { return ac.close(); }
  33918. return undefined;
  33919. },
  33920. }
  33921. );
  33922. },
  33923. };
  33924. var Tooltip = /*@__PURE__*/(function (Framework7Class) {
  33925. function Tooltip(app, params) {
  33926. if ( params === void 0 ) params = {};
  33927. Framework7Class.call(this, params, [app]);
  33928. var tooltip = this;
  33929. var defaults = Utils.extend({}, app.params.tooltip);
  33930. // Extend defaults with modules params
  33931. tooltip.useModulesParams(defaults);
  33932. tooltip.params = Utils.extend(defaults, params);
  33933. if (typeof params.offset === 'undefined' && Support.touch && tooltip.params.trigger === 'hover') {
  33934. tooltip.params.offset = 10;
  33935. }
  33936. var ref = tooltip.params;
  33937. var targetEl = ref.targetEl;
  33938. if (!targetEl) { return tooltip; }
  33939. var $targetEl = $(targetEl);
  33940. if ($targetEl.length === 0) { return tooltip; }
  33941. if ($targetEl[0].f7Tooltip) { return $targetEl[0].f7Tooltip; }
  33942. var $el = $(tooltip.render()).eq(0);
  33943. Utils.extend(tooltip, {
  33944. app: app,
  33945. $targetEl: $targetEl,
  33946. targetEl: $targetEl && $targetEl[0],
  33947. $el: $el,
  33948. el: $el && $el[0],
  33949. text: tooltip.params.text || '',
  33950. visible: false,
  33951. opened: false,
  33952. });
  33953. $targetEl[0].f7Tooltip = tooltip;
  33954. var touchesStart = {};
  33955. var isTouched;
  33956. function handleClick() {
  33957. if (tooltip.opened) { tooltip.hide(); }
  33958. else { tooltip.show(this); }
  33959. }
  33960. function handleClickOut(e) {
  33961. if (tooltip.opened && (
  33962. $(e.target).closest($targetEl).length
  33963. || $(e.target).closest(tooltip.$el).length
  33964. )) { return; }
  33965. tooltip.hide();
  33966. }
  33967. function handleTouchStart(e) {
  33968. if (isTouched) { return; }
  33969. isTouched = true;
  33970. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  33971. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  33972. tooltip.show(this);
  33973. }
  33974. function handleTouchMove(e) {
  33975. if (!isTouched) { return; }
  33976. var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  33977. var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  33978. var distance = Math.pow( (
  33979. (Math.pow( (x - touchesStart.x), 2 ))
  33980. + (Math.pow( (y - touchesStart.y), 2 ))
  33981. ), 0.5 );
  33982. if (distance > 50) {
  33983. isTouched = false;
  33984. tooltip.hide();
  33985. }
  33986. }
  33987. function handleTouchEnd() {
  33988. if (!isTouched) { return; }
  33989. isTouched = false;
  33990. tooltip.hide();
  33991. }
  33992. function handleMouseEnter() {
  33993. tooltip.show(this);
  33994. }
  33995. function handleMouseLeave() {
  33996. tooltip.hide();
  33997. }
  33998. function handleTransitionEnd() {
  33999. if (!$el.hasClass('tooltip-in')) {
  34000. $el.removeClass('tooltip-out').remove();
  34001. }
  34002. }
  34003. tooltip.attachEvents = function attachEvents() {
  34004. $el.on('transitionend', handleTransitionEnd);
  34005. if (tooltip.params.trigger === 'click') {
  34006. $targetEl.on('click', handleClick);
  34007. $('html').on('click', handleClickOut);
  34008. return;
  34009. }
  34010. if (Support.touch) {
  34011. var passive = Support.passiveListener ? { passive: true } : false;
  34012. $targetEl.on(app.touchEvents.start, handleTouchStart, passive);
  34013. app.on('touchmove', handleTouchMove);
  34014. app.on('touchend:passive', handleTouchEnd);
  34015. } else {
  34016. $targetEl.on((Support.pointerEvents ? 'pointerenter' : 'mouseenter'), handleMouseEnter);
  34017. $targetEl.on((Support.pointerEvents ? 'pointerleave' : 'mouseleave'), handleMouseLeave);
  34018. }
  34019. };
  34020. tooltip.detachEvents = function detachEvents() {
  34021. $el.off('transitionend', handleTransitionEnd);
  34022. if (tooltip.params.trigger === 'click') {
  34023. $targetEl.off('click', handleClick);
  34024. $('html').off('click', handleClickOut);
  34025. return;
  34026. }
  34027. if (Support.touch) {
  34028. var passive = Support.passiveListener ? { passive: true } : false;
  34029. $targetEl.off(app.touchEvents.start, handleTouchStart, passive);
  34030. app.off('touchmove', handleTouchMove);
  34031. app.off('touchend:passive', handleTouchEnd);
  34032. } else {
  34033. $targetEl.off((Support.pointerEvents ? 'pointerenter' : 'mouseenter'), handleMouseEnter);
  34034. $targetEl.off((Support.pointerEvents ? 'pointerleave' : 'mouseleave'), handleMouseLeave);
  34035. }
  34036. };
  34037. // Install Modules
  34038. tooltip.useModules();
  34039. tooltip.init();
  34040. return tooltip;
  34041. }
  34042. if ( Framework7Class ) Tooltip.__proto__ = Framework7Class;
  34043. Tooltip.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  34044. Tooltip.prototype.constructor = Tooltip;
  34045. Tooltip.prototype.position = function position (targetEl) {
  34046. var tooltip = this;
  34047. var $el = tooltip.$el;
  34048. var app = tooltip.app;
  34049. var tooltipOffset = tooltip.params.offset || 0;
  34050. $el.css({ left: '', top: '' });
  34051. var $targetEl = $(targetEl || tooltip.targetEl);
  34052. var ref = [$el.width(), $el.height()];
  34053. var width = ref[0];
  34054. var height = ref[1];
  34055. $el.css({ left: '', top: '' });
  34056. var targetWidth;
  34057. var targetHeight;
  34058. var targetOffsetLeft;
  34059. var targetOffsetTop;
  34060. if ($targetEl && $targetEl.length > 0) {
  34061. targetWidth = $targetEl.outerWidth();
  34062. targetHeight = $targetEl.outerHeight();
  34063. if (typeof targetWidth === 'undefined' && typeof targetHeight === 'undefined') {
  34064. var clientRect = $targetEl[0].getBoundingClientRect();
  34065. targetWidth = clientRect.width;
  34066. targetHeight = clientRect.height;
  34067. }
  34068. var targetOffset = $targetEl.offset();
  34069. targetOffsetLeft = targetOffset.left - app.left;
  34070. targetOffsetTop = targetOffset.top - app.top;
  34071. var targetParentPage = $targetEl.parents('.page');
  34072. if (targetParentPage.length > 0) {
  34073. targetOffsetTop -= targetParentPage[0].scrollTop;
  34074. }
  34075. }
  34076. var ref$1 = [0, 0, 0];
  34077. var left = ref$1[0];
  34078. var top = ref$1[1];
  34079. // Top Position
  34080. var position = 'top';
  34081. if (height + tooltipOffset < targetOffsetTop) {
  34082. // On top
  34083. top = targetOffsetTop - height - tooltipOffset;
  34084. } else if (height < app.height - targetOffsetTop - targetHeight) {
  34085. // On bottom
  34086. position = 'bottom';
  34087. top = targetOffsetTop + targetHeight + tooltipOffset;
  34088. } else {
  34089. // On middle
  34090. position = 'middle';
  34091. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  34092. if (top <= 0) {
  34093. top = 8;
  34094. } else if (top + height >= app.height) {
  34095. top = app.height - height - 8;
  34096. }
  34097. }
  34098. // Horizontal Position
  34099. if (position === 'top' || position === 'bottom') {
  34100. left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
  34101. if (left < 8) { left = 8; }
  34102. if (left + width > app.width) { left = app.width - width - 8; }
  34103. if (left < 0) { left = 0; }
  34104. } else if (position === 'middle') {
  34105. left = targetOffsetLeft - width;
  34106. if (left < 8 || (left + width > app.width)) {
  34107. if (left < 8) { left = targetOffsetLeft + targetWidth; }
  34108. if (left + width > app.width) { left = app.width - width - 8; }
  34109. }
  34110. }
  34111. // Apply Styles
  34112. $el.css({ top: (top + "px"), left: (left + "px") });
  34113. };
  34114. Tooltip.prototype.show = function show (aroundEl) {
  34115. var tooltip = this;
  34116. var app = tooltip.app;
  34117. var $el = tooltip.$el;
  34118. var $targetEl = tooltip.$targetEl;
  34119. app.root.append($el);
  34120. tooltip.position(aroundEl);
  34121. var $aroundEl = $(aroundEl);
  34122. tooltip.visible = true;
  34123. tooltip.opened = true;
  34124. $targetEl.trigger('tooltip:show');
  34125. $el.trigger('tooltip:show');
  34126. if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
  34127. $aroundEl.trigger('tooltip:show');
  34128. }
  34129. tooltip.emit('local::show tooltipShow', tooltip);
  34130. $el.removeClass('tooltip-out').addClass('tooltip-in');
  34131. return tooltip;
  34132. };
  34133. Tooltip.prototype.hide = function hide () {
  34134. var tooltip = this;
  34135. var $el = tooltip.$el;
  34136. var $targetEl = tooltip.$targetEl;
  34137. tooltip.visible = false;
  34138. tooltip.opened = false;
  34139. $targetEl.trigger('tooltip:hide');
  34140. $el.trigger('tooltip:hide');
  34141. tooltip.emit('local::hide tooltipHide', tooltip);
  34142. $el.addClass('tooltip-out').removeClass('tooltip-in');
  34143. return tooltip;
  34144. };
  34145. Tooltip.prototype.render = function render () {
  34146. var tooltip = this;
  34147. if (tooltip.params.render) { return tooltip.params.render.call(tooltip, tooltip); }
  34148. var ref = tooltip.params;
  34149. var cssClass = ref.cssClass;
  34150. var text = ref.text;
  34151. return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
  34152. };
  34153. Tooltip.prototype.setText = function setText (newText) {
  34154. var tooltip = this;
  34155. if (typeof newText === 'undefined') {
  34156. return tooltip;
  34157. }
  34158. tooltip.params.text = newText;
  34159. tooltip.text = newText;
  34160. if (tooltip.$el) {
  34161. tooltip.$el.children('.tooltip-content').html(newText);
  34162. }
  34163. if (tooltip.opened) {
  34164. tooltip.position();
  34165. }
  34166. return tooltip;
  34167. };
  34168. Tooltip.prototype.init = function init () {
  34169. var tooltip = this;
  34170. tooltip.attachEvents();
  34171. };
  34172. Tooltip.prototype.destroy = function destroy () {
  34173. var tooltip = this;
  34174. if (!tooltip.$targetEl || tooltip.destroyed) { return; }
  34175. tooltip.$targetEl.trigger('tooltip:beforedestroy');
  34176. tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
  34177. tooltip.$el.remove();
  34178. delete tooltip.$targetEl[0].f7Tooltip;
  34179. tooltip.detachEvents();
  34180. Utils.deleteProps(tooltip);
  34181. tooltip.destroyed = true;
  34182. };
  34183. return Tooltip;
  34184. }(Framework7Class));
  34185. var Tooltip$1 = {
  34186. name: 'tooltip',
  34187. static: {
  34188. Tooltip: Tooltip,
  34189. },
  34190. create: function create() {
  34191. var app = this;
  34192. app.tooltip = ConstructorMethods({
  34193. defaultSelector: '.tooltip',
  34194. constructor: Tooltip,
  34195. app: app,
  34196. domProp: 'f7Tooltip',
  34197. });
  34198. app.tooltip.show = function show(el) {
  34199. var $el = $(el);
  34200. if ($el.length === 0) { return undefined; }
  34201. var tooltip = $el[0].f7Tooltip;
  34202. if (!tooltip) { return undefined; }
  34203. tooltip.show($el[0]);
  34204. return tooltip;
  34205. };
  34206. app.tooltip.hide = function hide(el) {
  34207. var $el = $(el);
  34208. if ($el.length === 0) { return undefined; }
  34209. var tooltip = $el[0].f7Tooltip;
  34210. if (!tooltip) { return undefined; }
  34211. tooltip.hide();
  34212. return tooltip;
  34213. };
  34214. app.tooltip.setText = function text(el, newText) {
  34215. var $el = $(el);
  34216. if ($el.length === 0) { return undefined; }
  34217. var tooltip = $el[0].f7Tooltip;
  34218. if (!tooltip) { return undefined; }
  34219. tooltip.setText(newText);
  34220. return tooltip;
  34221. };
  34222. },
  34223. params: {
  34224. tooltip: {
  34225. targetEl: null,
  34226. text: null,
  34227. cssClass: null,
  34228. render: null,
  34229. offset: 0,
  34230. trigger: 'hover',
  34231. },
  34232. },
  34233. on: {
  34234. tabMounted: function tabMounted(tabEl) {
  34235. var app = this;
  34236. $(tabEl).find('.tooltip-init').each(function (index, el) {
  34237. var text = $(el).attr('data-tooltip');
  34238. if (!text) { return; }
  34239. app.tooltip.create({ targetEl: el, text: text });
  34240. });
  34241. },
  34242. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  34243. $(tabEl).find('.tooltip-init').each(function (index, el) {
  34244. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  34245. });
  34246. },
  34247. pageInit: function pageInit(page) {
  34248. var app = this;
  34249. page.$el.find('.tooltip-init').each(function (index, el) {
  34250. var text = $(el).attr('data-tooltip');
  34251. if (!text) { return; }
  34252. app.tooltip.create({ targetEl: el, text: text });
  34253. });
  34254. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  34255. page.$navbarEl.find('.tooltip-init').each(function (index, el) {
  34256. var text = $(el).attr('data-tooltip');
  34257. if (!text) { return; }
  34258. app.tooltip.create({ targetEl: el, text: text });
  34259. });
  34260. }
  34261. },
  34262. pageBeforeRemove: function pageBeforeRemove(page) {
  34263. var app = this;
  34264. page.$el.find('.tooltip-init').each(function (index, el) {
  34265. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  34266. });
  34267. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  34268. page.$navbarEl.find('.tooltip-init').each(function (index, el) {
  34269. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  34270. });
  34271. }
  34272. },
  34273. },
  34274. vnode: {
  34275. 'tooltip-init': {
  34276. insert: function insert(vnode) {
  34277. var app = this;
  34278. var el = vnode.elm;
  34279. var text = $(el).attr('data-tooltip');
  34280. if (!text) { return; }
  34281. app.tooltip.create({ targetEl: el, text: text });
  34282. },
  34283. update: function update(vnode) {
  34284. var el = vnode.elm;
  34285. if (!el.f7Tooltip) { return; }
  34286. if (vnode && vnode.data && vnode.data.attrs && vnode.data.attrs['data-tooltip']) {
  34287. el.f7Tooltip.setText(vnode.data.attrs['data-tooltip']);
  34288. }
  34289. },
  34290. destroy: function destroy(vnode) {
  34291. var el = vnode.elm;
  34292. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  34293. },
  34294. },
  34295. },
  34296. };
  34297. /* eslint no-nested-ternary: off */
  34298. var Gauge = /*@__PURE__*/(function (Framework7Class) {
  34299. function Gauge(app, params) {
  34300. if ( params === void 0 ) params = {};
  34301. // Extends with open/close Modal methods;
  34302. Framework7Class.call(this, params, [app]);
  34303. var gauge = this;
  34304. var defaults = Utils.extend({}, app.params.gauge);
  34305. // Extend defaults with modules params
  34306. gauge.useModulesParams(defaults);
  34307. gauge.params = Utils.extend(defaults, params);
  34308. var ref = gauge.params;
  34309. var el = ref.el;
  34310. if (!el) { return gauge; }
  34311. var $el = $(el);
  34312. if ($el.length === 0) { return gauge; }
  34313. if ($el[0].f7Gauge) { return $el[0].f7Gauge; }
  34314. Utils.extend(gauge, {
  34315. app: app,
  34316. $el: $el,
  34317. el: $el && $el[0],
  34318. });
  34319. $el[0].f7Gauge = gauge;
  34320. // Install Modules
  34321. gauge.useModules();
  34322. gauge.init();
  34323. return gauge;
  34324. }
  34325. if ( Framework7Class ) Gauge.__proto__ = Framework7Class;
  34326. Gauge.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  34327. Gauge.prototype.constructor = Gauge;
  34328. Gauge.prototype.calcRadius = function calcRadius () {
  34329. var gauge = this;
  34330. var ref = gauge.params;
  34331. var size = ref.size;
  34332. var borderWidth = ref.borderWidth;
  34333. return (size / 2) - (borderWidth / 2);
  34334. };
  34335. Gauge.prototype.calcBorderLength = function calcBorderLength () {
  34336. var gauge = this;
  34337. var radius = gauge.calcRadius();
  34338. return 2 * Math.PI * radius;
  34339. };
  34340. Gauge.prototype.render = function render () {
  34341. var gauge = this;
  34342. if (gauge.params.render) { return gauge.params.render.call(gauge, gauge); }
  34343. var ref = gauge.params;
  34344. var type = ref.type;
  34345. var value = ref.value;
  34346. var size = ref.size;
  34347. var bgColor = ref.bgColor;
  34348. var borderBgColor = ref.borderBgColor;
  34349. var borderColor = ref.borderColor;
  34350. var borderWidth = ref.borderWidth;
  34351. var valueText = ref.valueText;
  34352. var valueTextColor = ref.valueTextColor;
  34353. var valueFontSize = ref.valueFontSize;
  34354. var valueFontWeight = ref.valueFontWeight;
  34355. var labelText = ref.labelText;
  34356. var labelTextColor = ref.labelTextColor;
  34357. var labelFontSize = ref.labelFontSize;
  34358. var labelFontWeight = ref.labelFontWeight;
  34359. var semiCircle = type === 'semicircle';
  34360. var radius = gauge.calcRadius();
  34361. var length = gauge.calcBorderLength();
  34362. var progress = Math.max(Math.min(value, 1), 0);
  34363. 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();
  34364. };
  34365. Gauge.prototype.update = function update (newParams) {
  34366. if ( newParams === void 0 ) newParams = {};
  34367. var gauge = this;
  34368. var params = gauge.params;
  34369. var $gaugeSvgEl = gauge.$gaugeSvgEl;
  34370. Object.keys(newParams).forEach(function (param) {
  34371. if (typeof newParams[param] !== 'undefined') {
  34372. params[param] = newParams[param];
  34373. }
  34374. });
  34375. if ($gaugeSvgEl.length === 0) { return gauge; }
  34376. var value = params.value;
  34377. var size = params.size;
  34378. var bgColor = params.bgColor;
  34379. var borderBgColor = params.borderBgColor;
  34380. var borderColor = params.borderColor;
  34381. var borderWidth = params.borderWidth;
  34382. var valueText = params.valueText;
  34383. var valueTextColor = params.valueTextColor;
  34384. var valueFontSize = params.valueFontSize;
  34385. var valueFontWeight = params.valueFontWeight;
  34386. var labelText = params.labelText;
  34387. var labelTextColor = params.labelTextColor;
  34388. var labelFontSize = params.labelFontSize;
  34389. var labelFontWeight = params.labelFontWeight;
  34390. var length = gauge.calcBorderLength();
  34391. var progress = Math.max(Math.min(value, 1), 0);
  34392. var radius = gauge.calcRadius();
  34393. var semiCircle = params.type === 'semicircle';
  34394. var svgAttrs = {
  34395. width: (size + "px"),
  34396. height: ((semiCircle ? size / 2 : size) + "px"),
  34397. viewBox: ("0 0 " + size + " " + (semiCircle ? size / 2 : size)),
  34398. };
  34399. Object.keys(svgAttrs).forEach(function (attr) {
  34400. $gaugeSvgEl.attr(attr, svgAttrs[attr]);
  34401. });
  34402. if (semiCircle) {
  34403. var backAttrs = {
  34404. d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
  34405. stroke: borderBgColor,
  34406. 'stroke-width': borderWidth,
  34407. fill: bgColor || 'none',
  34408. };
  34409. var frontAttrs = {
  34410. d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
  34411. stroke: borderColor,
  34412. 'stroke-width': borderWidth,
  34413. 'stroke-dasharray': length / 2,
  34414. 'stroke-dashoffset': (length / 2) * (1 + progress),
  34415. fill: borderBgColor ? 'none' : (bgColor || 'none'),
  34416. };
  34417. Object.keys(backAttrs).forEach(function (attr) {
  34418. $gaugeSvgEl.find('.gauge-back-semi').attr(attr, backAttrs[attr]);
  34419. });
  34420. Object.keys(frontAttrs).forEach(function (attr) {
  34421. $gaugeSvgEl.find('.gauge-front-semi').attr(attr, frontAttrs[attr]);
  34422. });
  34423. } else {
  34424. var backAttrs$1 = {
  34425. stroke: borderBgColor,
  34426. 'stroke-width': borderWidth,
  34427. fill: bgColor || 'none',
  34428. cx: size / 2,
  34429. cy: size / 2,
  34430. r: radius,
  34431. };
  34432. var frontAttrs$1 = {
  34433. transform: ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")"),
  34434. stroke: borderColor,
  34435. 'stroke-width': borderWidth,
  34436. 'stroke-dasharray': length,
  34437. 'stroke-dashoffset': length * (1 - progress),
  34438. fill: borderBgColor ? 'none' : bgColor || 'none',
  34439. cx: size / 2,
  34440. cy: size / 2,
  34441. r: radius,
  34442. };
  34443. Object.keys(backAttrs$1).forEach(function (attr) {
  34444. $gaugeSvgEl.find('.gauge-back-circle').attr(attr, backAttrs$1[attr]);
  34445. });
  34446. Object.keys(frontAttrs$1).forEach(function (attr) {
  34447. $gaugeSvgEl.find('.gauge-front-circle').attr(attr, frontAttrs$1[attr]);
  34448. });
  34449. }
  34450. if (valueText) {
  34451. if (!$gaugeSvgEl.find('.gauge-value-text').length) {
  34452. var textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
  34453. textEl.classList.add('gauge-value-text');
  34454. $gaugeSvgEl.append(textEl);
  34455. }
  34456. var textAttrs = {
  34457. x: '50%',
  34458. y: semiCircle ? '100%' : '50%',
  34459. 'font-weight': valueFontWeight,
  34460. 'font-size': valueFontSize,
  34461. fill: valueTextColor,
  34462. dy: semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0,
  34463. 'text-anchor': 'middle',
  34464. 'dominant-baseline': !semiCircle && 'middle',
  34465. };
  34466. Object.keys(textAttrs).forEach(function (attr) {
  34467. $gaugeSvgEl.find('.gauge-value-text').attr(attr, textAttrs[attr]);
  34468. });
  34469. $gaugeSvgEl.find('.gauge-value-text').text(valueText);
  34470. } else {
  34471. $gaugeSvgEl.find('.gauge-value-text').remove();
  34472. }
  34473. if (labelText) {
  34474. if (!$gaugeSvgEl.find('.gauge-label-text').length) {
  34475. var textEl$1 = document.createElementNS('http://www.w3.org/2000/svg', 'text');
  34476. textEl$1.classList.add('gauge-label-text');
  34477. $gaugeSvgEl.append(textEl$1);
  34478. }
  34479. var labelAttrs = {
  34480. x: '50%',
  34481. y: semiCircle ? '100%' : '50%',
  34482. 'font-weight': labelFontWeight,
  34483. 'font-size': labelFontSize,
  34484. fill: labelTextColor,
  34485. dy: semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0),
  34486. 'text-anchor': 'middle',
  34487. 'dominant-baseline': !semiCircle && 'middle',
  34488. };
  34489. Object.keys(labelAttrs).forEach(function (attr) {
  34490. $gaugeSvgEl.find('.gauge-label-text').attr(attr, labelAttrs[attr]);
  34491. });
  34492. $gaugeSvgEl.find('.gauge-label-text').text(labelText);
  34493. } else {
  34494. $gaugeSvgEl.find('.gauge-label-text').remove();
  34495. }
  34496. return gauge;
  34497. };
  34498. Gauge.prototype.init = function init () {
  34499. var gauge = this;
  34500. var $gaugeSvgEl = $(gauge.render()).eq(0);
  34501. $gaugeSvgEl.f7Gauge = gauge;
  34502. Utils.extend(gauge, {
  34503. $gaugeSvgEl: $gaugeSvgEl,
  34504. gaugeSvgEl: $gaugeSvgEl && $gaugeSvgEl[0],
  34505. });
  34506. gauge.$el.append($gaugeSvgEl);
  34507. return gauge;
  34508. };
  34509. Gauge.prototype.destroy = function destroy () {
  34510. var gauge = this;
  34511. if (!gauge.$el || gauge.destroyed) { return; }
  34512. gauge.$el.trigger('gauge:beforedestroy');
  34513. gauge.emit('local::beforeDestroy gaugeBeforeDestroy', gauge);
  34514. gauge.$gaugeSvgEl.remove();
  34515. delete gauge.$el[0].f7Gauge;
  34516. Utils.deleteProps(gauge);
  34517. gauge.destroyed = true;
  34518. };
  34519. return Gauge;
  34520. }(Framework7Class));
  34521. var Gauge$1 = {
  34522. name: 'gauge',
  34523. static: {
  34524. Gauge: Gauge,
  34525. },
  34526. create: function create() {
  34527. var app = this;
  34528. app.gauge = ConstructorMethods({
  34529. defaultSelector: '.gauge',
  34530. constructor: Gauge,
  34531. app: app,
  34532. domProp: 'f7Gauge',
  34533. });
  34534. app.gauge.update = function update(el, newParams) {
  34535. var $el = $(el);
  34536. if ($el.length === 0) { return undefined; }
  34537. var gauge = app.gauge.get(el);
  34538. if (!gauge) { return undefined; }
  34539. gauge.update(newParams);
  34540. return gauge;
  34541. };
  34542. },
  34543. params: {
  34544. gauge: {
  34545. el: null,
  34546. type: 'circle',
  34547. value: 0,
  34548. size: 200,
  34549. bgColor: 'transparent',
  34550. borderBgColor: '#eeeeee',
  34551. borderColor: '#000000',
  34552. borderWidth: 10,
  34553. valueText: null,
  34554. valueTextColor: '#000000',
  34555. valueFontSize: 31,
  34556. valueFontWeight: 500,
  34557. labelText: null,
  34558. labelTextColor: '#888888',
  34559. labelFontSize: 14,
  34560. labelFontWeight: 400,
  34561. },
  34562. },
  34563. on: {
  34564. tabMounted: function tabMounted(tabEl) {
  34565. var app = this;
  34566. $(tabEl).find('.gauge-init').each(function (index, el) {
  34567. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  34568. });
  34569. },
  34570. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  34571. $(tabEl).find('.gauge-init').each(function (index, el) {
  34572. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  34573. });
  34574. },
  34575. pageInit: function pageInit(page) {
  34576. var app = this;
  34577. page.$el.find('.gauge-init').each(function (index, el) {
  34578. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  34579. });
  34580. },
  34581. pageBeforeRemove: function pageBeforeRemove(page) {
  34582. page.$el.find('.gauge-init').each(function (index, el) {
  34583. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  34584. });
  34585. },
  34586. },
  34587. vnode: {
  34588. 'gauge-init': {
  34589. insert: function insert(vnode) {
  34590. var app = this;
  34591. var el = vnode.elm;
  34592. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  34593. },
  34594. destroy: function destroy(vnode) {
  34595. var el = vnode.elm;
  34596. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  34597. },
  34598. },
  34599. },
  34600. };
  34601. var Skeleton = {
  34602. name: 'skeleton',
  34603. };
  34604. var Menu = {
  34605. open: function open(el) {
  34606. if ( el === void 0 ) el = '.menu-item-dropdown';
  34607. var app = this;
  34608. if (!el) { return; }
  34609. var $el = $(el).closest('.menu-item-dropdown');
  34610. if (!$el.length) { return; }
  34611. var $menuEl = $el.closest('.menu').eq(0);
  34612. if ($menuEl.length) {
  34613. var zIndex = $menuEl.css('z-index');
  34614. var originalZIndex = $menuEl[0].style.zIndex;
  34615. $menuEl.css('z-index', parseInt(zIndex || 0, 0) + 1);
  34616. $menuEl[0].f7MenuZIndex = originalZIndex;
  34617. }
  34618. $el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
  34619. app.emit('menuOpened', $el.eq(0)[0]);
  34620. },
  34621. close: function close(el) {
  34622. if ( el === void 0 ) el = '.menu-item-dropdown-opened';
  34623. var app = this;
  34624. if (!el) { return; }
  34625. var $el = $(el).closest('.menu-item-dropdown-opened');
  34626. if (!$el.length) { return; }
  34627. var $menuEl = $el.closest('.menu').eq(0);
  34628. if ($menuEl.length) {
  34629. var zIndex = $menuEl[0].f7MenuZIndex;
  34630. $menuEl.css('z-index', zIndex);
  34631. delete $menuEl[0].f7MenuZIndex;
  34632. }
  34633. $el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
  34634. app.emit('menuClosed', $el.eq(0)[0]);
  34635. },
  34636. };
  34637. var Menu$1 = {
  34638. name: 'menu',
  34639. create: function create() {
  34640. var app = this;
  34641. app.menu = {
  34642. open: Menu.open.bind(app),
  34643. close: Menu.close.bind(app),
  34644. };
  34645. },
  34646. on: {
  34647. click: function click(e) {
  34648. var app = this;
  34649. var openedMenus = $('.menu-item-dropdown-opened');
  34650. if (!openedMenus.length) { return; }
  34651. openedMenus.each(function (index, el) {
  34652. if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
  34653. app.menu.close(el);
  34654. }
  34655. });
  34656. },
  34657. },
  34658. clicks: {
  34659. '.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
  34660. var app = this;
  34661. if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
  34662. if ($(e.target).closest('.menu-dropdown').length) { return; }
  34663. app.menu.close($clickedEl);
  34664. } else {
  34665. app.menu.open($clickedEl);
  34666. }
  34667. },
  34668. '.menu-close': function onClick() {
  34669. var app = this;
  34670. app.menu.close();
  34671. },
  34672. },
  34673. };
  34674. var moduleAlphaSlider = {
  34675. render: function render(self) {
  34676. var ref = self.params;
  34677. var sliderLabel = ref.sliderLabel;
  34678. var sliderValue = ref.sliderValue;
  34679. var sliderValueEditable = ref.sliderValueEditable;
  34680. var alphaLabelText = ref.alphaLabelText;
  34681. 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 ");
  34682. },
  34683. init: function init(self) {
  34684. self.alphaRangeSlider = self.app.range.create({
  34685. el: self.$el.find('.color-picker-slider-alpha'),
  34686. min: 0,
  34687. max: 1,
  34688. step: 0.01,
  34689. value: 1,
  34690. on: {
  34691. change: function change(range, value) {
  34692. var alpha = Math.floor(value * 100) / 100;
  34693. self.setValue({ alpha: alpha });
  34694. },
  34695. },
  34696. });
  34697. function handleInputChange(e) {
  34698. var alpha = self.value.alpha;
  34699. var value = parseFloat(e.target.value);
  34700. if (Number.isNaN(value)) {
  34701. e.target.value = alpha;
  34702. return;
  34703. }
  34704. value = Math.max(0, Math.min(1, value));
  34705. self.setValue({ alpha: value });
  34706. }
  34707. self.$el.on('change', '.color-picker-module-alpha-slider input', handleInputChange);
  34708. self.destroyAlphaSliderEvents = function destroyAlphaSliderEvents() {
  34709. self.$el.off('change', '.color-picker-module-alpha-slider input', handleInputChange);
  34710. };
  34711. },
  34712. update: function update(self) {
  34713. var value = self.value;
  34714. var ref = self.params;
  34715. var sliderValue = ref.sliderValue;
  34716. var sliderValueEditable = ref.sliderValueEditable;
  34717. var alpha = value.alpha;
  34718. self.alphaRangeSlider.value = alpha;
  34719. self.alphaRangeSlider.layout();
  34720. if (sliderValue && sliderValueEditable) {
  34721. self.$el.find('input.color-picker-value-alpha').val(alpha);
  34722. } else {
  34723. self.$el.find('span.color-picker-value-alpha').text(alpha);
  34724. }
  34725. },
  34726. destroy: function destroy(self) {
  34727. if (self.alphaRangeSlider && self.alphaRangeSlider.destroy) {
  34728. self.alphaRangeSlider.destroy();
  34729. }
  34730. delete self.alphaRangeSlider;
  34731. if (self.destroyAlphaSliderEvents) { self.destroyAlphaSliderEvents(); }
  34732. delete self.destroyAlphaSliderEvents;
  34733. },
  34734. };
  34735. var moduleCurrentColor = {
  34736. render: function render() {
  34737. return "\n <div class=\"color-picker-module color-picker-module-current-color\">\n <div class=\"color-picker-current-color\"></div>\n </div>\n ";
  34738. },
  34739. update: function update(self) {
  34740. self.$el.find('.color-picker-module-current-color .color-picker-current-color').css(
  34741. 'background-color',
  34742. self.value.hex
  34743. );
  34744. },
  34745. };
  34746. var moduleHex = {
  34747. render: function render(self) {
  34748. var ref = self.params;
  34749. var hexLabel = ref.hexLabel;
  34750. var hexLabelText = ref.hexLabelText;
  34751. var hexValueEditable = ref.hexValueEditable;
  34752. 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 ");
  34753. },
  34754. init: function init(self) {
  34755. function handleInputChange(e) {
  34756. var hex = self.value.hex;
  34757. var value = e.target.value.replace(/#/g, '');
  34758. if (Number.isNaN(value) || !value || (value.length !== 3 && value.length !== 6)) {
  34759. e.target.value = hex;
  34760. return;
  34761. }
  34762. var min = 0;
  34763. var current = parseInt(value, 16);
  34764. var max = parseInt('ffffff', 16); // eslint-disable-line
  34765. if (current > max) {
  34766. value = 'fff';
  34767. }
  34768. if (current < min) {
  34769. value = '000';
  34770. }
  34771. self.setValue({ hex: value });
  34772. }
  34773. self.$el.on('change', '.color-picker-module-hex input', handleInputChange);
  34774. self.destroyHexEvents = function destroyHexEvents() {
  34775. self.$el.off('change', '.color-picker-module-hex input', handleInputChange);
  34776. };
  34777. },
  34778. update: function update(self) {
  34779. var value = self.value;
  34780. var ref = self.params;
  34781. var hexValueEditable = ref.hexValueEditable;
  34782. var hex = value.hex;
  34783. if (hexValueEditable) {
  34784. self.$el.find('input.color-picker-value-hex').val(hex);
  34785. } else {
  34786. self.$el.find('span.color-picker-value-hex').text(hex);
  34787. }
  34788. },
  34789. destroy: function destroy(self) {
  34790. if (self.destroyHexEvents) { self.destroyHexEvents(); }
  34791. delete self.destroyHexEvents;
  34792. },
  34793. };
  34794. var moduleHsbSliders = {
  34795. render: function render(self) {
  34796. var ref = self.params;
  34797. var sliderLabel = ref.sliderLabel;
  34798. var sliderValue = ref.sliderValue;
  34799. var sliderValueEditable = ref.sliderValueEditable;
  34800. var hueLabelText = ref.hueLabelText;
  34801. var saturationLabelText = ref.saturationLabelText;
  34802. var brightnessLabelText = ref.brightnessLabelText;
  34803. 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 ");
  34804. },
  34805. init: function init(self) {
  34806. self.hueRangeSlider = self.app.range.create({
  34807. el: self.$el.find('.color-picker-slider-hue'),
  34808. min: 0,
  34809. max: 360,
  34810. step: 0.1,
  34811. value: 0,
  34812. on: {
  34813. change: function change(range, value) {
  34814. self.setValue({ hue: value });
  34815. },
  34816. },
  34817. });
  34818. self.saturationRangeSlider = self.app.range.create({
  34819. el: self.$el.find('.color-picker-slider-saturation'),
  34820. min: 0,
  34821. max: 1,
  34822. step: 0.001,
  34823. value: 0,
  34824. on: {
  34825. change: function change(range, value) {
  34826. var s = Math.floor(value * 1000) / 1000;
  34827. self.setValue({ hsb: [self.value.hsb[0], s, self.value.hsb[2]] });
  34828. },
  34829. },
  34830. });
  34831. self.brightnessRangeSlider = self.app.range.create({
  34832. el: self.$el.find('.color-picker-slider-brightness'),
  34833. min: 0,
  34834. max: 1,
  34835. step: 0.001,
  34836. value: 0,
  34837. on: {
  34838. change: function change(range, value) {
  34839. var b = Math.floor(value * 1000) / 1000;
  34840. self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
  34841. },
  34842. },
  34843. });
  34844. function handleInputChange(e) {
  34845. var hsb = [].concat( self.value.hsb );
  34846. var index = parseInt($(e.target).attr('data-color-index'), 10);
  34847. var value = parseFloat(e.target.value);
  34848. if (Number.isNaN(value)) {
  34849. e.target.value = hsb[index];
  34850. return;
  34851. }
  34852. if (index === 0) {
  34853. value = Math.max(0, Math.min(360, value));
  34854. } else {
  34855. value = Math.max(0, Math.min(100, value)) / 100;
  34856. }
  34857. hsb[index] = value;
  34858. self.setValue({ hsb: hsb });
  34859. }
  34860. self.$el.on('change', '.color-picker-module-hsb-sliders input', handleInputChange);
  34861. self.destroyHsbSlidersEvents = function destroyHsbSlidersEvents() {
  34862. self.$el.off('change', '.color-picker-module-hsb-sliders input', handleInputChange);
  34863. };
  34864. },
  34865. update: function update(self) {
  34866. var app = self.app;
  34867. var value = self.value;
  34868. var ref = self.params;
  34869. var sliderValue = ref.sliderValue;
  34870. var sliderValueEditable = ref.sliderValueEditable;
  34871. var hsb = value.hsb;
  34872. var hue = value.hue;
  34873. self.hueRangeSlider.value = hue;
  34874. self.saturationRangeSlider.value = hsb[1];
  34875. self.brightnessRangeSlider.value = hsb[2];
  34876. self.hueRangeSlider.layout();
  34877. self.saturationRangeSlider.layout();
  34878. self.brightnessRangeSlider.layout();
  34879. var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  34880. var hslLeft = Utils.colorHsbToHsl(hsb[0], 0, 1);
  34881. var hslRight = Utils.colorHsbToHsl(hsb[0], 1, 1);
  34882. var brightness = hsb[2];
  34883. self.hueRangeSlider.$el[0].style.setProperty(
  34884. '--f7-range-knob-color',
  34885. ("hsl(" + hue + ", 100%, 50%)")
  34886. );
  34887. self.saturationRangeSlider.$el[0].style.setProperty(
  34888. '--f7-range-knob-color',
  34889. ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
  34890. );
  34891. self.brightnessRangeSlider.$el[0].style.setProperty(
  34892. '--f7-range-knob-color',
  34893. ("rgb(" + (brightness * 255) + ", " + (brightness * 255) + ", " + (brightness * 255) + ")")
  34894. );
  34895. self.saturationRangeSlider.$el.find('.range-bar').css(
  34896. 'background-image',
  34897. ("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) + "%))")
  34898. );
  34899. if (sliderValue && sliderValueEditable) {
  34900. self.$el.find('input.color-picker-value-hue').val(("" + hue));
  34901. self.$el.find('input.color-picker-value-saturation').val(("" + (hsb[1] * 1000 / 10)));
  34902. self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
  34903. } else if (sliderValue) {
  34904. self.$el.find('span.color-picker-value-hue').text(("" + hue));
  34905. self.$el.find('span.color-picker-value-saturation').text(("" + (hsb[1] * 1000 / 10)));
  34906. self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
  34907. }
  34908. },
  34909. destroy: function destroy(self) {
  34910. if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
  34911. self.hueRangeSlider.destroy();
  34912. }
  34913. if (self.saturationRangeSlider && self.saturationRangeSlider.destroy) {
  34914. self.saturationRangeSlider.destroy();
  34915. }
  34916. if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
  34917. self.brightnessRangeSlider.destroy();
  34918. }
  34919. delete self.hueRangeSlider;
  34920. delete self.saturationRangeSlider;
  34921. delete self.brightnessRangeSlider;
  34922. if (self.destroyHsbSlidersEvents) { self.destroyHsbSlidersEvents(); }
  34923. delete self.destroyHsbSlidersEvents;
  34924. },
  34925. };
  34926. var moduleHueSlider = {
  34927. render: function render(self) {
  34928. var ref = self.params;
  34929. var sliderLabel = ref.sliderLabel;
  34930. var sliderValue = ref.sliderValue;
  34931. var sliderValueEditable = ref.sliderValueEditable;
  34932. var hueLabelText = ref.hueLabelText;
  34933. 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 ");
  34934. },
  34935. init: function init(self) {
  34936. self.hueRangeSlider = self.app.range.create({
  34937. el: self.$el.find('.color-picker-slider-hue'),
  34938. min: 0,
  34939. max: 360,
  34940. step: 0.1,
  34941. value: 0,
  34942. on: {
  34943. change: function change(range, value) {
  34944. self.setValue({ hue: value });
  34945. },
  34946. },
  34947. });
  34948. },
  34949. update: function update(self) {
  34950. var value = self.value;
  34951. var ref = self.params;
  34952. var sliderValue = ref.sliderValue;
  34953. var sliderValueEditable = ref.sliderValueEditable;
  34954. var hue = value.hue;
  34955. self.hueRangeSlider.value = hue;
  34956. self.hueRangeSlider.layout();
  34957. self.hueRangeSlider.$el[0].style.setProperty(
  34958. '--f7-range-knob-color',
  34959. ("hsl(" + hue + ", 100%, 50%)")
  34960. );
  34961. if (sliderValue && sliderValueEditable) {
  34962. self.$el.find('input.color-picker-value-hue').val(("" + hue));
  34963. } else if (sliderValue) {
  34964. self.$el.find('span.color-picker-value-hue').text(("" + hue));
  34965. }
  34966. },
  34967. destroy: function destroy(self) {
  34968. if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
  34969. self.hueRangeSlider.destroy();
  34970. }
  34971. delete self.hueRangeSlider;
  34972. },
  34973. };
  34974. var moduleBrightnessSlider = {
  34975. render: function render(self) {
  34976. var ref = self.params;
  34977. var sliderLabel = ref.sliderLabel;
  34978. var sliderValue = ref.sliderValue;
  34979. var sliderValueEditable = ref.sliderValueEditable;
  34980. var brightnessLabelText = ref.brightnessLabelText;
  34981. 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 ");
  34982. },
  34983. init: function init(self) {
  34984. self.brightnessRangeSlider = self.app.range.create({
  34985. el: self.$el.find('.color-picker-slider-brightness'),
  34986. min: 0,
  34987. max: 1,
  34988. step: 0.001,
  34989. value: 0,
  34990. on: {
  34991. change: function change(range, value) {
  34992. var b = Math.floor(value * 1000) / 1000;
  34993. self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
  34994. },
  34995. },
  34996. });
  34997. },
  34998. update: function update(self) {
  34999. var value = self.value;
  35000. var app = self.app;
  35001. var ref = self.params;
  35002. var sliderValue = ref.sliderValue;
  35003. var sliderValueEditable = ref.sliderValueEditable;
  35004. var hsb = value.hsb;
  35005. self.brightnessRangeSlider.value = hsb[2];
  35006. self.brightnessRangeSlider.layout();
  35007. var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], hsb[2]);
  35008. var hslLeft = Utils.colorHsbToHsl(hsb[0], hsb[1], 0);
  35009. var hslRight = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  35010. self.brightnessRangeSlider.$el[0].style.setProperty(
  35011. '--f7-range-knob-color',
  35012. ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
  35013. );
  35014. self.brightnessRangeSlider.$el.find('.range-bar').css(
  35015. 'background-image',
  35016. ("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) + "%))")
  35017. );
  35018. if (sliderValue && sliderValueEditable) {
  35019. self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
  35020. } else if (sliderValue) {
  35021. self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
  35022. }
  35023. },
  35024. destroy: function destroy(self) {
  35025. if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
  35026. self.brightnessRangeSlider.destroy();
  35027. }
  35028. delete self.brightnessRangeSlider;
  35029. },
  35030. };
  35031. /* eslint indent: ["off"] */
  35032. var modulePalette = {
  35033. render: function render(self) {
  35034. return ("\n <div class=\"color-picker-module color-picker-module-palette\">\n <div class=\"color-picker-palette\">\n " + (self.params.palette.map(function (p) {
  35035. if (Array.isArray(p)) {
  35036. var row = '<div class="color-picker-palette-row">';
  35037. row += p.map(function (c) { return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + c + "\" style=\"background-color: " + c + "\"></div>\n "); }).join('');
  35038. row += '</div>';
  35039. return row;
  35040. }
  35041. return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + p + "\" style=\"background-color: " + p + "\"></div>\n ");
  35042. }).join('')) + "\n </div>\n </div>\n ");
  35043. },
  35044. init: function init(self) {
  35045. function handlePaletteClick(e) {
  35046. var hex = $(e.target).attr('data-palette-color');
  35047. self.setValue({
  35048. hex: hex,
  35049. });
  35050. }
  35051. self.$el.on('click', '.color-picker-module-palette .color-picker-palette-value', handlePaletteClick);
  35052. self.destroyPaletteEvents = function destroyPaletteEvents() {
  35053. self.$el.off('click', '.color-picker-module-hex input', handlePaletteClick);
  35054. };
  35055. },
  35056. destroy: function destroy(self) {
  35057. if (self.destroyPaletteEvents) {
  35058. self.destroyPaletteEvents();
  35059. }
  35060. delete self.destroyPaletteEvents;
  35061. },
  35062. };
  35063. var moduleInitialCurrentColors = {
  35064. render: function render() {
  35065. 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 ";
  35066. },
  35067. init: function init(self) {
  35068. function handleInitialColorClick() {
  35069. if (self.initialValue) {
  35070. var ref = self.initialValue;
  35071. var hex = ref.hex;
  35072. var alpha = ref.alpha;
  35073. self.setValue({
  35074. hex: hex,
  35075. alpha: alpha,
  35076. });
  35077. }
  35078. }
  35079. self.$el.on('click', '.color-picker-initial-color', handleInitialColorClick);
  35080. self.destroyInitialCurrentEvents = function destroyInitialCurrentEvents() {
  35081. self.$el.off('click', '.color-picker-initial-color', handleInitialColorClick);
  35082. };
  35083. },
  35084. update: function update(self) {
  35085. self.$el.find('.color-picker-module-initial-current-colors .color-picker-initial-color').css(
  35086. 'background-color',
  35087. self.initialValue.hex
  35088. );
  35089. self.$el.find('.color-picker-module-initial-current-colors .color-picker-current-color').css(
  35090. 'background-color',
  35091. self.value.hex
  35092. );
  35093. },
  35094. destroy: function destroy(self) {
  35095. if (self.destroyInitialCurrentEvents) {
  35096. self.destroyInitialCurrentEvents();
  35097. }
  35098. delete self.destroyInitialCurrentEvents;
  35099. },
  35100. };
  35101. var moduleRgbBars = {
  35102. render: function render(self) {
  35103. var ref = self.params;
  35104. var barLabel = ref.barLabel;
  35105. var barValue = ref.barValue;
  35106. var barValueEditable = ref.barValueEditable;
  35107. var redLabelText = ref.redLabelText;
  35108. var greenLabelText = ref.greenLabelText;
  35109. var blueLabelText = ref.blueLabelText;
  35110. 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 ");
  35111. },
  35112. init: function init(self) {
  35113. self.redBar = self.app.range.create({
  35114. el: self.$el.find('.color-picker-bar-red'),
  35115. min: 0,
  35116. max: 255,
  35117. step: 1,
  35118. value: 0,
  35119. vertical: true,
  35120. on: {
  35121. change: function change(range, value) {
  35122. self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
  35123. },
  35124. },
  35125. });
  35126. self.greenBar = self.app.range.create({
  35127. el: self.$el.find('.color-picker-bar-green'),
  35128. min: 0,
  35129. max: 255,
  35130. step: 1,
  35131. value: 0,
  35132. vertical: true,
  35133. on: {
  35134. change: function change(range, value) {
  35135. self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
  35136. },
  35137. },
  35138. });
  35139. self.blueBar = self.app.range.create({
  35140. el: self.$el.find('.color-picker-bar-blue'),
  35141. min: 0,
  35142. max: 255,
  35143. step: 1,
  35144. value: 0,
  35145. vertical: true,
  35146. on: {
  35147. change: function change(range, value) {
  35148. self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
  35149. },
  35150. },
  35151. });
  35152. function handleInputChange(e) {
  35153. var rgb = [].concat( self.value.rgb );
  35154. var index = parseInt($(e.target).attr('data-color-index'), 10);
  35155. var value = parseInt(e.target.value, 10);
  35156. if (Number.isNaN(value)) {
  35157. e.target.value = rgb[index];
  35158. return;
  35159. }
  35160. value = Math.max(0, Math.min(255, value));
  35161. rgb[index] = value;
  35162. self.setValue({ rgb: rgb });
  35163. }
  35164. self.$el.on('change', '.color-picker-module-rgb-bars input', handleInputChange);
  35165. self.destroyRgbBarsEvents = function destroyRgbBarsEvents() {
  35166. self.$el.off('change', '.color-picker-module-rgb-bars input', handleInputChange);
  35167. };
  35168. },
  35169. update: function update(self) {
  35170. var value = self.value;
  35171. var redBar = self.redBar;
  35172. var greenBar = self.greenBar;
  35173. var blueBar = self.blueBar;
  35174. var ref = self.params;
  35175. var barValue = ref.barValue;
  35176. var barValueEditable = ref.barValueEditable;
  35177. var rgb = value.rgb;
  35178. redBar.value = rgb[0];
  35179. greenBar.value = rgb[1];
  35180. blueBar.value = rgb[2];
  35181. redBar.layout();
  35182. greenBar.layout();
  35183. blueBar.layout();
  35184. redBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
  35185. greenBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
  35186. blueBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
  35187. if (barValue && barValueEditable) {
  35188. self.$el.find('input.color-picker-value-bar-red').val(rgb[0]);
  35189. self.$el.find('input.color-picker-value-bar-green').val(rgb[1]);
  35190. self.$el.find('input.color-picker-value-bar-blue').val(rgb[2]);
  35191. } else if (barValue) {
  35192. self.$el.find('span.color-picker-value-bar-red').text(rgb[0]);
  35193. self.$el.find('span.color-picker-value-bar-green').text(rgb[1]);
  35194. self.$el.find('span.color-picker-value-bar-blue').text(rgb[2]);
  35195. }
  35196. },
  35197. destroy: function destroy(self) {
  35198. if (self.redBar && self.redBar.destroy) {
  35199. self.redBar.destroy();
  35200. }
  35201. if (self.greenBar && self.greenBar.destroy) {
  35202. self.greenBar.destroy();
  35203. }
  35204. if (self.blueBar && self.blueBar.destroy) {
  35205. self.blueBar.destroy();
  35206. }
  35207. delete self.redBar;
  35208. delete self.greenBar;
  35209. delete self.blueBar;
  35210. if (self.destroyRgbBarsEvents) { self.destroyRgbBarsEvents(); }
  35211. delete self.destroyRgbBarsEvents;
  35212. },
  35213. };
  35214. var moduleRgbSliders = {
  35215. render: function render(self) {
  35216. var ref = self.params;
  35217. var sliderLabel = ref.sliderLabel;
  35218. var sliderValue = ref.sliderValue;
  35219. var sliderValueEditable = ref.sliderValueEditable;
  35220. var redLabelText = ref.redLabelText;
  35221. var greenLabelText = ref.greenLabelText;
  35222. var blueLabelText = ref.blueLabelText;
  35223. 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 ");
  35224. },
  35225. init: function init(self) {
  35226. self.redRangeSlider = self.app.range.create({
  35227. el: self.$el.find('.color-picker-slider-red'),
  35228. min: 0,
  35229. max: 255,
  35230. step: 1,
  35231. value: 0,
  35232. on: {
  35233. change: function change(range, value) {
  35234. self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
  35235. },
  35236. },
  35237. });
  35238. self.greenRangeSlider = self.app.range.create({
  35239. el: self.$el.find('.color-picker-slider-green'),
  35240. min: 0,
  35241. max: 255,
  35242. step: 1,
  35243. value: 0,
  35244. on: {
  35245. change: function change(range, value) {
  35246. self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
  35247. },
  35248. },
  35249. });
  35250. self.blueRangeSlider = self.app.range.create({
  35251. el: self.$el.find('.color-picker-slider-blue'),
  35252. min: 0,
  35253. max: 255,
  35254. step: 1,
  35255. value: 0,
  35256. on: {
  35257. change: function change(range, value) {
  35258. self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
  35259. },
  35260. },
  35261. });
  35262. function handleInputChange(e) {
  35263. var rgb = [].concat( self.value.rgb );
  35264. var index = parseInt($(e.target).attr('data-color-index'), 10);
  35265. var value = parseInt(e.target.value, 10);
  35266. if (Number.isNaN(value)) {
  35267. e.target.value = rgb[index];
  35268. return;
  35269. }
  35270. value = Math.max(0, Math.min(255, value));
  35271. rgb[index] = value;
  35272. self.setValue({ rgb: rgb });
  35273. }
  35274. self.$el.on('change', '.color-picker-module-rgb-sliders input', handleInputChange);
  35275. self.destroyRgbSlidersEvents = function destroyRgbSlidersEvents() {
  35276. self.$el.off('change', '.color-picker-module-rgb-sliders input', handleInputChange);
  35277. };
  35278. },
  35279. update: function update(self) {
  35280. var app = self.app;
  35281. var value = self.value;
  35282. var redRangeSlider = self.redRangeSlider;
  35283. var greenRangeSlider = self.greenRangeSlider;
  35284. var blueRangeSlider = self.blueRangeSlider;
  35285. var ref = self.params;
  35286. var sliderValue = ref.sliderValue;
  35287. var sliderValueEditable = ref.sliderValueEditable;
  35288. var rgb = value.rgb;
  35289. redRangeSlider.value = rgb[0];
  35290. greenRangeSlider.value = rgb[1];
  35291. blueRangeSlider.value = rgb[2];
  35292. redRangeSlider.layout();
  35293. greenRangeSlider.layout();
  35294. blueRangeSlider.layout();
  35295. redRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  35296. greenRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  35297. blueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  35298. var direction = app.rtl ? 'to left' : 'to right';
  35299. redRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
  35300. greenRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
  35301. blueRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
  35302. if (sliderValue && sliderValueEditable) {
  35303. self.$el.find('input.color-picker-value-red').val(rgb[0]);
  35304. self.$el.find('input.color-picker-value-green').val(rgb[1]);
  35305. self.$el.find('input.color-picker-value-blue').val(rgb[2]);
  35306. } else if (sliderValue) {
  35307. self.$el.find('span.color-picker-value-red').text(rgb[0]);
  35308. self.$el.find('span.color-picker-value-green').text(rgb[1]);
  35309. self.$el.find('span.color-picker-value-blue').text(rgb[2]);
  35310. }
  35311. },
  35312. destroy: function destroy(self) {
  35313. if (self.redRangeSlider && self.redRangeSlider.destroy) {
  35314. self.redRangeSlider.destroy();
  35315. }
  35316. if (self.greenRangeSlider && self.greenRangeSlider.destroy) {
  35317. self.greenRangeSlider.destroy();
  35318. }
  35319. if (self.blueRangeSlider && self.blueRangeSlider.destroy) {
  35320. self.blueRangeSlider.destroy();
  35321. }
  35322. delete self.redRangeSlider;
  35323. delete self.greenRangeSlider;
  35324. delete self.blueRangeSlider;
  35325. if (self.destroyRgbSlidersEvents) { self.destroyRgbSlidersEvents(); }
  35326. delete self.destroyRgbSlidersEvents;
  35327. },
  35328. };
  35329. var moduleSbSpectrum = {
  35330. render: function render() {
  35331. 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 ";
  35332. },
  35333. init: function init(self) {
  35334. var app = self.app;
  35335. var isTouched;
  35336. var isMoved;
  35337. var touchStartX;
  35338. var touchStartY;
  35339. var touchCurrentX;
  35340. var touchCurrentY;
  35341. var specterRect;
  35342. var specterIsTouched;
  35343. var specterHandleIsTouched;
  35344. var $el = self.$el;
  35345. function setSBFromSpecterCoords(x, y) {
  35346. var s = (x - specterRect.left) / specterRect.width;
  35347. var b = (y - specterRect.top) / specterRect.height;
  35348. s = Math.max(0, Math.min(1, s));
  35349. b = 1 - Math.max(0, Math.min(1, b));
  35350. self.setValue({ hsb: [self.value.hue, s, b] });
  35351. }
  35352. function handleTouchStart(e) {
  35353. if (isMoved || isTouched) { return; }
  35354. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  35355. touchCurrentX = touchStartX;
  35356. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  35357. touchCurrentY = touchStartY;
  35358. var $targetEl = $(e.target);
  35359. specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
  35360. if (!specterHandleIsTouched) {
  35361. specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
  35362. }
  35363. if (specterIsTouched) {
  35364. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  35365. setSBFromSpecterCoords(touchStartX, touchStartY);
  35366. }
  35367. if (specterHandleIsTouched || specterIsTouched) {
  35368. $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
  35369. }
  35370. }
  35371. function handleTouchMove(e) {
  35372. if (!(specterIsTouched || specterHandleIsTouched)) { return; }
  35373. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  35374. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  35375. e.preventDefault();
  35376. if (!isMoved) {
  35377. // First move
  35378. isMoved = true;
  35379. if (specterHandleIsTouched) {
  35380. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  35381. }
  35382. }
  35383. if (specterIsTouched || specterHandleIsTouched) {
  35384. setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
  35385. }
  35386. }
  35387. function handleTouchEnd() {
  35388. isMoved = false;
  35389. if (specterIsTouched || specterHandleIsTouched) {
  35390. $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
  35391. }
  35392. specterIsTouched = false;
  35393. specterHandleIsTouched = false;
  35394. }
  35395. function handleResize() {
  35396. self.modules['sb-spectrum'].update(self);
  35397. }
  35398. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  35399. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  35400. app.on('touchmove:active', handleTouchMove);
  35401. app.on('touchend:passive', handleTouchEnd);
  35402. app.on('resize', handleResize);
  35403. self.destroySpectrumEvents = function destroySpectrumEvents() {
  35404. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  35405. app.off('touchmove:active', handleTouchMove);
  35406. app.off('touchend:passive', handleTouchEnd);
  35407. app.off('resize', handleResize);
  35408. };
  35409. },
  35410. update: function update(self) {
  35411. var value = self.value;
  35412. var hsl = value.hsl;
  35413. var hsb = value.hsb;
  35414. var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
  35415. var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
  35416. self.$el.find('.color-picker-sb-spectrum')
  35417. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
  35418. self.$el.find('.color-picker-sb-spectrum-handle')
  35419. .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
  35420. .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
  35421. },
  35422. destroy: function destroy(self) {
  35423. if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
  35424. delete self.destroySpectrumEvents;
  35425. },
  35426. };
  35427. var moduleHsSpectrum = {
  35428. render: function render() {
  35429. 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 ";
  35430. },
  35431. init: function init(self) {
  35432. var app = self.app;
  35433. var isTouched;
  35434. var isMoved;
  35435. var touchStartX;
  35436. var touchStartY;
  35437. var touchCurrentX;
  35438. var touchCurrentY;
  35439. var specterRect;
  35440. var specterIsTouched;
  35441. var specterHandleIsTouched;
  35442. var $el = self.$el;
  35443. function setHSFromSpecterCoords(x, y) {
  35444. var h = (x - specterRect.left) / specterRect.width * 360;
  35445. var s = (y - specterRect.top) / specterRect.height;
  35446. h = Math.max(0, Math.min(360, h));
  35447. s = 1 - Math.max(0, Math.min(1, s));
  35448. self.setValue({ hsb: [h, s, self.value.hsb[2]] });
  35449. }
  35450. function handleTouchStart(e) {
  35451. if (isMoved || isTouched) { return; }
  35452. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  35453. touchCurrentX = touchStartX;
  35454. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  35455. touchCurrentY = touchStartY;
  35456. var $targetEl = $(e.target);
  35457. specterHandleIsTouched = $targetEl.closest('.color-picker-hs-spectrum-handle').length > 0;
  35458. if (!specterHandleIsTouched) {
  35459. specterIsTouched = $targetEl.closest('.color-picker-hs-spectrum').length > 0;
  35460. }
  35461. if (specterIsTouched) {
  35462. specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
  35463. setHSFromSpecterCoords(touchStartX, touchStartY);
  35464. }
  35465. if (specterHandleIsTouched || specterIsTouched) {
  35466. $el.find('.color-picker-hs-spectrum-handle').addClass('color-picker-hs-spectrum-handle-pressed');
  35467. }
  35468. }
  35469. function handleTouchMove(e) {
  35470. if (!(specterIsTouched || specterHandleIsTouched)) { return; }
  35471. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  35472. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  35473. e.preventDefault();
  35474. if (!isMoved) {
  35475. // First move
  35476. isMoved = true;
  35477. if (specterHandleIsTouched) {
  35478. specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
  35479. }
  35480. }
  35481. if (specterIsTouched || specterHandleIsTouched) {
  35482. setHSFromSpecterCoords(touchCurrentX, touchCurrentY);
  35483. }
  35484. }
  35485. function handleTouchEnd() {
  35486. isMoved = false;
  35487. if (specterIsTouched || specterHandleIsTouched) {
  35488. $el.find('.color-picker-hs-spectrum-handle').removeClass('color-picker-hs-spectrum-handle-pressed');
  35489. }
  35490. specterIsTouched = false;
  35491. specterHandleIsTouched = false;
  35492. }
  35493. function handleResize() {
  35494. self.modules['hs-spectrum'].update(self);
  35495. }
  35496. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  35497. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  35498. app.on('touchmove:active', handleTouchMove);
  35499. app.on('touchend:passive', handleTouchEnd);
  35500. app.on('resize', handleResize);
  35501. self.destroySpectrumEvents = function destroySpectrumEvents() {
  35502. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  35503. app.off('touchmove:active', handleTouchMove);
  35504. app.off('touchend:passive', handleTouchEnd);
  35505. app.off('resize', handleResize);
  35506. };
  35507. },
  35508. update: function update(self) {
  35509. var value = self.value;
  35510. var hsb = value.hsb;
  35511. var specterWidth = self.$el.find('.color-picker-hs-spectrum')[0].offsetWidth;
  35512. var specterHeight = self.$el.find('.color-picker-hs-spectrum')[0].offsetHeight;
  35513. var hslBright = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  35514. self.$el.find('.color-picker-hs-spectrum-handle')
  35515. .css('background-color', ("hsl(" + (hslBright[0]) + ", " + (hslBright[1] * 100) + "%, " + (hslBright[2] * 100) + "%)"))
  35516. .transform(("translate(" + (specterWidth * (hsb[0] / 360)) + "px, " + (specterHeight * (1 - hsb[1])) + "px)"));
  35517. },
  35518. destroy: function destroy(self) {
  35519. if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
  35520. delete self.destroySpectrumEvents;
  35521. },
  35522. };
  35523. function svgWheelCircles() {
  35524. var total = 256;
  35525. var circles = '';
  35526. for (var i = total; i > 0; i -= 1) {
  35527. var angle = i * Math.PI / (total / 2);
  35528. var hue = 360 / total * i;
  35529. circles += "<circle cx=\"" + (150 - Math.sin(angle) * 125) + "\" cy=\"" + (150 - Math.cos(angle) * 125) + "\" r=\"25\" fill=\"hsl(" + hue + ", 100%, 50%)\"></circle>";
  35530. }
  35531. return circles;
  35532. }
  35533. var moduleWheel = {
  35534. render: function render() {
  35535. 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 ");
  35536. },
  35537. init: function init(self) {
  35538. var app = self.app;
  35539. var isTouched;
  35540. var isMoved;
  35541. var touchStartX;
  35542. var touchStartY;
  35543. var touchCurrentX;
  35544. var touchCurrentY;
  35545. var wheelRect;
  35546. var wheelIsTouched;
  35547. var wheelHandleIsTouched;
  35548. var specterRect;
  35549. var specterIsTouched;
  35550. var specterHandleIsTouched;
  35551. var $el = self.$el;
  35552. function setHueFromWheelCoords(x, y) {
  35553. var wheelCenterX = wheelRect.left + wheelRect.width / 2;
  35554. var wheelCenterY = wheelRect.top + wheelRect.height / 2;
  35555. var angleRad = Math.atan2(y - wheelCenterY, x - wheelCenterX);
  35556. var angleDeg = angleRad * 180 / Math.PI + 90;
  35557. if (angleDeg < 0) { angleDeg += 360; }
  35558. angleDeg = 360 - angleDeg;
  35559. self.setValue({ hue: angleDeg });
  35560. }
  35561. function setSBFromSpecterCoords(x, y) {
  35562. var s = (x - specterRect.left) / specterRect.width;
  35563. var b = (y - specterRect.top) / specterRect.height;
  35564. s = Math.max(0, Math.min(1, s));
  35565. b = 1 - Math.max(0, Math.min(1, b));
  35566. self.setValue({ hsb: [self.value.hue, s, b] });
  35567. }
  35568. function handleTouchStart(e) {
  35569. if (isMoved || isTouched) { return; }
  35570. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  35571. touchCurrentX = touchStartX;
  35572. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  35573. touchCurrentY = touchStartY;
  35574. var $targetEl = $(e.target);
  35575. wheelHandleIsTouched = $targetEl.closest('.color-picker-wheel-handle').length > 0;
  35576. wheelIsTouched = $targetEl.closest('circle').length > 0;
  35577. specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
  35578. if (!specterHandleIsTouched) {
  35579. specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
  35580. }
  35581. if (wheelIsTouched) {
  35582. wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
  35583. setHueFromWheelCoords(touchStartX, touchStartY);
  35584. }
  35585. if (specterIsTouched) {
  35586. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  35587. setSBFromSpecterCoords(touchStartX, touchStartY);
  35588. }
  35589. if (specterHandleIsTouched || specterIsTouched) {
  35590. $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
  35591. }
  35592. }
  35593. function handleTouchMove(e) {
  35594. if (!(wheelIsTouched || wheelHandleIsTouched) && !(specterIsTouched || specterHandleIsTouched)) { return; }
  35595. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  35596. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  35597. e.preventDefault();
  35598. if (!isMoved) {
  35599. // First move
  35600. isMoved = true;
  35601. if (wheelHandleIsTouched) {
  35602. wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
  35603. }
  35604. if (specterHandleIsTouched) {
  35605. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  35606. }
  35607. }
  35608. if (wheelIsTouched || wheelHandleIsTouched) {
  35609. setHueFromWheelCoords(touchCurrentX, touchCurrentY);
  35610. }
  35611. if (specterIsTouched || specterHandleIsTouched) {
  35612. setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
  35613. }
  35614. }
  35615. function handleTouchEnd() {
  35616. isMoved = false;
  35617. if (specterIsTouched || specterHandleIsTouched) {
  35618. $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
  35619. }
  35620. wheelIsTouched = false;
  35621. wheelHandleIsTouched = false;
  35622. specterIsTouched = false;
  35623. specterHandleIsTouched = false;
  35624. }
  35625. function handleResize() {
  35626. self.modules.wheel.update(self);
  35627. }
  35628. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  35629. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  35630. app.on('touchmove:active', handleTouchMove);
  35631. app.on('touchend:passive', handleTouchEnd);
  35632. app.on('resize', handleResize);
  35633. self.destroyWheelEvents = function destroyWheelEvents() {
  35634. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  35635. app.off('touchmove:active', handleTouchMove);
  35636. app.off('touchend:passive', handleTouchEnd);
  35637. app.off('resize', handleResize);
  35638. };
  35639. },
  35640. update: function update(self) {
  35641. var value = self.value;
  35642. var hsl = value.hsl;
  35643. var hsb = value.hsb;
  35644. var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
  35645. var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
  35646. var wheelSize = self.$el.find('.color-picker-wheel')[0].offsetWidth;
  35647. var wheelHalfSize = wheelSize / 2;
  35648. var angleRad = value.hue * Math.PI / 180;
  35649. var handleSize = wheelSize / 6;
  35650. var handleHalfSize = handleSize / 2;
  35651. var tX = wheelHalfSize - Math.sin(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
  35652. var tY = wheelHalfSize - Math.cos(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
  35653. self.$el.find('.color-picker-wheel-handle')
  35654. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"))
  35655. .transform(("translate(" + tX + "px, " + tY + "px)"));
  35656. self.$el.find('.color-picker-sb-spectrum')
  35657. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
  35658. self.$el.find('.color-picker-sb-spectrum-handle')
  35659. .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
  35660. .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
  35661. },
  35662. destroy: function destroy(self) {
  35663. if (self.destroyWheelEvents) { self.destroyWheelEvents(); }
  35664. delete self.destroyWheelEvents;
  35665. },
  35666. };
  35667. var ColorPicker = /*@__PURE__*/(function (Framework7Class) {
  35668. function ColorPicker(app, params) {
  35669. if ( params === void 0 ) params = {};
  35670. Framework7Class.call(this, params, [app]);
  35671. var self = this;
  35672. self.params = Utils.extend({}, app.params.colorPicker, params);
  35673. var $containerEl;
  35674. if (self.params.containerEl) {
  35675. $containerEl = $(self.params.containerEl);
  35676. if ($containerEl.length === 0) { return self; }
  35677. }
  35678. var $inputEl;
  35679. if (self.params.inputEl) {
  35680. $inputEl = $(self.params.inputEl);
  35681. }
  35682. var $targetEl;
  35683. if (self.params.targetEl) {
  35684. $targetEl = $(self.params.targetEl);
  35685. }
  35686. Utils.extend(self, {
  35687. app: app,
  35688. $containerEl: $containerEl,
  35689. containerEl: $containerEl && $containerEl[0],
  35690. inline: $containerEl && $containerEl.length > 0,
  35691. $inputEl: $inputEl,
  35692. inputEl: $inputEl && $inputEl[0],
  35693. $targetEl: $targetEl,
  35694. targetEl: $targetEl && $targetEl[0],
  35695. initialized: false,
  35696. opened: false,
  35697. url: self.params.url,
  35698. modules: {
  35699. 'alpha-slider': moduleAlphaSlider,
  35700. 'current-color': moduleCurrentColor,
  35701. 'hex': moduleHex, // eslint-disable-line
  35702. 'hsb-sliders': moduleHsbSliders,
  35703. 'hue-slider': moduleHueSlider,
  35704. 'brightness-slider': moduleBrightnessSlider,
  35705. 'palette': modulePalette, // eslint-disable-line
  35706. 'initial-current-colors': moduleInitialCurrentColors,
  35707. 'rgb-bars': moduleRgbBars,
  35708. 'rgb-sliders': moduleRgbSliders,
  35709. 'sb-spectrum': moduleSbSpectrum,
  35710. 'hs-spectrum': moduleHsSpectrum,
  35711. 'wheel': moduleWheel, // eslint-disable-line
  35712. },
  35713. });
  35714. function onInputClick() {
  35715. self.open();
  35716. }
  35717. function onInputFocus(e) {
  35718. e.preventDefault();
  35719. }
  35720. function onTargetClick() {
  35721. self.open();
  35722. }
  35723. function onHtmlClick(e) {
  35724. if (self.destroyed || !self.params) { return; }
  35725. if (self.params.openIn === 'page') { return; }
  35726. var $clickTargetEl = $(e.target);
  35727. if (!self.opened || self.closing) { return; }
  35728. if ($clickTargetEl.closest('[class*="backdrop"]').length) { return; }
  35729. if ($clickTargetEl.closest('.color-picker-popup, .color-picker-popover').length) { return; }
  35730. if ($inputEl && $inputEl.length > 0) {
  35731. if ($clickTargetEl[0] !== $inputEl[0] && $clickTargetEl.closest('.sheet-modal').length === 0) {
  35732. self.close();
  35733. }
  35734. } else if ($(e.target).closest('.sheet-modal').length === 0) {
  35735. self.close();
  35736. }
  35737. }
  35738. // Events
  35739. Utils.extend(self, {
  35740. attachInputEvents: function attachInputEvents() {
  35741. self.$inputEl.on('click', onInputClick);
  35742. if (self.params.inputReadOnly) {
  35743. self.$inputEl.on('focus mousedown', onInputFocus);
  35744. if (self.$inputEl[0]) {
  35745. self.$inputEl[0].f7ValidateReadonly = true;
  35746. }
  35747. }
  35748. },
  35749. detachInputEvents: function detachInputEvents() {
  35750. self.$inputEl.off('click', onInputClick);
  35751. if (self.params.inputReadOnly) {
  35752. self.$inputEl.off('focus mousedown', onInputFocus);
  35753. if (self.$inputEl[0]) {
  35754. delete self.$inputEl[0].f7ValidateReadonly;
  35755. }
  35756. }
  35757. },
  35758. attachTargetEvents: function attachTargetEvents() {
  35759. self.$targetEl.on('click', onTargetClick);
  35760. },
  35761. detachTargetEvents: function detachTargetEvents() {
  35762. self.$targetEl.off('click', onTargetClick);
  35763. },
  35764. attachHtmlEvents: function attachHtmlEvents() {
  35765. app.on('click', onHtmlClick);
  35766. },
  35767. detachHtmlEvents: function detachHtmlEvents() {
  35768. app.off('click', onHtmlClick);
  35769. },
  35770. });
  35771. self.init();
  35772. return self;
  35773. }
  35774. if ( Framework7Class ) ColorPicker.__proto__ = Framework7Class;
  35775. ColorPicker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  35776. ColorPicker.prototype.constructor = ColorPicker;
  35777. var prototypeAccessors = { view: { configurable: true } };
  35778. prototypeAccessors.view.get = function () {
  35779. var ref = this;
  35780. var $inputEl = ref.$inputEl;
  35781. var $targetEl = ref.$targetEl;
  35782. var app = ref.app;
  35783. var params = ref.params;
  35784. var view;
  35785. if (params.view) {
  35786. view = params.view;
  35787. } else {
  35788. if ($inputEl) {
  35789. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  35790. }
  35791. if (!view && $targetEl) {
  35792. view = $targetEl.parents('.view').length && $targetEl.parents('.view')[0].f7View;
  35793. }
  35794. }
  35795. if (!view) { view = app.views.main; }
  35796. return view;
  35797. };
  35798. ColorPicker.prototype.attachEvents = function attachEvents () {
  35799. var self = this;
  35800. self.centerModules = self.centerModules.bind(self);
  35801. if (self.params.centerModules) {
  35802. self.app.on('resize', self.centerModules);
  35803. }
  35804. };
  35805. ColorPicker.prototype.detachEvents = function detachEvents () {
  35806. var self = this;
  35807. if (self.params.centerModules) {
  35808. self.app.off('resize', self.centerModules);
  35809. }
  35810. };
  35811. ColorPicker.prototype.centerModules = function centerModules () {
  35812. var self = this;
  35813. if (!self.opened || !self.$el || self.inline) { return; }
  35814. var $pageContentEl = self.$el.find('.page-content');
  35815. if (!$pageContentEl.length) { return; }
  35816. var ref = $pageContentEl[0];
  35817. var scrollHeight = ref.scrollHeight;
  35818. var offsetHeight = ref.offsetHeight;
  35819. if (scrollHeight <= offsetHeight) {
  35820. $pageContentEl.addClass('justify-content-center');
  35821. } else {
  35822. $pageContentEl.removeClass('justify-content-center');
  35823. }
  35824. };
  35825. ColorPicker.prototype.initInput = function initInput () {
  35826. var self = this;
  35827. if (!self.$inputEl) { return; }
  35828. if (self.params.inputReadOnly) { self.$inputEl.prop('readOnly', true); }
  35829. };
  35830. ColorPicker.prototype.getModalType = function getModalType () {
  35831. var self = this;
  35832. var app = self.app;
  35833. var modal = self.modal;
  35834. var params = self.params;
  35835. var openIn = params.openIn;
  35836. var openInPhone = params.openInPhone;
  35837. if (modal && modal.type) { return modal.type; }
  35838. if (openIn !== 'auto') { return openIn; }
  35839. if (self.inline) { return null; }
  35840. if (app.device.ios) {
  35841. return app.device.ipad ? 'popover' : openInPhone;
  35842. }
  35843. if (app.width >= 768 || (app.device.desktop && app.theme === 'aurora')) {
  35844. return 'popover';
  35845. }
  35846. return openInPhone;
  35847. };
  35848. ColorPicker.prototype.formatValue = function formatValue () {
  35849. var self = this;
  35850. var value = self.value;
  35851. if (self.params.formatValue) {
  35852. return self.params.formatValue.call(self, value);
  35853. }
  35854. return value.hex;
  35855. };
  35856. // eslint-disable-next-line
  35857. ColorPicker.prototype.normalizeHsValues = function normalizeHsValues (arr) {
  35858. return [
  35859. Math.floor(arr[0] * 10) / 10,
  35860. Math.floor(arr[1] * 1000) / 1000,
  35861. Math.floor(arr[2] * 1000) / 1000 ];
  35862. };
  35863. ColorPicker.prototype.setValue = function setValue (value, updateModules) {
  35864. if ( value === void 0 ) value = {};
  35865. if ( updateModules === void 0 ) updateModules = true;
  35866. var self = this;
  35867. if (typeof value === 'undefined') { return; }
  35868. var ref = (self.value || {});
  35869. var hex = ref.hex;
  35870. var rgb = ref.rgb;
  35871. var hsl = ref.hsl;
  35872. var hsb = ref.hsb;
  35873. var alpha = ref.alpha; if ( alpha === void 0 ) alpha = 1;
  35874. var hue = ref.hue;
  35875. var rgba = ref.rgba;
  35876. var hsla = ref.hsla;
  35877. var needChangeEvent = self.value || (!self.value && !self.params.value);
  35878. var valueChanged;
  35879. Object.keys(value).forEach(function (k) {
  35880. if (!self.value || typeof self.value[k] === 'undefined') {
  35881. valueChanged = true;
  35882. return;
  35883. }
  35884. var v = value[k];
  35885. if (Array.isArray(v)) {
  35886. v.forEach(function (subV, subIndex) {
  35887. if (subV !== self.value[k][subIndex]) {
  35888. valueChanged = true;
  35889. }
  35890. });
  35891. } else if (v !== self.value[k]) {
  35892. valueChanged = true;
  35893. }
  35894. });
  35895. if (!valueChanged) { return; }
  35896. if (value.rgb || value.rgba) {
  35897. var ref$1 = (value.rgb || value.rgba);
  35898. var r = ref$1[0];
  35899. var g = ref$1[1];
  35900. var b = ref$1[2];
  35901. var a = ref$1[3]; if ( a === void 0 ) a = alpha;
  35902. rgb = [r, g, b];
  35903. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  35904. hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
  35905. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  35906. hsl = self.normalizeHsValues(hsl);
  35907. hsb = self.normalizeHsValues(hsb);
  35908. hue = hsb[0];
  35909. alpha = a;
  35910. rgba = [rgb[0], rgb[1], rgb[2], a];
  35911. hsla = [hsl[0], hsl[1], hsl[2], a];
  35912. }
  35913. if (value.hsl || value.hsla) {
  35914. var ref$2 = (value.hsl || value.hsla);
  35915. var h = ref$2[0];
  35916. var s = ref$2[1];
  35917. var l = ref$2[2];
  35918. var a$1 = ref$2[3]; if ( a$1 === void 0 ) a$1 = alpha;
  35919. hsl = [h, s, l];
  35920. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  35921. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  35922. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  35923. hsl = self.normalizeHsValues(hsl);
  35924. hsb = self.normalizeHsValues(hsb);
  35925. hue = hsb[0];
  35926. alpha = a$1;
  35927. rgba = [rgb[0], rgb[1], rgb[2], a$1];
  35928. hsla = [hsl[0], hsl[1], hsl[2], a$1];
  35929. }
  35930. if (value.hsb) {
  35931. var ref$3 = value.hsb;
  35932. var h$1 = ref$3[0];
  35933. var s$1 = ref$3[1];
  35934. var b$1 = ref$3[2];
  35935. var a$2 = ref$3[3]; if ( a$2 === void 0 ) a$2 = alpha;
  35936. hsb = [h$1, s$1, b$1];
  35937. hsl = Utils.colorHsbToHsl.apply(Utils, hsb);
  35938. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  35939. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  35940. hsl = self.normalizeHsValues(hsl);
  35941. hsb = self.normalizeHsValues(hsb);
  35942. hue = hsb[0];
  35943. alpha = a$2;
  35944. rgba = [rgb[0], rgb[1], rgb[2], a$2];
  35945. hsla = [hsl[0], hsl[1], hsl[2], a$2];
  35946. }
  35947. if (value.hex) {
  35948. rgb = Utils.colorHexToRgb(value.hex);
  35949. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  35950. hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
  35951. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  35952. hsl = self.normalizeHsValues(hsl);
  35953. hsb = self.normalizeHsValues(hsb);
  35954. hue = hsb[0];
  35955. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  35956. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  35957. }
  35958. if (typeof value.alpha !== 'undefined') {
  35959. alpha = value.alpha;
  35960. if (typeof rgb !== 'undefined') {
  35961. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  35962. }
  35963. if (typeof hsl !== 'undefined') {
  35964. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  35965. }
  35966. }
  35967. if (typeof value.hue !== 'undefined') {
  35968. var h$2 = hsl[0];
  35969. var s$2 = hsl[1];
  35970. var l$1 = hsl[2]; // eslint-disable-line
  35971. hsl = [value.hue, s$2, l$1];
  35972. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  35973. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  35974. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  35975. hsl = self.normalizeHsValues(hsl);
  35976. hsb = self.normalizeHsValues(hsb);
  35977. hue = hsb[0];
  35978. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  35979. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  35980. }
  35981. self.value = {
  35982. hex: hex,
  35983. alpha: alpha,
  35984. hue: hue,
  35985. rgb: rgb,
  35986. hsl: hsl,
  35987. hsb: hsb,
  35988. rgba: rgba,
  35989. hsla: hsla,
  35990. };
  35991. if (!self.initialValue) { self.initialValue = Utils.extend({}, self.value); }
  35992. self.updateValue(needChangeEvent);
  35993. if (self.opened && updateModules) {
  35994. self.updateModules();
  35995. }
  35996. };
  35997. ColorPicker.prototype.getValue = function getValue () {
  35998. var self = this;
  35999. return self.value;
  36000. };
  36001. ColorPicker.prototype.updateValue = function updateValue (fireEvents) {
  36002. if ( fireEvents === void 0 ) fireEvents = true;
  36003. var self = this;
  36004. var $inputEl = self.$inputEl;
  36005. var value = self.value;
  36006. var $targetEl = self.$targetEl;
  36007. if ($targetEl && self.params.targetElSetBackgroundColor) {
  36008. var rgba = value.rgba;
  36009. $targetEl.css('background-color', ("rgba(" + (rgba.join(', ')) + ")"));
  36010. }
  36011. if (fireEvents) {
  36012. self.emit('local::change colorPickerChange', self, value);
  36013. }
  36014. if ($inputEl && $inputEl.length) {
  36015. var inputValue = self.formatValue(value);
  36016. if ($inputEl && $inputEl.length) {
  36017. $inputEl.val(inputValue);
  36018. if (fireEvents) {
  36019. $inputEl.trigger('change');
  36020. }
  36021. }
  36022. }
  36023. };
  36024. ColorPicker.prototype.updateModules = function updateModules () {
  36025. var self = this;
  36026. var modules = self.modules;
  36027. self.params.modules.forEach(function (m) {
  36028. if (typeof m === 'string' && modules[m] && modules[m].update) {
  36029. modules[m].update(self);
  36030. } else if (m && m.update) {
  36031. m.update(self);
  36032. }
  36033. });
  36034. };
  36035. ColorPicker.prototype.update = function update () {
  36036. var self = this;
  36037. self.updateModules();
  36038. };
  36039. ColorPicker.prototype.renderPicker = function renderPicker () {
  36040. var self = this;
  36041. var params = self.params;
  36042. var modules = self.modules;
  36043. var html = '';
  36044. params.modules.forEach(function (m) {
  36045. if (typeof m === 'string' && modules[m] && modules[m].render) {
  36046. html += modules[m].render(self);
  36047. } else if (m && m.render) {
  36048. html += m.render(self);
  36049. }
  36050. });
  36051. return html;
  36052. };
  36053. ColorPicker.prototype.renderNavbar = function renderNavbar () {
  36054. var self = this;
  36055. if (self.params.renderNavbar) {
  36056. return self.params.renderNavbar.call(self, self);
  36057. }
  36058. var ref = self.params;
  36059. var openIn = ref.openIn;
  36060. var navbarTitleText = ref.navbarTitleText;
  36061. var navbarBackLinkText = ref.navbarBackLinkText;
  36062. var navbarCloseText = ref.navbarCloseText;
  36063. 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();
  36064. };
  36065. ColorPicker.prototype.renderToolbar = function renderToolbar () {
  36066. var self = this;
  36067. if (self.params.renderToolbar) {
  36068. return self.params.renderToolbar.call(self, self);
  36069. }
  36070. 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();
  36071. };
  36072. ColorPicker.prototype.renderInline = function renderInline () {
  36073. var self = this;
  36074. var ref = self.params;
  36075. var cssClass = ref.cssClass;
  36076. var groupedModules = ref.groupedModules;
  36077. var inlineHtml = ("\n <div class=\"color-picker color-picker-inline " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '') + "\">\n " + (self.renderPicker()) + "\n </div>\n ").trim();
  36078. return inlineHtml;
  36079. };
  36080. ColorPicker.prototype.renderSheet = function renderSheet () {
  36081. var self = this;
  36082. var ref = self.params;
  36083. var cssClass = ref.cssClass;
  36084. var toolbarSheet = ref.toolbarSheet;
  36085. var groupedModules = ref.groupedModules;
  36086. 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();
  36087. return sheetHtml;
  36088. };
  36089. ColorPicker.prototype.renderPopover = function renderPopover () {
  36090. var self = this;
  36091. var ref = self.params;
  36092. var cssClass = ref.cssClass;
  36093. var toolbarPopover = ref.toolbarPopover;
  36094. var groupedModules = ref.groupedModules;
  36095. 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();
  36096. return popoverHtml;
  36097. };
  36098. ColorPicker.prototype.renderPopup = function renderPopup () {
  36099. var self = this;
  36100. var ref = self.params;
  36101. var cssClass = ref.cssClass;
  36102. var navbarPopup = ref.navbarPopup;
  36103. var groupedModules = ref.groupedModules;
  36104. 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();
  36105. return popupHtml;
  36106. };
  36107. ColorPicker.prototype.renderPage = function renderPage () {
  36108. var self = this;
  36109. var ref = self.params;
  36110. var cssClass = ref.cssClass;
  36111. var groupedModules = ref.groupedModules;
  36112. 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();
  36113. return pageHtml;
  36114. };
  36115. // eslint-disable-next-line
  36116. ColorPicker.prototype.render = function render () {
  36117. var self = this;
  36118. var params = self.params;
  36119. if (params.render) { return params.render.call(self); }
  36120. if (self.inline) { return self.renderInline(); }
  36121. if (params.openIn === 'page') {
  36122. return self.renderPage();
  36123. }
  36124. var modalType = self.getModalType();
  36125. if (modalType === 'popover') { return self.renderPopover(); }
  36126. if (modalType === 'sheet') { return self.renderSheet(); }
  36127. if (modalType === 'popup') { return self.renderPopup(); }
  36128. };
  36129. ColorPicker.prototype.onOpen = function onOpen () {
  36130. var self = this;
  36131. var initialized = self.initialized;
  36132. var $el = self.$el;
  36133. var app = self.app;
  36134. var $inputEl = self.$inputEl;
  36135. var inline = self.inline;
  36136. var value = self.value;
  36137. var params = self.params;
  36138. var modules = self.modules;
  36139. self.closing = false;
  36140. self.opened = true;
  36141. self.opening = true;
  36142. // Init main events
  36143. self.attachEvents();
  36144. params.modules.forEach(function (m) {
  36145. if (typeof m === 'string' && modules[m] && modules[m].init) {
  36146. modules[m].init(self);
  36147. } else if (m && m.init) {
  36148. m.init(self);
  36149. }
  36150. });
  36151. var updateValue = !value && params.value;
  36152. // Set value
  36153. if (!initialized) {
  36154. if (value) { self.setValue(value); }
  36155. else if (params.value) {
  36156. self.setValue(params.value, false);
  36157. } else if (!params.value) {
  36158. self.setValue({ hex: '#ff0000' }, false);
  36159. }
  36160. } else if (value) {
  36161. self.initialValue = Utils.extend({}, value);
  36162. self.setValue(value, false);
  36163. }
  36164. // Update input value
  36165. if (updateValue) { self.updateValue(); }
  36166. self.updateModules();
  36167. // Center modules
  36168. if (params.centerModules) {
  36169. self.centerModules();
  36170. }
  36171. // Extra focus
  36172. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  36173. $inputEl.trigger('focus');
  36174. }
  36175. self.initialized = true;
  36176. // Trigger events
  36177. if ($el) {
  36178. $el.trigger('colorpicker:open');
  36179. }
  36180. if ($inputEl) {
  36181. $inputEl.trigger('colorpicker:open');
  36182. }
  36183. self.emit('local::open colorPickerOpen', self);
  36184. };
  36185. ColorPicker.prototype.onOpened = function onOpened () {
  36186. var self = this;
  36187. self.opening = false;
  36188. if (self.$el) {
  36189. self.$el.trigger('colorpicker:opened');
  36190. }
  36191. if (self.$inputEl) {
  36192. self.$inputEl.trigger('colorpicker:opened');
  36193. }
  36194. self.emit('local::opened colorPickerOpened', self);
  36195. };
  36196. ColorPicker.prototype.onClose = function onClose () {
  36197. var self = this;
  36198. var app = self.app;
  36199. var params = self.params;
  36200. var modules = self.modules;
  36201. self.opening = false;
  36202. self.closing = true;
  36203. // Detach events
  36204. self.detachEvents();
  36205. if (self.$inputEl) {
  36206. if (app.theme === 'md') {
  36207. self.$inputEl.trigger('blur');
  36208. } else {
  36209. var validate = self.$inputEl.attr('validate');
  36210. var required = self.$inputEl.attr('required');
  36211. if (validate && required) {
  36212. app.input.validate(self.$inputEl);
  36213. }
  36214. }
  36215. }
  36216. params.modules.forEach(function (m) {
  36217. if (typeof m === 'string' && modules[m] && modules[m].destroy) {
  36218. modules[m].destroy(self);
  36219. } else if (m && m.destroy) {
  36220. m.destroy(self);
  36221. }
  36222. });
  36223. if (self.$el) {
  36224. self.$el.trigger('colorpicker:close');
  36225. }
  36226. if (self.$inputEl) {
  36227. self.$inputEl.trigger('colorpicker:close');
  36228. }
  36229. self.emit('local::close colorPickerClose', self);
  36230. };
  36231. ColorPicker.prototype.onClosed = function onClosed () {
  36232. var self = this;
  36233. self.opened = false;
  36234. self.closing = false;
  36235. if (!self.inline) {
  36236. Utils.nextTick(function () {
  36237. if (self.modal && self.modal.el && self.modal.destroy) {
  36238. if (!self.params.routableModals) {
  36239. self.modal.destroy();
  36240. }
  36241. }
  36242. delete self.modal;
  36243. });
  36244. }
  36245. if (self.$el) {
  36246. self.$el.trigger('colorpicker:closed');
  36247. }
  36248. if (self.$inputEl) {
  36249. self.$inputEl.trigger('colorpicker:closed');
  36250. }
  36251. self.emit('local::closed colorPickerClosed', self);
  36252. };
  36253. ColorPicker.prototype.open = function open () {
  36254. var obj;
  36255. var self = this;
  36256. var app = self.app;
  36257. var opened = self.opened;
  36258. var inline = self.inline;
  36259. var $inputEl = self.$inputEl;
  36260. var $targetEl = self.$targetEl;
  36261. var params = self.params;
  36262. if (opened) { return; }
  36263. if (inline) {
  36264. self.$el = $(self.render());
  36265. self.$el[0].f7ColorPicker = self;
  36266. self.$containerEl.append(self.$el);
  36267. self.onOpen();
  36268. self.onOpened();
  36269. return;
  36270. }
  36271. var colorPickerContent = self.render();
  36272. if (params.openIn === 'page') {
  36273. self.view.router.navigate({
  36274. url: self.url,
  36275. route: {
  36276. content: colorPickerContent,
  36277. path: self.url,
  36278. on: {
  36279. pageBeforeIn: function pageBeforeIn(e, page) {
  36280. self.$el = page.$el.find('.color-picker');
  36281. self.$el[0].f7ColorPicker = self;
  36282. self.onOpen();
  36283. },
  36284. pageAfterIn: function pageAfterIn() {
  36285. self.onOpened();
  36286. },
  36287. pageBeforeOut: function pageBeforeOut() {
  36288. self.onClose();
  36289. },
  36290. pageAfterOut: function pageAfterOut() {
  36291. self.onClosed();
  36292. if (self.$el && self.$el[0]) {
  36293. self.$el[0].f7ColorPicker = null;
  36294. delete self.$el[0].f7ColorPicker;
  36295. }
  36296. },
  36297. },
  36298. },
  36299. });
  36300. } else {
  36301. var modalType = self.getModalType();
  36302. var backdrop = params.backdrop;
  36303. if (backdrop === null || typeof backdrop === 'undefined') {
  36304. if (modalType === 'popover' && app.params.popover.backdrop !== false) { backdrop = true; }
  36305. if (modalType === 'popup') { backdrop = true; }
  36306. }
  36307. var modalParams = {
  36308. targetEl: ($targetEl || $inputEl),
  36309. scrollToEl: params.scrollToInput ? ($targetEl || $inputEl) : undefined,
  36310. content: colorPickerContent,
  36311. backdrop: backdrop,
  36312. closeByBackdropClick: params.closeByBackdropClick,
  36313. on: {
  36314. open: function open() {
  36315. var modal = this;
  36316. self.modal = modal;
  36317. self.$el = modalType === 'popover' || modalType === 'popup' ? modal.$el.find('.color-picker') : modal.$el;
  36318. self.$el[0].f7ColorPicker = self;
  36319. self.onOpen();
  36320. },
  36321. opened: function opened() { self.onOpened(); },
  36322. close: function close() { self.onClose(); },
  36323. closed: function closed() {
  36324. self.onClosed();
  36325. if (self.$el && self.$el[0]) {
  36326. self.$el[0].f7ColorPicker = null;
  36327. delete self.$el[0].f7ColorPicker;
  36328. }
  36329. },
  36330. },
  36331. };
  36332. if (modalType === 'popup') {
  36333. modalParams.push = params.popupPush;
  36334. modalParams.swipeToClose = params.popupSwipeToClose;
  36335. }
  36336. if (modalType === 'sheet') {
  36337. modalParams.push = params.sheetPush;
  36338. modalParams.swipeToClose = params.sheetSwipeToClose;
  36339. }
  36340. if (params.routableModals && self.view) {
  36341. self.view.router.navigate({
  36342. url: self.url,
  36343. route: ( obj = {
  36344. path: self.url
  36345. }, obj[modalType] = modalParams, obj ),
  36346. });
  36347. } else {
  36348. self.modal = app[modalType].create(modalParams);
  36349. self.modal.open();
  36350. }
  36351. }
  36352. };
  36353. ColorPicker.prototype.close = function close () {
  36354. var self = this;
  36355. var opened = self.opened;
  36356. var inline = self.inline;
  36357. if (!opened) { return; }
  36358. if (inline) {
  36359. self.onClose();
  36360. self.onClosed();
  36361. return;
  36362. }
  36363. if ((self.params.routableModals && self.view) || self.params.openIn === 'page') {
  36364. self.view.router.back();
  36365. } else {
  36366. self.modal.close();
  36367. }
  36368. };
  36369. ColorPicker.prototype.init = function init () {
  36370. var self = this;
  36371. self.initInput();
  36372. if (self.inline) {
  36373. self.open();
  36374. self.emit('local::init colorPickerInit', self);
  36375. return;
  36376. }
  36377. if (!self.initialized && self.params.value) {
  36378. self.setValue(self.params.value);
  36379. }
  36380. // Attach input Events
  36381. if (self.$inputEl) {
  36382. self.attachInputEvents();
  36383. }
  36384. if (self.$targetEl) {
  36385. self.attachTargetEvents();
  36386. }
  36387. if (self.params.closeByOutsideClick) {
  36388. self.attachHtmlEvents();
  36389. }
  36390. self.emit('local::init colorPickerInit', self);
  36391. };
  36392. ColorPicker.prototype.destroy = function destroy () {
  36393. var self = this;
  36394. if (self.destroyed) { return; }
  36395. var $el = self.$el;
  36396. self.emit('local::beforeDestroy colorPickerBeforeDestroy', self);
  36397. if ($el) { $el.trigger('colorpicker:beforedestroy'); }
  36398. self.close();
  36399. // Detach Events
  36400. self.detachEvents();
  36401. if (self.$inputEl) {
  36402. self.detachInputEvents();
  36403. }
  36404. if (self.$targetEl) {
  36405. self.detachTargetEvents();
  36406. }
  36407. if (self.params.closeByOutsideClick) {
  36408. self.detachHtmlEvents();
  36409. }
  36410. if ($el && $el.length) { delete self.$el[0].f7ColorPicker; }
  36411. Utils.deleteProps(self);
  36412. self.destroyed = true;
  36413. };
  36414. Object.defineProperties( ColorPicker.prototype, prototypeAccessors );
  36415. return ColorPicker;
  36416. }(Framework7Class));
  36417. var ColorPicker$1 = {
  36418. name: 'colorPicker',
  36419. static: {
  36420. ColorPicker: ColorPicker,
  36421. },
  36422. create: function create() {
  36423. var app = this;
  36424. app.colorPicker = ConstructorMethods({
  36425. defaultSelector: '.color-picker',
  36426. constructor: ColorPicker,
  36427. app: app,
  36428. domProp: 'f7ColorPicker',
  36429. });
  36430. app.colorPicker.close = function close(el) {
  36431. if ( el === void 0 ) el = '.color-picker';
  36432. var $el = $(el);
  36433. if ($el.length === 0) { return; }
  36434. var colorPicker = $el[0].f7ColorPicker;
  36435. if (!colorPicker || (colorPicker && !colorPicker.opened)) { return; }
  36436. colorPicker.close();
  36437. };
  36438. },
  36439. params: {
  36440. colorPicker: {
  36441. // Color picker settings
  36442. value: null,
  36443. modules: [
  36444. 'wheel' ],
  36445. palette: [
  36446. ['#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C'],
  36447. ['#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C'],
  36448. ['#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E'],
  36449. ['#E1F5FE', '#B3E5FC', '#81D4FA', '#4FC3F7', '#29B6F6', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B'],
  36450. ['#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40'],
  36451. ['#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E'],
  36452. ['#FFFDE7', '#FFF9C4', '#FFF59D', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17'],
  36453. ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100'] ],
  36454. groupedModules: false,
  36455. centerModules: true,
  36456. sliderLabel: false,
  36457. sliderValue: false,
  36458. sliderValueEdiable: false,
  36459. barLabel: false,
  36460. barValue: false,
  36461. barValueEdiable: false,
  36462. hexLabel: false,
  36463. hexValueEditable: false,
  36464. redLabelText: 'R',
  36465. greenLabelText: 'G',
  36466. blueLabelText: 'B',
  36467. hueLabelText: 'H',
  36468. saturationLabelText: 'S',
  36469. brightnessLabelText: 'B',
  36470. hexLabelText: 'HEX',
  36471. alphaLabelText: 'A',
  36472. // Common opener settings
  36473. containerEl: null,
  36474. openIn: 'popover', // or 'popover' or 'sheet' or 'popup' or 'page' or 'auto'
  36475. openInPhone: 'popup', // or 'popover' or 'sheet' or 'popup' or 'page'
  36476. popupPush: false,
  36477. popupSwipeToClose: undefined,
  36478. sheetPush: false,
  36479. sheetSwipeToClose: undefined,
  36480. formatValue: null,
  36481. targetEl: null,
  36482. targetElSetBackgroundColor: false,
  36483. inputEl: null,
  36484. inputReadOnly: true,
  36485. closeByOutsideClick: true,
  36486. scrollToInput: true,
  36487. toolbarSheet: true,
  36488. toolbarPopover: false,
  36489. toolbarCloseText: 'Done',
  36490. navbarPopup: true,
  36491. navbarCloseText: 'Done',
  36492. navbarTitleText: 'Color',
  36493. navbarBackLinkText: 'Back',
  36494. cssClass: null,
  36495. routableModals: true,
  36496. view: null,
  36497. url: 'color/',
  36498. backdrop: null,
  36499. closeByBackdropClick: true,
  36500. // Render functions
  36501. renderToolbar: null,
  36502. renderNavbar: null,
  36503. renderInline: null,
  36504. renderPopover: null,
  36505. renderSheet: null,
  36506. renderPopup: null,
  36507. render: null,
  36508. },
  36509. },
  36510. };
  36511. var Treeview = {
  36512. open: function open(itemEl) {
  36513. var app = this;
  36514. var $itemEl = $(itemEl).eq(0);
  36515. if (!$itemEl.length) { return; }
  36516. $itemEl.addClass('treeview-item-opened');
  36517. $itemEl.trigger('treeview:open');
  36518. app.emit('treeviewOpen', $itemEl[0]);
  36519. function done(cancel) {
  36520. if (cancel) {
  36521. $itemEl.removeClass('treeview-item-opened');
  36522. $itemEl.trigger('treeview:close');
  36523. app.emit('treeviewClose', $itemEl[0]);
  36524. } else {
  36525. $itemEl[0].f7TreeviewChildrenLoaded = true;
  36526. }
  36527. $itemEl.find('.treeview-toggle').removeClass('treeview-toggle-hidden');
  36528. $itemEl.find('.treeview-preloader').remove();
  36529. }
  36530. if ($itemEl.hasClass('treeview-load-children') && !$itemEl[0].f7TreeviewChildrenLoaded) {
  36531. $itemEl.trigger('treeview:loadchildren', done);
  36532. app.emit('treeviewLoadChildren', $itemEl[0], done);
  36533. $itemEl.find('.treeview-toggle').addClass('treeview-toggle-hidden');
  36534. $itemEl.find('.treeview-item-root').prepend(("<div class=\"preloader treeview-preloader\">" + (Utils[((app.theme) + "PreloaderContent")]) + "</div>"));
  36535. }
  36536. },
  36537. close: function close(itemEl) {
  36538. var app = this;
  36539. var $itemEl = $(itemEl).eq(0);
  36540. if (!$itemEl.length) { return; }
  36541. $itemEl.removeClass('treeview-item-opened');
  36542. $itemEl.trigger('treeview:close');
  36543. app.emit('treeviewClose', $itemEl[0]);
  36544. },
  36545. toggle: function toggle(itemEl) {
  36546. var app = this;
  36547. var $itemEl = $(itemEl).eq(0);
  36548. if (!$itemEl.length) { return; }
  36549. var wasOpened = $itemEl.hasClass('treeview-item-opened');
  36550. app.treeview[wasOpened ? 'close' : 'open']($itemEl);
  36551. },
  36552. };
  36553. var Treeview$1 = {
  36554. name: 'treeview',
  36555. create: function create() {
  36556. var app = this;
  36557. Utils.extend(app, {
  36558. treeview: {
  36559. open: Treeview.open.bind(app),
  36560. close: Treeview.close.bind(app),
  36561. toggle: Treeview.toggle.bind(app),
  36562. },
  36563. });
  36564. },
  36565. clicks: {
  36566. '.treeview-toggle': function toggle($clickedEl, clickedData, e) {
  36567. var app = this;
  36568. if ($clickedEl.parents('.treeview-item-toggle').length) { return; }
  36569. var $treeviewItemEl = $clickedEl.parents('.treeview-item').eq(0);
  36570. if (!$treeviewItemEl.length) { return; }
  36571. e.preventF7Router = true;
  36572. app.treeview.toggle($treeviewItemEl[0]);
  36573. },
  36574. '.treeview-item-toggle': function toggle($clickedEl, clickedData, e) {
  36575. var app = this;
  36576. var $treeviewItemEl = $clickedEl.closest('.treeview-item').eq(0);
  36577. if (!$treeviewItemEl.length) { return; }
  36578. e.preventF7Router = true;
  36579. app.treeview.toggle($treeviewItemEl[0]);
  36580. },
  36581. },
  36582. };
  36583. var textEditorButtonsMap = {
  36584. // f7-icon, material-icon, command
  36585. bold: ['bold', 'format_bold', 'bold'],
  36586. italic: ['italic', 'format_italic', 'italic'],
  36587. underline: ['underline', 'format_underlined', 'underline'],
  36588. strikeThrough: ['strikethrough', 'strikethrough_s', 'strikeThrough'],
  36589. orderedList: ['list_number', 'format_list_numbered', 'insertOrderedList'],
  36590. unorderedList: ['list_bullet', 'format_list_bulleted', 'insertUnorderedList'],
  36591. link: ['link', 'link', 'createLink'],
  36592. image: ['photo', 'image', 'insertImage'],
  36593. paragraph: ['paragraph', '<i class="icon">¶</i>', 'formatBlock.P'],
  36594. h1: ['<i class="icon">H<sub>1</sub></i>', '<i class="icon">H<sub>1</sub></i>', 'formatBlock.H1'],
  36595. h2: ['<i class="icon">H<sub>2</sub></i>', '<i class="icon">H<sub>2</sub></i>', 'formatBlock.H2'],
  36596. h3: ['<i class="icon">H<sub>3</sub></i>', '<i class="icon">H<sub>3</sub></i>', 'formatBlock.H3'],
  36597. alignLeft: ['text_alignleft', 'format_align_left', 'justifyLeft'],
  36598. alignCenter: ['text_aligncenter', 'format_align_center', 'justifyCenter'],
  36599. alignRight: ['text_alignright', 'format_align_right', 'justifyRight'],
  36600. alignJustify: ['text_justify', 'format_align_justify', 'justifyFull'],
  36601. subscript: ['textformat_subscript', '<i class="icon">A<sub>1</sub></i>', 'subscript'],
  36602. superscript: ['textformat_superscript', '<i class="icon">A<sup>1</sup></i>', 'superscript'],
  36603. indent: ['increase_indent', 'format_indent_increase', 'indent'],
  36604. outdent: ['decrease_indent', 'format_indent_decrease', 'outdent'],
  36605. };
  36606. var TextEditor = /*@__PURE__*/(function (Framework7Class) {
  36607. function TextEditor(app, params) {
  36608. Framework7Class.call(this, params, [app]);
  36609. var self = this;
  36610. var defaults = Utils.extend({}, app.params.textEditor);
  36611. // Extend defaults with modules params
  36612. self.useModulesParams(defaults);
  36613. self.params = Utils.extend(defaults, params);
  36614. var el = self.params.el;
  36615. if (!el) { return self; }
  36616. var $el = $(el);
  36617. if ($el.length === 0) { return self; }
  36618. if ($el[0].f7TextEditor) { return $el[0].f7TextEditor; }
  36619. var $contentEl = $el.children('.text-editor-content');
  36620. if (!$contentEl.length) {
  36621. $el.append('<div class="text-editor-content" contenteditable></div>');
  36622. $contentEl = $el.children('.text-editor-content');
  36623. }
  36624. Utils.extend(self, {
  36625. app: app,
  36626. $el: $el,
  36627. el: $el[0],
  36628. $contentEl: $contentEl,
  36629. contentEl: $contentEl[0],
  36630. });
  36631. if ('value' in params) {
  36632. self.value = self.params.value;
  36633. }
  36634. if (self.params.mode === 'keyboard-toolbar') {
  36635. if (!app.device.cordova && !app.device.android) {
  36636. self.params.mode = 'popover';
  36637. }
  36638. }
  36639. if (typeof self.params.buttons === 'string') {
  36640. try {
  36641. self.params.buttons = JSON.parse(self.params.buttons);
  36642. } catch (err) {
  36643. throw new Error('Framework7: TextEditor: wrong "buttons" parameter format');
  36644. }
  36645. }
  36646. $el[0].f7TextEditor = self;
  36647. // Bind
  36648. self.onButtonClick = self.onButtonClick.bind(self);
  36649. self.onFocus = self.onFocus.bind(self);
  36650. self.onBlur = self.onBlur.bind(self);
  36651. self.onInput = self.onInput.bind(self);
  36652. self.onPaste = self.onPaste.bind(self);
  36653. self.onSelectionChange = self.onSelectionChange.bind(self);
  36654. self.closeKeyboardToolbar = self.closeKeyboardToolbar.bind(self);
  36655. // Handle Events
  36656. self.attachEvents = function attachEvents() {
  36657. if (self.params.mode === 'toolbar') {
  36658. self.$el.find('.text-editor-toolbar').on('click', 'button', self.onButtonClick);
  36659. }
  36660. if (self.params.mode === 'keyboard-toolbar') {
  36661. self.$keyboardToolbarEl.on('click', 'button', self.onButtonClick);
  36662. self.$el.parents('.page').on('page:beforeout', self.closeKeyboardToolbar);
  36663. }
  36664. if (self.params.mode === 'popover' && self.popover) {
  36665. self.popover.$el.on('click', 'button', self.onButtonClick);
  36666. }
  36667. self.$contentEl.on('paste', self.onPaste);
  36668. self.$contentEl.on('focus', self.onFocus);
  36669. self.$contentEl.on('blur', self.onBlur);
  36670. self.$contentEl.on('input', self.onInput, true);
  36671. $(doc).on('selectionchange', self.onSelectionChange);
  36672. };
  36673. self.detachEvents = function detachEvents() {
  36674. if (self.params.mode === 'toolbar') {
  36675. self.$el.find('.text-editor-toolbar').off('click', 'button', self.onButtonClick);
  36676. }
  36677. if (self.params.mode === 'keyboard-toolbar') {
  36678. self.$keyboardToolbarEl.off('click', 'button', self.onButtonClick);
  36679. self.$el.parents('.page').off('page:beforeout', self.closeKeyboardToolbar);
  36680. }
  36681. if (self.params.mode === 'popover' && self.popover) {
  36682. self.popover.$el.off('click', 'button', self.onButtonClick);
  36683. }
  36684. self.$contentEl.off('paste', self.onPaste);
  36685. self.$contentEl.off('focus', self.onFocus);
  36686. self.$contentEl.off('blur', self.onBlur);
  36687. self.$contentEl.off('input', self.onInput, true);
  36688. $(doc).off('selectionchange', self.onSelectionChange);
  36689. };
  36690. // Install Modules
  36691. self.useModules();
  36692. // Init
  36693. self.init();
  36694. return self;
  36695. }
  36696. if ( Framework7Class ) TextEditor.__proto__ = Framework7Class;
  36697. TextEditor.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  36698. TextEditor.prototype.constructor = TextEditor;
  36699. TextEditor.prototype.setValue = function setValue (newValue) {
  36700. var self = this;
  36701. var currentValue = self.value;
  36702. if (currentValue === newValue) { return self; }
  36703. self.value = newValue;
  36704. self.$contentEl.html(newValue);
  36705. self.$el.trigger('texteditor:change', self.value);
  36706. self.emit('local::change textEditorChange', self, self.value);
  36707. return self;
  36708. };
  36709. TextEditor.prototype.getValue = function getValue () {
  36710. var self = this;
  36711. return self.value;
  36712. };
  36713. TextEditor.prototype.createLink = function createLink () {
  36714. var self = this;
  36715. var currentSelection = win.getSelection();
  36716. var selectedNodes = [];
  36717. var $selectedLinks;
  36718. if (currentSelection && currentSelection.anchorNode && $(currentSelection.anchorNode).parents(self.$el).length) {
  36719. var anchorNode = currentSelection.anchorNode;
  36720. while (anchorNode) {
  36721. selectedNodes.push(anchorNode);
  36722. if (!anchorNode.nextSibling || anchorNode === currentSelection.focusNode) {
  36723. anchorNode = null;
  36724. }
  36725. if (anchorNode) {
  36726. anchorNode = anchorNode.nextSibling;
  36727. }
  36728. }
  36729. $selectedLinks = $(selectedNodes).closest('a').add($(selectedNodes).children('a'));
  36730. }
  36731. if ($selectedLinks && $selectedLinks.length) {
  36732. $selectedLinks.each(function (linkIndex, linkNode) {
  36733. var selection = win.getSelection();
  36734. var range = doc.createRange();
  36735. range.selectNodeContents(linkNode);
  36736. selection.removeAllRanges();
  36737. selection.addRange(range);
  36738. doc.execCommand('unlink', false);
  36739. selection.removeAllRanges();
  36740. });
  36741. return self;
  36742. }
  36743. var currentRange = self.getSelectionRange();
  36744. if (!currentRange) { return self; }
  36745. var dialog = self.app.dialog.prompt(self.params.linkUrlText, '', function (link) {
  36746. if (link && link.trim().length) {
  36747. self.setSelectionRange(currentRange);
  36748. doc.execCommand('createLink', false, link.trim());
  36749. }
  36750. });
  36751. dialog.$el.find('input').focus();
  36752. return self;
  36753. };
  36754. TextEditor.prototype.insertImage = function insertImage () {
  36755. var self = this;
  36756. var currentRange = self.getSelectionRange();
  36757. if (!currentRange) { return self; }
  36758. var dialog = self.app.dialog.prompt(self.params.imageUrlText, '', function (imageUrl) {
  36759. if (imageUrl && imageUrl.trim().length) {
  36760. self.setSelectionRange(currentRange);
  36761. doc.execCommand('insertImage', false, imageUrl.trim());
  36762. }
  36763. });
  36764. dialog.$el.find('input').focus();
  36765. return self;
  36766. };
  36767. TextEditor.prototype.removePlaceholder = function removePlaceholder () {
  36768. var self = this;
  36769. self.$contentEl.find('.text-editor-placeholder').remove();
  36770. };
  36771. TextEditor.prototype.insertPlaceholder = function insertPlaceholder () {
  36772. var self = this;
  36773. self.$contentEl.append(("<div class=\"text-editor-placeholder\">" + (self.params.placeholder) + "</div>"));
  36774. };
  36775. TextEditor.prototype.onSelectionChange = function onSelectionChange () {
  36776. var self = this;
  36777. if (self.params.mode === 'toolbar') { return; }
  36778. var selection = win.getSelection();
  36779. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  36780. if (self.params.mode === 'keyboard-toolbar') {
  36781. if (!selectionIsInContent) {
  36782. self.closeKeyboardToolbar();
  36783. } else {
  36784. self.openKeyboardToolbar();
  36785. }
  36786. return;
  36787. }
  36788. if (self.params.mode === 'popover') {
  36789. var selectionIsInPopover = $(selection.anchorNode).parents(self.popover.el).length || selection.anchorNode === self.popover.el;
  36790. if (!selectionIsInContent && !selectionIsInPopover) {
  36791. self.closePopover();
  36792. return;
  36793. }
  36794. if (!selection.isCollapsed && selection.rangeCount) {
  36795. var range = selection.getRangeAt(0);
  36796. var rect = range.getBoundingClientRect();
  36797. var rootEl = self.app.root[0] || doc.body;
  36798. self.openPopover(rect.x + (win.scrollX || 0) - rootEl.offsetLeft, rect.y + (win.scrollY || 0) - rootEl.offsetTop, rect.width, rect.height);
  36799. } else if (selection.isCollapsed) {
  36800. self.closePopover();
  36801. }
  36802. }
  36803. };
  36804. TextEditor.prototype.onPaste = function onPaste (e) {
  36805. var self = this;
  36806. if (self.params.clearFormattingOnPaste && e.clipboardData && e.clipboardData.getData) {
  36807. var text = e.clipboardData.getData('text/plain');
  36808. e.preventDefault();
  36809. doc.execCommand('insertText', false, text);
  36810. }
  36811. };
  36812. TextEditor.prototype.onInput = function onInput () {
  36813. var self = this;
  36814. var value = self.$contentEl.html();
  36815. self.$el.trigger('texteditor:input');
  36816. self.emit('local:input textEditorInput', self);
  36817. self.value = value;
  36818. self.$el.trigger('texteditor:change', self.value);
  36819. self.emit('local::change textEditorChange', self, self.value);
  36820. };
  36821. TextEditor.prototype.onFocus = function onFocus () {
  36822. var self = this;
  36823. self.removePlaceholder();
  36824. self.$contentEl.focus();
  36825. self.$el.trigger('texteditor:focus');
  36826. self.emit('local::focus textEditorFocus', self);
  36827. };
  36828. TextEditor.prototype.onBlur = function onBlur () {
  36829. var self = this;
  36830. if (self.params.placeholder && self.$contentEl.html() === '') {
  36831. self.insertPlaceholder();
  36832. }
  36833. if (self.params.mode === 'popover') {
  36834. var selection = win.getSelection();
  36835. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  36836. var inPopover = doc.activeElement && self.popover && $(doc.activeElement).closest(self.popover.$el).length;
  36837. if (!inPopover && !selectionIsInContent) {
  36838. self.closePopover();
  36839. }
  36840. }
  36841. if (self.params.mode === 'keyboard-toolbar') {
  36842. var selection$1 = win.getSelection();
  36843. var selectionIsInContent$1 = $(selection$1.anchorNode).parents(self.contentEl).length || selection$1.anchorNode === self.contentEl;
  36844. if (!selectionIsInContent$1) {
  36845. self.closeKeyboardToolbar();
  36846. }
  36847. }
  36848. self.$el.trigger('texteditor:blur');
  36849. self.emit('local::blur textEditorBlur', self);
  36850. };
  36851. TextEditor.prototype.onButtonClick = function onButtonClick (e) {
  36852. var self = this;
  36853. var selection = win.getSelection();
  36854. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  36855. if (!selectionIsInContent) { return; }
  36856. var $buttonEl = $(e.target).closest('button');
  36857. if ($buttonEl.parents('form').length) {
  36858. e.preventDefault();
  36859. }
  36860. var button = $buttonEl.attr('data-button');
  36861. var buttonData = self.params.customButtons && self.params.customButtons[button];
  36862. if (!button || !(textEditorButtonsMap[button] || buttonData)) { return; }
  36863. $buttonEl.trigger('texteditor:buttonclick', button);
  36864. self.emit('local::buttonClick textEditorButtonClick', self, button);
  36865. if (buttonData) {
  36866. if (buttonData.onClick) { buttonData.onClick(self, $buttonEl[0]); }
  36867. return;
  36868. }
  36869. var command = textEditorButtonsMap[button][2];
  36870. if (command === 'createLink') {
  36871. self.createLink();
  36872. return;
  36873. }
  36874. if (command === 'insertImage') {
  36875. self.insertImage();
  36876. return;
  36877. }
  36878. if (command.indexOf('formatBlock') === 0) {
  36879. var tagName = command.split('.')[1];
  36880. var $anchorNode = $(selection.anchorNode);
  36881. if ($anchorNode.parents(tagName.toLowerCase()).length || $anchorNode.is(tagName)) {
  36882. doc.execCommand('formatBlock', false, 'div');
  36883. } else {
  36884. doc.execCommand('formatBlock', false, tagName);
  36885. }
  36886. return;
  36887. }
  36888. doc.execCommand(command, false);
  36889. };
  36890. // eslint-disable-next-line
  36891. TextEditor.prototype.getSelectionRange = function getSelectionRange () {
  36892. if (win.getSelection) {
  36893. var sel = win.getSelection();
  36894. if (sel.getRangeAt && sel.rangeCount) {
  36895. return sel.getRangeAt(0);
  36896. }
  36897. } else if (doc.selection && doc.selection.createRange) {
  36898. return doc.selection.createRange();
  36899. }
  36900. return null;
  36901. };
  36902. // eslint-disable-next-line
  36903. TextEditor.prototype.setSelectionRange = function setSelectionRange (range) {
  36904. if (range) {
  36905. if (win.getSelection) {
  36906. var sel = win.getSelection();
  36907. sel.removeAllRanges();
  36908. sel.addRange(range);
  36909. } else if (doc.selection && range.select) {
  36910. range.select();
  36911. }
  36912. }
  36913. };
  36914. TextEditor.prototype.renderButtons = function renderButtons () {
  36915. var self = this;
  36916. var html = '';
  36917. function renderButton(button) {
  36918. var iconClass = self.app.theme === 'md' ? 'material-icons' : 'f7-icons';
  36919. if (self.params.customButtons && self.params.customButtons[button]) {
  36920. var buttonData = self.params.customButtons[button];
  36921. return ("<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (buttonData.content || '') + "</button>");
  36922. }
  36923. if (!textEditorButtonsMap[button]) { return ''; }
  36924. var iconContent = textEditorButtonsMap[button][self.app.theme === 'md' ? 1 : 0];
  36925. return ("<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (iconContent.indexOf('<') >= 0 ? iconContent : ("<i class=\"" + iconClass + "\">" + iconContent + "</i>")) + "</button>").trim();
  36926. }
  36927. self.params.buttons.forEach(function (button, buttonIndex) {
  36928. if (Array.isArray(button)) {
  36929. button.forEach(function (b) {
  36930. html += renderButton(b);
  36931. });
  36932. if (buttonIndex < self.params.buttons.length - 1 && self.params.dividers) {
  36933. html += '<div class="text-editor-button-divider"></div>';
  36934. }
  36935. } else {
  36936. html += renderButton(button);
  36937. }
  36938. });
  36939. return html;
  36940. };
  36941. TextEditor.prototype.createToolbar = function createToolbar () {
  36942. var self = this;
  36943. self.$el.prepend(("<div class=\"text-editor-toolbar\">" + (self.renderButtons()) + "</div>"));
  36944. };
  36945. TextEditor.prototype.createKeyboardToolbar = function createKeyboardToolbar () {
  36946. var self = this;
  36947. var isDark = self.$el.closest('.theme-dark').length > 0 || self.app.device.prefersColorScheme() === 'dark';
  36948. self.$keyboardToolbarEl = $(("<div class=\"toolbar toolbar-bottom text-editor-keyboard-toolbar " + (isDark ? 'theme-dark' : '') + "\"><div class=\"toolbar-inner\">" + (self.renderButtons()) + "</div></div>"));
  36949. };
  36950. TextEditor.prototype.createPopover = function createPopover () {
  36951. var self = this;
  36952. var isDark = self.$el.closest('.theme-dark').length > 0;
  36953. self.popover = self.app.popover.create({
  36954. content: ("\n <div class=\"popover " + (isDark ? 'theme-light' : 'theme-dark') + " text-editor-popover\">\n <div class=\"popover-inner\">" + (self.renderButtons()) + "</div>\n </div>\n "),
  36955. closeByOutsideClick: false,
  36956. backdrop: false,
  36957. });
  36958. };
  36959. TextEditor.prototype.openKeyboardToolbar = function openKeyboardToolbar () {
  36960. var self = this;
  36961. if (self.$keyboardToolbarEl.parent(self.app.root).length) { return; }
  36962. self.$el.trigger('texteditor:keyboardopen');
  36963. self.emit('local::keyboardOpen textEditorKeyboardOpen', self);
  36964. self.app.root.append(self.$keyboardToolbarEl);
  36965. };
  36966. TextEditor.prototype.closeKeyboardToolbar = function closeKeyboardToolbar () {
  36967. var self = this;
  36968. self.$keyboardToolbarEl.remove();
  36969. self.$el.trigger('texteditor:keyboardclose');
  36970. self.emit('local::keyboardClose textEditorKeyboardClose', self);
  36971. };
  36972. TextEditor.prototype.openPopover = function openPopover (targetX, targetY, targetWidth, targetHeight) {
  36973. var self = this;
  36974. if (!self.popover) { return; }
  36975. Object.assign(self.popover.params, {
  36976. targetX: targetX,
  36977. targetY: targetY,
  36978. targetWidth: targetWidth,
  36979. targetHeight: targetHeight,
  36980. });
  36981. clearTimeout(self.popoverTimeout);
  36982. self.popoverTimeout = setTimeout(function () {
  36983. if (!self.popover) { return; }
  36984. if (self.popover.opened) {
  36985. self.popover.resize();
  36986. } else {
  36987. self.$el.trigger('texteditor:popoveropen');
  36988. self.emit('local::popoverOpen textEditorPopoverOpen', self);
  36989. self.popover.open();
  36990. }
  36991. }, 400);
  36992. };
  36993. TextEditor.prototype.closePopover = function closePopover () {
  36994. var self = this;
  36995. clearTimeout(self.popoverTimeout);
  36996. if (!self.popover || !self.popover.opened) { return; }
  36997. self.popoverTimeout = setTimeout(function () {
  36998. if (!self.popover) { return; }
  36999. self.$el.trigger('texteditor:popoverclose');
  37000. self.emit('local::popoverClose textEditorPopoverClose', self);
  37001. self.popover.close();
  37002. }, 400);
  37003. };
  37004. TextEditor.prototype.init = function init () {
  37005. var self = this;
  37006. if (self.value) {
  37007. self.$contentEl.html(self.value);
  37008. } else {
  37009. self.value = self.$contentEl.html();
  37010. }
  37011. if (self.params.placeholder && self.value === '') {
  37012. self.insertPlaceholder();
  37013. }
  37014. if (self.params.mode === 'toolbar') {
  37015. self.createToolbar();
  37016. } else if (self.params.mode === 'popover') {
  37017. self.createPopover();
  37018. } else if (self.params.mode === 'keyboard-toolbar') {
  37019. self.createKeyboardToolbar();
  37020. }
  37021. self.attachEvents();
  37022. self.$el.trigger('texteditor:init');
  37023. self.emit('local::init textEditorInit', self);
  37024. return self;
  37025. };
  37026. TextEditor.prototype.destroy = function destroy () {
  37027. var self = this;
  37028. self.$el.trigger('texteditor:beforedestroy');
  37029. self.emit('local::beforeDestroy textEditorBeforeDestroy', self);
  37030. self.detachEvents();
  37031. if (self.params.mode === 'keyboard-toolbar' && self.$keyboardToolbarEl) {
  37032. self.$keyboardToolbarEl.remove();
  37033. }
  37034. if (self.popover) {
  37035. self.popover.close(false);
  37036. self.popover.destroy();
  37037. }
  37038. delete self.$el[0].f7TextEditor;
  37039. Utils.deleteProps(self);
  37040. self = null;
  37041. };
  37042. return TextEditor;
  37043. }(Framework7Class));
  37044. var TextEditor$1 = {
  37045. name: 'textEditor',
  37046. params: {
  37047. textEditor: {
  37048. el: null,
  37049. mode: 'toolbar', // or 'popover'
  37050. value: undefined, // will use html content
  37051. customButtons: null,
  37052. buttons: [
  37053. ['bold', 'italic', 'underline', 'strikeThrough'],
  37054. ['orderedList', 'unorderedList'],
  37055. ['link', 'image'],
  37056. ['paragraph', 'h1', 'h2', 'h3'],
  37057. ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'],
  37058. ['subscript', 'superscript'],
  37059. ['indent', 'outdent'] ],
  37060. dividers: true,
  37061. imageUrlText: 'Insert image URL',
  37062. linkUrlText: 'Insert link URL',
  37063. placeholder: null,
  37064. clearFormattingOnPaste: true,
  37065. },
  37066. },
  37067. create: function create() {
  37068. var app = this;
  37069. app.textEditor = Utils.extend(
  37070. ConstructorMethods({
  37071. defaultSelector: '.text-editor',
  37072. constructor: TextEditor,
  37073. app: app,
  37074. domProp: 'f7TextEditor',
  37075. })
  37076. );
  37077. },
  37078. static: {
  37079. TextEditor: TextEditor,
  37080. },
  37081. on: {
  37082. tabMounted: function tabMounted(tabEl) {
  37083. var app = this;
  37084. $(tabEl).find('.text-editor-init').each(function (index, editorEl) {
  37085. var dataset = $(editorEl).dataset();
  37086. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  37087. });
  37088. },
  37089. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  37090. $(tabEl).find('.text-editor-init').each(function (index, editorEl) {
  37091. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  37092. });
  37093. },
  37094. pageInit: function pageInit(page) {
  37095. var app = this;
  37096. page.$el.find('.text-editor-init').each(function (index, editorEl) {
  37097. var dataset = $(editorEl).dataset();
  37098. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  37099. });
  37100. },
  37101. pageBeforeRemove: function pageBeforeRemove(page) {
  37102. page.$el.find('.text-editor-init').each(function (index, editorEl) {
  37103. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  37104. });
  37105. },
  37106. },
  37107. vnode: {
  37108. 'text-editor-init': {
  37109. insert: function insert(vnode) {
  37110. var app = this;
  37111. var editorEl = vnode.elm;
  37112. var dataset = $(editorEl).dataset();
  37113. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  37114. },
  37115. destroy: function destroy(vnode) {
  37116. var editorEl = vnode.elm;
  37117. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  37118. },
  37119. },
  37120. },
  37121. };
  37122. var Elevation = {
  37123. name: 'elevation',
  37124. };
  37125. var Typography = {
  37126. name: 'typography',
  37127. };
  37128. var ViAd = /*@__PURE__*/(function (Framework7Class) {
  37129. function ViAd(app, params) {
  37130. if ( params === void 0 ) params = {};
  37131. Framework7Class.call(this, params, [app]);
  37132. var vi = this;
  37133. if (!win.vi) {
  37134. throw new Error('Framework7: vi SDK not found.');
  37135. }
  37136. var orientation;
  37137. if (typeof win.orientation !== 'undefined') {
  37138. orientation = win.orientation === -90 || win.orientation === 90 ? 'horizontal' : 'vertical';
  37139. }
  37140. var defaults = Utils.extend(
  37141. {},
  37142. app.params.vi,
  37143. {
  37144. appId: app.id,
  37145. appVer: app.version,
  37146. language: app.language,
  37147. width: app.width,
  37148. height: app.height,
  37149. os: Device.os,
  37150. osVersion: Device.osVersion,
  37151. orientation: orientation,
  37152. }
  37153. );
  37154. // Extend defaults with modules params
  37155. vi.useModulesParams(defaults);
  37156. vi.params = Utils.extend(defaults, params);
  37157. var adParams = {};
  37158. var skipParams = ('on autoplay fallbackOverlay fallbackOverlayText enabled').split(' ');
  37159. Object.keys(vi.params).forEach(function (paramName) {
  37160. if (skipParams.indexOf(paramName) >= 0) { return; }
  37161. var paramValue = vi.params[paramName];
  37162. if ([null, undefined].indexOf(paramValue) >= 0) { return; }
  37163. adParams[paramName] = paramValue;
  37164. });
  37165. if (!vi.params.appId) {
  37166. throw new Error('Framework7: "app.id" is required to display an ad. Make sure you have specified it on app initialization.');
  37167. }
  37168. if (!vi.params.placementId) {
  37169. throw new Error('Framework7: "placementId" is required to display an ad.');
  37170. }
  37171. function onResize() {
  37172. var $viFrame = $('iframe#viAd');
  37173. if ($viFrame.length === 0) { return; }
  37174. $viFrame
  37175. .css({
  37176. width: ((app.width) + "px"),
  37177. height: ((app.height) + "px"),
  37178. });
  37179. }
  37180. function removeOverlay() {
  37181. if (!vi.$overlayEl) { return; }
  37182. vi.$overlayEl.off('click touchstart');
  37183. vi.$overlayEl.remove();
  37184. }
  37185. function createOverlay(videoEl) {
  37186. if (!videoEl) { return; }
  37187. 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());
  37188. var touchStartTime;
  37189. vi.$overlayEl.on('touchstart', function () {
  37190. touchStartTime = Utils.now();
  37191. });
  37192. vi.$overlayEl.on('click', function () {
  37193. var timeDiff = Utils.now() - touchStartTime;
  37194. if (timeDiff > 300) { return; }
  37195. if (videoEl) {
  37196. videoEl.play();
  37197. removeOverlay();
  37198. return;
  37199. }
  37200. vi.start();
  37201. removeOverlay();
  37202. });
  37203. app.root.append(vi.$overlayEl);
  37204. }
  37205. // Create ad
  37206. vi.ad = new win.vi.Ad(adParams);
  37207. Utils.extend(vi.ad, {
  37208. onAdReady: function onAdReady() {
  37209. app.on('resize', onResize);
  37210. vi.emit('local::ready');
  37211. if (vi.params.autoplay) {
  37212. vi.start();
  37213. }
  37214. },
  37215. onAdStarted: function onAdStarted() {
  37216. vi.emit('local::started');
  37217. },
  37218. onAdClick: function onAdClick(targetUrl) {
  37219. vi.emit('local::click', targetUrl);
  37220. },
  37221. onAdImpression: function onAdImpression() {
  37222. vi.emit('local::impression');
  37223. },
  37224. onAdStopped: function onAdStopped(reason) {
  37225. app.off('resize', onResize);
  37226. removeOverlay();
  37227. vi.emit('local::stopped', reason);
  37228. if (reason === 'complete') {
  37229. vi.emit('local::complete');
  37230. vi.emit('local::completed');
  37231. }
  37232. if (reason === 'userexit') {
  37233. vi.emit('local::userexit');
  37234. }
  37235. vi.destroyed = true;
  37236. },
  37237. onAutoPlayFailed: function onAutoPlayFailed(reason, videoEl) {
  37238. vi.emit('local::autoplayFailed', reason, videoEl);
  37239. if (reason && reason.name && reason.name.indexOf('NotAllowedError') !== -1 && vi.params.fallbackOverlay) {
  37240. createOverlay(videoEl);
  37241. }
  37242. },
  37243. onAdError: function onAdError(msg) {
  37244. removeOverlay();
  37245. app.off('resize', onResize);
  37246. vi.emit('local::error', msg);
  37247. vi.destroyed = true;
  37248. },
  37249. });
  37250. vi.init();
  37251. Utils.extend(vi, {
  37252. app: app,
  37253. });
  37254. }
  37255. if ( Framework7Class ) ViAd.__proto__ = Framework7Class;
  37256. ViAd.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  37257. ViAd.prototype.constructor = ViAd;
  37258. ViAd.prototype.start = function start () {
  37259. var vi = this;
  37260. if (vi.destroyed) { return; }
  37261. if (vi.ad) { vi.ad.startAd(); }
  37262. };
  37263. ViAd.prototype.pause = function pause () {
  37264. var vi = this;
  37265. if (vi.destroyed) { return; }
  37266. if (vi.ad) { vi.ad.pauseAd(); }
  37267. };
  37268. ViAd.prototype.resume = function resume () {
  37269. var vi = this;
  37270. if (vi.destroyed) { return; }
  37271. if (vi.ad) { vi.ad.resumeAd(); }
  37272. };
  37273. ViAd.prototype.stop = function stop () {
  37274. var vi = this;
  37275. if (vi.destroyed) { return; }
  37276. if (vi.ad) { vi.ad.stopAd(); }
  37277. };
  37278. ViAd.prototype.init = function init () {
  37279. var vi = this;
  37280. if (vi.destroyed) { return; }
  37281. if (vi.ad) { vi.ad.initAd(); }
  37282. };
  37283. ViAd.prototype.destroy = function destroy () {
  37284. var vi = this;
  37285. vi.destroyed = true;
  37286. vi.emit('local::beforeDestroy');
  37287. Utils.deleteProps(vi);
  37288. };
  37289. return ViAd;
  37290. }(Framework7Class));
  37291. var Vi = {
  37292. name: 'vi',
  37293. params: {
  37294. vi: {
  37295. enabled: false,
  37296. autoplay: true,
  37297. fallbackOverlay: true,
  37298. fallbackOverlayText: 'Please watch this ad',
  37299. showMute: true,
  37300. startMuted: (Device.ios || Device.android) && !Device.cordova,
  37301. appId: null,
  37302. appVer: null,
  37303. language: null,
  37304. width: null,
  37305. height: null,
  37306. placementId: 'pltd4o7ibb9rc653x14',
  37307. placementType: 'interstitial',
  37308. videoSlot: null,
  37309. showProgress: true,
  37310. showBranding: true,
  37311. os: null,
  37312. osVersion: null,
  37313. orientation: null,
  37314. age: null,
  37315. gender: null,
  37316. advertiserId: null,
  37317. latitude: null,
  37318. longitude: null,
  37319. accuracy: null,
  37320. storeId: null,
  37321. ip: null,
  37322. manufacturer: null,
  37323. model: null,
  37324. connectionType: null,
  37325. connectionProvider: null,
  37326. },
  37327. },
  37328. create: function create() {
  37329. var app = this;
  37330. app.vi = {
  37331. sdkReady: false,
  37332. createAd: function createAd(adParams) {
  37333. return new ViAd(app, adParams);
  37334. },
  37335. loadSdk: function loadSdk() {
  37336. if (app.vi.sdkReady) { return; }
  37337. var script = doc.createElement('script');
  37338. script.onload = function onload() {
  37339. app.emit('viSdkReady');
  37340. app.vi.sdkReady = true;
  37341. };
  37342. script.src = 'https://c.vi-serve.com/viadshtml/vi.min.js';
  37343. $('head').append(script);
  37344. },
  37345. };
  37346. },
  37347. on: {
  37348. init: function init() {
  37349. var app = this;
  37350. if (app.params.vi.enabled || (app.passedParams.vi && app.passedParams.vi.enabled !== false)) { app.vi.loadSdk(); }
  37351. },
  37352. },
  37353. };
  37354. /**
  37355. * Framework7 5.7.14
  37356. * Full featured mobile HTML framework for building iOS & Android apps
  37357. * https://framework7.io/
  37358. *
  37359. * Copyright 2014-2020 Vladimir Kharlampidi
  37360. *
  37361. * Released under the MIT License
  37362. *
  37363. * Released on: November 9, 2020
  37364. */
  37365. // Install Core Modules & Components
  37366. Framework7.use([
  37367. DeviceModule,
  37368. SupportModule,
  37369. UtilsModule,
  37370. ResizeModule,
  37371. RequestModule,
  37372. TouchModule,
  37373. ClicksModule,
  37374. RouterModule,
  37375. HistoryModule,
  37376. ServiceWorkerModule,
  37377. Statusbar$1,
  37378. View$1,
  37379. Navbar$1,
  37380. Toolbar$1,
  37381. Subnavbar,
  37382. TouchRipple$1,
  37383. Modal$1,
  37384. Appbar,
  37385. Dialog$1,
  37386. Popup$1,
  37387. LoginScreen$1,
  37388. Popover$1,
  37389. Actions$1,
  37390. Sheet$1,
  37391. Toast$1,
  37392. Preloader$1,
  37393. Progressbar$1,
  37394. Sortable$1,
  37395. Swipeout$1,
  37396. Accordion$1,
  37397. ContactsList,
  37398. VirtualList$1,
  37399. ListIndex$1,
  37400. Timeline,
  37401. Tabs,
  37402. Panel$1,
  37403. Card,
  37404. Chip,
  37405. Form,
  37406. Input$1,
  37407. Checkbox,
  37408. Radio,
  37409. Toggle$1,
  37410. Range$1,
  37411. Stepper$1,
  37412. SmartSelect$1,
  37413. Grid$1,
  37414. Calendar$1,
  37415. Picker$1,
  37416. InfiniteScroll$1,
  37417. PullToRefresh$1,
  37418. Lazy$1,
  37419. DataTable$1,
  37420. Fab$1,
  37421. Searchbar$1,
  37422. Messages$1,
  37423. Messagebar$1,
  37424. Swiper$1,
  37425. PhotoBrowser$1,
  37426. Notification$1,
  37427. Autocomplete$1,
  37428. Tooltip$1,
  37429. Gauge$1,
  37430. Skeleton,
  37431. Menu$1,
  37432. ColorPicker$1,
  37433. Treeview$1,
  37434. TextEditor$1,
  37435. Elevation,
  37436. Typography,
  37437. Vi
  37438. ]);
  37439. return Framework7;
  37440. })));