[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"swiper\",\n  \"projectOwner\": \"nolimits4web\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"files\": [\n    \"CODE_CONTRIBUTORS.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"nolimits4web\",\n      \"name\": \"Vladimir Kharlampidi\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/999588?v=4\",\n      \"profile\": \"https://github.com/nolimits4web\",\n      \"contributions\": [\n        \"code\",\n        \"maintenance\",\n        \"infra\",\n        \"question\",\n        \"doc\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"vltansky\",\n      \"name\": \"Vlad Tansky\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5851280?v=4\",\n      \"profile\": \"https://github.com/vltansky\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"DAnn2012\",\n      \"name\": \"DAnn2012\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1197819?v=4\",\n      \"profile\": \"https://github.com/DAnn2012\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"stephanebachelier\",\n      \"name\": \"Stéphane Bachelier\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/172615?v=4\",\n      \"profile\": \"https://github.com/stephanebachelier\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"robpop\",\n      \"name\": \"Robert F. Popeleski\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/13895584?v=4\",\n      \"profile\": \"https://github.com/robpop\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ygj6\",\n      \"name\": \"yuangongji\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/7699524?v=4\",\n      \"profile\": \"https://github.com/ygj6\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"imjohansunden\",\n      \"name\": \"Johan Sundén\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/19605741?v=4\",\n      \"profile\": \"https://github.com/imjohansunden\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"netcitylife\",\n      \"name\": \"Dmitry\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2089893?v=4\",\n      \"profile\": \"https://github.com/netcitylife\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"andyburke\",\n      \"name\": \"Andy Burke\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/273857?v=4\",\n      \"profile\": \"https://github.com/andyburke\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tzvikaf\",\n      \"name\": \"Tzvika Farber\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/13975372?v=4\",\n      \"profile\": \"https://github.com/tzvikaf\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"callumacrae\",\n      \"name\": \"Callum Macrae\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/472830?v=4\",\n      \"profile\": \"http://macr.ae/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jasonlav\",\n      \"name\": \"jasonlav\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/7593912?v=4\",\n      \"profile\": \"https://github.com/jasonlav\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"shashank1010\",\n      \"name\": \"Shashank Agarwal\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3106368?v=4\",\n      \"profile\": \"https://plus.google.com/u/0/114487431636655655146\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kochizufan\",\n      \"name\": \"Kohei Otsuka\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2221431?v=4\",\n      \"profile\": \"https://github.com/kochizufan\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Triloworld\",\n      \"name\": \"Patryk Padus\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2671726?v=4\",\n      \"profile\": \"https://www.webo.agency/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"icek\",\n      \"name\": \"Grzegorz Michlicki\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/150243?v=4\",\n      \"profile\": \"http://fatcode.pl/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"justingrant\",\n      \"name\": \"Justin Grant\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/277214?v=4\",\n      \"profile\": \"http://cantaloupesys.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"OrbintSoft\",\n      \"name\": \"Stefano Balzarotti\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6378748?v=4\",\n      \"profile\": \"https://github.com/OrbintSoft\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"fenyagg\",\n      \"name\": \"Dmitry Chernyshev\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2457209?v=4\",\n      \"profile\": \"https://github.com/fenyagg\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ghaiat\",\n      \"name\": \"Gilles Haiat\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5446909?v=4\",\n      \"profile\": \"http://www.yoobic.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"weiz18\",\n      \"name\": \"weiz18\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42139732?v=4\",\n      \"profile\": \"https://github.com/weiz18\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kireerik\",\n      \"name\": \"Erik Engi\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3628043?v=4\",\n      \"profile\": \"https://oengi.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"GalCohen\",\n      \"name\": \"Gal Cohen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1293368?v=4\",\n      \"profile\": \"https://github.com/GalCohen\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mrtnbroder\",\n      \"name\": \"Martin Broder\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1118826?v=4\",\n      \"profile\": \"https://martinbroder.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Rikk\",\n      \"name\": \"Ricardo\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2916485?v=4\",\n      \"profile\": \"https://github.com/Rikk\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"roman01la\",\n      \"name\": \"Roman Liutikov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1355501?v=4\",\n      \"profile\": \"https://romanliutikov.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"baxang\",\n      \"name\": \"Sanghyun Park\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/196302?v=4\",\n      \"profile\": \"http://baxang.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"girliemac\",\n      \"name\": \"Tomomi ❤ Imura\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/107763?v=4\",\n      \"profile\": \"https://girliemac.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jenemde\",\n      \"name\": \"jenemde\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/53625399?v=4\",\n      \"profile\": \"https://github.com/jenemde\",\n      \"contributions\": [\n        \"code\",\n        \"a11y\"\n      ]\n    },\n    {\n      \"login\": \"navyxie\",\n      \"name\": \"navy\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1982716?v=4\",\n      \"profile\": \"http://www.navyxie.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"1sergiogarciap\",\n      \"name\": \"1sergiogarciap\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/64509552?v=4\",\n      \"profile\": \"https://github.com/1sergiogarciap\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"azaslavsky\",\n      \"name\": \"Alex Zaslavsky\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3709945?v=4\",\n      \"profile\": \"https://github.com/azaslavsky\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"andreybs11\",\n      \"name\": \"Andrey Bolaños Sandoval\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1462803?v=4\",\n      \"profile\": \"https://github.com/andreybs11\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"exodusanto\",\n      \"name\": \"Antonio Dal Sie\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/13484843?v=4\",\n      \"profile\": \"https://antoniodalsie.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tremby\",\n      \"name\": \"Bart Nagel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/199635?v=4\",\n      \"profile\": \"https://bartnagel.ca/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Garbanas\",\n      \"name\": \"Christoph Dörfel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2815411?v=4\",\n      \"profile\": \"https://github.com/Garbanas\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"DKvistgaard\",\n      \"name\": \"Daniel Kvistgaard\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1705203?v=4\",\n      \"profile\": \"https://github.com/DKvistgaard\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"danijelGombac\",\n      \"name\": \"Danijel Gombač\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3872726?v=4\",\n      \"profile\": \"http://www.gombac.si/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dy\",\n      \"name\": \"Dmitry IV.\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/300067?v=4\",\n      \"profile\": \"https://twitter.com/dimayv\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"eklingen\",\n      \"name\": \"Elco Klingen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/716683?v=4\",\n      \"profile\": \"https://elcoklingen.nl/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"OxyDesign\",\n      \"name\": \"Nicolas Escoffier\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2378180?v=4\",\n      \"profile\": \"http://www.oxydesign.fr/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Evidica\",\n      \"name\": \"Patrick Mallahan\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6105827?v=4\",\n      \"profile\": \"https://github.com/Evidica\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"zhiru\",\n      \"name\": \"Felipe\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4226997?v=4\",\n      \"profile\": \"https://aireset.com.br/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"garrettmaring\",\n      \"name\": \"Garrett Maring\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8270120?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/garrettmaringdev\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"joejoseph00\",\n      \"name\": \"Joseph Olstad\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1028526?v=4\",\n      \"profile\": \"https://github.com/joejoseph00\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kostyabushuev\",\n      \"name\": \"Kostya Bushuev\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/31274471?v=4\",\n      \"profile\": \"https://github.com/kostyabushuev\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"marwej\",\n      \"name\": \"Marcus Wejderot\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5296840?v=4\",\n      \"profile\": \"https://mevisio.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cfxd\",\n      \"name\": \"CFX\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1671933?v=4\",\n      \"profile\": \"https://github.com/cfxd\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Mrliuchanghao\",\n      \"name\": \"HoH-World\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/30208835?v=4\",\n      \"profile\": \"https://github.com/Mrliuchanghao\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"websirnik\",\n      \"name\": \"Nikita Korotaev\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/282871?v=4\",\n      \"profile\": \"https://relayto.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"katerlouis\",\n      \"name\": \"René Eschke\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1983382?v=4\",\n      \"profile\": \"https://github.com/katerlouis\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ryanzec\",\n      \"name\": \"Ryan Zec\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/444206?v=4\",\n      \"profile\": \"http://www.ryanzec.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"SablinSergey\",\n      \"name\": \"Sergey Sablin\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/12068136?v=4\",\n      \"profile\": \"https://github.com/SablinSergey\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tobiasstrebitzer\",\n      \"name\": \"Tobias Strebitzer\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/222509?v=4\",\n      \"profile\": \"http://www.magloft.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"X4arms\",\n      \"name\": \"X4arms\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1517616?v=4\",\n      \"profile\": \"https://github.com/X4arms\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"a-barbieri\",\n      \"name\": \"Alessandro\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1528468?v=4\",\n      \"profile\": \"http://lacolonia.studio/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"amnausman\",\n      \"name\": \"amnausman\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/20682461?v=4\",\n      \"profile\": \"https://github.com/amnausman\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"crutch12\",\n      \"name\": \"Konstantin Barabanov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/19373212?v=4\",\n      \"profile\": \"https://github.com/crutch12\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"michaelWoe\",\n      \"name\": \"michaelWoe\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/49037485?v=4\",\n      \"profile\": \"https://github.com/michaelWoe\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"timothyhague\",\n      \"name\": \"timothyhague\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/9559835?v=4\",\n      \"profile\": \"https://github.com/timothyhague\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hsxfjames\",\n      \"name\": \"Yaojun Zheng\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8982188?v=4\",\n      \"profile\": \"http://www.cnblogs.com/blackstorm\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"raahede\",\n      \"name\": \"Frej Raahede Nielsen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/391833?v=4\",\n      \"profile\": \"https://github.com/raahede\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mzkmzk\",\n      \"name\": \"404_K\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4627170?v=4\",\n      \"profile\": \"https://github.com/mzkmzk\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"voxtex\",\n      \"name\": \"Adam\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/735455?v=4\",\n      \"profile\": \"https://github.com/voxtex\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"promoinvideo\",\n      \"name\": \"Alberto Cobre\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/10633232?v=4\",\n      \"profile\": \"https://github.com/promoinvideo\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"alejandroiglesias\",\n      \"name\": \"Alejandro García Iglesias\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/480640?v=4\",\n      \"profile\": \"https://alejandroiglesias.github.io/cv/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"anneke\",\n      \"name\": \"Anneke Sinnema\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/7202272?v=4\",\n      \"profile\": \"https://annekesinnema.nl/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kosminen\",\n      \"name\": \"Anssi Hautamäki\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1532140?v=4\",\n      \"profile\": \"https://github.com/kosminen\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"anteprimorac\",\n      \"name\": \"Ante Primorac\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/972083?v=4\",\n      \"profile\": \"http://anteprimorac.com.hr/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hanoii\",\n      \"name\": \"Ariel Barreiro\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/677879?v=4\",\n      \"profile\": \"https://github.com/hanoii\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"arthurpf\",\n      \"name\": \"Arthur Franco\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2388720?v=4\",\n      \"profile\": \"https://arthurpf.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"austinknight\",\n      \"name\": \"Austin Knight\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1007248?v=4\",\n      \"profile\": \"http://www.austinknight.net/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"justb81\",\n      \"name\": \"Bastian Rang\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3680539?v=4\",\n      \"profile\": \"https://github.com/justb81\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"bitdeli-chef\",\n      \"name\": \"Bitdeli Chef\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3092978?v=4\",\n      \"profile\": \"https://bitdeli.com/free\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Brightcells\",\n      \"name\": \"Kimi.Huang\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5810063?v=4\",\n      \"profile\": \"https://pypi.org/user/Hackathon/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"brunolm\",\n      \"name\": \"BrunoLM\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/706078?v=4\",\n      \"profile\": \"https://brunolm.com/blog\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Chepheus\",\n      \"name\": \"Cepheus\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/9037206?v=4\",\n      \"profile\": \"https://github.com/Chepheus\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Chun-Yang\",\n      \"name\": \"yang2007chun\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2827867?v=4\",\n      \"profile\": \"https://trentyang.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"DanielRuf\",\n      \"name\": \"Daniel Ruf\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/827205?v=4\",\n      \"profile\": \"https://daniel-ruf.de/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dfvalero\",\n      \"name\": \"David Fernandez\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/337955?v=4\",\n      \"profile\": \"https://github.com/dfvalero\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"davgothic\",\n      \"name\": \"David Hancock\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/158586?v=4\",\n      \"profile\": \"http://davidhancock.co/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cartok\",\n      \"name\": \"cartok\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/22181589?v=4\",\n      \"profile\": \"https://github.com/cartok\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"izifortune\",\n      \"name\": \"Fabrizio Fortunato\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3394606?v=4\",\n      \"profile\": \"https://izifortune.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"FishErr\",\n      \"name\": \"FishErr\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/742467?v=4\",\n      \"profile\": \"https://github.com/FishErr\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"fritzmg\",\n      \"name\": \"Fritz Michael Gschwantner\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4970961?v=4\",\n      \"profile\": \"https://github.com/fritzmg\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"glebmachine\",\n      \"name\": \"Gleb Mikheev\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1610882?v=4\",\n      \"profile\": \"http://betaagency.ru/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"TatumCreative\",\n      \"name\": \"TatumCreative\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/22155328?v=4\",\n      \"profile\": \"https://github.com/gregtatum\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hanjukim\",\n      \"name\": \"Paul Kim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1264116?v=4\",\n      \"profile\": \"https://github.com/hanjukim\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"HeadFox\",\n      \"name\": \"Lucien PESLIER\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6277284?v=4\",\n      \"profile\": \"https://github.com/HeadFox\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"HerringtonDarkholme\",\n      \"name\": \"Herrington Darkholme\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2883231?v=4\",\n      \"profile\": \"https://github.com/HerringtonDarkholme\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"IronKinoko\",\n      \"name\": \"IronKinoko\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/32838658?v=4\",\n      \"profile\": \"https://github.com/IronKinoko\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"stonebranch\",\n      \"name\": \"Jakob Stenqvist\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/87466?v=4\",\n      \"profile\": \"https://jakobstenqvist.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"sconix\",\n      \"name\": \"Janne Julkunen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/921515?v=4\",\n      \"profile\": \"https://github.com/sconix\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jasonkuhrt\",\n      \"name\": \"Jason Kuhrt\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/284476?v=4\",\n      \"profile\": \"https://github.com/jasonkuhrt\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"Manduro\",\n      \"name\": \"Job\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2545042?v=4\",\n      \"profile\": \"https://github.com/Manduro\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"johnferrie\",\n      \"name\": \"John Ferrie\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1991460?v=4\",\n      \"profile\": \"https://github.com/johnferrie\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"sakuraineed\",\n      \"name\": \"Kenji Sakurai\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4065624?v=4\",\n      \"profile\": \"https://github.com/sakuraineed\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"careykevin\",\n      \"name\": \"Kevin Carey\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/9685146?v=4\",\n      \"profile\": \"http://www.linkedin.com/in/careykevin\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"klojniewski-pagepro\",\n      \"name\": \"Chris (Krzysztof) Lojniewski\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/245971?v=4\",\n      \"profile\": \"http://pagepro.pl/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ljanecek\",\n      \"name\": \"Ladislav Janeček\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2696545?v=4\",\n      \"profile\": \"https://twitter.com/ladislavjanecek\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"luads\",\n      \"name\": \"Luã de Souza\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/194708?v=4\",\n      \"profile\": \"http://www.lsouza.pro.br/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"luis-kaufmann-silva\",\n      \"name\": \"Luis\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1151616?v=4\",\n      \"profile\": \"https://wiserdev.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"blikblum\",\n      \"name\": \"Luiz Américo\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3047126?v=4\",\n      \"profile\": \"https://github.com/blikblum\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"LukasDrgon\",\n      \"name\": \"Lukas Drgon\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/15611832?v=4\",\n      \"profile\": \"https://github.com/LukasDrgon\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"waffle-iron\",\n      \"name\": \"Making GitHub Delicious.\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6912981?v=4\",\n      \"profile\": \"https://github.com/waffle-iron\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"silvenon\",\n      \"name\": \"Matija Marohnić\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/471278?v=4\",\n      \"profile\": \"https://silvenon.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"damrbaby\",\n      \"name\": \"Matthew Windwer\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/237580?v=4\",\n      \"profile\": \"https://github.com/damrbaby\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mehernosh\",\n      \"name\": \"Mehernosh Bhathena\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1410232?v=4\",\n      \"profile\": \"https://github.com/mehernosh\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mems\",\n      \"name\": \"Memmie Lenglet\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/729275?v=4\",\n      \"profile\": \"https://memmie.lenglet.name/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mibo-fdc\",\n      \"name\": \"Michael Bohn\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/70259891?v=4\",\n      \"profile\": \"https://github.com/mibo-fdc\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"wodka\",\n      \"name\": \"Michael Schramm\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/385731?v=4\",\n      \"profile\": \"https://github.com/wodka\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mhartington\",\n      \"name\": \"Mike Hartington\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2835826?v=4\",\n      \"profile\": \"https://twitter.com/mhartington\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mitchheddles\",\n      \"name\": \"Mitchell Heddles\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/20656128?v=4\",\n      \"profile\": \"https://mitch.app/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"NLNicoo\",\n      \"name\": \"Nico\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6526666?v=4\",\n      \"profile\": \"https://github.com/NLNicoo\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"nil-ni-ck\",\n      \"name\": \"Nil\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8202448?v=4\",\n      \"profile\": \"https://github.com/nil-ni-ck\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pawl\",\n      \"name\": \"Paul Brown\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/992533?v=4\",\n      \"profile\": \"http://paulsprogrammingnotes.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pbalmasov\",\n      \"name\": \"Pavel Balmasov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3986749?v=4\",\n      \"profile\": \"https://github.com/pbalmasov\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"czajkowski\",\n      \"name\": \"Piotr Czajkowski\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/197684?v=4\",\n      \"profile\": \"https://github.com/czajkowski\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"PythonLinks\",\n      \"name\": \"PythonLinks\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/34622952?v=4\",\n      \"profile\": \"https://github.com/PythonLinks\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"rayvincent-bsd\",\n      \"name\": \"rayvincent-bsd\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/41829998?v=4\",\n      \"profile\": \"https://github.com/rayvincent-bsd\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"RomanYazvinsky\",\n      \"name\": \"RomanYazvinsky\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/32144682?v=4\",\n      \"profile\": \"https://github.com/RomanYazvinsky\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"rrelmy\",\n      \"name\": \"Rémy\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/442683?v=4\",\n      \"profile\": \"https://remyboehler.ch/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"KSH-code\",\n      \"name\": \"Seonghoon Kim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/29705162?v=4\",\n      \"profile\": \"http://ksh-code.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"isairz\",\n      \"name\": \"Seongjun Kim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/4544327?v=4\",\n      \"profile\": \"https://github.com/isairz\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dippas\",\n      \"name\": \"Serpa\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/10220287?v=4\",\n      \"profile\": \"http://stackoverflow.com/users/3448527/dippas\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"staszek998\",\n      \"name\": \"Stanisław Gregor\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/34459296?v=4\",\n      \"profile\": \"http://staszek.codes/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"steve3d\",\n      \"name\": \"Steve Yin\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/670687?v=4\",\n      \"profile\": \"https://github.com/steve3d\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"seastland\",\n      \"name\": \"Steven Eastland\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3535053?v=4\",\n      \"profile\": \"http://www.grassmonk.net/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"soenkekluth\",\n      \"name\": \"Sönke Kluth\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/201338?v=4\",\n      \"profile\": \"https://soenkekluth.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"gitter-badger\",\n      \"name\": \"The Gitter Badger\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8518239?v=4\",\n      \"profile\": \"https://gitter.im/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dogoku\",\n      \"name\": \"Theo\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/761999?v=4\",\n      \"profile\": \"https://github.com/dogoku\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"timgates42\",\n      \"name\": \"Tim Gates\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/47873678?v=4\",\n      \"profile\": \"https://github.com/timgates42\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tom-sherman\",\n      \"name\": \"Tom Sherman\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/9257001?v=4\",\n      \"profile\": \"https://tom-sherman.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"WarriorRocker\",\n      \"name\": \"WarriorRocker\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2924540?v=4\",\n      \"profile\": \"https://github.com/WarriorRocker\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"omgovich\",\n      \"name\": \"Vlad Shilov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/206567?v=4\",\n      \"profile\": \"https://github.com/omgovich\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"vladgurovich\",\n      \"name\": \"Vladimir Gurovich\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/444833?v=4\",\n      \"profile\": \"http://vlad.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"VladimirIvanin\",\n      \"name\": \"Vladimir Ivanin\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/15268753?v=4\",\n      \"profile\": \"https://github.com/VladimirIvanin\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"TreVld\",\n      \"name\": \"TreVld\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/42523020?v=4\",\n      \"profile\": \"https://github.com/TreVld\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"waghcwb\",\n      \"name\": \"Wagner Souza\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6169950?v=4\",\n      \"profile\": \"https://www.linkedin.com/in/waghcwb\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"codesignist\",\n      \"name\": \"Yunus EŞ\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1472881?v=4\",\n      \"profile\": \"http://yunuses.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"axten\",\n      \"name\": \"axten\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1412778?v=4\",\n      \"profile\": \"https://github.com/axten\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ccebrand\",\n      \"name\": \"Cyrille\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/818237?v=4\",\n      \"profile\": \"http://www.moustic.biz/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"daleknauss\",\n      \"name\": \"Dale Knauss\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2430232?v=4\",\n      \"profile\": \"http://daleknauss.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"danielkalen\",\n      \"name\": \"Daniel Kalen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/10832620?v=4\",\n      \"profile\": \"https://github.com/danielkalen\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"dependabot[bot]\",\n      \"name\": \"dependabot[bot]\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/in/29110?v=4\",\n      \"profile\": \"https://github.com/apps/dependabot\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"devmi\",\n      \"name\": \"devmi\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/19313261?v=4\",\n      \"profile\": \"https://github.com/devmi\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"fabrizim\",\n      \"name\": \"fabrizim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/79165?v=4\",\n      \"profile\": \"https://owlwatch.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"hiroqn\",\n      \"name\": \"hiroqn\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/909385?v=4\",\n      \"profile\": \"https://github.com/hiroqn\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jamesryanbell\",\n      \"name\": \"James Bell\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1842481?v=4\",\n      \"profile\": \"https://james-bell.co.uk/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"knusperpixel\",\n      \"name\": \"knusperpixel\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1455404?v=4\",\n      \"profile\": \"https://github.com/knusperpixel\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"langjun\",\n      \"name\": \"langjun\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/7370806?v=4\",\n      \"profile\": \"https://langjun.github.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"lenny0702\",\n      \"name\": \"Lenny\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2850927?v=4\",\n      \"profile\": \"https://github.com/lenny0702\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mattdemps\",\n      \"name\": \"Matt\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2694295?v=4\",\n      \"profile\": \"https://github.com/mattdemps\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"n3gotium\",\n      \"name\": \"n3gotium\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3309521?v=4\",\n      \"profile\": \"https://github.com/n3gotium\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"naedx\",\n      \"name\": \"naedx\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1711099?v=4\",\n      \"profile\": \"https://github.com/naedx\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"nealnote\",\n      \"name\": \"nealnote\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3173785?v=4\",\n      \"profile\": \"https://github.com/nealnote\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"osamaalsabbagh\",\n      \"name\": \"osamaalsabbagh\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2883742?v=4\",\n      \"profile\": \"https://github.com/osamaalsabbagh\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pantcaser\",\n      \"name\": \"pantcaser\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/33579079?v=4\",\n      \"profile\": \"https://github.com/pantcaser\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ph1p\",\n      \"name\": \"Phil\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/15351728?v=4\",\n      \"profile\": \"https://ph1p.dev/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pimlie\",\n      \"name\": \"Pim\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1067403?v=4\",\n      \"profile\": \"https://github.com/pimlie\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"andrey-glotov\",\n      \"name\": \"Andrey A. Glotov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1656509?v=4\",\n      \"profile\": \"https://github.com/andrey-glotov\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"rdsn\",\n      \"name\": \"rdsn\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3916181?v=4\",\n      \"profile\": \"https://github.com/rdsn\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"shahjehanali1\",\n      \"name\": \"Shahjehan Ali\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/8455072?v=4\",\n      \"profile\": \"https://github.com/shahjehanali1\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"JoveX\",\n      \"name\": \"清泉古雾\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1560179?v=4\",\n      \"profile\": \"http://jser.io/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"kashtian\",\n      \"name\": \"kashtian\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/17918091?v=4\",\n      \"profile\": \"https://github.com/kashtian\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"tienbuide\",\n      \"name\": \"tienbuide\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2574700?v=4\",\n      \"profile\": \"https://github.com/tienbuide\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"unicod3\",\n      \"name\": \"Sinan Ülker\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/2614110?v=4\",\n      \"profile\": \"https://github.com/unicod3\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"vaxul\",\n      \"name\": \"vaxul\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3798226?v=4\",\n      \"profile\": \"https://github.com/vaxul\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"wolffan\",\n      \"name\": \"Raimon Lapuente\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1092080?v=4\",\n      \"profile\": \"http://raimonlapuente.com/\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"yukulele\",\n      \"name\": \"Clément P\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/347244?v=4\",\n      \"profile\": \"https://github.com/yukulele\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"aPalenov\",\n      \"name\": \"Андрей\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/20544542?v=4\",\n      \"profile\": \"https://github.com/aPalenov\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"beomy\",\n      \"name\": \"이효범\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6986479?v=4\",\n      \"profile\": \"https://github.com/beomy\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"philwolstenholme\",\n      \"name\": \"Phil Wolstenholme\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/6339853?v=4\",\n      \"profile\": \"https://wolstenhol.me/\",\n      \"contributions\": [\n        \"a11y\"\n      ]\n    },\n    {\n      \"login\": \"shahjehan-wpbrigade\",\n      \"name\": \"Shahjehan Ali\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/65647117?v=4\",\n      \"profile\": \"https://github.com/shahjehan-wpbrigade\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"commitConvention\": \"none\",\n  \"skipCi\": true\n}\n"
  },
  {
    "path": ".browserslistrc",
    "content": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n\n# For additional information regarding the format and rule options, please see:\n\n# https://github.com/browserslist/browserslist#queries\n\n# You can see what browsers were selected by your queries by running:\n\n# npx browserslist\n\nIOS >= 17\nSafari >= 17\nlast 5 Chrome versions\nlast 5 Firefox versions\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".eslintignore",
    "content": "build\nplayground/index.html\nnode_modules\ndist\nsrc/swiper.js\nsrc/swiper-bundle.js\n"
  },
  {
    "path": ".eslintrc.cjs",
    "content": "const rules = {\n  'no-nested-ternary': 'off',\n  'no-lonely-if': 'off',\n  'no-param-reassign': 'off',\n  'no-underscore-dangle': 'off',\n  'prefer-object-spread': 'off',\n  'prefer-destructuring': 'off',\n  'default-param-last': 'off',\n  'import/prefer-default-export': 'off',\n  'guard-for-in': 'off',\n  'no-restricted-syntax': 'off',\n  'import/no-extraneous-dependencies': 'off',\n  'no-console': 'off',\n  'no-restricted-globals': 'off',\n  'max-classes-per-file': 'off',\n  'react/jsx-filename-extension': 'off',\n  'jsx-a11y/label-has-associated-control': 'off',\n  'react/no-array-index-key': 'off',\n  'react/prop-types': 'off',\n  'react/jsx-props-no-spreading': 'off',\n  'import/no-unresolved': [2, { ignore: ['ssr-window', 'dom7', 'swiper'] }],\n};\nmodule.exports = {\n  root: true,\n  env: {\n    browser: true,\n    es6: true,\n    node: true,\n  },\n\n  globals: {\n    Atomics: 'readonly',\n    SharedArrayBuffer: 'readonly',\n  },\n  parserOptions: {\n    ecmaFeatures: {\n      jsx: true,\n    },\n    ecmaVersion: 2021,\n    sourceType: 'module',\n  },\n\n  overrides: [\n    {\n      files: ['*.js'],\n      extends: ['plugin:react/recommended', 'airbnb-base', 'plugin:prettier/recommended'],\n      rules,\n    },\n    {\n      files: ['**/*.jsx', 'src/react/*.js'],\n      plugins: ['react'],\n      rules,\n    },\n\n    {\n      files: ['src/**/*.*'],\n      rules: {\n        ...rules,\n        'import/extensions': [2, 'ignorePackages', { js: 'always' }],\n      },\n    },\n    {\n      files: ['scripts/**/*.*'],\n      parserOptions: {\n        ecmaVersion: 2020,\n        sourceType: 'module',\n      },\n      rules: {\n        ...rules,\n        'import/extensions': [2, 'ignorePackages', { js: 'always' }],\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=LF\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# How to contribute\n\nSwiper loves to welcome your contributions. There are several ways to help out:\n\n- Create an [issue](https://github.com/nolimits4web/swiper/issues) on GitHub, if you have found a bug\n- Write test cases or provide examples for open bug issues\n- Write patches for open bug/feature issues\n\nThere are a few guidelines that we need contributors to follow so that we have a\nchance of keeping on top of things.\n\n## Getting Started\n\n- Make sure you have a [GitHub account](https://github.com/signup/free).\n- Submit an [issue](https://github.com/nolimits4web/swiper/issues), assuming one does not already exist.\n  - Clearly describe the issue including steps to reproduce when it is a bug.\n  - Make sure you fill in the earliest version that you know has the issue.\n- Fork the repository on GitHub.\n\n## Making Changes\n\n- Create a topic branch from where you want to base your work.\n  - This is usually the master branch.\n  - Only target release branches if you are certain your fix must be on that\n    branch.\n  - To quickly create a topic branch based on master; `git branch master/my_contribution master` then checkout the new branch with `git checkout master/my_contribution`. Better avoid working directly on the\n    `master` branch, to avoid conflicts if you pull in updates from origin.\n- Make commits of logical units.\n- Check for unnecessary whitespace with `git diff --check` before committing.\n- Use descriptive commit messages and reference the #issue number.\n\n## Submitting Changes\n\n- Push your changes to a topic branch in your fork of the repository.\n- Submit a pull request to the repository\n\n## Editor Config\n\nThe project uses .editorconfig to define the coding style of each file. We recommend that you install the Editor Config extension for your preferred IDE.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "patreon: swiperjs\nopen_collective: swiper\ngithub: nolimits4web\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n  - name: 🙏 Open Collective\n    url: https://opencollective.com/swiper/\n    about: Love Swiper? Please consider supporting us via Open Collective.\n  - name: 📃 Documentation Issue\n    url: https://github.com/nolimits4web/swiper-website/issues/new\n    about: Issues with Swiper website\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yml",
    "content": "name: \"\\U0001F680 New feature proposal\"\ndescription: Propose a new feature to be added to Swiper\nlabels: ['feature request']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for your interest in the project and taking the time to fill out this feature report!\n  - type: textarea\n    id: feature-description\n    attributes:\n      label: Clear and concise description of the problem\n      description: As a developer using Swiper I want [goal / wish] so that [benefit]\n    validations:\n      required: true\n  - type: textarea\n    id: suggested-solution\n    attributes:\n      label: Suggested solution\n      description: 'In module [xy] we could provide following implementation...'\n    validations:\n      required: true\n  - type: textarea\n    id: alternative\n    attributes:\n      label: Alternative\n      description: Clear and concise description of any alternative solutions or features you've considered.\n  - type: textarea\n    id: additional-context\n    attributes:\n      label: Additional context\n      description: Any other context or screenshots about the feature request here.\n  - type: checkboxes\n    id: checkboxes\n    attributes:\n      label: Validations\n      description: Before submitting the issue, please make sure you do the following\n      options:\n        - label: Follow our [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md)\n          required: true\n        - label: Read the [docs](https://swiperjs.com/swiper-api).\n          required: true\n        - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.\n          required: true\n  - type: checkboxes\n    id: pr\n    attributes:\n      label: Would you like to open a PR for this feature?\n      description: Before starting to work on PR it is recommended to get maintainers approval.\n      options:\n        - label: I'm willing to open a PR\n          required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/swiper_core_issue.yml",
    "content": "name: '🐞 Swiper Core Issue'\ndescription: Report an issue with Swiper\nlabels: []\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: checkboxes\n    id: qa\n    attributes:\n      label: Check that this is really a bug\n      description: For Q&A open a [GitHub Discussion](https://github.com/nolimits4web/swiper/discussions)\n      options:\n        - label: I confirm\n          required: true\n  - type: input\n    id: reproduction\n    attributes:\n      label: Reproduction link\n      description: Please provide a link to a repo that can reproduce the problem you ran into. You can fork one of our [demos](https://swiperjs.com/demos) in codesandbox to get start. A reproduction is required unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a \"missing demo\" label. If no reproduction is provided after 3 days, it will be auto-closed.\n      placeholder: 'https://codesandbox.io/..'\n    validations:\n      required: true\n  - type: textarea\n    id: descr\n    attributes:\n      label: Bug description\n      description: A clear and concise description of what the bug is\n    validations:\n      required: true\n  - type: textarea\n    id: expected\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen\n    validations:\n      required: false\n  - type: textarea\n    id: actual\n    attributes:\n      label: Actual Behavior\n      description: A concise description of what you're experiencing\n    validations:\n      required: false\n  - type: input\n    id: swiper\n    attributes:\n      label: Swiper version\n      description: Exact release version or commit hash\n      placeholder: e.g 7.0.0\n    validations:\n      required: true\n  - type: input\n    id: browser\n    attributes:\n      label: Platform/Target and Browser Versions\n      description: Platform client you are targeting such as macOS, Windows, Cordova, iOS, Android, Chrome, etc.\n      placeholder: e.g macOS Safari 14.1\n    validations:\n      required: true\n  - type: checkboxes\n    id: checkboxes\n    attributes:\n      label: Validations\n      description: Before submitting the issue, please make sure you do the following\n      options:\n        - label: Follow our [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md)\n          required: true\n        - label: Read the [docs](https://swiperjs.com/swiper-api).\n          required: true\n        - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.\n          required: true\n        - label: Make sure this is a Swiper issue and not a framework-specific issue\n          required: true\n  - type: checkboxes\n    id: pr\n    attributes:\n      label: Would you like to open a PR for this bug?\n      description: Before starting to work on PR it is recommended to get maintainers approval\n      options:\n        - label: I'm willing to open a PR\n          required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/swiper_element_issue.yml",
    "content": "name: '🐞 Swiper Element Issue'\ndescription: Report an issue with Swiper Element\nlabels: ['Element']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: checkboxes\n    id: qa\n    attributes:\n      label: Check that this is really a bug\n      description: For Q&A open a [GitHub Discussion](https://github.com/nolimits4web/swiper/discussions)\n      options:\n        - label: I confirm\n          required: true\n  - type: input\n    id: reproduction\n    attributes:\n      label: Reproduction link\n      description: Please provide a link to a repo that can reproduce the problem you ran into. You can fork one of our [demos](https://swiperjs.com/demos) in codesandbox to get start. A reproduction is required unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a \"missing demo\" label. If no reproduction is provided after 3 days, it will be auto-closed.\n      placeholder: 'https://codesandbox.io/..'\n    validations:\n      required: true\n  - type: textarea\n    id: descr\n    attributes:\n      label: Bug description\n      description: A clear and concise description of what the bug is\n    validations:\n      required: true\n  - type: textarea\n    id: expected\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen\n    validations:\n      required: false\n  - type: textarea\n    id: actual\n    attributes:\n      label: Actual Behavior\n      description: A concise description of what you're experiencing\n    validations:\n      required: false\n  - type: input\n    id: swiper\n    attributes:\n      label: Swiper version\n      description: Exact release version or commit hash\n      placeholder: e.g 7.0.0\n    validations:\n      required: true\n  - type: input\n    id: browser\n    attributes:\n      label: Platform/Target and Browser Versions\n      description: Platform client you are targeting such as macOS, Windows, Cordova, iOS, Android, Chrome, etc.\n      placeholder: e.g macOS Safari 14.1\n    validations:\n      required: true\n  - type: checkboxes\n    id: checkboxes\n    attributes:\n      label: Validations\n      description: Before submitting the issue, please make sure you do the following\n      options:\n        - label: Follow our [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md)\n          required: true\n        - label: Read the [docs](https://swiperjs.com/swiper-api).\n          required: true\n        - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.\n          required: true\n        - label: Make sure this is a Swiper issue and not a framework-specific issue\n          required: true\n  - type: checkboxes\n    id: pr\n    attributes:\n      label: Would you like to open a PR for this bug?\n      description: Before starting to work on PR it is recommended to get maintainers approval\n      options:\n        - label: I'm willing to open a PR\n          required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/swiper_react_issue.yml",
    "content": "name: '🐞 Swiper React Issue'\ndescription: Create a report for Swiper React components\nlabels: 'React'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: checkboxes\n    id: qa\n    attributes:\n      label: Check that this is really a bug\n      description: For Q&A open a [GitHub Discussion](https://github.com/nolimits4web/swiper/discussions)\n      options:\n        - label: I confirm\n          required: true\n  - type: input\n    id: reproduction\n    attributes:\n      label: Reproduction link\n      description: Please provide a link to a repo that can reproduce the problem you ran into. You can fork one of our [demos](https://swiperjs.com/demos) in codesandbox to get start. A reproduction is required unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a \"missing demo\" label. If no reproduction is provided after 3 days, it will be auto-closed.\n      placeholder: 'https://codesandbox.io/..'\n    validations:\n      required: true\n  - type: textarea\n    id: descr\n    attributes:\n      label: Bug description\n      description: A clear and concise description of what the bug is\n    validations:\n      required: true\n  - type: textarea\n    id: expected\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen\n    validations:\n      required: false\n  - type: textarea\n    id: actual\n    attributes:\n      label: Actual Behavior\n      description: A concise description of what you're experiencing\n    validations:\n      required: false\n  - type: input\n    id: swiper\n    attributes:\n      label: Swiper version\n      description: Exact release version or commit hash\n      placeholder: e.g 7.0.0\n    validations:\n      required: true\n  - type: input\n    id: browser\n    attributes:\n      label: Platform/Target and Browser Versions\n      description: Platform client you are targeting such as macOS, Windows, Cordova, iOS, Android, Chrome, etc.\n      placeholder: e.g macOS Safari 14.1\n    validations:\n      required: true\n  - type: checkboxes\n    id: checkboxes\n    attributes:\n      label: Validations\n      description: Before submitting the issue, please make sure you do the following\n      options:\n        - label: Follow our [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md)\n          required: true\n        - label: Read the [docs](https://swiperjs.com/swiper-api).\n          required: true\n        - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.\n          required: true\n        - label: Make sure this is a Swiper issue and not a framework-specific issue\n          required: true\n  - type: checkboxes\n    id: pr\n    attributes:\n      label: Would you like to open a PR for this bug?\n      description: Before starting to work on PR it is recommended to get maintainers approval\n      options:\n        - label: I'm willing to open a PR\n          required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/vue_issue.yml",
    "content": "name: 🐞 Swiper Vue Issue\ndescription: Create a report for Swiper Vue components\nlabels: 'Vue'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: checkboxes\n    id: qa\n    attributes:\n      label: Check that this is really a bug\n      description: For Q&A open a [GitHub Discussion](https://github.com/nolimits4web/swiper/discussions)\n      options:\n        - label: I confirm\n          required: true\n  - type: input\n    id: reproduction\n    attributes:\n      label: Reproduction link\n      description: Please provide a link to a repo that can reproduce the problem you ran into. You can fork one of our [demos](https://swiperjs.com/demos) in codesandbox to get start. A reproduction is required unless you are absolutely sure that the issue is obvious and the provided information is enough to understand the problem. If a report is vague (e.g. just a generic error message) and has no reproduction, it will receive a \"missing demo\" label. If no reproduction is provided after 3 days, it will be auto-closed.\n      placeholder: 'https://codesandbox.io/..'\n    validations:\n      required: true\n  - type: textarea\n    id: descr\n    attributes:\n      label: Bug description\n      description: A clear and concise description of what the bug is\n    validations:\n      required: true\n  - type: textarea\n    id: expected\n    attributes:\n      label: Expected Behavior\n      description: A concise description of what you expected to happen\n    validations:\n      required: false\n  - type: textarea\n    id: actual\n    attributes:\n      label: Actual Behavior\n      description: A concise description of what you're experiencing\n    validations:\n      required: false\n  - type: input\n    id: swiper\n    attributes:\n      label: Swiper version\n      description: Exact release version or commit hash\n      placeholder: e.g 6.7.1\n    validations:\n      required: true\n  - type: input\n    id: browser\n    attributes:\n      label: Platform/Target and Browser Versions\n      description: Platform client you are targeting such as macOS, Windows, Cordova, iOS, Android, Chrome, etc.\n      placeholder: e.g macOS Safari 14.1\n    validations:\n      required: true\n  - type: checkboxes\n    id: checkboxes\n    attributes:\n      label: Validations\n      description: Before submitting the issue, please make sure you do the following\n      options:\n        - label: Follow our [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md)\n          required: true\n        - label: Read the [docs](https://swiperjs.com/swiper-api).\n          required: true\n        - label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.\n          required: true\n        - label: Make sure this is a Swiper issue and not a framework-specific issue\n          required: true\n  - type: checkboxes\n    id: pr\n    attributes:\n      label: Would you like to open a PR for this bug?\n      description: Before starting to work on PR it is recommended to get maintainers approval\n      options:\n        - label: I'm willing to open a PR\n          required: false\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue.\n\nThe best way to propose a feature is to open an issue first and discuss your ideas there before implementing them.\n\nAlways follow the [contribution guidelines](https://github.com/nolimits4web/swiper/blob/master/CONTRIBUTING.md) when submitting a pull request.\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": " - package-ecosystem: npm\n    directory: \"/\"\n    schedule:\n      interval: monthly\n    versioning-strategy: increase\n\n  - package-ecosystem: github-actions\n    directory: \"/\"\n    schedule:\n      interval: monthly\n"
  },
  {
    "path": ".github/lock.yml",
    "content": "daysUntilLock: 240\nexemptLabels:\n  - feature request\n  - in progress\nlockLabel: outdated\nlockComment: false\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "daysUntilStale: 180\ndaysUntilClose: 60\nexemptLabels:\n  - feature request\n  - probably bug\n  - bug confirmed\n  - in progress\nstaleLabel: stale\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. Thank you\n  for your contributions.\ncloseComment: >\n  This issue has been automatically closed due to inactivity.\n  If this issue is still actual, please, create the new one.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\non:\n  push:\n    branches: [master, Swiper6, Swiper7, Swiper8]\n  pull_request:\n    branches: [master, Swiper6, Swiper7, Swiper8]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@v2\n      - name: Install Node.js\n        uses: actions/setup-node@v2\n        with:\n          node-version: 18\n      - name: Install dependencies\n        run: npm install\n      - name: Run build\n        run: npm run build:prod\n"
  },
  {
    "path": ".github/workflows/formatting.yml",
    "content": "name: Formatting\non:\n  push:\n    branches: [master, Swiper6, Swiper7, Swiper8]\n  pull_request:\n    branches: [master, Swiper6, Swiper7, Swiper8]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@v2\n      - name: Install Node.js\n        uses: actions/setup-node@v2\n        with:\n          node-version: 18\n      - name: Install dependencies\n        run: npm install\n      - name: Run prettier check\n        run: npm run check-format\n"
  },
  {
    "path": ".github/workflows/issue-close-require.yml",
    "content": "name: Issue Close Require\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n    steps:\n      - name: missing demo\n        uses: actions-cool/issues-helper@v2.2.1\n        with:\n          actions: 'close-issues'\n          token: ${{ secrets.GITHUB_TOKEN }}\n          labels: 'missing demo'\n          inactive-day: 3\n"
  },
  {
    "path": ".github/workflows/issue-labeled.yml",
    "content": "name: Issue Labeled\n\non:\n  issues:\n    types: [labeled]\n\njobs:\n  reply-labeled:\n    runs-on: ubuntu-latest\n    steps:\n      - name: missing demo\n        if: github.event.label.name == 'missing demo'\n        uses: actions-cool/issues-helper@v2.2.1\n        with:\n          actions: 'create-comment, remove-labels'\n          token: ${{ secrets.GITHUB_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}. Please provide a online reproduction by [codesandbox](https://codesandbox.io/) or a minimal GitHub repository. You can fork one of our [demos](https://swiperjs.com/demos) in codesandbox to get start. Issues labeled by `missing demo` will be closed if no activities in 3 days.\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\non:\n  push:\n    branches: [master, Swiper6, Swiper7, Swiper8]\n  pull_request:\n    branches: [master, Swiper6, Swiper7, Swiper8]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@v2\n      - name: Install Node.js\n        uses: actions/setup-node@v2\n        with:\n          node-version: 18\n      - name: Install dependencies\n        run: npm install\n      - name: Run eslint\n        run: npm run lint\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules\ncustom\n*.log\n\n.versions\n.idea\ndist\n\n\n# local env files\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n.eslintcache\nsrc/swiper-element-bundle.mjs\n\n# Agents\n.claude\n.agents\n.cursor\n.gemini\n.codex\n.opencode\n"
  },
  {
    "path": ".lintstagedrc",
    "content": "{\n  \"*.+(js)\": [\n    \"eslint\"\n  ],\n  \"*.+(js|json|scss|css|less|ts)\": [\n    \"prettier --write\"\n  ]\n}\n"
  },
  {
    "path": ".npmignore",
    "content": ".git\n.github\nbuild\ndemos\nnode_modules\nplayground\nscripts\n"
  },
  {
    "path": ".prettierignore",
    "content": "build\nnode_modules\ndist\n.nova\npackage.json\n.claude\n.agents\n.cursor\n.gemini\n.codex\n.opencode\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"arrowParens\": \"always\",\n  \"bracketSpacing\": true,\n  \"htmlWhitespaceSensitivity\": \"css\",\n  \"insertPragma\": false,\n  \"jsxSingleQuote\": false,\n  \"printWidth\": 100,\n  \"proseWrap\": \"preserve\",\n  \"quoteProps\": \"as-needed\",\n  \"requirePragma\": false,\n  \"endOfLine\": \"auto\",\n  \"semi\": true,\n  \"singleQuote\": true,\n  \"tabWidth\": 2,\n  \"trailingComma\": \"all\",\n  \"useTabs\": false,\n  \"vueIndentScriptAndStyle\": false\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.formatOnSave\": true,\n  \"eslint.enable\": true,\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n}\n"
  },
  {
    "path": "BACKERS.md",
    "content": "# Backers\n\nSupport Swiper development by [pledging on Open Collective](http://opencollective.com/swiper)!\n\n<!-- SPONSORS_TABLE_WRAP -->\n<table>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://fi.parhaatuudetkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/parhaatuudetkasinotcom.png\" alt=\"Uudet Nettikasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.vanguardngr.com/casino/fr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/vanguardngr-france.png\" alt=\"VanguardNGR France\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://marsbahis.com/tr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/noah23.png\" alt=\"Marsbahis: Marsbahis Giriş - Marsbahis Güncel Adres ve Üyelik\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://heinekenjazzaldia.eus/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinossinlicenciaespana.png\" alt=\"Casinos Sin Licencia En España\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://royalwriter.co.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/royal-writer.png\" alt=\"Skilled Writers for In-Depth Academic Papers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.masterpapers.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/masterpapers.png\" alt=\"Masterpapers - Qualified writers delivering excellence in every word!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosfest.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosfest.png\" alt=\"Best Online Casinos Canada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://grademiners.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/grademiners.png\" alt=\"Grademiners - Professional writers, original content, quality you can trust!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nettikasinot.org/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nettikasinot-org.png\" alt=\"Nettikasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nejlepsiceskacasina.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nejlepsiceskacasinacom.png\" alt=\"České Online Casino: Hrajte Bezpečně a Výhodně v 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://slovenskeonlinecasino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/slovenskeonlinecasinocom.png\" alt=\"Najlepšie Online Casino Slovensko 2024 | Október 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://ssmarket.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/ss-market.png\" alt=\"SS Market: Social Media Services Market\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://automatenspieler.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/automatenspieler.png\" alt=\"Automatenspieler\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://uusimmatkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/uusimmatkasinotcom.png\" alt=\"Uudet nettikasinot 2024 » Listaamme Suomen uudet kasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinohai.com/nettikasinot\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinohai.png\" alt=\"Nettikasinot 2022 | Löydä Luotettava & Turvallinen Nettikasino!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nongamstopodds.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopodds.png\" alt=\"NonGamStopOdds casino sites\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinotest.de\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotest.png\" alt=\"Online Casino Test 2022 » 90+ Casinos von Experten geprüft!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://parimatch.in/en/football/live\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/parimatch.png\" alt=\"Online sports betting and casino at Parimatch India\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casino-wise.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-wise-com.png\" alt=\"Casinos not on GamStop | Casino-Wise.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nongamstopwager.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopwager-com.png\" alt=\"Casinos not on GamStop UK 🏆 NonGamStopWager.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoauditor.com/online-casinos-cyprus/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoauditor.png\" alt=\"Online Casinos Cyprus - CasinoAuditor\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoshunter.com/online-casinos/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-hunter.png\" alt=\"Best Online Casinos in Canada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.stltoday.com/exclusive/3-top-rated-platforms-to-buy-tiktok-followers-for-fast-growth/article_74fb98eb-6019-5b74-9cda-803a7d4ac4a2.html\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers-stl-today.png\" alt=\"Buy TikTok Followers - STL Today\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://au.trustpilot.com/review/pokiesgambler.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pokiesgamblercom.png\" alt=\"Online Pokies in Australia\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://topl.co\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/no-deposit-casinos.png\" alt=\"No Deposit Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://brecktic.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/brecktic-ltd.png\" alt=\"Brecktic UK\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fortune365.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fortune365.png\" alt=\"fortune365\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cryptocasino-guide.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cryptocasino-guide.png\" alt=\"CryptoCasino Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fbpostlikes.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pankaj-jangir.png\" alt=\"Buy Facebook Likes for Post & Page\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/BusinessVault/comments/1nr32xk/whats_the_best_smm_panel_looking_for_suggestions/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/smm-panel19.png\" alt=\"SMM Panel\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://finance.yahoo.com/news/best-website-super-clone-watches-073500706.html\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/super-clone-prestige.png\" alt=\"Yahoo Finance - Super Clone Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://superclonereps.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/superclonewatch.png\" alt=\"superclonewatch\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://detecting-ai.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/detecting-aicom.png\" alt=\"AI Detector & AI Checker for ChatGPT, Gemini, Claude, & More\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.idsnews.com/article/2025/09/buy-instagram-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-ids-ne.png\" alt=\"Buy Instagram Followers - IDS News\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gmkoutsi.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gmkoutsi.png\" alt=\"gmkoutsi.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://interac-casino.com/en-ca/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/interac-casino-canada.png\" alt=\"Interac-casino.com - Canada\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://releaf.com/de/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/releaf-medizinischer-cannabis-shop.png\" alt=\"Releaf - Medizinischer Cannabis Shop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://legitcasino.vip/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/legit-casino.png\" alt=\"Legit Casino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.eurocommpr.at/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/eurocommpr.png\" alt=\"EuroCommpr\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://snapinsta.vin/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/snapinsta.png\" alt=\"SnapInsta\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gpc.fm/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/brand-new-online-casinos-usa-no-deposit-bonus.png\" alt=\"Brand New Online Casinos USA No Deposit Bonus\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/what-is-forex\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfmcom.png\" alt=\"fx取引とは\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bonustly.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonustly-best-crypto-casino-bonuses.png\" alt=\"Bonustly: Best Crypto Casino Bonuses\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinononaamsit.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinononaamsit-com.png\" alt=\"Migliori Casino non AAMS in Italia 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/what-is-forex\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfmcom.png\" alt=\"fx取引とは\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://opencollective.com/jokacasino\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/jokacasino.png\" alt=\"online casino australia JokaCasino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://swipey.ai/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/swipey.png\" alt=\"Swipey AI - NSFW Chat\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nondetected.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nondetected.png\" alt=\"Remove negative information from the Internet | NonDetected.com\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://opencollective.com/king-johnnie1\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/king-johnnie1.png\" alt=\"king Johnnie\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://collegian.com/sponsored/2025/03/buy-youtube-subscribers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-youtube-subscribers-collegian.png\" alt=\"buy YouTube subscribers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/InstagramEmpire/comments/1o8v7zx/whats_the_best_site_to_buy_instagram_followers/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-real-instagram-followers1.png\" alt=\"buy instagram followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinoranking.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinoranking.png\" alt=\"Luotettavat nettikasinot 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://newcasinos.vip/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/newcasinosvip.png\" alt=\"Best New Online Casinos in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.backlinksrocket.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/backlinksrocket.png\" alt=\"Buy Backlinks - High Quality SEO Backlink Services\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://kingjohnnie-au.casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kingjohnnie-casino-australia.svg\" alt=\"King Johnnie Casino Australia\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nomaspinn.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nomaspin.svg\" alt=\"Nomaspin Casino Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buytiktokfollowers.co/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers-co.png\" alt=\"Buy TikTok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tiktokfame.co/buy-tiktok-followers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tiktokfameco.png\" alt=\"Buy TikTok Followers & Get Fame\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.softorbits.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/softorbits.png\" alt=\"SoftOrbits - Easiest Photo Editing Software for Beginners\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinossinlicencia.eu/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-sin-licencia-en-espana1.png\" alt=\"casinos sin licencia en España\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://homeworkguy.org/someone-to-take-my-online-class\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/homeworkguy.png\" alt=\"someone to take my online class service\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.bestetf.net/list/artificial-intelligence/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bestetf.png\" alt=\"AI ETFs\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://superluxuryreps.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/superluxuryreps.png\" alt=\"Super Clone Watches - Trusted Dealer For 1:1 Replica Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/how-to-trade-gold\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfm.png\" alt=\"ゴールド取引\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/MarketingMentor/comments/1cut7x5/where_to_buy_instagram_followers_likes/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/givemeboost.png\" alt=\"Buy Instagram Followers \" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://prestigewatches.co/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/prestige_watches.png\" alt=\"Super Clone Watches For Sale: Best Website for 1:1 Replica Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://unaimytext.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/humanize-ai-unaimytext.png\" alt=\"humanize ai unaimytext\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinotopplistan.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotopplistan-com.png\" alt=\"Casino online - Vi jämför casinon på nätet i Sverige\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinonetti.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinonetti-com.png\" alt=\"Parhaat kasinot - Valitse turvallinen nettikasino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nogamstopcasinos.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/non-gamstop-casinos3.png\" alt=\"New Casinos Not on Gamstop - Best Non GamStop sites in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinonotongamstop.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-not-on-gamstop.webp\" alt=\"Casino not on GamStop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://socialfollowers.io/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/socialfollowers.png\" alt=\"The Best Social Media Promotion Service Provider\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinotreasure.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotreasure.jpeg\" alt=\"Trusted Source for Online Casino Info , Games, Guides , Reviews\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.mixx.com/buy-instagram-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-mixx.png\" alt=\"Buy Instagram Followers with Instant Delivery\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://expressfollowers.com/buy-tiktok-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers2.png\" alt=\"buy tiktok followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://boostlikes.uk/buy-youtube-subscribers-views/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-uk.webp\" alt=\"Buy YouTube Subscribers & Views UK\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://miramtech.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/miramtech.png\" alt=\"Miramtech\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.uudetkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/simon-johansson.svg\" alt=\"Uudet Nettikasinot Huhtikuu 2025 | Parhaat Uudet Kasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://goldstarsocial.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/user-c1ad5e70.png\" alt=\"Goldstar Social\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://pistolocasino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pistolocasino.png\" alt=\"Pistolo Casino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://follower-boerse.de/product/tiktok-likes-kaufen/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tiktok-likes.png\" alt=\"TikTok Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.socialfollowers.uk/buy-tiktok-followers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/social-followers.png\" alt=\"Buy Tiktok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.palace-luzern.ch/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/auslandische-online-casinos-schweiz.png\" alt=\"Online Casino Ausland: Beste ausländische Online Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://kasynoplonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonus-bez-depozytu.png\" alt=\"Kasyno online w Polsce\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buylikesservices.com/free-instagram-likes/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/free-instaram-likes.png\" alt=\"Free Instagram Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.favbet.ro/ro/casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/favbet-ro.jpeg\" alt=\"Casino online Favbet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://twesocial.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-twitter-followers-visit-twesocial.png\" alt=\"Buy X Followers from TweSocial (Instant & Cheap)\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://sidesmedia.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/sidesmedia.png\" alt=\"SidesMedia: Buy Followers, Views, Likes & More\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosinternacionalesonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosinternacionalesonline.png\" alt=\"Mejores Casinos Internacionales Online de España 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinokennis.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinokennis.png\" alt=\"CasinoKennis\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoonlineellada.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoonlineelladacom.png\" alt=\"casino online ellada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.favbet.ua/uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/favbet.png\" alt=\"БК Favbet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.vso.org.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-not-on-gamstop10.png\" alt=\"casinos not on Gamstop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bonusoid.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonusoidcom.png\" alt=\"Online Casinos mit deutscher Lizenz\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinofy.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinofy.png\" alt=\"Casinofy\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoallianz.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoallianz.png\" alt=\"CasinoAllianz\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinos.it.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-online-italia.png\" alt=\"casinò online Italia\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.stjamestheatre.co.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/non-gamstop-casinos.png\" alt=\"Top UK Casinos Not on GamStop in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nogamstopcasinos.org.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nogamstopcasinos.png\" alt=\"nogamstopcasinos.org.uk\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://mysocialfollowing.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/mysocialfollowing.png\" alt=\"My Social Following\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://dashtickets.nz/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/dashtickets-new-zealand-gambling-magazine.png\" alt=\"DashTickets New Zealand gambling magazine\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tethercasinos.top/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tethercasinos.png\" alt=\"best tether casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.socialboosting.com/buy-tiktok-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/socialboosting.png\" alt=\"Buy TikTok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betking.com.ua/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betking.png\" alt=\"Онлайн казино та БК (ставки на спорт) в Україні\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tychebets.gr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tychebets-gr.png\" alt=\"O Καλύτερος Οδηγός Online Καζίνο\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.top-casino.nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/top-casino.png\" alt=\"Top online casino's van Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://polskiesloty.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinekasyno-polis.jpg\" alt=\"Polskie Sloty\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://robocat.casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/robocat-casino.png\" alt=\"RoboCat Casino\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://zamsino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/zamamamma.png\" alt=\"Zamsino.com 🎖️ Global Online Gambling Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betwinnerpartner.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betwinnerpartner.png\" alt=\"Betwinner Partner\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinosdeutschlandonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-casinos-deutschland.png\" alt=\"Online Casinos Deutschland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosportugal.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-portugal.png\" alt=\"Casinos online em Portugal\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bettingsite.cc/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betting-site.png\" alt=\"Betting Site\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.onlinecasinolegends.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-casino-legends.png\" alt=\"Online Casino Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nongamstopcasinos.net/gb/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopcasinosnet.png\" alt=\"UK Casinos not on GamStop 2025 - nongamstopcasinos.net\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://guidebook.betwinner.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/guidebook_betwinner_com.png\" alt=\"Guidebook.BetWinner\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://zondercruks.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/zondercruksnet.png\" alt=\"ZonderCruks - Online Gokken Zonder CRUKS\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosinlicenciaespana.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/mejores-casinos-sin-licencia-en-espana1.png\" alt=\"Mejores Casinos Sin Licencia en España\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://sanctionslawyers.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/sanctionslawyers-net.png\" alt=\"SANCTIONS LAW FIRM\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://interpollawfirm.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/interpollawfirmcom.png\" alt=\"Interpol Law Firm\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nongamstopbookiesuk.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/try-bookmakers-not-on-gamstop.png\" alt=\"try bookmakers not on GamStop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://leofame.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/leofame.png\" alt=\"Buy Instagram Followers & Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.teravisiontech.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/teravisiontech.webp\" alt=\"Accelerating Your Software Products | Teravision Technologies\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosgr.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-magyar.png\" alt=\"Casino Magyar\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosgr.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinecasinosgr-com.png\" alt=\"Ta καλύτερα διαδικτυακά καζίνο στην Ελλάδα το 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bulkoid.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bulkoid_com.png\" alt=\"Bulkoid\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.gokken-online.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gokken-online.png\" alt=\"Gokken Online\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://greece-casinos.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/greece-casinos.png\" alt=\"Greece Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hellobonuses.com/nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-bonussen-nederland.png\" alt=\"Casino Bonussen Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.ownedcore.com/casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-usa.png\" alt=\"Casino No deposit Bonus 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://blastup.com/buy-instagram-likes\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/blastup_com.png\" alt=\"Buy Instagram Likes - Real Likes & Instant Delivery!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://vedonlyontiyhtiot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/vedonlyontiyhtiot-com.svg\" alt=\"Vedonlyontiyhtiot.com - Parhaat Vedolyöntiyhtiöt & Bonukset\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://celebian.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/celebian.png\" alt=\"Purchase TikTok followers, likes and views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://views4you.com/buy-youtube-views/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-youtube-views-views4you.png\" alt=\"Buy Youtube Views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.upgrow.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/upgrow.png\" alt=\"UpGrow: #1 AI-Powered Instagram Growth | Real IG Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.doublethebitcoin.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/doublethebitcoin.png\" alt=\"Best Bitcoin Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://topnoaccountcasinos.com/nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/topnoaccountcasinos.png\" alt=\"Topnoaccountcasinos casino zonder registratie\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.prointernet.in.ua/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/prointernet-2.png\" alt=\"Prointernet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nexussmoke.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nexus-smoke.png\" alt=\"Nexus Smoke Premium E-Liquid and Luxury Vape Products\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.overlyzer.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/overlyzer_com.png\" alt=\"Overlyzer » football betting analyzer & soccer predictions\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://spelpressen.se/casino-reportage/casino-utan-svensk-licens\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/spelpressen-se.png\" alt=\"Casino utan Svensk Licens | Bästa Casinon utan Spelpaus 🎖️\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betfans.nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betfans.png\" alt=\"BetFans - Alles over online wedden; Bookmakers Vergelijken\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.onlineunitedstatescasinos.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-united-states-casinos.png\" alt=\"Top USA Online Casinos September 2023 | Online United States Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://philippinescasinos.ph/gcash/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/philippinescasinosph.png\" alt=\"Best Online Casino in Philippines using GCash | 2023 Rank\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cyberogism.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cyberogism.png\" alt=\"Technology, Security, Innovation, The Cyber World Now | Cyberogism\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buycheapestfollowers.com/buy-instagram-reels-views\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/thebestsolution.png\" alt=\"Buy Instagram Reels Views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosspelen.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinecasinosspelen.png\" alt=\"Onlinecasinosspelen.com site is dé nummer één gids, waardoor je gemakkelijk alle informatie van de top 10 online casino sites.\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://rotativka.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/rotativka.png\" alt=\"Rotativka.com - Най-добрите онлайн казина в България\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinoaustraliaonline.com/under-1-hour-withdrawal-casinos/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoaustraliaonline.png\" alt=\"Under 1 Hour Withdrawal Casinos in Australia - 2022\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betbetter-pa.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betbetter.png\" alt=\"PA Online Casino - List of Best Casinos in Pennsylvania\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinozonderregistratie.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/czrnet.png\" alt=\"Casino Zonder Registratie 2022 | CZR's Top No Account Casino's Ranglijst\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nieuwe-casinos.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nieuwecasinos.png\" alt=\"Nieuwe Online Casino's December 2022 | Overzicht van de top nieuwe casinos!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://4rabet.com/app\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/4rabet.svg\" alt=\"cricket betting app\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.wisergamblers.com/de/casino-bonus-ohne-einzahlung/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/wisergamblers.png\" alt=\"WiserGamblers | Best Online Gambling Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betting-sider.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betting-sider.png\" alt=\"betting sider\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://thecasinowizard.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/thecasinowizard.png\" alt=\"The Casino Wizard » Best Casinos & (No) Deposit Bonuses 2022\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fast.bet/ca/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fastbet-bet-ca.png\" alt=\"Fastest Payout Casinos in Canada [2022]\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cliquestudios.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cliquestudios.png\" alt=\"Clique Studios - Creative Digital Transformation\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://correctcasinos.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/correctcasinos.png\" alt=\"Correct Casinos | The Ultimate Guide to the Legit Online Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://writingmetier.com/extended-essay-writing-service/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/writingmetier.png\" alt=\"IB extended essay writing service\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.wizardslots.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/wizardslots.png\" alt=\"Online Slots - UK Slot Games - 500 FREE Spins at Wizard Slots\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fortunegames.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fortunegames.png\" alt=\"Fortune Games® | Free Spins No Deposit Slot Games | Online Slots\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tankpenge.dk\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tankpenge-dk.png\" alt=\"LÅN PENGE NU | Hurtige Online lån 2021 | Klik her og Ansøg i dag\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://veepn.com/vpn-apps/vpn-for-chrome/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/veepn.png\" alt=\"VPN for Chrome to Make Web Surfing 100% Safe\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoexpo.se/casino-utan-registrering/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoexpo.jpg\" alt=\"CasinoExpo casino utan registrering\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://najlepsibukmacherzy.pl/ranking-legalnych-bukmacherow/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/netpositive.png\" alt=\"Ranking Bukmacherów Legalnych 2020. Bukmacher nr 1 to...\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosters.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosters.svg\" alt=\"The Best Online Casinos in the UK » Gambling Sites by Casinosters\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gamblizard.com/deposit-bonuses/deposit-10-pound/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gamblizard.png\" alt=\"Deposit £10 Play with 30, 40, 50, 60, 70, or 80 Pounds✔️ GambLizard\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://goread.io/buy-instagram-likes\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/goread.png\" alt=\"Instagram likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n  </tr>\n</table>\n<!-- SPONSORS_TABLE_WRAP -->\n\n### \\$500 Platinum Sponsor\n\n[Currently vacant. It could be you!](https://opencollective.com/swiper/contribute/platinum-sponsor-24468/checkout)\n\n---\n\n### \\$250 Gold Sponsor\n\n[Currently vacant. It could be you!](https://opencollective.com/swiper/contribute/gold-sponsor-24466/checkout)\n\n---\n\n### \\$100 Silver Sponsor\n\n<!-- SILVER_SPONSOR -->\n- [Uudet Nettikasinot](https://fi.parhaatuudetkasinot.com/)\n- [VanguardNGR France](https://www.vanguardngr.com/casino/fr/)\n- [Marsbahis: Marsbahis Giriş - Marsbahis Güncel Adres ve Üyelik](https://marsbahis.com/tr/)\n- [Casinos Sin Licencia En España](https://heinekenjazzaldia.eus/)\n- [Skilled Writers for In-Depth Academic Papers](https://royalwriter.co.uk/)\n- [Masterpapers - Qualified writers delivering excellence in every word!](https://www.masterpapers.com/)\n- [Best Online Casinos Canada](https://casinosfest.com/)\n- [Grademiners - Professional writers, original content, quality you can trust!](https://grademiners.com/)\n- [Nettikasinot](https://www.nettikasinot.org/)\n- [České Online Casino: Hrajte Bezpečně a Výhodně v 2024](https://nejlepsiceskacasina.com/)\n- [Najlepšie Online Casino Slovensko 2024 | Október 2024](https://slovenskeonlinecasino.com/)\n- [SS Market: Social Media Services Market](https://ssmarket.net/)\n- [Automatenspieler](https://automatenspieler.net/)\n- [Uudet nettikasinot 2024 » Listaamme Suomen uudet kasinot](https://uusimmatkasinot.com/)\n- [Nettikasinot 2022 | Löydä Luotettava & Turvallinen Nettikasino!](https://www.kasinohai.com/nettikasinot)\n- [NonGamStopOdds casino sites](https://www.nongamstopodds.com/casinos-not-on-gamstop/)\n- [Online Casino Test 2022 » 90+ Casinos von Experten geprüft!](https://www.casinotest.de)\n- [Online sports betting and casino at Parimatch India](https://parimatch.in/en/football/live)\n- [Casinos not on GamStop | Casino-Wise.com](https://casino-wise.com/casinos-not-on-gamstop/)\n- [Casinos not on GamStop UK 🏆 NonGamStopWager.com](https://www.nongamstopwager.com/casinos-not-on-gamstop/)\n- [Online Casinos Cyprus - CasinoAuditor](https://casinoauditor.com/online-casinos-cyprus/)\n- [Best Online Casinos in Canada](https://casinoshunter.com/online-casinos/)\n<!-- SILVER_SPONSOR -->\n\n[Join here!](https://opencollective.com/swiper/contribute/silver-sponsor-24464/checkout)\n\n---\n\n### \\$50+ Sponsor\n\n<!-- SPONSOR -->\n- [Buy TikTok Followers - STL Today](https://www.stltoday.com/exclusive/3-top-rated-platforms-to-buy-tiktok-followers-for-fast-growth/article_74fb98eb-6019-5b74-9cda-803a7d4ac4a2.html)\n- [Online Pokies in Australia](https://au.trustpilot.com/review/pokiesgambler.com)\n- [No Deposit Casinos](https://topl.co)\n- [Brecktic UK](https://brecktic.uk/)\n- [fortune365](https://www.fortune365.com/)\n- [CryptoCasino Guide](https://cryptocasino-guide.com/)\n- [Buy Facebook Likes for Post & Page](https://www.fbpostlikes.com/)\n- [SMM Panel](https://www.reddit.com/r/BusinessVault/comments/1nr32xk/whats_the_best_smm_panel_looking_for_suggestions/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button)\n- [Yahoo Finance - Super Clone Watches](https://finance.yahoo.com/news/best-website-super-clone-watches-073500706.html)\n- [superclonewatch](https://superclonereps.com/)\n- [AI Detector & AI Checker for ChatGPT, Gemini, Claude, & More](https://detecting-ai.com/)\n- [Buy Instagram Followers - IDS News](https://www.idsnews.com/article/2025/09/buy-instagram-followers)\n- [gmkoutsi.com](https://gmkoutsi.com/)\n- [Interac-casino.com - Canada](https://interac-casino.com/en-ca/)\n- [Releaf - Medizinischer Cannabis Shop](https://releaf.com/de/)\n- [Legit Casino](https://legitcasino.vip/)\n- [EuroCommpr](https://www.eurocommpr.at/)\n- [SnapInsta](https://snapinsta.vin/)\n- [Brand New Online Casinos USA No Deposit Bonus](https://gpc.fm/)\n- [fx取引とは](https://www.hfm.com/int/jp/trading-education/what-is-forex)\n- [Bonustly: Best Crypto Casino Bonuses](https://bonustly.com/)\n- [Migliori Casino non AAMS in Italia 2025](https://casinononaamsit.com/)\n- [fx取引とは](https://www.hfm.com/int/jp/trading-education/what-is-forex)\n- [online casino australia JokaCasino](https://opencollective.com/jokacasino)\n- [Swipey AI - NSFW Chat](https://swipey.ai/)\n- [Remove negative information from the Internet | NonDetected.com](https://nondetected.com/)\n- [king Johnnie](https://opencollective.com/king-johnnie1)\n- [buy YouTube subscribers](https://collegian.com/sponsored/2025/03/buy-youtube-subscribers/)\n- [buy instagram followers](https://www.reddit.com/r/InstagramEmpire/comments/1o8v7zx/whats_the_best_site_to_buy_instagram_followers/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button)\n- [Luotettavat nettikasinot 2025](https://www.kasinoranking.com/)\n- [Best New Online Casinos in 2025](https://newcasinos.vip/)\n- [Buy Backlinks - High Quality SEO Backlink Services](https://www.backlinksrocket.com/)\n- [King Johnnie Casino Australia](https://kingjohnnie-au.casino/)\n- [Nomaspin Casino Nederland](https://nomaspinn.com/)\n- [Buy TikTok Followers](https://buytiktokfollowers.co/)\n- [Buy TikTok Followers & Get Fame](https://tiktokfame.co/buy-tiktok-followers/)\n- [SoftOrbits - Easiest Photo Editing Software for Beginners](https://www.softorbits.net/)\n- [casinos sin licencia en España](https://casinossinlicencia.eu/)\n- [someone to take my online class service](https://homeworkguy.org/someone-to-take-my-online-class)\n- [AI ETFs](https://www.bestetf.net/list/artificial-intelligence/)\n- [Super Clone Watches - Trusted Dealer For 1:1 Replica Watches](https://superluxuryreps.com/)\n- [ゴールド取引](https://www.hfm.com/int/jp/trading-education/how-to-trade-gold)\n- [Buy Instagram Followers ](https://www.reddit.com/r/MarketingMentor/comments/1cut7x5/where_to_buy_instagram_followers_likes/)\n- [Super Clone Watches For Sale: Best Website for 1:1 Replica Watches](https://prestigewatches.co/)\n- [humanize ai unaimytext](https://unaimytext.com/)\n- [Casino online - Vi jämför casinon på nätet i Sverige](https://www.casinotopplistan.com/)\n- [Parhaat kasinot - Valitse turvallinen nettikasino](https://www.kasinonetti.com/)\n- [New Casinos Not on Gamstop - Best Non GamStop sites in 2025](https://nogamstopcasinos.uk/)\n- [Casino not on GamStop](https://casinonotongamstop.uk/)\n- [The Best Social Media Promotion Service Provider](https://socialfollowers.io/)\n- [Trusted Source for Online Casino Info , Games, Guides , Reviews](https://casinotreasure.com/)\n- [Buy Instagram Followers with Instant Delivery](https://www.mixx.com/buy-instagram-followers)\n- [buy tiktok followers](https://expressfollowers.com/buy-tiktok-followers)\n- [Buy YouTube Subscribers & Views UK](https://boostlikes.uk/buy-youtube-subscribers-views/)\n- [Miramtech](https://miramtech.com/)\n- [Uudet Nettikasinot Huhtikuu 2025 | Parhaat Uudet Kasinot](https://www.uudetkasinot.com/)\n- [Goldstar Social](https://goldstarsocial.com/)\n- [Pistolo Casino](https://pistolocasino.com/)\n- [TikTok Likes](https://follower-boerse.de/product/tiktok-likes-kaufen/)\n- [Buy Tiktok Followers](https://www.socialfollowers.uk/buy-tiktok-followers/)\n- [Online Casino Ausland: Beste ausländische Online Casinos](https://www.palace-luzern.ch/)\n- [Kasyno online w Polsce](https://kasynoplonline.com/)\n- [Free Instagram Likes](https://buylikesservices.com/free-instagram-likes/)\n- [Casino online Favbet](https://www.favbet.ro/ro/casino/)\n- [Buy X Followers from TweSocial (Instant & Cheap)](https://twesocial.com/)\n- [SidesMedia: Buy Followers, Views, Likes & More](https://sidesmedia.com/)\n- [Mejores Casinos Internacionales Online de España 2025](https://casinosinternacionalesonline.com/)\n- [CasinoKennis](https://www.casinokennis.com/)\n- [casino online ellada](https://casinoonlineellada.com/)\n- [БК Favbet](https://www.favbet.ua/uk/)\n- [casinos not on Gamstop](https://www.vso.org.uk/)\n- [Online Casinos mit deutscher Lizenz](https://bonusoid.com/)\n- [Casinofy](https://www.casinofy.com/)\n- [CasinoAllianz](https://casinoallianz.com/)\n- [casinò online Italia](https://casinos.it.com/)\n- [Top UK Casinos Not on GamStop in 2025](https://www.stjamestheatre.co.uk/)\n- [nogamstopcasinos.org.uk](https://nogamstopcasinos.org.uk/)\n- [My Social Following](https://mysocialfollowing.com/)\n- [DashTickets New Zealand gambling magazine](https://dashtickets.nz/)\n- [best tether casinos](https://tethercasinos.top/)\n- [Buy TikTok Followers](https://www.socialboosting.com/buy-tiktok-followers)\n- [Онлайн казино та БК (ставки на спорт) в Україні](https://betking.com.ua/)\n- [O Καλύτερος Οδηγός Online Καζίνο](https://tychebets.gr/)\n- [Top online casino's van Nederland](https://www.top-casino.nl/)\n- [Polskie Sloty](https://polskiesloty.com/)\n- [RoboCat Casino](https://robocat.casino/)\n- [Zamsino.com 🎖️ Global Online Gambling Guide](https://zamsino.com/)\n- [Betwinner Partner](https://betwinnerpartner.com/)\n- [Online Casinos Deutschland](https://www.casinosdeutschlandonline.com/)\n- [Casinos online em Portugal](https://casinosportugal.com/)\n- [Betting Site](https://bettingsite.cc/)\n- [Online Casino Nederland](https://www.onlinecasinolegends.com/)\n- [UK Casinos not on GamStop 2025 - nongamstopcasinos.net](https://nongamstopcasinos.net/gb/)\n- [Guidebook.BetWinner](https://guidebook.betwinner.com/)\n- [ZonderCruks - Online Gokken Zonder CRUKS](https://zondercruks.net/)\n- [Mejores Casinos Sin Licencia en España](https://casinosinlicenciaespana.com/)\n- [SANCTIONS LAW FIRM](https://sanctionslawyers.net/)\n- [Interpol Law Firm](https://interpollawfirm.com/)\n- [try bookmakers not on GamStop](https://nongamstopbookiesuk.com/)\n- [Buy Instagram Followers & Likes](https://leofame.com/)\n- [Accelerating Your Software Products | Teravision Technologies](https://www.teravisiontech.com/)\n- [Casino Magyar](https://onlinecasinosgr.com/)\n- [Ta καλύτερα διαδικτυακά καζίνο στην Ελλάδα το 2024](https://onlinecasinosgr.com/)\n- [Bulkoid](https://bulkoid.com/)\n- [Gokken Online](https://www.gokken-online.com/)\n- [Greece Casinos](https://greece-casinos.com/)\n- [Casino Bonussen Nederland](https://www.hellobonuses.com/nl/)\n- [Casino No deposit Bonus 2024](https://www.ownedcore.com/casino/)\n- [Buy Instagram Likes - Real Likes & Instant Delivery!](https://blastup.com/buy-instagram-likes)\n- [Vedonlyontiyhtiot.com - Parhaat Vedolyöntiyhtiöt & Bonukset](https://vedonlyontiyhtiot.com/)\n- [Purchase TikTok followers, likes and views](https://celebian.com/)\n- [Buy Youtube Views](https://views4you.com/buy-youtube-views/)\n- [UpGrow: #1 AI-Powered Instagram Growth | Real IG Followers](https://www.upgrow.com/)\n- [Best Bitcoin Casinos](https://www.doublethebitcoin.net/)\n- [Topnoaccountcasinos casino zonder registratie](https://topnoaccountcasinos.com/nl/)\n- [Prointernet](https://www.prointernet.in.ua/)\n- [Nexus Smoke Premium E-Liquid and Luxury Vape Products](https://nexussmoke.com/)\n- [Overlyzer » football betting analyzer & soccer predictions](https://www.overlyzer.com/)\n- [Casino utan Svensk Licens | Bästa Casinon utan Spelpaus 🎖️](https://spelpressen.se/casino-reportage/casino-utan-svensk-licens)\n- [BetFans - Alles over online wedden; Bookmakers Vergelijken](https://betfans.nl/)\n- [Top USA Online Casinos September 2023 | Online United States Casinos](https://www.onlineunitedstatescasinos.com/)\n- [Best Online Casino in Philippines using GCash | 2023 Rank](https://philippinescasinos.ph/gcash/)\n- [Technology, Security, Innovation, The Cyber World Now | Cyberogism](https://cyberogism.com/)\n- [Buy Instagram Reels Views](https://buycheapestfollowers.com/buy-instagram-reels-views)\n- [Onlinecasinosspelen.com site is dé nummer één gids, waardoor je gemakkelijk alle informatie van de top 10 online casino sites.](https://onlinecasinosspelen.com/)\n- [Rotativka.com - Най-добрите онлайн казина в България](https://rotativka.com/)\n- [Under 1 Hour Withdrawal Casinos in Australia - 2022](https://www.casinoaustraliaonline.com/under-1-hour-withdrawal-casinos/)\n- [PA Online Casino - List of Best Casinos in Pennsylvania](https://betbetter-pa.com/)\n- [Casino Zonder Registratie 2022 | CZR's Top No Account Casino's Ranglijst](https://casinozonderregistratie.net/)\n- [Nieuwe Online Casino's December 2022 | Overzicht van de top nieuwe casinos!](https://nieuwe-casinos.net/)\n- [cricket betting app](https://4rabet.com/app)\n- [WiserGamblers | Best Online Gambling Guide](https://www.wisergamblers.com/de/casino-bonus-ohne-einzahlung/)\n- [betting sider](https://betting-sider.net/)\n- [The Casino Wizard » Best Casinos & (No) Deposit Bonuses 2022](https://thecasinowizard.com/)\n- [Fastest Payout Casinos in Canada [2022]](https://www.fast.bet/ca/)\n- [Clique Studios - Creative Digital Transformation](https://cliquestudios.com)\n- [Correct Casinos | The Ultimate Guide to the Legit Online Casinos](https://correctcasinos.com)\n- [IB extended essay writing service](https://writingmetier.com/extended-essay-writing-service/)\n- [Online Slots - UK Slot Games - 500 FREE Spins at Wizard Slots](https://www.wizardslots.com)\n- [Fortune Games® | Free Spins No Deposit Slot Games | Online Slots](https://www.fortunegames.com)\n- [LÅN PENGE NU | Hurtige Online lån 2021 | Klik her og Ansøg i dag](https://tankpenge.dk)\n- [VPN for Chrome to Make Web Surfing 100% Safe](https://veepn.com/vpn-apps/vpn-for-chrome/)\n- [CasinoExpo casino utan registrering](https://casinoexpo.se/casino-utan-registrering/)\n- [Ranking Bukmacherów Legalnych 2020. Bukmacher nr 1 to...](https://najlepsibukmacherzy.pl/ranking-legalnych-bukmacherow/)\n- [The Best Online Casinos in the UK » Gambling Sites by Casinosters](https://casinosters.com)\n- [Deposit £10 Play with 30, 40, 50, 60, 70, or 80 Pounds✔️ GambLizard](https://gamblizard.com/deposit-bonuses/deposit-10-pound/)\n- [Instagram likes](https://goread.io/buy-instagram-likes)\n<!-- SPONSOR -->\n\n[Join here!](https://opencollective.com/swiper/contribute/sponsor-24467/checkout)\n\n---\n\n### \\$25+ Top Supporter\n\n<!-- TOP_SUPPORTER -->\n\n[easy-views.org](https://easy-views.org) - High Retention Youtube Views<br>\n\n<!-- TOP_SUPPORTER -->\n\n[Join here!](https://opencollective.com/swiper/contribute/top-supporter-24465/checkout)\n\n---\n\n### \\$10+ Supporter\n\n[Quicko](https://opencollective.com/quicko)<br>\n\n[Instagram Stories Viewer](https://opencollective.com/instagram-stories-viewer)<br>\n\n[Will Myers](https://opencollective.com/will-myers)<br>\n\n[Join here!](https://opencollective.com/swiper/contribute/supporter-23766/checkout)\n\n---\n\n### \\$5+ Thank You\n\n[Fresh Engagements](https://opencollective.com/fresh-engagements)<br>\n\n[Instagram Services](https://www.patreon.com/user?u=67523502)<br>\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n# [12.1.1](https://github.com/nolimits4web/Swiper/compare/v12.1.0...v12.1.1) (2026-02-13)\n\n### Bug Fixes\n\n- **a11y:** fix focus in virtual mode enabled ([3055008](https://github.com/nolimits4web/Swiper/commit/30550088fd089600aec2d7f8924b88cff13abbe9)), closes [#8147](https://github.com/nolimits4web/Swiper/issues/8147)\n- **core:** avoid double-subtracting offsets in centerInsufficientSlides ([#8158](https://github.com/nolimits4web/Swiper/issues/8158)) ([60b0052](https://github.com/nolimits4web/Swiper/commit/60b005222a801029a4a00d319517028afba7af18))\n- **core:** prevent duplicate module initialization in constructor ([#8155](https://github.com/nolimits4web/Swiper/issues/8155)) ([#8156](https://github.com/nolimits4web/Swiper/issues/8156)) ([07738a2](https://github.com/nolimits4web/Swiper/commit/07738a233b70535c36126c5b579f2bb40049da6c))\n- **types:** support boolean as a11y value ([#8157](https://github.com/nolimits4web/Swiper/issues/8157)) ([6bf76d5](https://github.com/nolimits4web/Swiper/commit/6bf76d573196c61db1328350c11e2c44f5d3ec08))\n\n# [12.1.0](https://github.com/nolimits4web/Swiper/compare/v12.0.3...v12.1.0) (2026-01-28)\n\n### Bug Fixes\n\n- **autoplay:** broken custom delay percentages with pause/resume ([#8133](https://github.com/nolimits4web/Swiper/issues/8133)) ([0afecde](https://github.com/nolimits4web/Swiper/commit/0afecde9781268a60a92f752ea3a3a92420e2dcf))\n- **core:** Don't use `data-swiper-slide-index` for `realIndex` when virtual module is enabled ([#8142](https://github.com/nolimits4web/Swiper/issues/8142)) ([bd957f8](https://github.com/nolimits4web/Swiper/commit/bd957f8396f711b83dc1bc6b3d42a59e6d6539d2))\n- **core:** Escape all CSS selector special characters ([d35f41a](https://github.com/nolimits4web/Swiper/commit/d35f41a85bd1793de58358d06300440e09187a6d)), closes [#8135](https://github.com/nolimits4web/Swiper/issues/8135)\n- **core:** support slidesOffsetBefore and slidesOffsetAfert in cssMode ([45b98d0](https://github.com/nolimits4web/Swiper/commit/45b98d02b2235b0c425f8bd60ebdc04d7b1a4fbd)), closes [#7926](https://github.com/nolimits4web/Swiper/issues/7926)\n- fix lazy preloader removal error in react in vue ([332f5c7](https://github.com/nolimits4web/Swiper/commit/332f5c77005921c8a260f199cdfe6d3aa5d209a1)), closes [#8149](https://github.com/nolimits4web/Swiper/issues/8149)\n- **thumbs:** update slide classes on virtual swiper update ([#8141](https://github.com/nolimits4web/Swiper/issues/8141)) ([9752771](https://github.com/nolimits4web/Swiper/commit/975277111b73f389043cb0ed19feee0244a80f57))\n- **types:** Add `autoScroll` to `thumbs.update` type signature ([#8146](https://github.com/nolimits4web/Swiper/issues/8146)) ([5d91e6e](https://github.com/nolimits4web/Swiper/commit/5d91e6edb4ce35d70019616b51f1e380feb9a082))\n- **zoom:** initialize gesture state after programmatic zoom ([#8112](https://github.com/nolimits4web/Swiper/issues/8112)) ([71e9511](https://github.com/nolimits4web/Swiper/commit/71e9511802c34482bc8b66abda19a1a518d88d36))\n\n### Features\n\n- **keyboard:** add support for custom speed parameter in keyboard navigation ([#8148](https://github.com/nolimits4web/Swiper/issues/8148)) ([7a4a0e5](https://github.com/nolimits4web/Swiper/commit/7a4a0e5fc3c85710a37ab021328e083fc3b14e16))\n- new snapToSlideEdge parameter ([de3131f](https://github.com/nolimits4web/Swiper/commit/de3131fbf72cccbf1d1473f787ddf15c74612584)), closes [#8021](https://github.com/nolimits4web/Swiper/issues/8021) [#4780](https://github.com/nolimits4web/Swiper/issues/4780)\n\n# [12.0.3](https://github.com/nolimits4web/Swiper/compare/v12.0.2...v12.0.3) (2025-10-21)\n\n### Bug Fixes\n\n- **element:** fixed reference to nav arrows SVG ([0b17ecf](https://github.com/nolimits4web/Swiper/commit/0b17ecf56bf941e4a5da2a2c171d5e16a9e4552b)), closes [#8115](https://github.com/nolimits4web/Swiper/issues/8115)\n\n### Features\n\n- **core:** add 'getRotateFix' export to effect utils ([c97ae5d](https://github.com/nolimits4web/Swiper/commit/c97ae5d0069cf3d5c745efb63ced9924a64d2453)), closes [#8114](https://github.com/nolimits4web/Swiper/issues/8114)\n\n# [12.0.2](https://github.com/nolimits4web/Swiper/compare/v12.0.1...v12.0.2) (2025-09-18)\n\n### Features\n\n- **navigation:** add styles for when buttons set before slider ([4588c57](https://github.com/nolimits4web/Swiper/commit/4588c5719d4d828548c34f456de099f621f4c709)), closes [#8085](https://github.com/nolimits4web/Swiper/issues/8085)\n- **navigation:** new `addIcons` parameter to add SVG icons to nav buttons ([b955b0c](https://github.com/nolimits4web/Swiper/commit/b955b0c15c3b813bbda7a68cdd250f8a822015df)), closes [#8088](https://github.com/nolimits4web/Swiper/issues/8088) [#8087](https://github.com/nolimits4web/Swiper/issues/8087)\n\n# [12.0.1](https://github.com/nolimits4web/Swiper/compare/v12.0.0...v12.0.1) (2025-09-11)\n\n### Bug Fixes\n\n- **navigation:** tweak nav styles when adjacent ([98440d9](https://github.com/nolimits4web/Swiper/commit/98440d9621c2b06c1c45edf8f4103ce5125e8231))\n\n# [12.0.0](https://github.com/nolimits4web/Swiper/compare/v11.2.10...v12.0.0) (2025-09-11)\n\n### Bug Fixes\n\n- **core:** fixes issues when slidesOffsetBefore & slidesOffsetAfter are combinated with centeredSlides, slidesPerView & loop ([#8038](https://github.com/nolimits4web/Swiper/issues/8038)) ([74cc297](https://github.com/nolimits4web/Swiper/commit/74cc29713508bb48939ef9147a869979a8120cc4)), closes [#7298](https://github.com/nolimits4web/Swiper/issues/7298) [#7956](https://github.com/nolimits4web/Swiper/issues/7956) [#6916](https://github.com/nolimits4web/Swiper/issues/6916)\n- **effect-cards:** fix offset in vertical direction when rotate is unset ([a248ca1](https://github.com/nolimits4web/Swiper/commit/a248ca1fc4fd070e02f65ca7afc55789c02f15c7)), closes [#8075](https://github.com/nolimits4web/Swiper/issues/8075)\n- **get-device:** regexp tweak ([60bb79b](https://github.com/nolimits4web/Swiper/commit/60bb79b599895350da71212b05e3f89a0dabc447)), closes [#8057](https://github.com/nolimits4web/Swiper/issues/8057)\n- **types:** correct types for getSlideTransformEl ([b34bdce](https://github.com/nolimits4web/Swiper/commit/b34bdce988a681a41778c95795e19787a19e754d)), closes [#8054](https://github.com/nolimits4web/Swiper/issues/8054)\n\n### Features\n\n- **a11y:** add wrapperLiveRegion param to disable wrapper live region in a11y module ([#8061](https://github.com/nolimits4web/Swiper/issues/8061)) ([d03044e](https://github.com/nolimits4web/Swiper/commit/d03044e8f8648946dfecf9b669df987a5a5e1925))\n- move to SVG icons for navigation ([264603c](https://github.com/nolimits4web/Swiper/commit/264603cc36a54e7a4f39507b2fbdab7e38bb046e)), closes [#6652](https://github.com/nolimits4web/Swiper/issues/6652) [#4990](https://github.com/nolimits4web/Swiper/issues/4990)\n- remove LESS and SCSS styles in favor of CSS ([118ec66](https://github.com/nolimits4web/Swiper/commit/118ec6616da1249b589f9c468076ec036234b36d))\n- **virtual:** add slidesPerViewAutoSlideSize parameter for fixed slide dimensions with slidesPerView auto ([d472144](https://github.com/nolimits4web/Swiper/commit/d47214480e7b9155ce2203a9a21209e56c5c303b)), closes [#8041](https://github.com/nolimits4web/Swiper/issues/8041) [#7796](https://github.com/nolimits4web/Swiper/issues/7796)\n\n# [11.2.10](https://github.com/nolimits4web/Swiper/compare/v11.2.9...v11.2.10) (2025-06-28)\n\n### Bug Fixes\n\n- **core:** fix clickedIndex with grid ([863d8bd](https://github.com/nolimits4web/Swiper/commit/863d8bdd750b5a5f5b6df8b1129656e8050bd615))\n\n# [11.2.9](https://github.com/nolimits4web/Swiper/compare/v11.2.8...v11.2.9) (2025-06-27)\n\n### Bug Fixes\n\n- **core:** clear blank slides within loopCreate() ([#8033](https://github.com/nolimits4web/Swiper/issues/8033)) ([377d53c](https://github.com/nolimits4web/Swiper/commit/377d53cbcf7dfbaeab76e8bfa88e94795693b157))\n- **core:** escape brackets when transforming classes to selector ([#8014](https://github.com/nolimits4web/Swiper/issues/8014)) ([0c53ee8](https://github.com/nolimits4web/Swiper/commit/0c53ee8bd9d606934e0e29d78b7088a58d9fba64))\n- **core:** slideTo function does not work when grid.rows > 1 ([#8030](https://github.com/nolimits4web/Swiper/issues/8030)) ([1fde9d3](https://github.com/nolimits4web/Swiper/commit/1fde9d38090a858487ae9e000a8c164fecf81320))\n- **core:** using loop and slideToClickedSlide / slideToLoop with centeredSlides ([b6692e2](https://github.com/nolimits4web/Swiper/commit/b6692e21de281685c6434368e5cac2180f9320fa)), closes [#8031](https://github.com/nolimits4web/Swiper/issues/8031)\n- **element:** don't set subprops on boolean values ([090caa1](https://github.com/nolimits4web/Swiper/commit/090caa19764f16e44e89b8478e5737f1783eefa3)), closes [#8003](https://github.com/nolimits4web/Swiper/issues/8003)\n- **keyboard:** detect contenteditable element in keyboard module ([#8006](https://github.com/nolimits4web/Swiper/issues/8006)) ([fcd434a](https://github.com/nolimits4web/Swiper/commit/fcd434aa53e957b516417865bddafdcb5533e863))\n- **vue:** add missing event ([839cafb](https://github.com/nolimits4web/Swiper/commit/839cafb60fb68d8f4ef8b5a2ccf6648e895e8fe9)), closes [#8002](https://github.com/nolimits4web/Swiper/issues/8002)\n\n# [11.2.8](https://github.com/nolimits4web/Swiper/compare/v11.2.7...v11.2.8) (2025-05-23)\n\n### Bug Fixes\n\n- **virtual:** fix error in Virtual slides ([7a53208](https://github.com/nolimits4web/Swiper/commit/7a53208899cbcc6efb3ec655a9de3a0b4871bbb8)), closes [#7997](https://github.com/nolimits4web/Swiper/issues/7997)\n\n# [11.2.7](https://github.com/nolimits4web/Swiper/compare/v11.2.6...v11.2.7) (2025-05-19)\n\n### Bug Fixes\n\n- **core:** fix for slideResetTransition events ([#7989](https://github.com/nolimits4web/Swiper/issues/7989)) ([473ec25](https://github.com/nolimits4web/Swiper/commit/473ec25a74a9dfbf4366445034bd22aabc3f1889))\n- **core:** set innerHTML using trusted type ([8a46954](https://github.com/nolimits4web/Swiper/commit/8a46954e43c976ea5dc0c6e3edf351f3a99a0d42)), closes [#7961](https://github.com/nolimits4web/Swiper/issues/7961)\n- **react,vue:** fix not rendered slides in effects when Virtual is enabled ([e4e1680](https://github.com/nolimits4web/Swiper/commit/e4e1680cda676992ff2ff7b14d7c45db9aec304b)), closes [#7730](https://github.com/nolimits4web/Swiper/issues/7730)\n- **types:** add enabled property on swiper-class.d.ts ([#7973](https://github.com/nolimits4web/Swiper/issues/7973)) ([ccd96dc](https://github.com/nolimits4web/Swiper/commit/ccd96dca508de2a72adb11cba3fce96d24596453))\n- **types:** coverflow effect can be number or string with percentage ([#7931](https://github.com/nolimits4web/Swiper/issues/7931)) ([4d988d8](https://github.com/nolimits4web/Swiper/commit/4d988d8b0f5f646d881895c2934d82042fa1b120))\n- **types:** fix `effect` param type ([#7945](https://github.com/nolimits4web/Swiper/issues/7945)) ([42eec07](https://github.com/nolimits4web/Swiper/commit/42eec0722c7a1d6dd943245282f4048ce7d4459d))\n- **vue:** added missing props ([#7966](https://github.com/nolimits4web/Swiper/issues/7966)) ([6aa8d05](https://github.com/nolimits4web/Swiper/commit/6aa8d0585d29ff10abb9a4328ce6add240d4e55d))\n\n# [11.2.6](https://github.com/nolimits4web/Swiper/compare/v11.2.5...v11.2.6) (2025-03-19)\n\n### Bug Fixes\n\n- **cards/loop:** improve loop behavior with cards effect ([9a258d4](https://github.com/nolimits4web/Swiper/commit/9a258d42324cce36026bd3e3367b069a64e9aa99)), closes [#7917](https://github.com/nolimits4web/Swiper/issues/7917)\n- **core:** fix initialSlide in loop mode when it there are not enough slides to fill ([16818e2](https://github.com/nolimits4web/Swiper/commit/16818e2629d6afbbc1ef3778b3289d575e86d2ff)), closes [#7780](https://github.com/nolimits4web/Swiper/issues/7780)\n- **core:** fix touchReleaseOnEdges in RTL ([d841428](https://github.com/nolimits4web/Swiper/commit/d841428af537f127f16584cf437ba4c6a912a82f)), closes [#7179](https://github.com/nolimits4web/Swiper/issues/7179)\n\n# [11.2.5](https://github.com/nolimits4web/Swiper/compare/v11.2.4...v11.2.5) (2025-03-04)\n\n### Bug Fixes\n\n- **docs:** correct structure of pagination render functions ([b259723](https://github.com/nolimits4web/Swiper/commit/b25972397926ad0abb3bfa808e8621127a0f0e06)), closes [#7897](https://github.com/nolimits4web/Swiper/issues/7897) [#7896](https://github.com/nolimits4web/Swiper/issues/7896)\n- **thumbs:** correct reinit thumbs ([1cf24d4](https://github.com/nolimits4web/Swiper/commit/1cf24d46472f1e0bbd73fa1ea6064fc5f793b7e6)), closes [#7880](https://github.com/nolimits4web/Swiper/issues/7880)\n- **zoom:** fix transform origin of `zoom.in()` function ([#7904](https://github.com/nolimits4web/Swiper/issues/7904)) ([f7febe1](https://github.com/nolimits4web/Swiper/commit/f7febe10be5d38954a7b030234037a852b47b12d))\n\n### Features\n\n- check if slidesEl is defined in loopDestroy ([#7906](https://github.com/nolimits4web/Swiper/issues/7906)) ([ced30cb](https://github.com/nolimits4web/Swiper/commit/ced30cbd567700582aef5076c5e22dc3b4b571e1))\n\n# [11.2.4](https://github.com/nolimits4web/Swiper/compare/v11.2.3...v11.2.4) (2025-02-14)\n\n### Bug Fixes\n\n- restore compatibility with ES2019 [#7891](https://github.com/nolimits4web/Swiper/issues/7891) ([#7892](https://github.com/nolimits4web/Swiper/issues/7892)) ([b4fbbb3](https://github.com/nolimits4web/Swiper/commit/b4fbbb3ceb1af1cecd5295a32f1e600876802e87))\n\n# [11.2.3](https://github.com/nolimits4web/Swiper/compare/v11.2.2...v11.2.3) (2025-02-12)\n\n### Bug Fixes\n\n- **element:** remove infinite preloader in loop ([#7886](https://github.com/nolimits4web/Swiper/issues/7886)) ([c0d3ece](https://github.com/nolimits4web/Swiper/commit/c0d3ece2147e95f37154ee019402286f5b213712))\n\n### Features\n\n- **core:** export swiper-vars.scss for overwriteability ([#7883](https://github.com/nolimits4web/Swiper/issues/7883)) ([0b688a1](https://github.com/nolimits4web/Swiper/commit/0b688a1a40d9365ff0a696abf290bea6baf5a8f0)), closes [#7882](https://github.com/nolimits4web/Swiper/issues/7882)\n- update ssr-window to latest ([c521888](https://github.com/nolimits4web/Swiper/commit/c521888d98863ededd3286543dac7e040bcf1ddc))\n\n# [11.2.2](https://github.com/nolimits4web/Swiper/compare/v11.2.1...v11.2.2) (2025-01-31)\n\n### Bug Fixes\n\n- **cards:** fix slides swap issue in loop mode ([e012e34](https://github.com/nolimits4web/Swiper/commit/e012e34f6f926dcec6415f11912d23190ed85242)), closes [#7823](https://github.com/nolimits4web/Swiper/issues/7823)\n- **core:** fix slidePrev issue in free-mode ([a3fee36](https://github.com/nolimits4web/Swiper/commit/a3fee3615eaf3daf3fad54445c3bdba29d9cd302)), closes [#7869](https://github.com/nolimits4web/Swiper/issues/7869)\n- **virtual:** fix when Element not swiping in Safari ([5abdbfd](https://github.com/nolimits4web/Swiper/commit/5abdbfde1a4e796a6ed981105d02ca7b4b13d6ed)), closes [#7679](https://github.com/nolimits4web/Swiper/issues/7679)\n\n# [11.2.1](https://github.com/nolimits4web/Swiper/compare/v11.2.0...v11.2.1) (2025-01-10)\n\n### Bug Fixes\n\n- **core:** add check for HTMLSlotElement support ([#7840](https://github.com/nolimits4web/Swiper/issues/7840)) ([56700e5](https://github.com/nolimits4web/Swiper/commit/56700e588e63da8a07ec25f096910cbef64e7dd1))\n- **core:** typo in autoplay param ([#7848](https://github.com/nolimits4web/Swiper/issues/7848)) ([69113c9](https://github.com/nolimits4web/Swiper/commit/69113c99478921a52532daf2ba1ab994ed46b701))\n\n# [11.2.0](https://github.com/nolimits4web/Swiper/compare/v11.1.15...v11.2.0) (2025-01-02)\n\n### Bug Fixes\n\n- **core:** Fixed elementIsChildOf returning false for nested web components ([#7762](https://github.com/nolimits4web/Swiper/issues/7762)) ([8136607](https://github.com/nolimits4web/Swiper/commit/8136607e0782646cd095b6e3ff8ece63033df390)), closes [#7761](https://github.com/nolimits4web/Swiper/issues/7761)\n- **zoom:** Ensure the zoom module's array is cleared onTouchEnd to fix [#7304](https://github.com/nolimits4web/Swiper/issues/7304) ([#7830](https://github.com/nolimits4web/Swiper/issues/7830)) ([21610bd](https://github.com/nolimits4web/Swiper/commit/21610bde1d6537102fdcec62b86f2f2e0794540c))\n\n### Features\n\n- **core:** Allow using a CSS selector as breakpointsBase ([#7818](https://github.com/nolimits4web/Swiper/issues/7818)) ([44d3443](https://github.com/nolimits4web/Swiper/commit/44d3443f66d93c1dc6720bddb05780bea7406982))\n- **zoom:** Add ability to pan around an image on mouse move ([#7831](https://github.com/nolimits4web/Swiper/issues/7831)) ([c4619bb](https://github.com/nolimits4web/Swiper/commit/c4619bb01dd929b29397afc7697958ca23c82c90)), closes [#7306](https://github.com/nolimits4web/Swiper/issues/7306)\n\n# [11.1.15](https://github.com/nolimits4web/Swiper/compare/v11.1.14...v11.1.15) (2024-11-18)\n\n### Bug Fixes\n\n- **react:** react strict mode double initialization errors for thumbs ([#7789](https://github.com/nolimits4web/Swiper/issues/7789)) ([9dece7d](https://github.com/nolimits4web/Swiper/commit/9dece7dae34e6a7a0291cd0a05f8c804bfdd7b59))\n- **scss:** Dart Sass 3.0.0 compatibility ([fbd2ba4](https://github.com/nolimits4web/Swiper/commit/fbd2ba4b9bc7c5ae6a3c8796e4ea790a2c5507b0)), closes [#7772](https://github.com/nolimits4web/Swiper/issues/7772) [#7771](https://github.com/nolimits4web/Swiper/issues/7771)\n- **types:** remove 'Lazy' declaration ([#7739](https://github.com/nolimits4web/Swiper/issues/7739)) ([40a705e](https://github.com/nolimits4web/Swiper/commit/40a705e5bcadf2ee2ee90591ff9ed95c1aaf9026))\n- **types:** type definitions for `slidesEl`, `slidesGrid`, and `slidesSizesGrid` ([#7768](https://github.com/nolimits4web/Swiper/issues/7768)) ([fb59a41](https://github.com/nolimits4web/Swiper/commit/fb59a41801629a25dc7f0738961e3aeeb60a9cc8))\n\n# [11.1.14](https://github.com/nolimits4web/Swiper/compare/v11.1.12...v11.1.14) (2024-09-12)\n\n### Bug Fixes\n\n- **core:** fix mobile input blur on touchstart on different input ([66c5dd1](https://github.com/nolimits4web/Swiper/commit/66c5dd10dc3b75a645b17c5b06b193483c026a89)), closes [#7728](https://github.com/nolimits4web/Swiper/issues/7728)\n- **element:** Query the swiper.hostEl for the navigation buttons ([#7714](https://github.com/nolimits4web/Swiper/issues/7714)) ([#7716](https://github.com/nolimits4web/Swiper/issues/7716)) ([d0b6abd](https://github.com/nolimits4web/Swiper/commit/d0b6abd74805398ac3cbf41aeebf141a805ec64b))\n- **zoom:** add sanity check before allowTouchMove call in timeout ([#7723](https://github.com/nolimits4web/Swiper/issues/7723)) ([869bb84](https://github.com/nolimits4web/Swiper/commit/869bb843735718c3c77551644cfd717bbf9e264e))\n\n# [11.1.12](https://github.com/nolimits4web/Swiper/compare/v11.1.11...v11.1.12) (2024-09-01)\n\n### Bug Fixes\n\n- **cards:** fix cards effect styles leak ([0be4c6a](https://github.com/nolimits4web/Swiper/commit/0be4c6aa785d5be34a8f33fde91b67ec25d5752a)), closes [#7712](https://github.com/nolimits4web/Swiper/issues/7712)\n\n### Features\n\n- **a11y:** add `containerRole` parameter ([#7708](https://github.com/nolimits4web/Swiper/issues/7708)) ([1542c01](https://github.com/nolimits4web/Swiper/commit/1542c01823fd233aa6159c13aec717360cb3c01c))\n\n# [11.1.11](https://github.com/nolimits4web/Swiper/compare/v11.1.10...v11.1.11) (2024-08-28)\n\n### Bug Fixes\n\n- centeredSlides with centeredSlidesBounds don't work correct when slidesPerView: 'auto' and width of the swiper-container bigger then width of slides ([#7696](https://github.com/nolimits4web/Swiper/issues/7696)) ([c11172a](https://github.com/nolimits4web/Swiper/commit/c11172a50ae67d79a625ad35c9460feceff478c6))\n- **element:** fix element styles to have correct order override ([f26036f](https://github.com/nolimits4web/Swiper/commit/f26036f3261bc9dad9f83a8c7145578b8ccf6ecc)), closes [#7704](https://github.com/nolimits4web/Swiper/issues/7704)\n- **virtual:** fix bypassing initial translate check if Virtual is enabled ([df957bb](https://github.com/nolimits4web/Swiper/commit/df957bbdb81ffeb7ef752598f740d4e155f9840a)), closes [#7699](https://github.com/nolimits4web/Swiper/issues/7699)\n\n# [11.1.10](https://github.com/nolimits4web/Swiper/compare/v11.1.9...v11.1.10) (2024-08-21)\n\n### Bug Fixes\n\n- **pagination:** fixed swiper Infinite loop scroll jumping ([#7690](https://github.com/nolimits4web/Swiper/issues/7690))\n- **zoom:** fix zoomIn after currentScale is set to 1 ([#7663](https://github.com/nolimits4web/Swiper/issues/7663)) ([94173da](https://github.com/nolimits4web/Swiper/commit/94173dae058d18e3839d8f98584bce460eb49996))\n\n# [11.1.9](https://github.com/nolimits4web/Swiper/compare/v11.1.8...v11.1.9) (2024-07-31)\n\n### Bug Fixes\n\n- **core:** fix loop missing slides with centeredSlides ([4847fcb](https://github.com/nolimits4web/Swiper/commit/4847fcba5dbe34caa91ea23b0bb72c8d40da0e63)), closes [#7584](https://github.com/nolimits4web/Swiper/issues/7584)\n- **core:** fix types of swiper-effect-utils.d.ts ([#7655](https://github.com/nolimits4web/Swiper/issues/7655)) ([4875f26](https://github.com/nolimits4web/Swiper/commit/4875f26163c016469e599abd3d5e0a05b3838959))\n- **mousewheel:** fix issue with event handling after Swiper was destroyed ([82ae434](https://github.com/nolimits4web/Swiper/commit/82ae4346800b96bdb435cb97bed34beebbb1f359)), closes [#7654](https://github.com/nolimits4web/Swiper/issues/7654)\n\n### Features\n\n- add types for minTranslate and maxTranslate functions ([#7647](https://github.com/nolimits4web/Swiper/issues/7647)) ([450c57a](https://github.com/nolimits4web/Swiper/commit/450c57a4c6d651207e4f79ffe7ac823ab2cfcb63))\n\n# [11.1.8](https://github.com/nolimits4web/Swiper/compare/v11.1.7...v11.1.8) (2024-07-26)\n\n### Bug Fixes\n\n- **core:** fixed typo in utils/elementIsChildOf ([#7649](https://github.com/nolimits4web/Swiper/issues/7649)) ([575e715](https://github.com/nolimits4web/Swiper/commit/575e71593bac73f8db64730cce2323f660006489))\n\n# [11.1.7](https://github.com/nolimits4web/Swiper/compare/v11.1.6...v11.1.7) (2024-07-24)\n\n### Bug Fixes\n\n- **core:** fix element child detection ([7ec975c](https://github.com/nolimits4web/Swiper/commit/7ec975c8550bfebacc7ecd032dc540e720f45175)), closes [#7636](https://github.com/nolimits4web/Swiper/issues/7636)\n\n# [11.1.6](https://github.com/nolimits4web/Swiper/compare/v11.1.5...v11.1.6) (2024-07-23)\n\n### Bug Fixes\n\n- **controller:** fix 2 way control in element ([6eec16b](https://github.com/nolimits4web/Swiper/commit/6eec16bfe1f103bd19bad6dec0a7aa3fb3ee2bb1)), closes [#7628](https://github.com/nolimits4web/Swiper/issues/7628)\n\n### Features\n\n- **a11y:** added new prop for a11y module - `scrollOnFocus` ([#7632](https://github.com/nolimits4web/Swiper/issues/7632)) ([f4f7da0](https://github.com/nolimits4web/Swiper/commit/f4f7da0260f1b03ab5f168b84a3b74ef8e2a7a26))\n- **element:** added support for using slots as swiper wrappers ([#7624](https://github.com/nolimits4web/Swiper/issues/7624)) ([e374e06](https://github.com/nolimits4web/Swiper/commit/e374e06a930bef74658614900bb1e11c5a54b189))\n\n# [11.1.5](https://github.com/nolimits4web/Swiper/compare/v11.1.4...v11.1.5) (2024-07-15)\n\n### Bug Fixes\n\n- **element:** fix observer to watch for slides ([7cffede](https://github.com/nolimits4web/Swiper/commit/7cffedef190c6e75bf84adfa6dfddd64e1bfa0e6)), closes [#7598](https://github.com/nolimits4web/Swiper/issues/7598)\n- improved 3d rotate fix in Safari ([cb83879](https://github.com/nolimits4web/Swiper/commit/cb83879894fca633844b5db76dfe1d9d82c816ea)), closes [#7532](https://github.com/nolimits4web/Swiper/issues/7532)\n- update navigation.scss to remove SASS Deprecation Warning ([#7612](https://github.com/nolimits4web/Swiper/issues/7612)) ([a3e0bf8](https://github.com/nolimits4web/Swiper/commit/a3e0bf893da2af150a64b99c8d59b81249929a5a))\n- **vue:** add breakpointsBase type ([4adb85b](https://github.com/nolimits4web/Swiper/commit/4adb85b081a0ed3e657da79d8f711e610335edba)), closes [#7607](https://github.com/nolimits4web/Swiper/issues/7607)\n\n# [11.1.4](https://github.com/nolimits4web/Swiper/compare/v11.1.3...v11.1.4) (2024-05-30)\n\n### Bug Fixes\n\n- **a11y:** fix slide on focus when loop mode is enabled ([fc8ed1a](https://github.com/nolimits4web/Swiper/commit/fc8ed1a2de8f05b017e371763b1236e1eb2670c4)), closes [#7540](https://github.com/nolimits4web/Swiper/issues/7540)\n- **core:** check for swiper.el in destroy queue ([39a3e53](https://github.com/nolimits4web/Swiper/commit/39a3e53ba7df00a0479e0748fff874703578c7df)), closes [#7530](https://github.com/nolimits4web/Swiper/issues/7530)\n- **navigation:** prevent hide on click when clicking on navigation buttons ([c0f7bb6](https://github.com/nolimits4web/Swiper/commit/c0f7bb6f3612f42664eab60bbcfb7969bfeb16bf)), closes [#7559](https://github.com/nolimits4web/Swiper/issues/7559)\n- **vue:** avoid rendering same slide vnode twice for small amount of slides in loop + virtual mode ([#7556](https://github.com/nolimits4web/Swiper/issues/7556)) ([5737f03](https://github.com/nolimits4web/Swiper/commit/5737f03d202ce0f22d390b2e9f94b8573f59472b))\n- **zoom:** fix issue when slide change possible during zoom out ([f67308c](https://github.com/nolimits4web/Swiper/commit/f67308c8f4367817d9c60980276c922af9fcb654))\n\n# [11.1.3](https://github.com/nolimits4web/Swiper/compare/v11.1.2...v11.1.3) (2024-05-13)\n\n### Bug Fixes\n\n- fix types import ([57923db](https://github.com/nolimits4web/Swiper/commit/57923db8f2cc7dae9f39011531147d68f26f834d)), closes [#7529](https://github.com/nolimits4web/Swiper/issues/7529)\n\n# [11.1.2](https://github.com/nolimits4web/Swiper/compare/v11.1.1...v11.1.2) (2024-05-13)\n\n### Bug Fixes\n\n- **autoplay:** keep 0 transition on touchmove with 0 timeout delay ([8ccb08e](https://github.com/nolimits4web/Swiper/commit/8ccb08ef1c1adcb4ff53f91bf494a0bd221d5735)), closes [#7515](https://github.com/nolimits4web/Swiper/issues/7515)\n- **core:** centerInsuffientSlides takes offsets into account ([#7437](https://github.com/nolimits4web/Swiper/issues/7437)) ([5a271ff](https://github.com/nolimits4web/Swiper/commit/5a271ff050376820cfe42e04730cd097f38496a1))\n- **types:** fixed SwiperModule, slideTo, effectInit types ([#7428](https://github.com/nolimits4web/Swiper/issues/7428)) ([bc61bce](https://github.com/nolimits4web/Swiper/commit/bc61bce297bce8c38299671e9fe18f6a5b0fd77e))\n\n### Performance Improvements\n\n- do not remove and re-add visibility classes for unchanged slides to prevents unnecessary style recalculations (This performance difference is mostly noticable when moving a slide with a mouse or touchmove because updateSlidesProgress is triggered for every keyboard-/touchevent) ([#7505](https://github.com/nolimits4web/Swiper/issues/7505)) ([2c08227](https://github.com/nolimits4web/Swiper/commit/2c08227d3e81db744e2d6e1c9d87c9ff6236533d))\n\n# [11.1.1](https://github.com/nolimits4web/Swiper/compare/v11.1.0...v11.1.1) (2024-04-09)\n\n### Bug Fixes\n\n- **zoom:** fix zoom pan not preventing slide changes using touch ([f73cc2a](https://github.com/nolimits4web/Swiper/commit/f73cc2a7a0bc4b9d094c33853e629785d1b5ddeb)), closes [#7308](https://github.com/nolimits4web/Swiper/issues/7308)\n\n# [11.1.0](https://github.com/nolimits4web/Swiper/compare/v11.0.7...v11.1.0) (2024-03-28)\n\n### Bug Fixes\n\n- **a11y:** fixed issue with not working \"enter\" navigation on arrows ([aac2dcf](https://github.com/nolimits4web/Swiper/commit/aac2dcfc4cf6ddcef93933c75d3eab984f149a18)), closes [#7423](https://github.com/nolimits4web/Swiper/issues/7423)\n- **a11y:** prevent falsy focus handlers ([a7c260a](https://github.com/nolimits4web/Swiper/commit/a7c260a9d93405a0adce304b4ccf4f5309dfedda)), closes [#7406](https://github.com/nolimits4web/Swiper/issues/7406)\n- **core:** add/remove slide classes only when changed ([3312fba](https://github.com/nolimits4web/Swiper/commit/3312fba06de686e48cf0c138ea7bba20fc7842e5)), closes [#7356](https://github.com/nolimits4web/Swiper/issues/7356)\n- **core:** don't fix the loop on simple resize ([641793f](https://github.com/nolimits4web/Swiper/commit/641793ff459527c4c1efc9f72b447b87c8939f5f)), closes [#7325](https://github.com/nolimits4web/Swiper/issues/7325)\n- **core:** fixed thrown error on calling slideTo methods on destroyed swiper ([8c6a3c6](https://github.com/nolimits4web/Swiper/commit/8c6a3c6f63915db82415e2d7829ece6c624ace1e)), closes [#7416](https://github.com/nolimits4web/Swiper/issues/7416)\n- **core:** handle grabCursor within breakpoints ([e853908](https://github.com/nolimits4web/Swiper/commit/e853908c2ff93dc944ba045c9c0fce83efe46288)), closes [#7364](https://github.com/nolimits4web/Swiper/issues/7364)\n- **core:** reset animating flag on translateTo call ([7da50bf](https://github.com/nolimits4web/Swiper/commit/7da50bf1bcfe86f5af646e7d53c7d0414211da60)), closes [#7403](https://github.com/nolimits4web/Swiper/issues/7403)\n- **scrollbar:** fix warning ([e5371f7](https://github.com/nolimits4web/Swiper/commit/e5371f7656c4e828d87e7497edc73f9b6311f91d)), closes [#7415](https://github.com/nolimits4web/Swiper/issues/7415)\n- **thumbs:** fix thumbs .swiper type prop to accept string ([5b0fa84](https://github.com/nolimits4web/Swiper/commit/5b0fa84ac14022dd1ca39d387267a8d9125cb13a)), closes [#7421](https://github.com/nolimits4web/Swiper/issues/7421)\n- **virtual:** don't render first slides when initialSlide set ([bab9230](https://github.com/nolimits4web/Swiper/commit/bab92305c5a69b9b9f33615fa5df61fbfda39700)), closes [#7353](https://github.com/nolimits4web/Swiper/issues/7353)\n- **zoom:** fix panning on SVG elements ([eed8a5b](https://github.com/nolimits4web/Swiper/commit/eed8a5bf727163cf2da343490c09fc248b658e5e)), closes [#7352](https://github.com/nolimits4web/Swiper/issues/7352)\n\n# [11.0.7](https://github.com/nolimits4web/Swiper/compare/v11.0.6...v11.0.7) (2024-02-27)\n\n### Bug Fixes\n\n- **core:** fix initial slide index shift with centeredSlides and slidesPerView auto ([#7319](https://github.com/nolimits4web/Swiper/issues/7319)) ([cae9c2d](https://github.com/nolimits4web/Swiper/commit/cae9c2dc192dafc0f35cb03e919dd1151dca88da))\n- **history:** fix setting history in virtual slides ([d4de17b](https://github.com/nolimits4web/Swiper/commit/d4de17b278b57760cfc9953d1da7892b44f0fc22)), closes [#7327](https://github.com/nolimits4web/Swiper/issues/7327)\n- **react:** make sure the key is unique in virtual mode ([829a253](https://github.com/nolimits4web/Swiper/commit/829a2536b5d4f4ed86cb31d9c73d4d9b3be656c3)), closes [#7329](https://github.com/nolimits4web/Swiper/issues/7329)\n\n### Features\n\n- add swiper-effect-utils ([df5f873](https://github.com/nolimits4web/Swiper/commit/df5f8731b795419534420bf4d567c75bfd475656)), closes [#7336](https://github.com/nolimits4web/Swiper/issues/7336)\n- **zoom:** add ability to constrain max zoom to 100% of original image size ([#7311](https://github.com/nolimits4web/Swiper/issues/7311)) ([645f266](https://github.com/nolimits4web/Swiper/commit/645f266c6b8dea5d43e14cace925ad86236ecc75))\n\n# [11.0.6](https://github.com/nolimits4web/Swiper/compare/v11.0.5...v11.0.6) (2024-02-05)\n\n### Bug Fixes\n\n- add optional swiperElementNodeName param to allow more flexible web component usage ([#7284](https://github.com/nolimits4web/Swiper/issues/7284)) ([178511f](https://github.com/nolimits4web/Swiper/commit/178511fe8ac37b590b92ff081379074e340436fa))\n- fixed behavior where the combination of 'initialSlide:0' and 'slidesPerView:auto' would shift the first slide position ([e5c04c3](https://github.com/nolimits4web/Swiper/commit/e5c04c38e4261f4afb195bc15ea7417e7c1190dd)), closes [#7216](https://github.com/nolimits4web/Swiper/issues/7216)\n- Safari 3D fix for webview ([d42ce05](https://github.com/nolimits4web/Swiper/commit/d42ce05380c4a8f1848ad409b2ac8ed848723399)), closes [#7167](https://github.com/nolimits4web/Swiper/issues/7167)\n- **scrollbar:** correctly update scrollbar on changeDirection ([6bbb73d](https://github.com/nolimits4web/Swiper/commit/6bbb73d84f684e711250664d1eb7017b1b02ec3a)), closes [#7263](https://github.com/nolimits4web/Swiper/issues/7263)\n- SwiperOptions documentation for loopAddBlankSlides ([#7289](https://github.com/nolimits4web/Swiper/issues/7289)) ([cbc3dba](https://github.com/nolimits4web/Swiper/commit/cbc3dba7b4869c82f87c920e519f334fe9dc9880))\n\n### Features\n\n- **core:** prevent running .slideTo methods when Swiper is destroyed ([05f9c64](https://github.com/nolimits4web/Swiper/commit/05f9c6493081666f0458a67715271fc728827731)), closes [#7265](https://github.com/nolimits4web/Swiper/issues/7265)\n\n# [11.0.5](https://github.com/nolimits4web/Swiper/compare/v11.0.4...v11.0.5) (2023-11-22)\n\n### Bug Fixes\n\n- **core:** swipe to last with slidesPerView: auto ([#7183](https://github.com/nolimits4web/Swiper/issues/7183)) ([2e3f47d](https://github.com/nolimits4web/Swiper/commit/2e3f47d5fcd37707be18180f35c9955c0bcc915e))\n- **modules/a11y:** filter out falsy pagination elems ([#7201](https://github.com/nolimits4web/Swiper/issues/7201)) ([a044626](https://github.com/nolimits4web/Swiper/commit/a0446261bdbd9d538e31c02d3248d3bec0328c55))\n\n### Features\n\n- **core:** new `slidesUpdated` event ([8a0c7c4](https://github.com/nolimits4web/Swiper/commit/8a0c7c43ad5931d22a20a9b33152f6befc5bcb59))\n\n# [11.0.4](https://github.com/nolimits4web/Swiper/compare/v11.0.3...v11.0.4) (2023-11-09)\n\n### Bug Fixes\n\n- **effectx:** fix Safari issue with rotates even to 90deg ([e005b69](https://github.com/nolimits4web/Swiper/commit/e005b699e7dbd7c343a56f19fca384b28c37cb97)), closes [#7167](https://github.com/nolimits4web/Swiper/issues/7167)\n\n# [11.0.3](https://github.com/nolimits4web/Swiper/compare/v11.0.2...v11.0.3) (2023-10-26)\n\n### Bug Fixes\n\n- **core:** fixed legacy condition preventing touch move when zoom enabled ([2f64043](https://github.com/nolimits4web/Swiper/commit/2f64043bc2abfe13a6b3a2a24b082c9627c20ee7)), closes [#7137](https://github.com/nolimits4web/Swiper/issues/7137)\n- **core:** prevent observer updates on loop fix ([7a5eacc](https://github.com/nolimits4web/Swiper/commit/7a5eaccb5e6ee1a867a3c2f30e9a44400e6c341c)), closes [#7135](https://github.com/nolimits4web/Swiper/issues/7135)\n\n# [11.0.2](https://github.com/nolimits4web/Swiper/compare/v11.0.1...v11.0.2) (2023-10-25)\n\n### Bug Fixes\n\n- **core:** correctly handle loopAdditionalSlides parameter ([3f5e05d](https://github.com/nolimits4web/Swiper/commit/3f5e05d59a776e2cfc3a709e4b230ff23191266c))\n\n# [11.0.1](https://github.com/nolimits4web/Swiper/compare/v11.0.0...v11.0.1) (2023-10-24)\n\n### Bug Fixes\n\n- **types:** fix eventsPrefix type ([fd0f601](https://github.com/nolimits4web/Swiper/commit/fd0f601fb08af7a72d3c582cf88e06e6a8bed9f8))\n\n# [11.0.0](https://github.com/nolimits4web/Swiper/compare/v10.3.1...v11.0.0) (2023-09-24)\n\n### Bug Fixes\n\n- **autoplay:** fix negative autoplay values after stop/start, fix autoplay with free mode ([8bef84d](https://github.com/nolimits4web/Swiper/commit/8bef84d68c44b93757585cb037f7448cc99f7c71)), closes [#7084](https://github.com/nolimits4web/Swiper/issues/7084)\n- **autoplay:** fix pauseOnPointerEnter if hovered during transition ([5080d95](https://github.com/nolimits4web/Swiper/commit/5080d9569fc1ac77c0cb01812567f8035cc780bb)), closes [#7107](https://github.com/nolimits4web/Swiper/issues/7107)\n- **core:** remove grid class on rows change ([2f65e89](https://github.com/nolimits4web/Swiper/commit/2f65e89cb5758b44ceced212d4be905e0ed0f4c3)), closes [#7053](https://github.com/nolimits4web/Swiper/issues/7053)\n- **element:** correctly respond to object params assignment ([f23c742](https://github.com/nolimits4web/Swiper/commit/f23c74250c7d4fd56ea4d5abfe2e031504c86d91))\n- **scrollbar:** allow multiple classes in scrollbar parameters ([89a6f71](https://github.com/nolimits4web/Swiper/commit/89a6f7192f7da120487c224dc1b1a7668422321a)), closes [#7096](https://github.com/nolimits4web/Swiper/issues/7096)\n\n### Features\n\n- **core:** add fully visible slides classes ([902a4c4](https://github.com/nolimits4web/Swiper/commit/902a4c4adbff3af1188427d6cfef50d537c1bcef)), closes [#6773](https://github.com/nolimits4web/Swiper/issues/6773)\n- **core:** add handling for native touch events ([74bb1cc](https://github.com/nolimits4web/Swiper/commit/74bb1ccf4c6f31ffdb7419d5a58a4f592aa6006b)), closes [#6478](https://github.com/nolimits4web/Swiper/issues/6478) [#6381](https://github.com/nolimits4web/Swiper/issues/6381) [#6897](https://github.com/nolimits4web/Swiper/issues/6897)\n- **core:** loop support for grid, new `loopAddBlankSlides` parameter ([b5db223](https://github.com/nolimits4web/Swiper/commit/b5db22392f6c6609de292c00d163f9230d0925ee))\n- **core:** remove `loopedSlides` parameter, add `loopAdditionalSlides` parameter ([d647985](https://github.com/nolimits4web/Swiper/commit/d647985faa9c8e3d551270e96692b2bd135bc92a))\n- **core:** reworked loop mode ([2a99dbd](https://github.com/nolimits4web/Swiper/commit/2a99dbd383ca6880dd60ce35c70d7337bb1f38c8))\n- **core:** update loop mode logic and lowered requirements ([703ede6](https://github.com/nolimits4web/Swiper/commit/703ede6ea1e490ee0200edf18c6857f534101827))\n- **element:** make`eventPrefix` parameter default to `swiper` ([88d463a](https://github.com/nolimits4web/Swiper/commit/88d463aef9b74e6de637470c4c7c024e5f3ca6b9))\n- **core:** move default container overflow back to `hidden` ([88941a8](https://github.com/nolimits4web/Swiper/commit/88941a82491b289faed24508db8b90e3c5506ba1))\n\n# [10.3.1](https://github.com/nolimits4web/Swiper/compare/v10.3.0...v10.3.1) (2023-09-28)\n\n### Bug Fixes\n\n- **autoplay:** fix autoplay stop when disableOnInteraction is active ([ecfb3fb](https://github.com/nolimits4web/Swiper/commit/ecfb3fb06b7214e87332e41a6b96dc7a721a8313)), closes [#7060](https://github.com/nolimits4web/Swiper/issues/7060) [#7059](https://github.com/nolimits4web/Swiper/issues/7059)\n- **types:** detection of custom html tags ([#7055](https://github.com/nolimits4web/Swiper/issues/7055)) ([c55f76d](https://github.com/nolimits4web/Swiper/commit/c55f76d51cadb3b9835b6c45537da30d2c3b298e))\n\n# [10.3.0](https://github.com/nolimits4web/Swiper/compare/v10.2.0...v10.3.0) (2023-09-21)\n\n### Bug Fixes\n\n- **core:** correctly destroyor create loop on breakpoints ([12a44fb](https://github.com/nolimits4web/Swiper/commit/12a44fb995313c58cde37395a654493e2d42c694)), closes [#6967](https://github.com/nolimits4web/Swiper/issues/6967)\n- **core:** don't call `realIndexChange` on initialIndex if runCallbacksOnInit is disalbed ([48c4e0a](https://github.com/nolimits4web/Swiper/commit/48c4e0a76736ac124a0d6e878f840208f31b8b09)), closes [#6976](https://github.com/nolimits4web/Swiper/issues/6976)\n- **core:** fix `slideToClickedSlide` when using Element slide slots ([af0519c](https://github.com/nolimits4web/Swiper/commit/af0519c22513ec4a7bad2c80896d421fe07012f8)), closes [#6958](https://github.com/nolimits4web/Swiper/issues/6958)\n- **core:** fix lazy preloader in later initialized slides ([e4fddc0](https://github.com/nolimits4web/Swiper/commit/e4fddc076f69bdf267559c70a489474bc311c02c)), closes [#6946](https://github.com/nolimits4web/Swiper/issues/6946)\n- **core:** fix loop on centeredSlides slide to beginning ([c496835](https://github.com/nolimits4web/Swiper/commit/c496835a2ce49065a9b282bbafe5629797bb3da4)), closes [#7011](https://github.com/nolimits4web/Swiper/issues/7011)\n- **core:** fix loopFix in loop and cssMode ([8180a52](https://github.com/nolimits4web/Swiper/commit/8180a52f386301147dae286994119693f6231202)), closes [#6919](https://github.com/nolimits4web/Swiper/issues/6919)\n- **core:** fixed ignored allowSlidePrev/Next in loop mode ([1b74619](https://github.com/nolimits4web/Swiper/commit/1b74619f5d74073cf387201c5715c29c8115f770)), closes [#6987](https://github.com/nolimits4web/Swiper/issues/6987)\n- **core:** remove grid class on rows change ([908becc](https://github.com/nolimits4web/Swiper/commit/908becc6ffbf5b5a050e2fde522867289073cf4a)), closes [#7053](https://github.com/nolimits4web/Swiper/issues/7053)\n- **element:** correctly respond to object params assignment ([2ef1ff5](https://github.com/nolimits4web/Swiper/commit/2ef1ff5d42cea985556c54f79b8a52305294d21e))\n- **element:** do not bubble `hashchange` event ([106a3d7](https://github.com/nolimits4web/Swiper/commit/106a3d7da4967bbf1ba705c1bb8a0547307bb2f9)), closes [#6943](https://github.com/nolimits4web/Swiper/issues/6943)\n- **element:** fix issue updating with boolean module params ([1cc359e](https://github.com/nolimits4web/Swiper/commit/1cc359e45d637c209ce97ebffb917ae8587fdcf2)), closes [#6947](https://github.com/nolimits4web/Swiper/issues/6947)\n- **navigation:** fix lock class on enable ([ea39c33](https://github.com/nolimits4web/Swiper/commit/ea39c3353ccd74d37444692cf01f38724aaff6b7)), closes [#7009](https://github.com/nolimits4web/Swiper/issues/7009)\n- **react:** add breakpointsBase param ([0eb4122](https://github.com/nolimits4web/Swiper/commit/0eb4122e45558efe9209f3b72ae9c30524424183)), closes [#7014](https://github.com/nolimits4web/Swiper/issues/7014)\n- **react:** fix react components props type ([1cd412e](https://github.com/nolimits4web/Swiper/commit/1cd412ecf22a38ff6c3c63bb7dc49fc1f92ca16f)), closes [#7000](https://github.com/nolimits4web/Swiper/issues/7000)\n- **scrollbar:** add 'touch-action: none' to swiper-scrollbar ([#7024](https://github.com/nolimits4web/Swiper/issues/7024)) ([9542d09](https://github.com/nolimits4web/Swiper/commit/9542d094faa61d9a4837a6ec40c331e8172324ab))\n- **virtual:** fix issue with loop mode and initialSlide enabled ([f4afd9d](https://github.com/nolimits4web/Swiper/commit/f4afd9d0fec3be48c17ab75c462c23e69e98a571)), closes [#6945](https://github.com/nolimits4web/Swiper/issues/6945)\n- **virtual:** fix removing nested slides ([c3321e1](https://github.com/nolimits4web/Swiper/commit/c3321e1645015e2ea053c72edbe60b6351030bcb)), closes [#7005](https://github.com/nolimits4web/Swiper/issues/7005)\n- **virtual:** recalc cache on removeSlide ([96e5166](https://github.com/nolimits4web/Swiper/commit/96e5166c9e01a8ca3e18ee236adee0566ad0969e)), closes [#7020](https://github.com/nolimits4web/Swiper/issues/7020)\n- **vue:** add breakpointsBase param ([6800dbb](https://github.com/nolimits4web/Swiper/commit/6800dbba2f006d1ff2206cd7ac2068cfc6429089))\n- **zoom:** fix scale origin when document is scrolled ([2cf3fc2](https://github.com/nolimits4web/Swiper/commit/2cf3fc26c2a2d9e5dc29b02427c73e8559ab896d)), closes [#6950](https://github.com/nolimits4web/Swiper/issues/6950) [#6955](https://github.com/nolimits4web/Swiper/issues/6955)\n\n### Features\n\n- **core:** allow createElements to process object params with `{enabled: true}` ([abf8405](https://github.com/nolimits4web/Swiper/commit/abf840506aa4c4f2c60cadb9dcdd4223fa071352))\n- **core:** make slidesPerViewDynamic public ([ae434b0](https://github.com/nolimits4web/Swiper/commit/ae434b0a5d76fd0d2659cd2dffc27d19c1f14a9e)), closes [#7036](https://github.com/nolimits4web/Swiper/issues/7036)\n\n# [10.2.0](https://github.com/nolimits4web/Swiper/compare/v10.1.0...v10.2.0) (2023-08-17)\n\n### Bug Fixes\n\n- **autoplay:** fix autoplay pause during transition ([db9b17f](https://github.com/nolimits4web/Swiper/commit/db9b17ffc627bafaa912b31e6336b4c366be3021)), closes [#6896](https://github.com/nolimits4web/Swiper/issues/6896)\n- **controller:** fix issues with loop mode ([fbb84fe](https://github.com/nolimits4web/Swiper/commit/fbb84fed425f8341c0bd927e5a658962b130abdf)), closes [#6659](https://github.com/nolimits4web/Swiper/issues/6659)\n- **core:** fix touch move and loop behavior when transition-delay enabled on swiper-wrapper ([ac27d02](https://github.com/nolimits4web/Swiper/commit/ac27d0204dfa3e6cc2059e19d5f6ff836d77c4d0))\n- **core:** handle `contextmenu` event ([721ccaf](https://github.com/nolimits4web/Swiper/commit/721ccaf292de538e479c33668abf30ae86278d2b)), closes [#6692](https://github.com/nolimits4web/Swiper/issues/6692)\n- **element:** fix missing elements `part` when added dynamically ([db5b5d6](https://github.com/nolimits4web/Swiper/commit/db5b5d6c337b4e8615b7e6ec2acb1694213a2311)), closes [#6899](https://github.com/nolimits4web/Swiper/issues/6899)\n- **element:** fix parallax on elements passed to component root ([265e466](https://github.com/nolimits4web/Swiper/commit/265e466a043efc750964c397d262736923e58040))\n- **element:** fixed issue with incorrect lookup for lazy prelader and images ([64513ac](https://github.com/nolimits4web/Swiper/commit/64513ac899c843b745e33813126ab6c52af650a4)), closes [#6901](https://github.com/nolimits4web/Swiper/issues/6901)\n- **element:** fixed issue with pointer-events:none in fade effect ([2dcb802](https://github.com/nolimits4web/Swiper/commit/2dcb802ea5192c1f4b47fed4b20242983e06c6cb)), closes [#6908](https://github.com/nolimits4web/Swiper/issues/6908)\n- **pagination:** fixed issue in loop mode when sometimes it switches slides with transiton ([3d7dc58](https://github.com/nolimits4web/Swiper/commit/3d7dc5834f12a8ed518c9a79a58fe13777f9298f)), closes [#6856](https://github.com/nolimits4web/Swiper/issues/6856)\n\n### Features\n\n- **pagination:** allow multiple `clickableClass` ([703d13b](https://github.com/nolimits4web/Swiper/commit/703d13b1aeb234d0f72ab0a61572af6a8bb94ab7)), closes [#6741](https://github.com/nolimits4web/Swiper/issues/6741)\n\n# [10.1.0](https://github.com/nolimits4web/Swiper/compare/v10.0.4...v10.1.0) (2023-08-01)\n\n### Bug Fixes\n\n- **core:** fix flickering in loop mode edge positions ([bf29843](https://github.com/nolimits4web/Swiper/commit/bf298437039168611853cc7b7f92624f5f2726c6)), closes [#6673](https://github.com/nolimits4web/Swiper/issues/6673)\n- **core:** set `isElement` on swiper-containers only ([#6870](https://github.com/nolimits4web/Swiper/issues/6870)) ([2f61fda](https://github.com/nolimits4web/Swiper/commit/2f61fda721232f78b1b8ed16f57953442d70384b))\n- **package:** fix source maps for ES modules ([#6866](https://github.com/nolimits4web/Swiper/issues/6866)) ([5e88c4b](https://github.com/nolimits4web/Swiper/commit/5e88c4b2a88fb2158bc89ebb3f30ad738078530a)), closes [#6863](https://github.com/nolimits4web/Swiper/issues/6863)\n- **modules:** filter out falsy elements ([#6823](https://github.com/nolimits4web/Swiper/issues/6823)) ([e1b7254](https://github.com/nolimits4web/Swiper/commit/e1b725476eb90e2bbf719a344e57a92530f779ce))\n- **mousewheel:** fix `releaseOnEdges` for freeMode ([8a83360](https://github.com/nolimits4web/Swiper/commit/8a83360ea780d63dd5a95d9f62a364c5f4ab0f3f)), closes [#6770](https://github.com/nolimits4web/Swiper/issues/6770) [#6799](https://github.com/nolimits4web/Swiper/issues/6799)\n- **zoom:** fix image move in element ([89d9aa5](https://github.com/nolimits4web/Swiper/commit/89d9aa57531c4675611842378519025a926de34f)), closes [#6847](https://github.com/nolimits4web/Swiper/issues/6847)\n\n### Features\n\n- **element:** support slides as slots ([697b028](https://github.com/nolimits4web/Swiper/commit/697b02843f5feaf1968aefa07ec7e389dcd478cc))\n- **types:** make VirtualOptions generic ([#6852](https://github.com/nolimits4web/Swiper/issues/6852)) ([068ee68](https://github.com/nolimits4web/Swiper/commit/068ee68c55d8f62167af015fc2d57db8af439003))\n\n# [10.0.4](https://github.com/nolimits4web/Swiper/compare/v10.0.3...v10.0.4) (2023-07-08)\n\n### Bug Fixes\n\n- **element:** fix in Safari < 16.4 ([e53fc07](https://github.com/nolimits4web/Swiper/commit/e53fc07dffca2a2ef3e929e120d4af6b41540cd7)), closes [#6831](https://github.com/nolimits4web/Swiper/issues/6831)\n\n# [v10.0.3](https://github.com/nolimits4web/Swiper/compare/v10.0.2...v10.0.3) (2023-07-03)\n\n### Features\n\n- added overflow:hidden for fallback if clip is not supported in target… ([#6807](https://github.com/nolimits4web/Swiper/issues/6807)) ([5d8d6f9](https://github.com/nolimits4web/Swiper/commit/5d8d6f933146c8c80792c4892c54cb769b21a005))\n- **element:** use usual `<style>` tag if adopted stylesheet are not supported ([18613df](https://github.com/nolimits4web/Swiper/commit/18613dfaa7719983db059e694753262956905504))\n\n# [v10.0.2](https://github.com/nolimits4web/Swiper/compare/v10.0.1...v10.0.2) (2023-07-03)\n\n### Bug Fixes\n\n- **types:** fix modules imports ([a1b4cf6](https://github.com/nolimits4web/Swiper/commit/a1b4cf61c0a1b14b25a293443c1f336e8a8fa321)), closes [#6803](https://github.com/nolimits4web/Swiper/issues/6803)\n\n# [v10.0.1](https://github.com/nolimits4web/Swiper/compare/v10.0.0...v10.0.1) (2023-07-03)\n\n### Bug Fixes\n\n- **types:** fix types for swiper/modules ([fa6e597](https://github.com/nolimits4web/Swiper/commit/fa6e5976856304aff8e13620f09d99e8697b24a8))\n\n# [10.0.0](https://github.com/nolimits4web/Swiper/compare/v9.4.1...v10.0.0) (2023-07-03)\n\n### Features\n\n- tweak browserslist to iOS >= 15 ([96a4e7e](https://github.com/nolimits4web/Swiper/commit/96a4e7e50a430d70817d90916c8412adfbc33f74))\n- rework package to use .mjs files and all scripts and styles are minified ([a267785](https://github.com/nolimits4web/Swiper/commit/a267785a09fa228d99ede0173fdbe5506238b19a))\n- fully rework scripts structure in package ([2c87f13](https://github.com/nolimits4web/Swiper/commit/2c87f13f56a480ddbbfd43f97516a0775ceb8d19))\n- rename package files `.esm.js` to `.mjs` ([7a17821](https://github.com/nolimits4web/Swiper/commit/7a1782128125bda394b40ea9d1235d789964bfa3))\n- browser ES modules ([ab20bd1](https://github.com/nolimits4web/Swiper/commit/ab20bd1f3a4204ef83831976746cc4a4e5b4b8d9))\n- change swiper container overflow to clip ([#6738](https://github.com/nolimits4web/Swiper/issues/6738)) ([a8447b7](https://github.com/nolimits4web/Swiper/commit/a8447b7d5550bb144b842b4c5b1c61ef96e64ab1))\n- **element:** attributes can accept JSON stringified strings ([5b93954](https://github.com/nolimits4web/Swiper/commit/5b9395424d591ab90c391ab5b9573d09c69536c7))\n- **element:** highly reworked Swiper web component ([a6f8a0f](https://github.com/nolimits4web/Swiper/commit/a6f8a0fab4d4daae8b37b274a6c548393b2a11df))\n  - navigation arrows use SVGs instead of font\n  - changed shadow DOM layout to have `<div class=\"swiper\">` inside\n  - component styles now added using adoptedStylesheets\n  - no more global styles injection\n- set transform 3d on wrapper for iOS devices ([90c590d](https://github.com/nolimits4web/Swiper/commit/90c590d1879f39a3fed290a003fe7fd0205d9033))\n- tweak types exports to be Node 16+ compatible ([30ce8e0](https://github.com/nolimits4web/Swiper/commit/30ce8e0c9c7ce32025275469e9480ca8c81f30a7))\n\n### Bug Fixes\n\n- package.json exports for typescript ([#6626](https://github.com/nolimits4web/Swiper/issues/6626)) ([e9e8039](https://github.com/nolimits4web/Swiper/commit/e9e8039db557c5fbeab33472ced9ab9dc823280b))\n\n# [10.0.0-beta.5](https://github.com/nolimits4web/Swiper/compare/v10.0.0-beta.4...v10.0.0-beta.5) (2023-06-26)\n\n### Features\n\n- tweak browserslist to iOS >= 15 ([96a4e7e](https://github.com/nolimits4web/Swiper/commit/96a4e7e50a430d70817d90916c8412adfbc33f74))\n\n# [10.0.0-beta.3](https://github.com/nolimits4web/Swiper/compare/v10.0.0-beta.2...v10.0.0-beta.3) (2023-06-23)\n\n### Features\n\n- rework package to use .mjs files and all scripts and styles are minified ([a267785](https://github.com/nolimits4web/Swiper/commit/a267785a09fa228d99ede0173fdbe5506238b19a))\n\n# [10.0.0-beta.2](https://github.com/nolimits4web/Swiper/compare/v10.0.0-beta.1...v10.0.0-beta.2) (2023-06-23)\n\n### Features\n\n- fully rework scripts structure in package ([2c87f13](https://github.com/nolimits4web/Swiper/commit/2c87f13f56a480ddbbfd43f97516a0775ceb8d19))\n- rename package files `.esm.js` to `.mjs` ([7a17821](https://github.com/nolimits4web/Swiper/commit/7a1782128125bda394b40ea9d1235d789964bfa3))\n\n# [10.0.0-beta.1](https://github.com/nolimits4web/Swiper/compare/v9.4.1...v10.0.0-beta.1) (2023-06-23)\n\n### Bug Fixes\n\n- package.json exports for typescript ([#6626](https://github.com/nolimits4web/Swiper/issues/6626)) ([e9e8039](https://github.com/nolimits4web/Swiper/commit/e9e8039db557c5fbeab33472ced9ab9dc823280b))\n\n### Features\n\n- browser ES modules ([ab20bd1](https://github.com/nolimits4web/Swiper/commit/ab20bd1f3a4204ef83831976746cc4a4e5b4b8d9))\n- change swiper container overflow to clip ([#6738](https://github.com/nolimits4web/Swiper/issues/6738)) ([a8447b7](https://github.com/nolimits4web/Swiper/commit/a8447b7d5550bb144b842b4c5b1c61ef96e64ab1))\n- **element:** attributes can accept JSON stringified strings ([5b93954](https://github.com/nolimits4web/Swiper/commit/5b9395424d591ab90c391ab5b9573d09c69536c7))\n- **element:** highly reworked Swiper web component ([a6f8a0f](https://github.com/nolimits4web/Swiper/commit/a6f8a0fab4d4daae8b37b274a6c548393b2a11df))\n  - navigation arrows use SVGs instead of font\n  - changed shadow DOM layout to have `<div class=\"swiper\">` inside\n  - component styles now added using adoptedStylesheets\n  - no more global styles injection\n- set transform 3d on wrapper for iOS devices ([90c590d](https://github.com/nolimits4web/Swiper/commit/90c590d1879f39a3fed290a003fe7fd0205d9033))\n- tweak types exports to be Node 16+ compatible ([30ce8e0](https://github.com/nolimits4web/Swiper/commit/30ce8e0c9c7ce32025275469e9480ca8c81f30a7))\n\n# [9.4.1](https://github.com/nolimits4web/Swiper/compare/v9.4.0...v9.4.1) (2023-06-13)\n\n### Bug Fixes\n\n- **core:** fix issue with calling freeMode introduced in 9.4.0 ([581eea8](https://github.com/nolimits4web/Swiper/commit/581eea828b11e79d17d8ad16430acb0823f2049a)), closes [#6751](https://github.com/nolimits4web/Swiper/issues/6751)\n\n# [9.4.0](https://github.com/nolimits4web/Swiper/compare/v9.3.2...v9.3.3) (2023-06-12)\n\n### Bug Fixes\n\n- **core:** lazyPreloadPrevNext not working with grid ([883f006](https://github.com/nolimits4web/Swiper/commit/883f0066089ed3fccd24424e548c4ebb85d92756)), closes [#6725](https://github.com/nolimits4web/Swiper/issues/6725)\n- **core:** fix case with not enough slides with `centeredSlidesBounds` ([93b4279](https://github.com/nolimits4web/Swiper/commit/93b4279abed90d5f668fd48c9124392fbb516fdb)), closes [#6689](https://github.com/nolimits4web/Swiper/issues/6689)\n- **core:** fix error for `swiperSlideSize` in hidden slider ([36ef2e6](https://github.com/nolimits4web/Swiper/commit/36ef2e608843b4c83a5dc7ecde30aa71794f639e)), closes [#6718](https://github.com/nolimits4web/Swiper/issues/6718)\n- **core:** fix issue with `allowSlideNext` in RTL mode ([d61da52](https://github.com/nolimits4web/Swiper/commit/d61da526a4568f39aa37bdf9ba60078b25d0ee20)), closes [#6737](https://github.com/nolimits4web/Swiper/issues/6737)\n- **core:** fix navigation can be disabled in breakpoints ([1fd36ad](https://github.com/nolimits4web/Swiper/commit/1fd36ad9d33714df6cff9383e156279867137429)), closes [#6746](https://github.com/nolimits4web/Swiper/issues/6746)\n- **core:** fix to preload lazyPreloadPrevNext prior to active slide ([d2f718c](https://github.com/nolimits4web/Swiper/commit/d2f718ce428d0d7c9bbd1c4102f1c4970d4f772b)), closes [#6684](https://github.com/nolimits4web/Swiper/issues/6684)\n- **core:** lazyPreloadPrevNext not working with loop mode [#6724](https://github.com/nolimits4web/Swiper/issues/6724) ([#6726](https://github.com/nolimits4web/Swiper/issues/6726)) ([69acab4](https://github.com/nolimits4web/Swiper/commit/69acab4a9b024af1f164f2388070fec68f906c16))\n- **effect-cards:** fixed in RTL mode ([e402f05](https://github.com/nolimits4web/Swiper/commit/e402f056a4ace5c7a73cebf414659fe40b46c06f)), closes [#5534](https://github.com/nolimits4web/Swiper/issues/5534)\n- **hash-navigation:** get active slide element using the old method if Virtual is not being… ([#6704](https://github.com/nolimits4web/Swiper/issues/6704)) ([db7e72f](https://github.com/nolimits4web/Swiper/commit/db7e72f8f3b67049395302d25f2548062f094d54))\n\n### Features\n\n- **core:** cssMode now supports freeMode ([abe1ec7](https://github.com/nolimits4web/Swiper/commit/abe1ec74a4da0e471af8304616af705e3614106e))\n- **element:** add `part=\"bullet[-active]\"` to pagination bullets ([8b4cccd](https://github.com/nolimits4web/Swiper/commit/8b4cccdec6cf75c06cc27117f5f33268da19851c)), closes [#6717](https://github.com/nolimits4web/Swiper/issues/6717)\n\n## [9.3.2](https://github.com/nolimits4web/Swiper/compare/v9.3.1...v9.3.2) (2023-05-15)\n\n### Bug Fixes\n\n- **core:** don't call update() on lazy loaded if spv !== auto and no autoHeight ([378a3c6](https://github.com/nolimits4web/Swiper/commit/378a3c627d8e3845c2949d2c4fff506905d8d9cd))\n- **core:** don't call update() on lazy loaded in css mode ([efc294c](https://github.com/nolimits4web/Swiper/commit/efc294c45b0bcd022109e913cd2df165360cfabd))\n- **core:** fix for `smoothScroll` check in Support module ([e0f4ae4](https://github.com/nolimits4web/Swiper/commit/e0f4ae4484d2b305dbee9a437d6ca07fbbe15297))\n- **element:** fix not working correctly `injectStylesUrls` ([6a50d45](https://github.com/nolimits4web/Swiper/commit/6a50d455801e2d925e4591ac75f70a39b93eaabd)), closes [#6662](https://github.com/nolimits4web/Swiper/issues/6662)\n- **element:** remove/re-add navigation, pagination, scrollbar elements based on prop value ([45f8d4a](https://github.com/nolimits4web/Swiper/commit/45f8d4a3dd5b76c8f8426e93696b20aadc74306e)), closes [#6672](https://github.com/nolimits4web/Swiper/issues/6672)\n- **hash-navigation:** handle slide to none existing hash ([#6681](https://github.com/nolimits4web/Swiper/issues/6681)) ([7f3fa96](https://github.com/nolimits4web/Swiper/commit/7f3fa96c502964311a012cf6ecea96536c7b46af))\n\n### Features\n\n- add `string` type for `effect` param ([7340629](https://github.com/nolimits4web/Swiper/commit/734062914c3deaf4baa556d966634f50c870bb28)), closes [#6676](https://github.com/nolimits4web/Swiper/issues/6676)\n- **mousewheel:** add `noMousewheelClass` param ([0fcd210](https://github.com/nolimits4web/Swiper/commit/0fcd21050fb793fdaa7f9b2950a48e8a3986753a))\n- **mousewheel:** support for `swiper-no-mousewheel` ignore class ([#6671](https://github.com/nolimits4web/Swiper/issues/6671)) ([c9130c3](https://github.com/nolimits4web/Swiper/commit/c9130c341c2da0f3bd83a5c688fcd22fc51fb348))\n- **react:** export `SwiperClass` type from 'swiper/react' ([6768efe](https://github.com/nolimits4web/Swiper/commit/6768efe557d9829d51a3265cf6b31cfd75f8ef89)), closes [#5500](https://github.com/nolimits4web/Swiper/issues/5500)\n\n# [9.3.1](https://github.com/nolimits4web/Swiper/compare/v9.3.0...v9.3.1) (2023-05-10)\n\n### Bug Fixes\n\n- **element:** correct extending of HTMLElementEventMap in types ([d6a0aca](https://github.com/nolimits4web/Swiper/commit/d6a0aca0f24f19403a424655b4ceb2a1e81529ea)), closes [#6657](https://github.com/nolimits4web/Swiper/issues/6657)\n\n### Features\n\n- **element:** added all events arguments in TS declarations ([abb0688](https://github.com/nolimits4web/Swiper/commit/abb068845b26ace91ab5b10908a2f1f52cf0929e))\n\n# [9.3.0](https://github.com/nolimits4web/Swiper/compare/v9.3.0...v9.2.4) (2023-05-08)\n\n### Bug Fixes\n\n- **a11y:** add notification span to shadow root in Swiper Element ([aa83a03](https://github.com/nolimits4web/Swiper/commit/aa83a03545bb5fbd2469e0e096fb9fb42e57bdd6)), closes [#6634](https://github.com/nolimits4web/Swiper/issues/6634)\n- **core:** fix cases when spaceBetween set in `%` ([446af7e](https://github.com/nolimits4web/Swiper/commit/446af7ece1ec7042f5dad6bc550eb344132c0e88)), closes [#6647](https://github.com/nolimits4web/Swiper/issues/6647)\n- **element:** don't reinit nested swipers rearranged by parent swiper loop ([926828a](https://github.com/nolimits4web/Swiper/commit/926828aa9d1b301b04f2715a17b94971cfc25b42)), closes [#6642](https://github.com/nolimits4web/Swiper/issues/6642)\n- **element:** don't render swiper on every `connected` ([5a5ebb4](https://github.com/nolimits4web/Swiper/commit/5a5ebb4162666eb44c1a3e09893309d734289a98))\n\n### Features\n\n- **element:** element events types ([83774fa](https://github.com/nolimits4web/Swiper/commit/83774fae3585aa2c2883038f5978b576dcc5c0d5))\n- **element:** add shadow parts ([e4f3def](https://github.com/nolimits4web/Swiper/commit/e4f3defe5bcd3ab7b9e7dad5513bcb68482a4b9e)), closes [#6594](https://github.com/nolimits4web/Swiper/issues/6594)\n- **element:** more complex ts definitions ([4cab52d](https://github.com/nolimits4web/Swiper/commit/4cab52d29b8ca535622d73ddb52c192d282c65fa))\n\n# [9.3.0-beta.1](https://github.com/nolimits4web/Swiper/compare/v9.2.4...v9.3.0-beta.1) (2023-05-08)\n\n### Bug Fixes\n\n- **a11y:** add notification span to shadow root in Swiper Element ([aa83a03](https://github.com/nolimits4web/Swiper/commit/aa83a03545bb5fbd2469e0e096fb9fb42e57bdd6)), closes [#6634](https://github.com/nolimits4web/Swiper/issues/6634)\n- **core:** fix cases when spaceBetween set in `%` ([446af7e](https://github.com/nolimits4web/Swiper/commit/446af7ece1ec7042f5dad6bc550eb344132c0e88)), closes [#6647](https://github.com/nolimits4web/Swiper/issues/6647)\n- **element:** don't reinit nested swipers rearranged by parent swiper loop ([926828a](https://github.com/nolimits4web/Swiper/commit/926828aa9d1b301b04f2715a17b94971cfc25b42)), closes [#6642](https://github.com/nolimits4web/Swiper/issues/6642)\n- **element:** don't render swiper on every `connected` ([5a5ebb4](https://github.com/nolimits4web/Swiper/commit/5a5ebb4162666eb44c1a3e09893309d734289a98))\n\n### Features\n\n- **element:** add shadow parts ([e4f3def](https://github.com/nolimits4web/Swiper/commit/e4f3defe5bcd3ab7b9e7dad5513bcb68482a4b9e)), closes [#6594](https://github.com/nolimits4web/Swiper/issues/6594)\n- **element:** more complex ts definitions ([4cab52d](https://github.com/nolimits4web/Swiper/commit/4cab52d29b8ca535622d73ddb52c192d282c65fa))\n\n# [9.2.4](https://github.com/nolimits4web/Swiper/compare/v9.2.3...v9.2.4) (2023-04-21)\n\n### Bug Fixes\n\n- **core:** fix autoHeight in virtual slides ([dd30829](https://github.com/nolimits4web/Swiper/commit/dd308291a46db86bf7b88416587d2d8a1cdcabd5)), closes [#6570](https://github.com/nolimits4web/Swiper/issues/6570)\n- **loop:** update slides grids before loop fix when spv is \"auto\" ([035e79d](https://github.com/nolimits4web/Swiper/commit/035e79d6eb3e07d78824322bc6412df3d09cafbe)), closes [#6599](https://github.com/nolimits4web/Swiper/issues/6599)\n- **virtual:** fix last slide index check in virtual slides ([154f048](https://github.com/nolimits4web/Swiper/commit/154f048436726a5a3219ace6b00bebc3bb51ab07)), closes [#6595](https://github.com/nolimits4web/Swiper/issues/6595)\n\n### Features\n\n- **hash-navigation:** new `getSlideIndex` to specify slide index by hash ([3eb0ae2](https://github.com/nolimits4web/Swiper/commit/3eb0ae2dfa6911f7c13fe85fd48cac22a91af451)), closes [#6588](https://github.com/nolimits4web/Swiper/issues/6588)\n\n# [9.2.3](https://github.com/nolimits4web/Swiper/compare/v9.2.2...v9.2.3) (2023-04-17)\n\n### Bug Fixes\n\n- **autoplay:** use local scope for autoplay resize timeot ([4f665bd](https://github.com/nolimits4web/Swiper/commit/4f665bde1871ca05780c1666b5b8072a48786e18)), closes [#6590](https://github.com/nolimits4web/Swiper/issues/6590)\n- made defineProperty configurable as it broke when minified. ([#6586](https://github.com/nolimits4web/Swiper/issues/6586)) ([26cfbaa](https://github.com/nolimits4web/Swiper/commit/26cfbaa5a992dc5f4e0f6b12f85e9c7b6308db8c))\n- **pagination:** fix clickable pagination in loop ([479a7f5](https://github.com/nolimits4web/Swiper/commit/479a7f5d042492171af15b1bd1001c7f89341eb0)), closes [#6518](https://github.com/nolimits4web/Swiper/issues/6518) [#6460](https://github.com/nolimits4web/Swiper/issues/6460) [#6587](https://github.com/nolimits4web/Swiper/issues/6587) [#6451](https://github.com/nolimits4web/Swiper/issues/6451)\n\n# [9.2.2](https://github.com/nolimits4web/Swiper/compare/v9.2.1...v9.2.2) (2023-04-14)\n\n### Bug Fixes\n\n- **element:** fix redefining `injectStyles` ([36ddaf2](https://github.com/nolimits4web/Swiper/commit/36ddaf26e230878bd8da3bd20b86c2b972ae8228)), closes [#6584](https://github.com/nolimits4web/Swiper/issues/6584)\n\n# [9.2.1](https://github.com/nolimits4web/Swiper/compare/v9.2.0...v9.2.1) (2023-04-14)\n\n### Bug Fixes\n\n- **controller:** add a conditional to early return if the swiper controller is destroyed ([#6555](https://github.com/nolimits4web/Swiper/issues/6555)) ([3fbec6e](https://github.com/nolimits4web/Swiper/commit/3fbec6e5a730f073575f57422262585471eaae5b))\n- **controller:** correct interpolation per slider ([706fdf8](https://github.com/nolimits4web/Swiper/commit/706fdf8a962ccd4750bf018e85a6ab9f9e51cf86)), closes [#6506](https://github.com/nolimits4web/Swiper/issues/6506)\n- **controller:** fix controllers multiplier on 0 translates ([4b8bd02](https://github.com/nolimits4web/Swiper/commit/4b8bd029fb3f63d897860e489c713d5f223df89c)), closes [#6498](https://github.com/nolimits4web/Swiper/issues/6498)\n- **element:** add `injectStyles` to be acceptable as props ([7c1c5d3](https://github.com/nolimits4web/Swiper/commit/7c1c5d35997eba2ba9b6c4d14e11e587b722610b)), closes [#6578](https://github.com/nolimits4web/Swiper/issues/6578)\n- **pagination:** update pagination direction class on direction change ([e6247d9](https://github.com/nolimits4web/Swiper/commit/e6247d98a11e7d9c5a23fbef7d60a70edac8100c)), closes [#6511](https://github.com/nolimits4web/Swiper/issues/6511)\n- **vue:** fix deep slots ([642b455](https://github.com/nolimits4web/Swiper/commit/642b455fc7f02b82d8e534e51405a2bbe70d0b2c)), closes [#6574](https://github.com/nolimits4web/Swiper/issues/6574)\n\n### Features\n\n- **virtual:** patch for very large sliders using virtual slides ([#6533](https://github.com/nolimits4web/Swiper/issues/6533)) ([e48daa5](https://github.com/nolimits4web/Swiper/commit/e48daa51e1d728be1751a7bf5f726a0fc777d36a))\n\n# [9.2.0](https://github.com/nolimits4web/Swiper/compare/v9.1.1...v9.2.0) (2023-03-31)\n\n### Bug Fixes\n\n- **controller:** add `null` type ([3177936](https://github.com/nolimits4web/Swiper/commit/3177936a725ece8d076a5f481ae927325f41c0ec)), closes [#6505](https://github.com/nolimits4web/Swiper/issues/6505)\n- **controller:** prevent controlled swipers from being called when destroyed ([#6501](https://github.com/nolimits4web/Swiper/issues/6501)) ([a266b78](https://github.com/nolimits4web/Swiper/commit/a266b78f918babee0850e6e9cce49341052ee94c)), closes [#6491](https://github.com/nolimits4web/Swiper/issues/6491)\n- **mousewheel:** Initialize lastClickTime to very old time ([#6497](https://github.com/nolimits4web/Swiper/issues/6497)) ([0983ded](https://github.com/nolimits4web/Swiper/commit/0983ded1dfc716efacc0c67e047fd0ac9c027439)), closes [#6496](https://github.com/nolimits4web/Swiper/issues/6496)\n- **pagination:** fix pagination.d.ts render functions return types ([#6499](https://github.com/nolimits4web/Swiper/issues/6499)) ([34973a1](https://github.com/nolimits4web/Swiper/commit/34973a1555a38c4588a7f8554bdc983d601dc654))\n- **zoom:** fix zoom out on double tap on sensitive touch screens ([7f5c626](https://github.com/nolimits4web/Swiper/commit/7f5c6264c3b143d87fa939bfb54644bc1858bc27))\n- **zoom:** reset transform origin on zoom out ([7f7f57e](https://github.com/nolimits4web/Swiper/commit/7f7f57e17736219d1856f35a444a1b73b8e2087d))\n\n### Features\n\n- **core:** lazyPreloadPrevNext option to preload prev/next images ([#6544](https://github.com/nolimits4web/Swiper/issues/6544)) ([1cb3233](https://github.com/nolimits4web/Swiper/commit/1cb3233b112d756a111dc8cacb3f37d32b461ca5))\n- lazyPreloadPrevNext option to preload prev/next images ([6d08635](https://github.com/nolimits4web/Swiper/commit/6d086359206ed936b991dde0ce7552ba0e65b6b2))\n- **zoom:** highly improve pinch-zoom gestures handling ([6016a50](https://github.com/nolimits4web/Swiper/commit/6016a50ddc9fb29bb21e2656abea82ba1f6b90bd))\n\n# [9.1.1](https://github.com/nolimits4web/Swiper/compare/v9.1.0...v9.1.1) (2023-03-16)\n\n### Bug Fixes\n\n- **core:** fixed loop when using custom `slideActiveClass` ([#6495](https://github.com/nolimits4web/Swiper/issues/6495)) ([756ecdb](https://github.com/nolimits4web/Swiper/commit/756ecdbd3e510a29d298f40a167cbdeb26d72508))\n- **element:** reset initialized flag on disconnectedCallback ([#6474](https://github.com/nolimits4web/Swiper/issues/6474)) ([1e4a235](https://github.com/nolimits4web/Swiper/commit/1e4a235587c32fcd4be5910917cc60a9743193c6))\n- **loop:** fix loopFix for controlled swipers ([d7c0ef7](https://github.com/nolimits4web/Swiper/commit/d7c0ef70625a6306879611ea6f5a756b38c1f78e)), closes [#6491](https://github.com/nolimits4web/Swiper/issues/6491)\n- **loop:** fix slides closure when removing last slide ([1a02271](https://github.com/nolimits4web/Swiper/commit/1a02271005473c65c190f009fe9a5c5987129d18)), closes [#6477](https://github.com/nolimits4web/Swiper/issues/6477)\n- **pagination:** correctly support multiple bullets paginations ([e24bd8c](https://github.com/nolimits4web/Swiper/commit/e24bd8c60eb2cc2af7b0bd25c109f6e150008819)), closes [#6462](https://github.com/nolimits4web/Swiper/issues/6462)\n- **pagination:** escape `+` char in pagination classes ([d0beb9f](https://github.com/nolimits4web/Swiper/commit/d0beb9feb99cc121f0a38ba9f40e1a77d81e9911)), closes [#6486](https://github.com/nolimits4web/Swiper/issues/6486)\n- **pagination:** support bulle multiple classes ([20b05fa](https://github.com/nolimits4web/Swiper/commit/20b05fa498eb86a1cc1fae849fce200233121cf3)), closes [#6447](https://github.com/nolimits4web/Swiper/issues/6447)\n- **react:** fix virtual loop when not enough slides ([57d8eea](https://github.com/nolimits4web/Swiper/commit/57d8eea78df4908051962041c995fb96ec956cfe)), closes [#6487](https://github.com/nolimits4web/Swiper/issues/6487)\n\n### Features\n\n- **element:** add `eventsPrefix` prop to avoid collision with native events ([d5df91f](https://github.com/nolimits4web/Swiper/commit/d5df91f93421676764c916926c258eda5027dead)), closes [#6450](https://github.com/nolimits4web/Swiper/issues/6450)\n- **pagination:** add border-radius variable ([#6476](https://github.com/nolimits4web/Swiper/issues/6476)) ([c912590](https://github.com/nolimits4web/Swiper/commit/c912590af23f1e5190a5c8d6ade5855907288e3f))\n\n# [9.1.0](https://github.com/nolimits4web/Swiper/compare/v9.0.5...v9.1.0) (2023-02-28)\n\n### Bug Fixes\n\n- **autoplay:** fix a crash with resize when the autoplay has gone away during timeout ([#6431](https://github.com/nolimits4web/Swiper/issues/6431)) ([adb40f4](https://github.com/nolimits4web/Swiper/commit/adb40f439858c604d66dc225f8383d0bf81ec1fc))\n- **core:** correctly calc slide's DOM indexes, actual for Element ([18b1f2b](https://github.com/nolimits4web/Swiper/commit/18b1f2b4ecbdf9986314b7e483b4b7d316b0c1b4))\n- **core:** fix loop when slidesPerGroup is not even to number of slides ([f998115](https://github.com/nolimits4web/Swiper/commit/f998115b91eafcc825d50e4be3b8f91745293406)), closes [#6412](https://github.com/nolimits4web/Swiper/issues/6412)\n- **core:** prevent observer trigger because of grab cursor ([9597442](https://github.com/nolimits4web/Swiper/commit/9597442ef06a0eeb28c96b62d8d022c768caf3f1)), closes [#6423](https://github.com/nolimits4web/Swiper/issues/6423)\n- **core:** proceed iOS's pointercancel as pointerup ([50b65f6](https://github.com/nolimits4web/Swiper/commit/50b65f622966b788bb586ddadc4ccf9c8b4291f3)), closes [#6414](https://github.com/nolimits4web/Swiper/issues/6414) [#6382](https://github.com/nolimits4web/Swiper/issues/6382)\n- **effect-creative:** fix origin ([7883408](https://github.com/nolimits4web/Swiper/commit/788340875d5d1f81b338cbf6045119819a0405c7)), closes [#6439](https://github.com/nolimits4web/Swiper/issues/6439)\n- **element:** fix ignored `on` event handlers ([898f76c](https://github.com/nolimits4web/Swiper/commit/898f76c08f70144add8adc8da114a4a08a75343d)), closes [#6399](https://github.com/nolimits4web/Swiper/issues/6399)\n- **pagination:** double check if bullet exists ([a335a41](https://github.com/nolimits4web/Swiper/commit/a335a41f1f2cd6ef45b5bd03c31a99759b261b1c)), closes [#6422](https://github.com/nolimits4web/Swiper/issues/6422)\n- **pagination:** fix clickable pagination with slidesPerView > 1 and loop ([cf8cdf5](https://github.com/nolimits4web/Swiper/commit/cf8cdf59aad733deccb19f5295fb90ab41b1c372)), closes [#6415](https://github.com/nolimits4web/Swiper/issues/6415)\n- **virtual:** fix escaped HTML in virtual slides content ([a61638a](https://github.com/nolimits4web/Swiper/commit/a61638a540d307be09cf2d2e3952d0103d2ed970)), closes [#6404](https://github.com/nolimits4web/Swiper/issues/6404)\n- **zoom:** fix zoom stick on pointer out ([6700980](https://github.com/nolimits4web/Swiper/commit/670098077d5209b76356486f95b623d3ee22228a)), closes [#6396](https://github.com/nolimits4web/Swiper/issues/6396)\n\n### Features\n\n- **element:** new global `window.SwiperElementRegisterParams` method to register acceptable element props ([fb63358](https://github.com/nolimits4web/Swiper/commit/fb6335826cf6b34d3528069a4ae1ec03cfc6217c))\n\n# [9.0.5](https://github.com/nolimits4web/Swiper/compare/v9.0.4...v9.0.5) (2023-02-13)\n\n### Bug Fixes\n\n- **scrollbar:** fix duplicated scrollbar ([e99361d](https://github.com/nolimits4web/Swiper/commit/e99361d4e94f3b5292c77ee933d6acb4007a1a3f)), closes [#6386](https://github.com/nolimits4web/Swiper/issues/6386)\n\n# [9.0.4](https://github.com/nolimits4web/Swiper/compare/v9.0.3...v9.0.4) (2023-02-10)\n\n### Bug Fixes\n\n- **autoplay:** fixing autoplay undefined error ([#6366](https://github.com/nolimits4web/Swiper/issues/6366)) ([f2a0572](https://github.com/nolimits4web/Swiper/commit/f2a0572ba72d6740bc30c7295ced205f56b8cb5f))\n- **pagination:** fix pagination bullets children clicks ([8bcff39](https://github.com/nolimits4web/Swiper/commit/8bcff39651e511385d2371c5c1ac5e387d19251b)), closes [#6361](https://github.com/nolimits4web/Swiper/issues/6361)\n- **virtual:** grab DOM slides only from wrapper children ([d59183d](https://github.com/nolimits4web/Swiper/commit/d59183db9cfa6710f7739dada484747a782f9213))\n- **zoom:** fix gesture scale origin ([c89b2dd](https://github.com/nolimits4web/Swiper/commit/c89b2dd3011623fe8f0f57ed44adb6438fb040e7)), closes [#6371](https://github.com/nolimits4web/Swiper/issues/6371)\n\n# [9.0.3](https://github.com/nolimits4web/Swiper/compare/v9.0.2...v9.0.3) (2023-02-06)\n\n### Bug Fixes\n\n- **core:** don't proceed lazy if swiper destroyed ([4ea0102](https://github.com/nolimits4web/Swiper/commit/4ea0102cfda0be6de5757381b6c0e2aa2649a4e8)), closes [#6322](https://github.com/nolimits4web/Swiper/issues/6322)\n- **core:** fix loop handling with virtual ([69462d2](https://github.com/nolimits4web/Swiper/commit/69462d29e1514b687187b96b5cd2be80362860d9)), closes [#6343](https://github.com/nolimits4web/Swiper/issues/6343)\n- **element:** fix converting boolean/string params to module object ([192e0d4](https://github.com/nolimits4web/Swiper/commit/192e0d4d104705685117cb8cfba8f54f025c7d85)), closes [#6328](https://github.com/nolimits4web/Swiper/issues/6328)\n- **navigation:** allow multiple classes in navigation options ([#6345](https://github.com/nolimits4web/Swiper/issues/6345)) ([ca49b9f](https://github.com/nolimits4web/Swiper/commit/ca49b9f6decc8a678fb47cedb9d9d0c1d03a0d26)), closes [#6344](https://github.com/nolimits4web/Swiper/issues/6344)\n- **thumbs:** ensure there is a slide to add a class ([c6294ad](https://github.com/nolimits4web/Swiper/commit/c6294ada6fd31c840bb3cf8f842ff7ff4ae32bba)), closes [#6335](https://github.com/nolimits4web/Swiper/issues/6335)\n\n### Features\n\n- **history:** allow empty string `key` ([a335b09](https://github.com/nolimits4web/Swiper/commit/a335b09d4048d84d182fe94fd50cb9651ebbb8dd)), closes [#6338](https://github.com/nolimits4web/Swiper/issues/6338)\n\n# [9.0.2](https://github.com/nolimits4web/Swiper/compare/v9.0.1...v9.0.2) (2023-02-03)\n\n### Bug Fixes\n\n- **core:** fixed loop behavior in free mode with mousewheel ([336d908](https://github.com/nolimits4web/Swiper/commit/336d90836284e670018de2caaf2a7f37ac2de2ec)), closes [#6323](https://github.com/nolimits4web/Swiper/issues/6323)\n- **types:** `spaceBetween` can also be a string ([446fb06](https://github.com/nolimits4web/Swiper/commit/446fb068a080e3a774e79606cd51c52afb7e52de)), closes [#6286](https://github.com/nolimits4web/Swiper/issues/6286)\n- **vue:** declaration for `autoplayTimeLeft` event ([8467397](https://github.com/nolimits4web/Swiper/commit/846739705f8bdaa5423a2b24b0c9d42936db4999)), closes [#6333](https://github.com/nolimits4web/Swiper/issues/6333)\n\n# [9.0.1](https://github.com/nolimits4web/Swiper/compare/v9.0.0...v9.0.1) (2023-02-02)\n\n### Bug Fixes\n\n- **core:** fix class removal in setBreakpoints ([6cb79cf](https://github.com/nolimits4web/Swiper/commit/6cb79cf97894be1671370a7c8dadc571ff222e5d)), closes [#6319](https://github.com/nolimits4web/Swiper/issues/6319)\n- **virtual:** fix undefined `document` ([9cee290](https://github.com/nolimits4web/Swiper/commit/9cee290a1260b09659ef651254d1cde2cedefb94)), closes [#6318](https://github.com/nolimits4web/Swiper/issues/6318)\n\n# [9.0.0](https://github.com/nolimits4web/Swiper/compare/v8.4.7...v9.0.0) (2023-02-01)\n\n#### Core\n\n- new `oneWayMovement` parameter\n- removed Dom7 dependency\n- all new Loop mode without slides duplication\n- removed images loading functionality: `preloadImages`, `updateOnImagesReady` parameters\n\n#### Frameworks\n\n- all new Swiper Element (WebComponent)\n- removed Swiper Solid components (in favor of Swiper WebComponent)\n- removed Swiper Angular components (in favor of Swiper WebComponent)\n- removed Swiper Svelte components (in favor of Swiper WebComponent)\n\n#### Autoplay\n\n- all new autoplay module\n\n#### Controller\n\n- now `controller.control` parameter also accepts HTMLElement or CSS string with the selector of swiper to control\n\n#### Lazy\n\n- Lazy module has been moved to core and simplified in favor of native loading=\"lazy\"\n\n#### Navigation\n\n- more CSS variables to control appearance and position\n\n#### Parallax\n\n- support parallax `rotate`\n\n#### Thumbs\n\n- now `thumbs.swiper` parameter also accepts HTMLElement or CSS string with the selector of thumbs swiper\n\n#### Virtual Slides\n\n- added support for loop mode\n- improved performance\n- will work now with slides initially rendered in DOM\n\n#### Zoom\n\n- `swiper.zoom.in(ratio)` method now accepts custom zoom ratio\n\n### Features\n\n- add `wrapperClass` to swiper-wrapper in React & Vue components ([7aaa0d1](https://github.com/nolimits4web/Swiper/commit/7aaa0d1af8a8ba84540563b3ed450885d6905e95)), closes [#6254](https://github.com/nolimits4web/Swiper/issues/6254) [#5942](https://github.com/nolimits4web/Swiper/issues/5942)\n- **core:** add `loopPreventsSliding` parameter ([6533890](https://github.com/nolimits4web/Swiper/commit/6533890699a5f0fbfa4b3c688fe9fc4139bf6e84))\n\n* **core:** new `oneWayMovement` parameter ([ce2ea7f](https://github.com/nolimits4web/Swiper/commit/ce2ea7f4e78cab924c7a6cf3b07c899d8834c201))\n* **navigation:** more CSS variables to control appearance and position ([6db9439](https://github.com/nolimits4web/Swiper/commit/6db943971772cab4e9943ff853039cff4ae65e51))\n* **pagination:** more CSS variables to control appearance and position ([c8b1228](https://github.com/nolimits4web/Swiper/commit/c8b1228397513745cdec7b2f4577be59da58b4df))\n* **scrollbar:** more CSS variables to control appearance ([cfad536](https://github.com/nolimits4web/Swiper/commit/cfad5364043c9a7bb0a3bc4f3ac1b24bd3f6e3cd))\n* add element core version ([de6c7f7](https://github.com/nolimits4web/Swiper/commit/de6c7f70160a5a90b8dc5bb95441c02afa32c9db))\n* export element css styles ([51334a3](https://github.com/nolimits4web/Swiper/commit/51334a3efd5f5b45cbd83d511cb0ff856c04235b))\n* injectStyles and injectStylesUrls params ([71b10b2](https://github.com/nolimits4web/Swiper/commit/71b10b27546e52ff179beb4cc49cb75286888944))\n* **parallax:** support parallax rotate ([4949163](https://github.com/nolimits4web/Swiper/commit/49491636476c4b29622a6f08f26041c08a960c81)), closes [#6126](https://github.com/nolimits4web/Swiper/issues/6126)\n* **zoom:** `in` method now accepts custom zoom ratio ([d88df61](https://github.com/nolimits4web/Swiper/commit/d88df610b6557ee221d6ed69e3e5da22e6cbfb57)), closes [#5527](https://github.com/nolimits4web/Swiper/issues/5527)\n* **core:** add loopedSlides parameter ([1b076d9](https://github.com/nolimits4web/Swiper/commit/1b076d95750fc36ac6e9392c11a394231258113e))\n* **element:** add option to avoid styles injecting ([2291ec8](https://github.com/nolimits4web/Swiper/commit/2291ec82dbb589e9ba8c5898989d862c120f0f0a))\n* **thumbs:** init thumbs on their appearance in DOM ([a6b4cf7](https://github.com/nolimits4web/Swiper/commit/a6b4cf726a60f83045d7fb3a689a81d94211dcc9))\n* **element:** add standalone styles ([284b130](https://github.com/nolimits4web/Swiper/commit/284b130d02b21c5368bbdd836130fb6936e3e1b0))\n* **controller:** support updated loop ([6059e48](https://github.com/nolimits4web/Swiper/commit/6059e48f8120bed4b69fef227f8abf1ef2569fb9))\n* **controller:** support updated loop ([03d9895](https://github.com/nolimits4web/Swiper/commit/03d9895c63adac60b42d7c326326f436f2744379))\n* **controller:** support updated loop ([e73b577](https://github.com/nolimits4web/Swiper/commit/e73b5774e40dafee2f3a05891f1377a01abd48ea))\n* **core:** \"fix\" loop based on touch move direction ([5ab7217](https://github.com/nolimits4web/Swiper/commit/5ab7217bd89471aa05b7f56bc8185e110c6d0688))\n* **element:** add CSS styles for modules for Swiper Element ([6c36c80](https://github.com/nolimits4web/Swiper/commit/6c36c806c96051a69f8cb5cb2dcb34d0cd918315))\n* **core:** add --swiper-wrapper-transition-timing-function CSS var ([797bcda](https://github.com/nolimits4web/Swiper/commit/797bcdab58e51d4564f7e2a5d49e4dbed58347d7))\n* **navigation:** more CSS vars ([f41abe6](https://github.com/nolimits4web/Swiper/commit/f41abe649ef01462b5373dfd00282a5da86ea4df))\n* **paginatrion:** more CSS vars ([6f63fe2](https://github.com/nolimits4web/Swiper/commit/6f63fe201f821f6f171ebdc24abc0407263180d8))\n* **scrollbar:** more CSS vars ([875b35a](https://github.com/nolimits4web/Swiper/commit/875b35aa27def557a6ee6136b24778092f772e55))\n* **virtual:** `renderSlide` to support slide outer HTML and HTML element ([fdcd644](https://github.com/nolimits4web/Swiper/commit/fdcd6444cb925c80e571595c788ba16ddea91560))\n* **core:** support for \"swiper-slide-transform\" element for better effects compatability with CSS mode ([18b3e3f](https://github.com/nolimits4web/Swiper/commit/18b3e3f7934bc9cc4326a136c76baee1e8d17373))\n* **core:** remove Dom7 ([44de97b](https://github.com/nolimits4web/Swiper/commit/44de97b222941af6a93520419d0ea4ca78a0b972))\n* **core:** remove Dom7 ([7cdcebf](https://github.com/nolimits4web/Swiper/commit/7cdcebfa85526985c9c3ca7621980166e284866d))\n* **core:** don't prevent slidePrev/Next when animating in loop mode ([b358737](https://github.com/nolimits4web/Swiper/commit/b358737df7a03cb3c0d07380671fcfc75d005c04))\n* **autoplay:** correct support for virtual slides delay + fix for stopping autoplay on click ([43bf429](https://github.com/nolimits4web/Swiper/commit/43bf429a35b8ae7452c5825e893062d8e4e2be2e))\n* **element:** support for comples parameters via attrs in a form of `autoplay-delay` ([8161c57](https://github.com/nolimits4web/Swiper/commit/8161c57767cb16e0ca1004368d1f36b492f03cdb))\n* **virtual:** support for DOM virtual slides ([59da65c](https://github.com/nolimits4web/Swiper/commit/59da65c0afc938dbe7eefefdd7fc9f6f0026e406))\n* **virtual:** support loop mode with virtual slides ([f890f1e](https://github.com/nolimits4web/Swiper/commit/f890f1e18a72bae78dbb0d445a6f3b95dae70363))\n* **autoplay:** all new Autoplay module ([1b4ac21](https://github.com/nolimits4web/Swiper/commit/1b4ac21e80fc9d544fd9cbc50657db5c7cd5f131))\n* **core:** remove unused `slide*DuplicateClass` parameters ([8007e1a](https://github.com/nolimits4web/Swiper/commit/8007e1aeedda062bdccbbd152d6631ccc8834375))\n* **core:** all new loop mode without slides duplication ([f57aa3b](https://github.com/nolimits4web/Swiper/commit/f57aa3bf9127f5a5b3a6022828c2d93e471319df))\n* remove `postinstall` script ([12255cf](https://github.com/nolimits4web/Swiper/commit/12255cfd9b146e3f7f449efba1a418480eddafce))\n* **core, zoom:** rework touch handling logic to PointerEvents only ([ede6b6d](https://github.com/nolimits4web/Swiper/commit/ede6b6d848007ce05dd40115e6b2a534872faaf3))\n* **core:** make `threshold` parameter default to `5` ([dfce8a3](https://github.com/nolimits4web/Swiper/commit/dfce8a38ca0e15d0fe6306173da1a0d4ba88a3ec))\n* **lazy:** simplify Lazy module in favor of native loading=\"lazy\" ([d46d5d0](https://github.com/nolimits4web/Swiper/commit/d46d5d0f53c18ad07661536dfd62f38fed0db628))\n* move new Lazy module to the Core ([d51e1ce](https://github.com/nolimits4web/Swiper/commit/d51e1ce8ecd00ec5c635f5d1ff432f9c998a624a))\n* **react:** add boolean `lazy` prop to SwiperSlide to render lazy prelaoder ([f5d137f](https://github.com/nolimits4web/Swiper/commit/f5d137fb7d762bd850339c9eb17b5fbc78fb0e70))\n* remove Images loading functionality: preloadImages, updateOnImagesReady ([4d02653](https://github.com/nolimits4web/Swiper/commit/4d02653a8e6a1c48cb0dccd06ea9eb701472fcce))\n* **vue:** add boolean `lazy` prop to SwiperSlide to render lazy prelaoder ([e36b580](https://github.com/nolimits4web/Swiper/commit/e36b580f284b44c54ee1aeea6e2a9df7c8b9224c))\n* add new Swiper Custom Element ([47f9518](https://github.com/nolimits4web/Swiper/commit/47f9518e26bae302d89df22b8b0a0d21db5b19c2))\n* remove Angular and SolidJS components ([1329c10](https://github.com/nolimits4web/Swiper/commit/1329c102d806cd892ba16bd6942a0e7b26483d7a))\n* remove Swiper Svelte components ([52433ac](https://github.com/nolimits4web/Swiper/commit/52433ac17822da87bac3effd64a5e2face9fbca7))\n\n### Bug Fixes\n\n- **effect-cube:** fix for iOS 16.2 fixed perspective ([2f5ed48](https://github.com/nolimits4web/Swiper/commit/2f5ed481b721bc2cfbb3ac1a144b723fb1452215)), closes [#6293](https://github.com/nolimits4web/Swiper/issues/6293)\n\n* **history:** fix handling `popstate` on init ([483534f](https://github.com/nolimits4web/Swiper/commit/483534f9d05bf353ea26c7597d7e2e4283efce02))\n* **core:** make isBeginning and isEnd true when translate is less than 1px diff ([b2313d5](https://github.com/nolimits4web/Swiper/commit/b2313d5f0496af4f28661493cb01376613e18719)), closes [#6287](https://github.com/nolimits4web/Swiper/issues/6287)\n* **react:** fix React 18 compat types ([4c916d4](https://github.com/nolimits4web/Swiper/commit/4c916d474332d399bb784b4874aa38deb865580f)), closes [#5799](https://github.com/nolimits4web/Swiper/issues/5799)\n* **virtual:** fix Virtual with CSS Mode when initialSlide > 0 ([5ddf1d8](https://github.com/nolimits4web/Swiper/commit/5ddf1d849176f39bdbd93c93a0f9a6c9a6eef6fe))\n\n# [8.4.7](https://github.com/nolimits4web/Swiper/compare/v8.4.6...v8.4.7) (2023-01-30)\n\n### Bug Fixes\n\n- **svelte:** autoplay options typescript problem ([#6294](https://github.com/nolimits4web/Swiper/issues/6294)) ([3317f5e](https://github.com/nolimits4web/Swiper/commit/3317f5e63a7b3d9f23809c00807b6584c390139c))\n\n# [8.4.6](https://github.com/nolimits4web/Swiper/compare/v8.4.5...v8.4.6) (2023-01-17)\n\n### Features\n\n- add swipeDirection ([#6290](https://github.com/nolimits4web/Swiper/issues/6290)) ([3774a64](https://github.com/nolimits4web/Swiper/commit/3774a64b2a5922378573f5007d87eaba72e74ecc))\n- **angular:** slidesPerGroupAuto ([#6243](https://github.com/nolimits4web/Swiper/issues/6243)) ([750f41c](https://github.com/nolimits4web/Swiper/commit/750f41c01e255a088cd6e47d79e55aadf995830c))\n\n# [8.4.5](https://github.com/nolimits4web/Swiper/compare/v8.4.4...v8.4.5) (2022-11-21)\n\n### Bug Fixes\n\n- **a11y:** fix JS error \"swiper.a11y is undefined\" ([#6226](https://github.com/nolimits4web/Swiper/issues/6226)) ([02c1502](https://github.com/nolimits4web/Swiper/commit/02c1502d40c3cad52592030c122df26295547b3b))\n- touch focusableElements jumps element ([#6139](https://github.com/nolimits4web/Swiper/issues/6139)) ([339f52e](https://github.com/nolimits4web/Swiper/commit/339f52ee2fd728cfd18c25fda890714a20aec6f0))\n\n### Features\n\n- **svelte:** add tag and wrapperTag props ([71e7f5a](https://github.com/nolimits4web/Swiper/commit/71e7f5a88a2131eb5a0a916a9513498dfdfc8091)), closes [#6181](https://github.com/nolimits4web/Swiper/issues/6181)\n\n# [8.4.4](https://github.com/nolimits4web/Swiper/compare/v8.4.3...v8.4.4) (2022-10-12)\n\n### Features\n\n- add direct JS/CSS core and bundle exports ([f519f80](https://github.com/nolimits4web/Swiper/commit/f519f80f1fb9e3dab9b8b57c2550c83d550f07ac))\n\n# [8.4.3](https://github.com/nolimits4web/Swiper/compare/v8.4.2...v8.4.3) (2022-10-06)\n\n### Bug Fixes\n\n- **a11y:** don't focus slide on slide inner elements clicks ([c8e22f7](https://github.com/nolimits4web/Swiper/commit/c8e22f7a3e2aa2aa5f2f1a6b1e131473d63c1c46)), closes [#6116](https://github.com/nolimits4web/Swiper/issues/6116)\n\n### Features\n\n- **build-config:** allow to custom modules by process.env.SWIPER_BUILD_MODULES ([#6043](https://github.com/nolimits4web/Swiper/issues/6043)) ([b3c51c5](https://github.com/nolimits4web/Swiper/commit/b3c51c5ff7663bee10dc09dbda0d41f64ff0fdfa))\n- **solid:** fix handling dynamic slides ([708133d](https://github.com/nolimits4web/Swiper/commit/708133d90c7be8163f3101530f61f0d855d80773)), closes [#6031](https://github.com/nolimits4web/Swiper/issues/6031)\n- **solid:** keep solid components in `.jsx` ([d7f7f65](https://github.com/nolimits4web/Swiper/commit/d7f7f65052cde0d5d7b15239b5bc3762ac3b8911))\n\n# [8.4.2](https://github.com/nolimits4web/Swiper/compare/v8.4.1...8.4.2) (2022-09-15)\n\n### Bug Fixes\n\n- **onTouchStart.js:** Fix target element assignment ([#6065](https://github.com/nolimits4web/Swiper/issues/6065)) ([cb46a9a](https://github.com/nolimits4web/Swiper/commit/cb46a9a56b05b415bc5dbe69e84ef263f6766437))\n\n# [8.4.1](https://github.com/nolimits4web/Swiper/compare/v8.4.0...v8.4.1) (2022-09-15)\n\n### Bug Fixes\n\n- **core:** fix swiping over nested shadow doms ([7d09ab0](https://github.com/nolimits4web/Swiper/commit/7d09ab006666c5e102d5249d2c66fd2565e5acaf)), closes [#6063](https://github.com/nolimits4web/Swiper/issues/6063)\n- **react:** fix issue with checking children ([37a94ea](https://github.com/nolimits4web/Swiper/commit/37a94eaa123b73ae09fa820f6bafda877f4df864)), closes [#6064](https://github.com/nolimits4web/Swiper/issues/6064)\n\n# [8.4.0](https://github.com/nolimits4web/Swiper/compare/v8.3.2...v8.4.0) (2022-09-14)\n\n### Bug Fixes\n\n- **a11y:** don't handle focus on pointer events ([b251601](https://github.com/nolimits4web/Swiper/commit/b2516014b293bfc2cfc02ea07f5e888973787295)), closes [#5962](https://github.com/nolimits4web/Swiper/issues/5962) [#5814](https://github.com/nolimits4web/Swiper/issues/5814) [#5524](https://github.com/nolimits4web/Swiper/issues/5524) [#5490](https://github.com/nolimits4web/Swiper/issues/5490) [#5437](https://github.com/nolimits4web/Swiper/issues/5437)\n- **angular:** slidesPerGroupAuto is missing in params list for angular ([#5933](https://github.com/nolimits4web/Swiper/issues/5933)) ([b80352a](https://github.com/nolimits4web/Swiper/commit/b80352a22746d52cd53beea3e31350ef0e4c4dbf))\n- **core:** fix `beforeSlideChangeStart` event routing ([0e8a8b8](https://github.com/nolimits4web/Swiper/commit/0e8a8b85f757f4bea39f60418c52cadce7a44e57)), closes [#5913](https://github.com/nolimits4web/Swiper/issues/5913)\n- event.path => event.composedPath ([8df7edf](https://github.com/nolimits4web/Swiper/commit/8df7edffb8a30250298f5b5978f5b833f08ee4f4)), closes [#5925](https://github.com/nolimits4web/Swiper/issues/5925)\n- **types:** add isLocked definition ([f2bbae6](https://github.com/nolimits4web/Swiper/commit/f2bbae60ce129650713da25f568741679ebf2b66)), closes [#5941](https://github.com/nolimits4web/Swiper/issues/5941)\n- **types:** add missing AutoplayMethods members ([#5956](https://github.com/nolimits4web/Swiper/issues/5956)) ([6220c22](https://github.com/nolimits4web/Swiper/commit/6220c2270afe927f8a914386c76a0788a45de052))\n- **vue:** fix swiperRef for Vue swiperSlide ([#5994](https://github.com/nolimits4web/Swiper/issues/5994)) ([a2bcbb1](https://github.com/nolimits4web/Swiper/commit/a2bcbb1790145d8cd8c76af22dea9ece89d206dc))\n\n### Features\n\n- **build:** upgrade deps & cjs to esm ([#5927](https://github.com/nolimits4web/Swiper/issues/5927)) ([921809b](https://github.com/nolimits4web/Swiper/commit/921809b963d03a76999df0c93e7158646d2a48ef))\n- **cards-effect:** add `perSlideRotate` and `perSlideOffset` parameters ([db08a70](https://github.com/nolimits4web/Swiper/commit/db08a70fcde1c8a33c3dba29e2b4193f10fcbb98)), closes [#5939](https://github.com/nolimits4web/Swiper/issues/5939)\n- **core:** new `loopedSlidesLimit` parameter to re-duplicate slides ([1afa4b8](https://github.com/nolimits4web/Swiper/commit/1afa4b84b980f8f5de0218ca66064a1c12216839))\n- **react:** Allow SwiperSlide children as long as displayName includes SwiperSlide ([#5954](https://github.com/nolimits4web/Swiper/issues/5954)) ([d1f7582](https://github.com/nolimits4web/Swiper/commit/d1f7582633827b53612746096d738b33697999de))\n- **solid:** keep solid components incompiled ([18c6670](https://github.com/nolimits4web/Swiper/commit/18c66709a0e0119b7dd0dbb01a268e502bfc28c7)), closes [#5943](https://github.com/nolimits4web/Swiper/issues/5943)\n\n### Reverts\n\n- Revert \"chore(deps): upgrade angular to v14 (#5926)\" (#5929) ([ae429c4](https://github.com/nolimits4web/Swiper/commit/ae429c4d4d2e4401733d4bf576da94cb3c8a34e2)), closes [#5926](https://github.com/nolimits4web/Swiper/issues/5926) [#5929](https://github.com/nolimits4web/Swiper/issues/5929)\n\n# [8.3.2](https://github.com/nolimits4web/Swiper/compare/v8.3.1...v8.3.2) (2022-07-26)\n\n### Bug Fixes\n\n- **a11y:** fix `focus` handling ([8a3dfee](https://github.com/nolimits4web/Swiper/commit/8a3dfee2a3b26c56d6cd173094a08db8846f2fe6)), closes [#5905](https://github.com/nolimits4web/Swiper/issues/5905)\n- **autoplay:** don't run autoplay if swiper is hidden ([4f2e30f](https://github.com/nolimits4web/Swiper/commit/4f2e30f7a1607eb134d62153e9870bd6a9e26692)), closes [#5907](https://github.com/nolimits4web/Swiper/issues/5907)\n\n### Features\n\n- **core:** new loopedSlidesLimit paramter and new functionality to increase duplicated slides ([5156071](https://github.com/nolimits4web/Swiper/commit/5156071299fd7e1dc6041dcdfa7f127f7bbcf0c3))\n\n# [8.3.1](https://github.com/nolimits4web/Swiper/compare/v8.3.0...v8.3.1) (2022-07-13)\n\n### Bug Fixes\n\n- **packages:** add index.js in /solid and /react ([#5863](https://github.com/nolimits4web/Swiper/issues/5863)) ([6e94701](https://github.com/nolimits4web/Swiper/commit/6e947010f065dbaedf3fd00b936a95926d414503))\n- **solid:** fix reactivity ([502c152](https://github.com/nolimits4web/Swiper/commit/502c152270ef0f528bbb05ccc10f00668286fb67)), closes [#5862](https://github.com/nolimits4web/Swiper/issues/5862)\n- **solid:** stop using cloneNode in sliders without loops in SolidJS ([#5860](https://github.com/nolimits4web/Swiper/issues/5860)) ([d14c432](https://github.com/nolimits4web/Swiper/commit/d14c432956b0d61711ea2c7ddf5620c6fbb10578))\n\n# [8.3.0](https://github.com/nolimits4web/Swiper/compare/v8.2.6...v8.3.0) (2022-07-06)\n\n### Features\n\n- all new Swiper SolidJS components thanks to @TiagoCavalcante 🎉\n- move common helpers for React/Vue/Svelte/Solid to single files ([90e8da1](https://github.com/nolimits4web/Swiper/commit/90e8da1da94549ee827d0fd2b3cc3c0b0d9dd3a3))\n- **a11y:** allow disabling slideRole ([#5838](https://github.com/nolimits4web/Swiper/issues/5838)) ([b376aa1](https://github.com/nolimits4web/Swiper/commit/b376aa1f68b29560168cff5418715dfe3312ba39))\n\n# [8.2.6](https://github.com/nolimits4web/Swiper/compare/v8.2.5...v8.2.6) (2022-06-29)\n\n### Bug Fixes\n\n- **thumbs:** active class gets removed ([#5826](https://github.com/nolimits4web/Swiper/issues/5826)) ([3267616](https://github.com/nolimits4web/Swiper/commit/3267616d53d8e943b690a20ac327024cd3b2fff8))\n- **vue:** virtualUpdate event is not declared ([#5830](https://github.com/nolimits4web/Swiper/issues/5830)) ([8b00333](https://github.com/nolimits4web/Swiper/commit/8b003333d5684e00fc4919e6aef992ae4ae447f8))\n\n### Features\n\n- **core:** add `changeLanguageDirection` method to change it to RTL/LTR after init ([f5bb7af](https://github.com/nolimits4web/Swiper/commit/f5bb7af0e1039cc52068909159943d6302d819ba)), closes [#3279](https://github.com/nolimits4web/Swiper/issues/3279)\n- **navigation:** add `navigationPrev` and `navigationNext` events ([d0c6365](https://github.com/nolimits4web/Swiper/commit/d0c636572387e0ec94538cb00877de646a36736a)), closes [#5832](https://github.com/nolimits4web/Swiper/issues/5832)\n\n# [8.2.5](https://github.com/nolimits4web/Swiper/compare/v8.2.4...v8.2.5) (2022-06-27)\n\n### Bug Fixes\n\n- **pagination:** double check for $el ([baafb55](https://github.com/nolimits4web/Swiper/commit/baafb553213dc772821f6c06dfbaa6894a1917e5))\n\n# [8.2.4](https://github.com/nolimits4web/Swiper/compare/v8.2.3...v8.2.4) (2022-06-13)\n\n### Bug Fixes\n\n- **angular:** rollback build to Angular 13 ([3f14d67](https://github.com/nolimits4web/Swiper/commit/3f14d675b30c39085a375ac8d161576034192bd0)), closes [#5792](https://github.com/nolimits4web/Swiper/issues/5792) [#5791](https://github.com/nolimits4web/Swiper/issues/5791)\n\n# [8.2.3](https://github.com/nolimits4web/Swiper/compare/v8.2.2...v8.2.3) (2022-06-10)\n\n### Features\n\n- **a11y:** allow slideLabelMessage: null ([#5783](https://github.com/nolimits4web/Swiper/issues/5783)) ([78a8d90](https://github.com/nolimits4web/Swiper/commit/78a8d902008b31671bcc66f3a6706d3630a98b37))\n- **angular:** update to angular v14 ([097390d](https://github.com/nolimits4web/Swiper/commit/097390db6456c1d26ad45ff19fda976bd93d02fc))\n- **scrollbar:** add directional classes to scrollbar container ([083a83f](https://github.com/nolimits4web/Swiper/commit/083a83f0b80c53ce9fac5ae4f67730172f91e736))\n\n# [8.2.2](https://github.com/nolimits4web/Swiper/compare/v8.2.1...v8.2.2) (2022-06-01)\n\n### Bug Fixes\n\n- **scrollbar:** fix draggable scrollbar ([28cd6c2](https://github.com/nolimits4web/Swiper/commit/28cd6c243555f7132d7db1df899f3182e935f834)), closes [#5759](https://github.com/nolimits4web/Swiper/issues/5759)\n\n### Reverts\n\n- Revert \"fix(autoplay): immediate proceed autoplay when `autoplay.delay = 0`\" ([d942e83](https://github.com/nolimits4web/Swiper/commit/d942e834c58b3291425038325ab5ff009fb5d87d))\n- Revert \"fix(autoplay): fix swiper getting stuck with `0` autoplay delay\" ([56e050b](https://github.com/nolimits4web/Swiper/commit/56e050bcdbcc00db7af02ccb32e0725265dd242a))\n\n# [8.2.1](https://github.com/nolimits4web/Swiper/compare/v8.2.0...v8.2.1) (2022-05-31)\n\n### Bug Fixes\n\n- **core:** fix issues with navigation/pagination `enabled` prop ([af9ed85](https://github.com/nolimits4web/Swiper/commit/af9ed85d451148fd2e6af6aadc4436f1b2c2a3b5))\n\n# [8.2.0](https://github.com/nolimits4web/Swiper/compare/v8.1.6...v8.2.0) (2022-05-31)\n\n### Bug Fixes\n\n- **autoplay:** fix swiper getting stuck with `0` autoplay delay ([61db26f](https://github.com/nolimits4web/Swiper/commit/61db26fdde129afc77bb56c302790c8af6f35c44))\n- **core:** fix type Number in slideToLoop ([#5732](https://github.com/nolimits4web/Swiper/issues/5732)) ([1e1336b](https://github.com/nolimits4web/Swiper/commit/1e1336b5eabe331b212790a238d5993ca49e4abf))\n\n### Features\n\n- **navigation:** allow navigation to be enabled/disabled in breakpoints ([052f863](https://github.com/nolimits4web/Swiper/commit/052f863444a4891fa7803a43914de808038e5a06))\n- **pagination:** allow pagination to be enabled/disabled in breakpoints ([d748d49](https://github.com/nolimits4web/Swiper/commit/d748d49c86903acc39eac1c4512c2daff929c52b))\n- **scrollbar:** allow scrollbar to be enabled/disabled in breakpoints ([3f09fc7](https://github.com/nolimits4web/Swiper/commit/3f09fc7ecc13a643fc88e0d2cc434a5b7915eab7))\n\n# [8.1.6](https://github.com/nolimits4web/Swiper/compare/v8.1.5...v8.1.6) (2022-05-25)\n\n### Bug Fixes\n\n- **a11y:** update slides a11y on slides amount change ([31e2005](https://github.com/nolimits4web/Swiper/commit/31e200514392df6ebb7632a778d544edf8e43bda)), closes [#5692](https://github.com/nolimits4web/Swiper/issues/5692)\n- **autoplay:** immediate proceed autoplay when `autoplay.delay = 0` ([81a4cc8](https://github.com/nolimits4web/Swiper/commit/81a4cc83064c5e49a831afedf67251e754986c75))\n- **lazy:** `loadPrevNext` fix when `slidesPerView` is fractional ([94d4c9e](https://github.com/nolimits4web/Swiper/commit/94d4c9e66fe48f1bd88cdc4998947a7de5ad77b5)), closes [#5712](https://github.com/nolimits4web/Swiper/issues/5712)\n- **lazy:** unset lazy-loading class on swiper destroy ([81d7fc4](https://github.com/nolimits4web/Swiper/commit/81d7fc406c1c33b8d2635ed475188e105b596495)), closes [#5737](https://github.com/nolimits4web/Swiper/issues/5737)\n- **types:** add `snapIndex` and `snapGrid` props ([ee3d2dc](https://github.com/nolimits4web/Swiper/commit/ee3d2dcf717b09e7b0c622854480d82f5766c253)), closes [#5733](https://github.com/nolimits4web/Swiper/issues/5733)\n\n### Features\n\n- **navigation:** default `opacity: 0` styles for hidden navigation buttons ([85f72f4](https://github.com/nolimits4web/Swiper/commit/85f72f42711175a0f14ff49d6cf49e16715f1821))\n\n# [8.1.5](https://github.com/nolimits4web/Swiper/compare/v8.1.4...v8.1.5) (2022-05-16)\n\n### Bug Fixes\n\n- **core:** add missing types comments ([340f716](https://github.com/nolimits4web/Swiper/commit/340f716e78875ee21276bacb3625979bed17a4d5)), closes [/github.com/nolimits4web/swiper/issues/5688#issuecomment-1118316055](https://github.com//github.com/nolimits4web/swiper/issues/5688/issues/issuecomment-1118316055)\n- **core:** check for visibleSlides presence in updateAutoHeight ([3909c45](https://github.com/nolimits4web/Swiper/commit/3909c453616400803f3814ccc1deb94d94811887))\n- **core:** fix getWrapper $el check ([7702178](https://github.com/nolimits4web/Swiper/commit/77021780f8c1adf84eb5f9f62f89b0bddc74643b)), closes [#5711](https://github.com/nolimits4web/Swiper/issues/5711)\n- **navigation:** remove duplicated rules ([#5657](https://github.com/nolimits4web/Swiper/issues/5657)) ([333a3ae](https://github.com/nolimits4web/Swiper/commit/333a3ae0f827b33ce16c6c36a572e5e2b4c5d4ed))\n- **react:** move navigation, pagination, scrollbar to the end of container ([2d3255f](https://github.com/nolimits4web/Swiper/commit/2d3255fe3fdc12344fbac6b6979473258f9c66a8))\n- **svelte:** fix incorrect parameters in event dispatching ([#5716](https://github.com/nolimits4web/Swiper/issues/5716)) ([b7961a3](https://github.com/nolimits4web/Swiper/commit/b7961a34648834030d65ad04cf80eaab13685d23))\n- **svelte:** move navigation, pagination, scrollbar to the end of container ([c8a4f67](https://github.com/nolimits4web/Swiper/commit/c8a4f671ccc9dff9fc2241ada3fe3f8096a5c0de))\n- **vue:** move navigation, pagination, scrollbar to the end of container ([0d219f4](https://github.com/nolimits4web/Swiper/commit/0d219f4205807c2ddab3c37e449448366eed9b23))\n\n### Features\n\n- **history:** plugin fixes and new option adding ([#5665](https://github.com/nolimits4web/Swiper/issues/5665)) ([798c7c0](https://github.com/nolimits4web/Swiper/commit/798c7c068cbe785308e15a64dcfbb7ec4193b057))\n\n# [8.1.4](https://github.com/nolimits4web/Swiper/compare/v8.1.3...v8.1.4) (2022-04-24)\n\n### Bug Fixes\n\n- **core:** animate preloader in visible slides if watchSlidesProgress is enabled ([8174b5a](https://github.com/nolimits4web/Swiper/commit/8174b5a5fcc5078b9164ee0577387ca352fd7af9))\n- **core:** more checks for when swiper is destroyed ([de47f09](https://github.com/nolimits4web/Swiper/commit/de47f09f165653eccc682d5b4a51da705d6b6d0d)), closes [#5656](https://github.com/nolimits4web/Swiper/issues/5656) [#5635](https://github.com/nolimits4web/Swiper/issues/5635)\n- **lazy:** animate preloader in not visible slides ([865529b](https://github.com/nolimits4web/Swiper/commit/865529b0cd7d41a18e3bccf5ec511a1158c3e56f))\n\n# [8.1.3](https://github.com/nolimits4web/Swiper/compare/v8.1.2...v8.1.3) (2022-04-20)\n\n### Bug Fixes\n\n- **effects:** improve dynamic slide shadows re-creation for Cube and Flip effects ([98b8a3e](https://github.com/nolimits4web/Swiper/commit/98b8a3eddafe1b1d1456a61fcaac2cc477c6197f))\n\n# [8.1.2](https://github.com/nolimits4web/Swiper/compare/v8.1.1...v8.1.2) (2022-04-20)\n\n### Bug Fixes\n\n- **effects:** fix slide shadows flickering in Safari for Cube and Flip effects ([52f5ef7](https://github.com/nolimits4web/Swiper/commit/52f5ef75eed2f9c11950bee94a6b4060c366c7a7))\n\n### Features\n\n- **cube-effect:** set `--swiper-cube-translate-z` CSS property on swiper-wrapper ([758ad28](https://github.com/nolimits4web/Swiper/commit/758ad28fce90def8ba681219f7625a18e7fbac54))\n\n# [8.1.1](https://github.com/nolimits4web/Swiper/compare/v8.1.0...v8.1.1) (2022-04-15)\n\n### Bug Fixes\n\n- **lazy:** fix lazy preloader in iOS 15 ([794a625](https://github.com/nolimits4web/Swiper/commit/794a625804aac037a8c3d17bbdf1a59d9f074475))\n- **virtual:** fix leaked effects translate when Virtual enabled ([a0e8dd4](https://github.com/nolimits4web/Swiper/commit/a0e8dd464b478746e0023d10f7ab3fe47148e977)), closes [#5588](https://github.com/nolimits4web/Swiper/issues/5588)\n\n# [8.1.0](https://github.com/nolimits4web/Swiper/compare/v8.0.7...v8.1.0) (2022-04-08)\n\n### Bug Fixes\n\n- **pagination:** formatter functions now accept strings as return values ([#5610](https://github.com/nolimits4web/Swiper/issues/5610)) ([629c1c4](https://github.com/nolimits4web/Swiper/commit/629c1c4526f6c324a33118a22faaa8bf47c1a028))\n- **vue:** add missing event ([bda673f](https://github.com/nolimits4web/Swiper/commit/bda673f6a78b4c5cbc8f72ab3a302ef237dfecf2)), closes [#5558](https://github.com/nolimits4web/Swiper/issues/5558)\n- enabled not working (fix [#5611](https://github.com/nolimits4web/Swiper/issues/5611)) ([#5612](https://github.com/nolimits4web/Swiper/issues/5612)) ([6a0554b](https://github.com/nolimits4web/Swiper/commit/6a0554ba6f6c7ecf3715934b217797dd3a2a0f3a))\n\n### Features\n\n- **a11y:** add `id` parameter ([213c8fe](https://github.com/nolimits4web/Swiper/commit/213c8fe7cd7d5696909b19fdfa79dad600d24b3f)), closes [#5586](https://github.com/nolimits4web/Swiper/issues/5586)\n- **angular:** support `[ngClass]` in swiperSlide ([#5562](https://github.com/nolimits4web/Swiper/issues/5562)) ([5d4ffdc](https://github.com/nolimits4web/Swiper/commit/5d4ffdc4fa7d7a40b3c7cf620a5a8411138c5951))\n- **effect-cards:** add `rotate` parameter ([5f4ca8a](https://github.com/nolimits4web/Swiper/commit/5f4ca8a4e63b2487d49084e171012a8a6485bba5)), closes [#5575](https://github.com/nolimits4web/Swiper/issues/5575)\n\n# [8.0.7](https://github.com/nolimits4web/Swiper/compare/v8.0.6...v8.0.7) (2022-03-04)\n\n### Bug Fixes\n\n- **pagination:** use direction classes ([95c882c](https://github.com/nolimits4web/Swiper/commit/95c882c50a798ebe7adc20fcb61765aace0edbfc)), closes [#5489](https://github.com/nolimits4web/Swiper/issues/5489)\n\n### Features\n\n- **effect-cards:** support for use with Virtual Slides ([69a8870](https://github.com/nolimits4web/Swiper/commit/69a887094514555800fe588cf5643a76cd5c7a0e))\n- **virtual:** better support for other effects rather than `slide` ([2dae84f](https://github.com/nolimits4web/Swiper/commit/2dae84fa4d65c4a9d319a6fe086877ab7a2724c5))\n\n# [8.0.6](https://github.com/nolimits4web/Swiper/compare/v8.0.5...v8.0.6) (2022-02-14)\n\n### Bug Fixes\n\n- **angular:** swiper angular event ([#5462](https://github.com/nolimits4web/Swiper/issues/5462)) ([adc99a5](https://github.com/nolimits4web/Swiper/commit/adc99a5c114abbe3a84fd1f235dd6230fddf8dc9))\n- **vue:** HMR error ([#5460](https://github.com/nolimits4web/Swiper/issues/5460)) ([0374228](https://github.com/nolimits4web/Swiper/commit/0374228c2761201cf9895d30b34ea869cbc773ea))\n\n# [8.0.5](https://github.com/nolimits4web/Swiper/compare/v8.0.4...v8.0.5) (2022-02-10)\n\n### Bug Fixes\n\n- **core:** fix short swipes ([8e1c12e](https://github.com/nolimits4web/Swiper/commit/8e1c12e036e39034e6c627cf54105f9259862de5))\n\n# [8.0.4](https://github.com/nolimits4web/Swiper/compare/v8.0.3...v8.0.4) (2022-02-10)\n\n### Bug Fixes\n\n- **core:** wrap resize observer callback in requestAnimationFrame ([#5441](https://github.com/nolimits4web/Swiper/issues/5441)) ([0567641](https://github.com/nolimits4web/Swiper/commit/0567641fbe4bdbea54b5de0bcc2c937dfb52e088)), closes [#5440](https://github.com/nolimits4web/Swiper/issues/5440)\n\n### Features\n\n- **angular:** events types ([#5424](https://github.com/nolimits4web/Swiper/issues/5424)) ([d8631d8](https://github.com/nolimits4web/Swiper/commit/d8631d831333e3879bb42a3e91ccb23dde94b14d))\n- **angular:** lock output ([#5442](https://github.com/nolimits4web/Swiper/issues/5442)) ([3bc27a4](https://github.com/nolimits4web/Swiper/commit/3bc27a4f191e54a579c39dfdf70c39e05ce56342))\n- **core:** allow nesting of styles in SASS ([#5438](https://github.com/nolimits4web/Swiper/issues/5438)) ([c973bc8](https://github.com/nolimits4web/Swiper/commit/c973bc83f9a117e0ee5585d5495a7492d646ac6b))\n- **core:** rewind on swipes ([#5422](https://github.com/nolimits4web/Swiper/issues/5422)) ([1a2f83b](https://github.com/nolimits4web/Swiper/commit/1a2f83b1e0ec1330d9a004c81451f7db71a9186f))\n\n# [8.0.3](https://github.com/nolimits4web/Swiper/compare/v8.0.2...v8.0.3) (2022-02-03)\n\n### Bug Fixes\n\n- **react:** `useSwiper` context value ([#5421](https://github.com/nolimits4web/Swiper/issues/5421)) ([60cbe75](https://github.com/nolimits4web/Swiper/commit/60cbe754046a133d8e443a707460547bf05693cc))\n- **react:** add autoplay to watched modules ([#5419](https://github.com/nolimits4web/Swiper/issues/5419)) ([16059ad](https://github.com/nolimits4web/Swiper/commit/16059adf98f46c7f62f24d78aa68b62a1d34815d))\n- **svelte:** add autoplay to watched modules ([1463e05](https://github.com/nolimits4web/Swiper/commit/1463e0588b42f255c76dce04f5fff251e9260283))\n- **vue:** add autoplay to watched modules ([da4d3cc](https://github.com/nolimits4web/Swiper/commit/da4d3ccdfd7d619da030fbc82af3329d94b264e8))\n\n# [8.0.2](https://github.com/nolimits4web/Swiper/compare/v8.0.1...v8.0.2) (2022-02-02)\n\n### Bug Fixes\n\n- **core:** fix slider freeze with enabled observer ([8ff2691](https://github.com/nolimits4web/Swiper/commit/8ff2691ae8cfa63d97040c1ff0db3cc648f8e941)), closes [#5414](https://github.com/nolimits4web/Swiper/issues/5414)\n\n# [8.0.1](https://github.com/nolimits4web/Swiper/compare/v8.0.0...v8.0.1) (2022-02-01)\n\n### Bug Fixes\n\n- **angular:** fix angular export ([8785e2b](https://github.com/nolimits4web/Swiper/commit/8785e2b5742a84cf169dc1936e58d48b5158ae0f)), closes [#5414](https://github.com/nolimits4web/Swiper/issues/5414)\n- **react:** types for useSwiper and useSwiperSlide hooks ([2cbf82c](https://github.com/nolimits4web/Swiper/commit/2cbf82c51e9b2fd22ccf464eea502b7f19705df1)), closes [#5413](https://github.com/nolimits4web/Swiper/issues/5413)\n\n### Features\n\n- **angular:** remove deprecated `index` property ([#5412](https://github.com/nolimits4web/Swiper/issues/5412)) ([63642a1](https://github.com/nolimits4web/Swiper/commit/63642a18eb1ecffc28e7ecc6128b56e965aa9e46))\n\n# [8.0.0](https://github.com/nolimits4web/Swiper/compare/v7.4.1...v8.0.0) (2022-02-01)\n\n### Bug Fixes\n\n- **a11y:** update `aria-disabled` on lock/unlock ([8183466](https://github.com/nolimits4web/Swiper/commit/81834664102cfead3b3882112d6b5f32c5e22b0c)), closes [#5383](https://github.com/nolimits4web/Swiper/issues/5383)\n- **angular:** `[@output](https://github.com/output)` events emitting ([#5225](https://github.com/nolimits4web/Swiper/issues/5225)) ([a34eb7a](https://github.com/nolimits4web/Swiper/commit/a34eb7addb05c29673fc34dc95d745830d3c99e6))\n- **angular:** get params types ([#5390](https://github.com/nolimits4web/Swiper/issues/5390)) ([8731204](https://github.com/nolimits4web/Swiper/commit/87312043303ed3b3656f2b4f70f22830a85a44fb))\n- **angular:** toggle input ([#5229](https://github.com/nolimits4web/Swiper/issues/5229)) ([#5254](https://github.com/nolimits4web/Swiper/issues/5254)) ([03acbe2](https://github.com/nolimits4web/Swiper/commit/03acbe2569a5c2359f37031b3a6289bc9fe4ebb2))\n- **core:** don't prevent focusable elements click when `allowTouchMove: false` ([f0eac04](https://github.com/nolimits4web/Swiper/commit/f0eac047081b887eca47f1e9a2fa7ff352adac5b)), closes [#5358](https://github.com/nolimits4web/Swiper/issues/5358)\n- **core:** don't swipe over `<select>` element ([faeb14a](https://github.com/nolimits4web/Swiper/commit/faeb14abe72988a6b1bc86d1daa7df5f3a7a904f)), closes [#5268](https://github.com/nolimits4web/Swiper/issues/5268)\n- **lazy:** only activate preloader-spin animation when slide is active ([#5203](https://github.com/nolimits4web/Swiper/issues/5203)) ([b7d89ea](https://github.com/nolimits4web/Swiper/commit/b7d89ea39aa14532346e615aae0080f4b7a70ce6)), closes [#5202](https://github.com/nolimits4web/Swiper/issues/5202)\n- **react:** compatibility with React 18 strict mode ([68bcec8](https://github.com/nolimits4web/Swiper/commit/68bcec868c596d9a47fe029a2eff90dcaa921ae5)), closes [#5398](https://github.com/nolimits4web/Swiper/issues/5398)\n- **react:** update `controller.control` on `control` prop array change ([7c53de8](https://github.com/nolimits4web/Swiper/commit/7c53de8ffae91a661370c7e618ba468e7fdc64e1)), closes [#5368](https://github.com/nolimits4web/Swiper/issues/5368)\n- **svelte:** `swiperSlide` slot data with context ([89f14ab](https://github.com/nolimits4web/Swiper/commit/89f14ab5c07d0d8ab8fa7b0a40d4fb29dcdc99de))\n- **types:** bullets type should be `Dom7Array` ([#5405](https://github.com/nolimits4web/Swiper/issues/5405)) ([d248a14](https://github.com/nolimits4web/Swiper/commit/d248a14bc867015164fa0d85a96405de211751e7))\n\n### Features\n\n- **a11y:** automatically switch slides on focus (`Tab`) in inactive slides ([1288271](https://github.com/nolimits4web/Swiper/commit/128827156b0f125a5f6ecf1409add4146fa3c989)), closes [#3149](https://github.com/nolimits4web/Swiper/issues/3149)\n- **angular:** update to angular 13 and enable tsconfig `strict` ([#5231](https://github.com/nolimits4web/Swiper/issues/5231)) ([23ee4b3](https://github.com/nolimits4web/Swiper/commit/23ee4b34f21e5c52d032cdb8812229839fc72da0))\n- **autoplay:** `autoplayPause` and `autoplayResume` events ([aea56ed](https://github.com/nolimits4web/Swiper/commit/aea56ed2712c18ff215fd53bf86b4150b4a00470))\n- **free-mode:** stop scrolling when touch event happens in freeMode ([80958d5](https://github.com/nolimits4web/Swiper/commit/80958d5e946e40d697bd0eb6fcfeed5f45579ba3)), closes [#4616](https://github.com/nolimits4web/Swiper/issues/4616)\n- **react:** `useSwiper` and `useSwiperSlide` context hooks ([#5364](https://github.com/nolimits4web/Swiper/issues/5364)) ([18bb89b](https://github.com/nolimits4web/Swiper/commit/18bb89b5d69252a4c8b65246fa17edf9e27e172f))\n- **svelte:** `swiper` and `swiperSlide` context ([#5391](https://github.com/nolimits4web/Swiper/issues/5391)) ([b5c2d3b](https://github.com/nolimits4web/Swiper/commit/b5c2d3b2ae39dd19a111f819d568ef134fc71a6f))\n- **svelte:** import index ([c91f222](https://github.com/nolimits4web/Swiper/commit/c91f2229412062a24cfff5485769a3262b596732)), closes [#4976](https://github.com/nolimits4web/Swiper/issues/4976) [#4975](https://github.com/nolimits4web/Swiper/issues/4975)\n- **virtual:** support `rewind` functionality with Virtual slides ([e52de28](https://github.com/nolimits4web/Swiper/commit/e52de28fcd9e3b9cc29091b6fd89df842736b64e))\n- **vue:** `useSwiper` and `useSwiperSlide` context hooks ([987a32e](https://github.com/nolimits4web/Swiper/commit/987a32e807b2e9aaa40fb19bfd3022b1e80246c0))\n- new `maxBackfaceHiddenSlides` param to prevent flicker in Safari ([d679a98](https://github.com/nolimits4web/Swiper/commit/d679a98ec1b24be9f6ca057e02911e2e7ee91924))\n- new `maxBackfaceHiddenSlides` param to prevent flicker in Safari ([8c05e6d](https://github.com/nolimits4web/Swiper/commit/8c05e6d6ebcf1a8bc5ca9c27e274f22d6c339b92))\n- **svelte:** types for Swiper slot `virtualData` ([682f56f](https://github.com/nolimits4web/Swiper/commit/682f56f264584aae25273b500697238a4341b254))\n- **svelte:** types for SwiperSlide slot data ([1fa70e1](https://github.com/nolimits4web/Swiper/commit/1fa70e129c460d5adacc2964bcfdd80f864e0078)), closes [#5349](https://github.com/nolimits4web/Swiper/issues/5349)\n- **vue:** provide - inject `swiper` and `swiperSlide` context ([#5377](https://github.com/nolimits4web/Swiper/issues/5377)) ([f3145b1](https://github.com/nolimits4web/Swiper/commit/f3145b1232f6687c8f56b0131d8f1e2be6133e88))\n- update dom7 to latest ([a6b1a47](https://github.com/nolimits4web/Swiper/commit/a6b1a47041b63d4e5425d4651696ef5866ed8d94))\n\n# [7.4.1](https://github.com/nolimits4web/Swiper/compare/v7.4.0...v7.4.1) (2021-12-24)\n\n### Bug Fixes\n\n- **types:** fix `rewind` description ([83574e1](https://github.com/nolimits4web/Swiper/commit/83574e1b41ad6d61dd4c6bee8bcf699e099165f4))\n\n# [7.4.0](https://github.com/nolimits4web/Swiper/compare/v7.3.4...v7.4.0) (2021-12-24)\n\n### Bug Fixes\n\n- **core:** autoHeight shouldn't ignore zero height slides ([b3697f1](https://github.com/nolimits4web/Swiper/commit/b3697f16aaa0408062540298698b4c706538e3de)), closes [#5281](https://github.com/nolimits4web/Swiper/issues/5281)\n- **pagination:** fix dynamic bullets position with `loop` enabled ([3d377c2](https://github.com/nolimits4web/Swiper/commit/3d377c2a23e6267f6e106ca58ca7f3b09ed62fc9)), closes [#5304](https://github.com/nolimits4web/Swiper/issues/5304)\n\n### Features\n\n- **core:** add `rewind` functionality ([38fdd15](https://github.com/nolimits4web/Swiper/commit/38fdd151e9c75a016f0d7547b03fe0966e328779)), closes [#5003](https://github.com/nolimits4web/Swiper/issues/5003) [#5270](https://github.com/nolimits4web/Swiper/issues/5270)\n\n# [7.3.4](https://github.com/nolimits4web/Swiper/compare/v7.3.3...v7.3.4) (2021-12-22)\n\n### Bug Fixes\n\n- **angular:** `setElement` checks ([#5305](https://github.com/nolimits4web/Swiper/issues/5305)) ([51c4a49](https://github.com/nolimits4web/Swiper/commit/51c4a4926c6303e3e0d03332354a90c221663c40))\n- **angular:** fix `nativeElement` check ([d48fb1b](https://github.com/nolimits4web/Swiper/commit/d48fb1b848c61d79e05f075676b8567952f0d280))\n\n# [7.3.3](https://github.com/nolimits4web/Swiper/compare/v7.3.2...v7.3.3) (2021-12-16)\n\n### Bug Fixes\n\n- **angular:** setElement call updateInitSwiper bug ([#5296](https://github.com/nolimits4web/Swiper/issues/5296)) ([99be5ea](https://github.com/nolimits4web/Swiper/commit/99be5ea9395ca4cb1026fba9945cfbe6c3eff8a9))\n\n# [7.3.2](https://github.com/nolimits4web/Swiper/compare/v7.3.1...v7.3.2) (2021-12-13)\n\n### Bug Fixes\n\n- **angular:** toggle input ([#5229](https://github.com/nolimits4web/Swiper/issues/5229)) ([ab3a4ad](https://github.com/nolimits4web/Swiper/commit/ab3a4adbb4e69f04e1790918d801ee2837b8fe61))\n\n### Features\n\n- **a11y:** add `aria-current` to current bullet ([#5258](https://github.com/nolimits4web/Swiper/issues/5258)) ([b5df68e](https://github.com/nolimits4web/Swiper/commit/b5df68eb38c9435c3f47769232cfd4344ec938bf))\n- update dom7 and ssr-window to latest ([627ca3a](https://github.com/nolimits4web/Swiper/commit/627ca3a2346539cdce5125d76213b077b227df27))\n\n# [7.3.1](https://github.com/nolimits4web/Swiper/compare/v7.3.0...v7.3.1) (2021-11-24)\n\n### Features\n\n- **angular:** support `on` params ([#5224](https://github.com/nolimits4web/Swiper/issues/5224)) ([3553c41](https://github.com/nolimits4web/Swiper/commit/3553c41a8de97832819e93e4cbf6e9ce8fce26ce))\n\n# [7.3.0](https://github.com/nolimits4web/Swiper/compare/v7.2.0...v7.3.0) (2021-11-18)\n\n### Bug Fixes\n\n- **docs:** property -> properly ([#5187](https://github.com/nolimits4web/Swiper/issues/5187)) ([2824b0c](https://github.com/nolimits4web/Swiper/commit/2824b0cf35398c97b7027b11bc6a28153bfa4b5c))\n- **zoom:** use only one element to zoom ([60a9886](https://github.com/nolimits4web/Swiper/commit/60a9886ea2b74ed166f2a5b4a762f88c0508bfe5)), closes [#5170](https://github.com/nolimits4web/Swiper/issues/5170)\n- **core:** fallback $selector to $wrapperEl if no children exist ([#5173](https://github.com/nolimits4web/Swiper/issues/5173)) ([d8b4ca1](https://github.com/nolimits4web/Swiper/commit/d8b4ca1d59b76404fdcff98c54da1025f868181d))\n- **types:** fixed typo `progressMultipler` -> `progressMultiplier` ([#5158](https://github.com/nolimits4web/Swiper/issues/5158)) ([815e837](https://github.com/nolimits4web/Swiper/commit/815e837a564784b706ed51b869c5de02dcb4b46f))\n\n### Features\n\n- **react:** export `SwiperProps` and `SwiperSlideProps` types ([d543020](https://github.com/nolimits4web/Swiper/commit/d543020d12093269d87d800ce83d8ffffcd31792)), closes [#5141](https://github.com/nolimits4web/Swiper/issues/5141)\n\n# [7.2.0](https://github.com/nolimits4web/Swiper/compare/v7.1.0...v7.2.0) (2021-10-27)\n\n### Features\n\n- add \"main\" and \"module\" package fields ([f228391](https://github.com/nolimits4web/Swiper/commit/f22839168622ceeb878a7345c2d5f9c4510e2e43))\n- update dom7 and ssr-window to latest ([7d45076](https://github.com/nolimits4web/Swiper/commit/7d45076cade7e437fcbacfc4153d910dc481470c))\n\n# [7.1.0](https://github.com/nolimits4web/Swiper/compare/v7.0.9...v7.1.0) (2021-10-25)\n\n### Bug Fixes\n\n- **core:** centeredSlides won't work when use creative-effect ([#5115](https://github.com/nolimits4web/Swiper/issues/5115)) ([264ca64](https://github.com/nolimits4web/Swiper/commit/264ca64297f7e6aeec2345fb04f752a0a9f49710))\n- **coverflow effect:** interface CoverflowEffectOptions updated. ([#5123](https://github.com/nolimits4web/Swiper/issues/5123)) ([b1c317a](https://github.com/nolimits4web/Swiper/commit/b1c317a68b3cdd09d862f50b0dec1c5362cd73b4))\n\n### Features\n\n- **core:** add support to loop with slotted elements ([#5117](https://github.com/nolimits4web/Swiper/issues/5117)) ([33c411e](https://github.com/nolimits4web/Swiper/commit/33c411ed39a7163c3f239c02013e9b106bbe16f8))\n\n# [7.0.9](https://github.com/nolimits4web/Swiper/compare/v7.0.8...v7.0.9) (2021-10-18)\n\n### Bug Fixes\n\n- **core:** Change opacityString and scaleString to originalProgress ([#5095](https://github.com/nolimits4web/Swiper/issues/5095)) ([244cc2e](https://github.com/nolimits4web/Swiper/commit/244cc2ee2dcddaa60b625b967b64ae646e4186b5))\n- **vue:** fix SwiperSlide types ([114fee7](https://github.com/nolimits4web/Swiper/commit/114fee7c4a5499c9aab1b7b68560c7d1dd7f5320)), closes [#5069](https://github.com/nolimits4web/Swiper/issues/5069)\n\n# [7.0.8](https://github.com/nolimits4web/Swiper/compare/v7.0.7...v7.0.8) (2021-10-04)\n\n### Features\n\n- **virtual:** improve behavior with cssMode ([b478058](https://github.com/nolimits4web/Swiper/commit/b4780585341e775bab5646c3132dcbc69b35ae37))\n\n# [7.0.7](https://github.com/nolimits4web/Swiper/compare/v7.0.6...59e44ae7e91cee32827d4605cd2795a8c115948b) (2021-09-29)\n\n### Bug Fixes\n\n- **angular:** removed stray setIndex debug code (nolimits4web[#5006](https://github.com/nolimits4web/Swiper/issues/5006)) ([#5007](https://github.com/nolimits4web/Swiper/issues/5007)) ([59e44ae](https://github.com/nolimits4web/Swiper/commit/59e44ae7e91cee32827d4605cd2795a8c115948b))\n- **vue:** make `swiperRef` not required in SwiperSlide vue component ([#4992](https://github.com/nolimits4web/Swiper/issues/4992)) ([1cd6af8](https://github.com/nolimits4web/Swiper/commit/1cd6af8d7c54ec2cc63e949402ba334f7d36f557))\n\n# [7.0.6](https://github.com/nolimits4web/Swiper/compare/v7.0.5...v7.0.6) (2021-09-16)\n\n### Bug Fixes\n\n- **angular:** deprecate `[(index)]` and `setIndex()` ([#4951](https://github.com/nolimits4web/Swiper/issues/4951)) ([7ee3d58](https://github.com/nolimits4web/Swiper/commit/7ee3d5846c9dd0f30f0737b023b0de688664fbad))\n- **effect-creative:** fix autoplay by watching all slides transition end ([86e6fb6](https://github.com/nolimits4web/Swiper/commit/86e6fb658c203b0714e6eac8c0360c583f656007)), closes [#4961](https://github.com/nolimits4web/Swiper/issues/4961)\n- **types:** add missing `cards` effect ([#4950](https://github.com/nolimits4web/Swiper/issues/4950)) ([c18aa08](https://github.com/nolimits4web/Swiper/commit/c18aa084acb827a07ee414151be6d4235f06cc86))\n\n### Features\n\n- **angular:** `enabled` prop ([#4949](https://github.com/nolimits4web/Swiper/issues/4949)) ([6c0a3e5](https://github.com/nolimits4web/Swiper/commit/6c0a3e5408fa4a2fea18ebb5800bfa31d495ab05))\n- **angular:** support `data-swiper-autoplay` ([#4946](https://github.com/nolimits4web/Swiper/issues/4946)) ([d665fb9](https://github.com/nolimits4web/Swiper/commit/d665fb98cdd7f4c00596ae07d95cd5788e62f333))\n\n# [7.0.5](https://github.com/nolimits4web/Swiper/compare/v7.0.4...v7.0.5) (2021-09-09)\n\n### Bug Fixes\n\n- **core:** don't auto create elements on destroy/init ([b4cdea8](https://github.com/nolimits4web/Swiper/commit/b4cdea842207f12603d09cbfa2828c66062273c3))\n- **core:** passes `modules` shouldn't extend prototype ([f07d43f](https://github.com/nolimits4web/Swiper/commit/f07d43fa595d068baa1140de1421b66ee555b224)), closes [#4928](https://github.com/nolimits4web/Swiper/issues/4928)\n\n# [7.0.4](https://github.com/nolimits4web/Swiper/compare/v7.0.3...v7.0.4) (2021-09-08)\n\n### Bug Fixes\n\n- **core:** fix cssMode animation in Safari 14 ([7fd04fe](https://github.com/nolimits4web/Swiper/commit/7fd04fe06718a651bcfa34549c5ea2add6affc1f)), closes [#4925](https://github.com/nolimits4web/Swiper/issues/4925)\n- **virtual:** fix Virtual slides in React, Vue & Angular ([e80925e](https://github.com/nolimits4web/Swiper/commit/e80925e443acedd2c65eb972567ba393aeef05ce)), closes [#4899](https://github.com/nolimits4web/Swiper/issues/4899)\n\n### Features\n\n- **pagination:** more pagination bullet CSS variables ([#4927](https://github.com/nolimits4web/Swiper/issues/4927)) ([25416de](https://github.com/nolimits4web/Swiper/commit/25416dee7a66676986bd50bcb2b95f7bce22e1a7))\n\n# [7.0.3](https://github.com/nolimits4web/Swiper/compare/v7.0.2...v7.0.3) (2021-09-03)\n\n### Bug Fixes\n\n- **types:** effect-creative `translate` ([#4907](https://github.com/nolimits4web/Swiper/issues/4907)) ([ad8fae3](https://github.com/nolimits4web/Swiper/commit/ad8fae31a26d7e6a22527d69e760eb79cfa36f32))\n\n# [7.0.2](https://github.com/nolimits4web/Swiper/compare/v7.0.1...v7.0.2) (2021-08-31)\n\n### Bug Fixes\n\n- **a11y:** fix argments for `initNavEl()` method ([#4884](https://github.com/nolimits4web/Swiper/issues/4884)) ([2987700](https://github.com/nolimits4web/Swiper/commit/298770059e9c892378b3b244b6171b89fb4e76ee))\n- **core:** reset slides size when `slidesPerView` switches to auto ([2c8784b](https://github.com/nolimits4web/Swiper/commit/2c8784b6df0e365f3eaa9ad4ec9ca3b618113648)), closes [#4881](https://github.com/nolimits4web/Swiper/issues/4881)\n- description typo ([#4887](https://github.com/nolimits4web/Swiper/issues/4887)) ([d3c4764](https://github.com/nolimits4web/Swiper/commit/d3c47648a84c2bcfde0c44e6a43dd6d910ec8ec6))\n\n# [7.0.1](https://github.com/nolimits4web/Swiper/compare/v7.0.0...v7.0.1) (2021-08-26)\n\n### Bug Fixes\n\n- **autoplay:** add missing `.start()` method ([dda14bc](https://github.com/nolimits4web/Swiper/commit/dda14bc9477ee685dd8d4bad5a797e6f43834aed)), closes [#4865](https://github.com/nolimits4web/Swiper/issues/4865)\n- **pagination:** check for bullets before destroy ([ea06b4c](https://github.com/nolimits4web/Swiper/commit/ea06b4ce7f62f4b8dc908c7acf35dda016183958)), closes [#4859](https://github.com/nolimits4web/Swiper/issues/4859)\n\n# [7.0.0](https://github.com/nolimits4web/Swiper/compare/v6.8.4...v7.0.0) (2021-08-25)\n\n### Bug Fixes\n\n- **angular:** container classNames ([#4854](https://github.com/nolimits4web/Swiper/issues/4854)) ([fd092dc](https://github.com/nolimits4web/Swiper/commit/fd092dc812e0e048fde54ba0d151d607191d2773))\n- **angular:** demo ([9fa84e6](https://github.com/nolimits4web/Swiper/commit/9fa84e63526c1a2af64886f7fa9f92993a57f6cb))\n- **angular:** try paths for build/types ([04b4eae](https://github.com/nolimits4web/Swiper/commit/04b4eae0a49cd1d888d33862ff230b860aec7fa1))\n- **angular:** tsignore ([9011756](https://github.com/nolimits4web/Swiper/commit/9011756867f524dcf7498ef61b632c7c203fbf63))\n- **types:** make loopSlides & loopCreate & loopDestroy internal ([d6fdd1b](https://github.com/nolimits4web/Swiper/commit/d6fdd1bc51d2234381a5c71074e6f3831d4f9f78))\n- **zoom:** zoom elements only in `swiper-zoom-container` ([a4e351f](https://github.com/nolimits4web/Swiper/commit/a4e351ffdbe2f03e57fa22dddfa635ffc2c039ba)), closes [#4847](https://github.com/nolimits4web/Swiper/issues/4847)\n- **keyboard:** fix not working keyboard module ([31ee849](https://github.com/nolimits4web/Swiper/commit/31ee849caa7e08bfea72a2a5d2a0ab54eed23aa3))\n- **pagination:** avoid adding direction classes to other swiper's pagination's ([f1c8c89](https://github.com/nolimits4web/Swiper/commit/f1c8c898fb1efbaf565c507e45d15fd775770453))\n- **core:** prevent `watchOverflow` from unlocking slidePrev/Next ([f1b7397](https://github.com/nolimits4web/Swiper/commit/f1b7397aa1b1a8b3602a2317a12537aa9472f5b1))\n- **scrollbar:** fix scrollbar size with `centeredSlides` ([91f2f2f](https://github.com/nolimits4web/Swiper/commit/91f2f2fae3e661f23d333239c619a02865b0b62d))\n- **core:** fix slide progress in CSS Mode and centered slides ([1b0165a](https://github.com/nolimits4web/Swiper/commit/1b0165a5f25cef503f7b39b97b19e3ebadd3a355))\n- **core:** better handle loop fix with cssMode enabled ([ff84073](https://github.com/nolimits4web/Swiper/commit/ff8407309ad7e6bffa763df50bbbf46ec1bd6f39))\n- **core:** fix auto create elements feature with breakpoints ([3b50feb](https://github.com/nolimits4web/Swiper/commit/3b50febef6f1d1b5b49c1b06b56da96ee689ac8f))\n- **components:** add `modules` prop ([596e2a1](https://github.com/nolimits4web/Swiper/commit/596e2a18f8ade549e0d73c8ec354d2e24fc5ad49))\n- **types:** add `modules` parameter ([0d599e2](https://github.com/nolimits4web/Swiper/commit/0d599e259b1a00c4995ade3563142539db963ef9))\n- **core:** grab cursor to be set based on touchEventsTarget ([cffc3aa](https://github.com/nolimits4web/Swiper/commit/cffc3aac5a338eb52ac354d6cb2e225a334a7a30))\n- **core:** double check for documentElement in smoothScroll detection ([ac09e38](https://github.com/nolimits4web/Swiper/commit/ac09e3851851c27a80e7f283299553127c30a3a0))\n\n### Features\n\n- **creative-effect:** add `shadowPerProgress` parameter ([980c4c7](https://github.com/nolimits4web/Swiper/commit/980c4c790a7ec969e2ad0efe0ae02812e56b4e2e))\n- **angular:** better typing ([e132ee8](https://github.com/nolimits4web/Swiper/commit/e132ee8bf420bc7fa38054aaf40e664c2f93dc28))\n- **angular:** better typing ([6b562fa](https://github.com/nolimits4web/Swiper/commit/6b562fa8e403982d6adfae6130497c1cf841ea78))\n- **angular:** support 'strictTemplates' flag ([613f12c](https://github.com/nolimits4web/Swiper/commit/613f12c5ba01e99991fe416bd37ad640bee22d72))\n- **effect-creative:** add `progressMultiplier` option ([ed3bd7a](https://github.com/nolimits4web/Swiper/commit/ed3bd7a72b5f8eef23d46319a112b609cf021346))\n- **angular:** partial ivy build ([#4834](https://github.com/nolimits4web/Swiper/issues/4834)) ([e86b2b3](https://github.com/nolimits4web/Swiper/commit/e86b2b3011cb15bd41c30db9bad8994128c7b7af))\n- **core** `swiper-container` class to `swiper` ([ad8002c](https://github.com/nolimits4web/Swiper/commit/ad8002c87689936457110350e734766f2fc43dee))\n- **core** `swiper-container` class to `swiper` ([c763c9c](https://github.com/nolimits4web/Swiper/commit/c763c9c92cc05c1426a7250790725e032925b78e))\n- **core:** `watchOverflow` is now enabled by default ([b97286f](https://github.com/nolimits4web/Swiper/commit/b97286f57813bd9d5874a4ec563a511b61b1b2e9))\n- **core:** improve `watchOverflow` detection ([627ae4c](https://github.com/nolimits4web/Swiper/commit/627ae4cfb4bcb8b558bb6a9d632d0279d575c3eb))\n- **creative-effect:** add shadows ([cce4f23](https://github.com/nolimits4web/Swiper/commit/cce4f234d67670c4f04b03ed6e2b6ad9f1c7c898))\n- **cards-effect:** add slide shadow ([09666c8](https://github.com/nolimits4web/Swiper/commit/09666c85857a788a2c5d9cac4d5a34d8ec4fd883))\n- **cards-effect:** new Cards effect ([21af858](https://github.com/nolimits4web/Swiper/commit/21af858af6822a0ed469dbeda2bf50f9e4dcec8a))\n- **creative-effect:** add `limitProgress` and `perspective` options ([1c7d49e](https://github.com/nolimits4web/Swiper/commit/1c7d49e4b17f7a773ed068e7c1339de79dbbc298))\n- **core:** new \"Creative\" effect ([f72f5ba](https://github.com/nolimits4web/Swiper/commit/f72f5ba0b5e946c576917b85981aa247f389fcbe))\n- **svelte:** add Svelte components typings ([5a64bdc](https://github.com/nolimits4web/Swiper/commit/5a64bdc1eb1574b20f85e2e9cdde84bad921c166))\n- **core:** new `slidesPerGroupAuto` feature ([2b6f133](https://github.com/nolimits4web/Swiper/commit/2b6f1338b2de0821e77808aa1d7931d97d46e75a)), closes [#4168](https://github.com/nolimits4web/Swiper/issues/4168)\n- **coverflow-effect:** support cssMode ([e13d268](https://github.com/nolimits4web/Swiper/commit/e13d2687149ed67c5a72a48f720749b5b8faa458))\n- **fade-effect:** support cssMode ([18b49cc](https://github.com/nolimits4web/Swiper/commit/18b49ccc4576fcdc4c159c263f079d31a2a7cb19))\n- **flip-effect:** support cssMode ([82859a1](https://github.com/nolimits4web/Swiper/commit/82859a1b9cc1d4b143e3c230ca199f259e2a5d79))\n- **pagination:** keep pagination styles when it is outside of container ([1b11429](https://github.com/nolimits4web/Swiper/commit/1b11429afba80bc1ab1e2fb5ce234b43155d1266)), closes [#3736](https://github.com/nolimits4web/Swiper/issues/3736)\n- **core:** better RTL support in CSS Mode ([3503ced](https://github.com/nolimits4web/Swiper/commit/3503ced677ec867c7a28437a8731a8d0a500356b))\n- **core:** support for `centeredSlides` in CSS Mode ([c940953](https://github.com/nolimits4web/Swiper/commit/c9409538014da75207700b8206358c8423dd7847))\n- **core:** support for coverflow effect in CSS Mode ([8300225](https://github.com/nolimits4web/Swiper/commit/8300225d5d47afc53a096d95597f94e7b3b8b276))\n- **core:** support for Virtual Slides in CSS Mode ([0e26d52](https://github.com/nolimits4web/Swiper/commit/0e26d52efd584e928b29c29de720e97344f08db5))\n- **core:** use easing for custom scroll animation ([f40a370](https://github.com/nolimits4web/Swiper/commit/f40a370f2612128191d3b8ed370c20a777838c86))\n- **zoom:** support Zoom in CSS Mode ([4639702](https://github.com/nolimits4web/Swiper/commit/46397027825376e477abddf1f6959b2ddc499557))\n- **core:** `watchSlidesProgress` and `watchSlidesVisibility` merged into single `watchSlidesProgress` ([33dbf62](https://github.com/nolimits4web/Swiper/commit/33dbf6218ca558fcb14cb68d8dc4ef141be3f7ac))\n- **core:** custom animation for CSS Mode where smooth scrolling is not supported ([a61da6a](https://github.com/nolimits4web/Swiper/commit/a61da6a5100eaf5b6860dcad7c75bc93fe1a20eb))\n- **core:** remove `isEdge` browser detection ([9c9970c](https://github.com/nolimits4web/Swiper/commit/9c9970ca479f69d9fdebd1bedf830035b6b030e5))\n- **core:** move slides manipulation methods to Manipulation module ([74873f1](https://github.com/nolimits4web/Swiper/commit/74873f104716cad59f2114f754b7741c9b0a17f6))\n- **core:** move `slidesPerColumn` functionality to new Grid module ([0f1df44](https://github.com/nolimits4web/Swiper/commit/0f1df44f58b4154cb0018d043b73759a9aa933c9))\n- **core:** increase package build target ([65f96c1](https://github.com/nolimits4web/Swiper/commit/65f96c13707c0301b1f4b32cd108540d8126342b))\n- **core:** tweak browserslist ([82a23a5](https://github.com/nolimits4web/Swiper/commit/82a23a581ae80e36c358d9dcdcd49ab9c547092b))\n- **core:** convert A11y to functional module ([5906115](https://github.com/nolimits4web/Swiper/commit/590611559dc908c780de40b31539b5736a64832c))\n- **core:** convert Autoplay to functional module ([ace1e54](https://github.com/nolimits4web/Swiper/commit/ace1e54772a662e2a7e12f4c1c4fa0f1647a13df))\n- **core:** convert FreeMode to functional module ([4d307c0](https://github.com/nolimits4web/Swiper/commit/4d307c0903e21106f2352c112c15569b3eac0ea8))\n- **core:** convert Keyboard to functional module ([ed63a3b](https://github.com/nolimits4web/Swiper/commit/ed63a3be28dbc1c80824a1b4f34eb59b1a6bf00e))\n- **core:** convert Lazy to functional module ([8d4f99a](https://github.com/nolimits4web/Swiper/commit/8d4f99a4e2a20c0f5ce46bb5a1e4ebbeaddc19f1))\n- **core:** convert Mousewheel to functional module ([1e4bf98](https://github.com/nolimits4web/Swiper/commit/1e4bf98f336386618b19cc4459733494e7176831))\n- **core:** convert Navigation to functional module ([e4aa156](https://github.com/nolimits4web/Swiper/commit/e4aa1566e946e246905f00b00a5d8da02c653de7))\n- **core:** convert Pagination to functional module ([1c718d0](https://github.com/nolimits4web/Swiper/commit/1c718d0dcec3d2e52fe30ff2ced0123215d009bb))\n- **core:** convert Scrollbar to functional module ([96b8b17](https://github.com/nolimits4web/Swiper/commit/96b8b1737f3c64ac5f331a53ff44e95a0dc875d8))\n- **core:** convert Thumbs to functional module ([bea5ac2](https://github.com/nolimits4web/Swiper/commit/bea5ac2db2905c8badf19a34f909e41b07b8a045))\n- **core:** convert Virtual to functional module ([6899e83](https://github.com/nolimits4web/Swiper/commit/6899e833ab540faa660378d500342aed74d93853))\n- **core:** convert Zoom to functional module ([eb1437e](https://github.com/nolimits4web/Swiper/commit/eb1437ee695df731077dcc21c110c738b8ccab13))\n- **core:** remove object-syntax modules support ([287d14a](https://github.com/nolimits4web/Swiper/commit/287d14ae02f33e746c0f40d7d52cd9127c0e91de))\n- **core:** `touchEventsTarget` is now default to `wrapper` ([71ffcb5](https://github.com/nolimits4web/Swiper/commit/71ffcb5aab72f5023760896d7a68d182e6a6c73b)), closes [#4751](https://github.com/nolimits4web/Swiper/issues/4751) [#3816](https://github.com/nolimits4web/Swiper/issues/3816)\n- **core:** convert effects to functional modules ([b6f64a5](https://github.com/nolimits4web/Swiper/commit/b6f64a58d257a24eeabf0078c1bcf795252bb9c3))\n- **core:** convert HashNavigation to functional module ([ac384c6](https://github.com/nolimits4web/Swiper/commit/ac384c67c22a741589761181d8478dc973769d48))\n- **core:** convert History to functional module ([7e7c95a](https://github.com/nolimits4web/Swiper/commit/7e7c95a02e709e378d61ebb5548eb40237acd86d))\n- **core:** convert Observer to functional module ([a31b80e](https://github.com/nolimits4web/Swiper/commit/a31b80ed55efc8b3a482f26c7875351592c08531))\n- **core:** convert Parallax to functional module ([a7c26b5](https://github.com/nolimits4web/Swiper/commit/a7c26b55ccd9ecff6d10767eff330937bd040197))\n- **core:** convert Resize to functional module ([133047c](https://github.com/nolimits4web/Swiper/commit/133047c210af7b2d51de7786ea296cec9fd799ab))\n- **core:** new functional modules syntax ([e45285a](https://github.com/nolimits4web/Swiper/commit/e45285ab4e1e62c3cda1a78c5ba3e5d8899ba5e1))\n- **core:** remove `mouse` events listeners in favor of pointer events ([b9254ab](https://github.com/nolimits4web/Swiper/commit/b9254abec1b55cba664937a738d522af4ada63ca))\n- **core:** remove MutationObserver support detection (consider it is supported everywhere) ([6ed6786](https://github.com/nolimits4web/Swiper/commit/6ed6786ddc883e2a78674035e7bd8906534c8956))\n- **core:** remove pointerEvents support detection ([b7d171b](https://github.com/nolimits4web/Swiper/commit/b7d171be55827b7a046559615d334ae510f684b8))\n- **core:** `resizeObserver` is not enabled by default ([552a7ea](https://github.com/nolimits4web/Swiper/commit/552a7eac998b6def6deeb5c032ad02aa494135fe))\n- **package:** use `type: module` ([e8d89f2](https://github.com/nolimits4web/Swiper/commit/e8d89f262aa5f742f786189fc35097d789b2e9c9))\n- **core:** remove CJS formats ([3978367](https://github.com/nolimits4web/Swiper/commit/397836796f7be1ca4820d567cf20476def311b37))\n- **core:** remove Less and SCSS variables in favor of CSS variables ([91e8ea1](https://github.com/nolimits4web/Swiper/commit/91e8ea1ef111bee99bb2b13e506007c336909ca8))\n- **freeMode:** init ([#4240](https://github.com/nolimits4web/Swiper/issues/4240)) ([895da28](https://github.com/nolimits4web/Swiper/commit/895da2888e4e8613f2f3dbaa4c150429b0afd85d))\n- **slidesPerColumn:** init ([#4508](https://github.com/nolimits4web/Swiper/issues/4508)) ([c469d29](https://github.com/nolimits4web/Swiper/commit/c469d29f80393896356d2ccd315ee91080e829c0))\n\n# [6.8.4](https://github.com/nolimits4web/Swiper/compare/v6.8.3...v6.8.4) (2021-08-23)\n\n### Bug Fixes\n\n- improve typing ([b0fb310](https://github.com/nolimits4web/Swiper/commit/b0fb310de000dd9fff5e4c91e07be2cc93e754eb))\n\n# [6.8.3](https://github.com/nolimits4web/Swiper/compare/v6.8.2...v.6.8.3) (2021-08-20)\n\n### Bug Fixes\n\n- fix missing package.json in `swiper/types`\n\n# [6.8.2](https://github.com/nolimits4web/Swiper/compare/v6.8.1...v.6.8.2) (2021-08-16)\n\n### Bug Fixes\n\n- **core:** support tailwind's `!` in classes ([0cfbc53](https://github.com/nolimits4web/Swiper/commit/0cfbc538d1e23e01a1b93a327a2203ae70bd44ef)), closes [#4812](https://github.com/nolimits4web/Swiper/issues/4812)\n- **vue:** add missing emitted events (enable & disable) into 'emits' option ([95665cc](https://github.com/nolimits4web/Swiper/commit/95665ccbf7b7f381aa62a4e0ef3cbdf67de5ac83))\n- **vue:** fix `focusableElements` prop type ([7f1b1b9](https://github.com/nolimits4web/Swiper/commit/7f1b1b9805ec4b042570993fd5098344ca04d637)), closes [#4822](https://github.com/nolimits4web/Swiper/issues/4822)\n\n# [6.8.1](https://github.com/nolimits4web/Swiper/compare/v6.8.0...v.6.8.1) (2021-08-03)\n\n### Bug Fixes\n\n- **core:** reset slides margin-top on `slidesPerColumn` breakpoint ([c94a115](https://github.com/nolimits4web/Swiper/commit/c94a115b4e5ca326730722cdeeb5c27a387cf1db)), closes [#4044](https://github.com/nolimits4web/Swiper/issues/4044)\n- **core:** fix server side check for `HTMLElement` (close [#4787](https://github.com/nolimits4web/Swiper/issues/4787)) ([#4788](https://github.com/nolimits4web/Swiper/issues/4788)) ([ca4f6b8](https://github.com/nolimits4web/Swiper/commit/ca4f6b8dfcc96c0f59d7b78afba8633d06faced8))\n\n### Features\n\n- **pagination:** hide 1 dot pagination ([#4786](https://github.com/nolimits4web/Swiper/issues/4786)) ([cc5e417](https://github.com/nolimits4web/Swiper/commit/cc5e4174ae7bc1b3e465a9eea6a4ee8d7df16cdb))\n\n# [6.8.0](https://github.com/nolimits4web/Swiper/compare/v6.7.5...v6.8.0) (2021-07-22)\n\n### Bug Fixes\n\n- **a11y:** count aria-label without duplicated item in loop option ([4bd7461](https://github.com/nolimits4web/Swiper/commit/4bd7461f4c7ba0ca097a8d5a77881a547b0545e7)), closes [#4782](https://github.com/nolimits4web/Swiper/issues/4782) [#4781](https://github.com/nolimits4web/Swiper/issues/4781)\n- **angular:** nested swiper ([#4785](https://github.com/nolimits4web/Swiper/issues/4785)) ([2be958c](https://github.com/nolimits4web/Swiper/commit/2be958cd07be46d45000c3e971fc6a7f7f8b22f6))\n- **core:** don't extend html elements in SSR ([#4784](https://github.com/nolimits4web/Swiper/issues/4784)) ([adac257](https://github.com/nolimits4web/Swiper/commit/adac2579a0d2f311b9a269e2e6c526f46ba2c2dc))\n- **hash-navigation:** typos in comments and function name ([#4779](https://github.com/nolimits4web/Swiper/issues/4779)) ([07b8dc3](https://github.com/nolimits4web/Swiper/commit/07b8dc326796aa132360a3e5d1241f5b154a86b3))\n- **svelte:** install modules via `module` component prop ([#4768](https://github.com/nolimits4web/Swiper/issues/4768)) ([ddaa069](https://github.com/nolimits4web/Swiper/commit/ddaa0699cfb9cc2e068186339902a2d7099dc20e)), closes [#4767](https://github.com/nolimits4web/Swiper/issues/4767)\n- **zoom:** fix zoom panning in RTL ([08bcd05](https://github.com/nolimits4web/Swiper/commit/08bcd05ff008beb8e0b721048f1b36a8fd25094a)), closes [#4074](https://github.com/nolimits4web/Swiper/issues/4074)\n\n# [6.7.5](https://github.com/nolimits4web/Swiper/compare/v6.7.1...v6.7.5) (2021-07-01)\n\n### Bug Fixes\n\n- **lazy:** lazy load when no sides resistance enabled ([1949a9e](https://github.com/nolimits4web/Swiper/commit/1949a9e65bfc029fd62532920b3e3c34f351d44d)), closes [#4729](https://github.com/nolimits4web/Swiper/issues/4729)\n- **zoom:** compatibility with slidesPerView to zoom only clicked slide ([aa1a778](https://github.com/nolimits4web/Swiper/commit/aa1a7789482b7f244e44183e050e62009cdea00d)), closes [#4716](https://github.com/nolimits4web/Swiper/issues/4716)\n\n### Features\n\n- **vue:** added Vue components typings ([#4707](https://github.com/nolimits4web/Swiper/issues/4707)) ([c452c08](https://github.com/nolimits4web/Swiper/commit/c452c089995760c23e429fa06afa04bd7a1d7c81)), closes [#3916](https://github.com/nolimits4web/Swiper/issues/3916)\n\n# [6.7.1](https://github.com/nolimits4web/Swiper/compare/v6.7.0...v6.7.1) (2021-06-23)\n\n### Bug Fixes\n\n- **angular:** don't set main `class` on wrapper element ([1285195](https://github.com/nolimits4web/Swiper/commit/12851953491155f5f96930355c91110c9a4cf753)), closes [#4679](https://github.com/nolimits4web/Swiper/issues/4679)\n- **core:** don't extend html elements ([#4691](https://github.com/nolimits4web/Swiper/issues/4691)) ([32ae99b](https://github.com/nolimits4web/Swiper/commit/32ae99b5d7ffbd148cb3268c5048c76720190c54))\n- **core:** unset top margin on slide when `slidesPerColum` changed ([1ced4f7](https://github.com/nolimits4web/Swiper/commit/1ced4f725f66572505aeda34fe2e4c3e0cef05bf)), closes [#4658](https://github.com/nolimits4web/Swiper/issues/4658)\n- **react:** dynamically enable/disable navigation/pagination/scrollbar ([d87ac0c](https://github.com/nolimits4web/Swiper/commit/d87ac0c611cbe050c50ab70f4faf5a53decabf12)), closes [#4681](https://github.com/nolimits4web/Swiper/issues/4681)\n- **react:** update parallax on Virtual slides rendered ([ce210f3](https://github.com/nolimits4web/Swiper/commit/ce210f3de6336e068ef78511f8ee7a309e8d5456)), closes [#4673](https://github.com/nolimits4web/Swiper/issues/4673)\n- **react, svelte, vue:** allow to accept `enabled` prop ([76dd086](https://github.com/nolimits4web/Swiper/commit/76dd086ef6a6ba7794e5cc9fd7633d46bdec1c5c)), closes [#4633](https://github.com/nolimits4web/Swiper/issues/4633)\n- **svelte:** dynamically enable/disable navigation/pagination/scrollbar ([8711bb9](https://github.com/nolimits4web/Swiper/commit/8711bb944f5d3aece3550125ed9f5842419c1ea2))\n- **typings:** fixed methods definitions for navigation, pagination and scrollbar ([77d6909](https://github.com/nolimits4web/Swiper/commit/77d69092e229dc2dd8cf764766e70ba29408caec))\n- **vue:** dynamically enable/disable navigation/pagination/scrollbar ([4821008](https://github.com/nolimits4web/Swiper/commit/482100847d1f6459191d2ccf0ef868a6f69b5691))\n- **vue:** update parallax on Virtual slides rendered ([b78c6e0](https://github.com/nolimits4web/Swiper/commit/b78c6e0a758bdb52986ecc1c7b3134737807cbdc))\n\n### Features\n\n- **core:** add ParallaxOptions types ([7cc22fe](https://github.com/nolimits4web/Swiper/commit/7cc22fe72bf95a1fa74a6f4226bebb3bdd4527a2)), closes [#4684](https://github.com/nolimits4web/Swiper/issues/4684)\n- **core:** allow `wrapperClass` to be multiple classes ([0d578b0](https://github.com/nolimits4web/Swiper/commit/0d578b0b98bb95141a481d74f1a8ec286bfaad54)), closes [#4680](https://github.com/nolimits4web/Swiper/issues/4680)\n- **core:** make `focusableElements` configurable ([6ff0866](https://github.com/nolimits4web/Swiper/commit/6ff086644805be9992adcb6668198496e64e7707)), closes [#4677](https://github.com/nolimits4web/Swiper/issues/4677)\n- **core:** use `window.matchMedia` to detect window width for breakpoints ([1a4afe0](https://github.com/nolimits4web/Swiper/commit/1a4afe0f86ef6f7978fde8a8caf6522ee87faab2)), closes [#4682](https://github.com/nolimits4web/Swiper/issues/4682)\n\n# [6.7.0](https://github.com/nolimits4web/Swiper/compare/v6.6.2...v6.7.0) (2021-05-31)\n\n### Bug Fixes\n\n- **angular:** virtual mode run changeDetecton inside ngZone ([#4601](https://github.com/nolimits4web/Swiper/issues/4601)) ([4f37a61](https://github.com/nolimits4web/Swiper/commit/4f37a615a78c91149cd574437735037f5692da2a))\n- **lazy:** use passive listener for scroll listeners ([cbe7a59](https://github.com/nolimits4web/Swiper/commit/cbe7a5958a31eab98cd64bcdb81a69b7a6e3c5ac))\n- **thumbs:** improve thumbs with slidesPerGroup ([b2b31b3](https://github.com/nolimits4web/Swiper/commit/b2b31b325b9777269de4d23847fde11274beafe5)), closes [#3704](https://github.com/nolimits4web/Swiper/issues/3704) [#4007](https://github.com/nolimits4web/Swiper/issues/4007) [#4615](https://github.com/nolimits4web/Swiper/issues/4615) [#4208](https://github.com/nolimits4web/Swiper/issues/4208)\n- **vue:** definition for \"lock\" and \"unlock\" events ([46d35f7](https://github.com/nolimits4web/Swiper/commit/46d35f761c899563dd1f8e39b912ad8d68c55bbb)), closes [#4596](https://github.com/nolimits4web/Swiper/issues/4596)\n\n### Features\n\n- **core:** starter html layout can be optional with new `createElements: true` parameter ([#4507](https://github.com/nolimits4web/Swiper/issues/4507)) ([aef2865](https://github.com/nolimits4web/Swiper/commit/aef2865d9bc6cb7c63809b114668aa8b728c875c))\n- **autoplay:** if `disableOnInteraction` and `pauseOnMouseEnter`, it will stop autoplay on interaction ([e7e5031](https://github.com/nolimits4web/Swiper/commit/e7e5031a58b50e3f21f2c349db242408379beb05)), closes [#4598](https://github.com/nolimits4web/Swiper/issues/4598)\n- **vue:** add support for use Swiper as async component ([ff53797](https://github.com/nolimits4web/Swiper/commit/ff53797a68882940b4d239d11332005222a26058)), closes [#4613](https://github.com/nolimits4web/Swiper/issues/4613)\n\n# [6.6.2](https://github.com/nolimits4web/Swiper/compare/v6.6.1...v6.6.2) (2021-05-19)\n\n### Bug Fixes\n\n- **autoplay:** fix resume after pause on mouseenter ([3d480be](https://github.com/nolimits4web/Swiper/commit/3d480bef871add22543794fc279c95f4544c81ed)), closes [#4569](https://github.com/nolimits4web/Swiper/issues/4569)\n- **navigation:** better SCSS interpolation ([a1337df](https://github.com/nolimits4web/Swiper/commit/a1337dfed176a01631d84714785524953d08ecd5))\n- **svelte:** auto update Virtual slides on slides prop change ([ddf11b8](https://github.com/nolimits4web/Swiper/commit/ddf11b8fbf6494d076cddc55e306c720f975dd31)), closes [#4564](https://github.com/nolimits4web/Swiper/issues/4564)\n\n# [6.6.1](https://github.com/nolimits4web/Swiper/compare/v6.6.0...v6.6.1) (2021-05-11)\n\n### Bug Fixes\n\n- **core:** fix breakpoints `enabled` detection ([0be8099](https://github.com/nolimits4web/Swiper/commit/0be80997f11951985797e767c150545e3180f761)), closes [#4543](https://github.com/nolimits4web/Swiper/issues/4543)\n\n# [6.6.0](https://github.com/nolimits4web/Swiper/compare/v6.5.9...v6.6.0) (2021-05-11)\n\n### Bug Fixes\n\n- **core:** make autoHeight work with Virtual slides ([6925acf](https://github.com/nolimits4web/Swiper/commit/6925acf3b75fc2bdfdae0879cbb3f0f07a79beb4)), closes [#4525](https://github.com/nolimits4web/Swiper/issues/4525)\n- **zoom:** don't toggle zoom on slides without zoom-container ([e1de61b](https://github.com/nolimits4web/Swiper/commit/e1de61b821e29f202f041e63afe55b3b2b4250de)), closes [#4535](https://github.com/nolimits4web/Swiper/issues/4535)\n\n### Features\n\n- **autoplay:** new `pauseOnMouseEnter` parameter to pause autoplay on mouse enter over container ([1a10247](https://github.com/nolimits4web/Swiper/commit/1a102473df5be7c507b54efb1902a0dcbb53195d)), closes [#4482](https://github.com/nolimits4web/Swiper/issues/4482)\n- **core:** new parameters and methods to enable/disable Swiper dynamically ([575bc84](https://github.com/nolimits4web/Swiper/commit/575bc841539d8ceb79b88484534c7caf4e94a8fb)), closes [#4356](https://github.com/nolimits4web/Swiper/issues/4356) [#4311](https://github.com/nolimits4web/Swiper/issues/4311)\n- **react:** add the missing render function type ([cfa1459](https://github.com/nolimits4web/Swiper/commit/cfa1459b7d338274c2d0f682f68b27d7fc683884))\n\n# [6.5.9](https://github.com/nolimits4web/Swiper/compare/v6.5.8...v6.5.9) (2021-04-30)\n\n### Bug Fixes\n\n- **angular:** custom naviation & pagination ([c96bcf6](https://github.com/nolimits4web/Swiper/commit/c96bcf65a818d56a4ed949b43078bc5a5e4980ad))\n- **angular:** don't remove Swiper styles on destroy ([96ad4f0](https://github.com/nolimits4web/Swiper/commit/96ad4f0edd647e24d962cedfacaeb9668fe7a47a)), closes [#4443](https://github.com/nolimits4web/Swiper/issues/4443)\n- **angular:** extend current params ([71be609](https://github.com/nolimits4web/Swiper/commit/71be6095b647f7c8e92126fef71ef8cdea1b69ae))\n- **angular:** pagination true should work ([434a19c](https://github.com/nolimits4web/Swiper/commit/434a19cde48aa239a8ddf7cfb77fb6526a17360b))\n- **angular:** update value ([20e25b5](https://github.com/nolimits4web/Swiper/commit/20e25b5534d050ea11fa7a95dea130c1adaf8e33))\n- **build:** size calc ([769e9df](https://github.com/nolimits4web/Swiper/commit/769e9df2e439a2082505bcaa1a3de02d1bdb231d))\n- **docs:** postinstall bakers-> backers typo ([839aea4](https://github.com/nolimits4web/Swiper/commit/839aea42a33dd4b82031310ba69750251cb978e2))\n- **hash-navigation:** fixed issue when using with freeMode without transition ([c90a7bd](https://github.com/nolimits4web/Swiper/commit/c90a7bd73dd84b4422a5699ffb996f24ec868d01)), closes [#4478](https://github.com/nolimits4web/Swiper/issues/4478)\n- **history:** fixed issue when using with freeMode without transition ([2902ea9](https://github.com/nolimits4web/Swiper/commit/2902ea95b29a7c2e7696ffb5c9440f8604722fc9))\n- **react:** load lazy images (if enabled) on children change ([ca0347b](https://github.com/nolimits4web/Swiper/commit/ca0347b505fec19a08a8c48034b01ad8faf68265)), closes [#4463](https://github.com/nolimits4web/Swiper/issues/4463)\n- **vue:** load lazy images (if enabled) on children change ([335daff](https://github.com/nolimits4web/Swiper/commit/335daff14417da61c17a6f65a2c4698c24e145e1))\n\n### Features\n\n- **angular:** support id input ([ad51e32](https://github.com/nolimits4web/Swiper/commit/ad51e324a6cd8666d64b94f4fdf30fe9f6bd85f7))\n- core-js postinstall script ([fd5c01d](https://github.com/nolimits4web/Swiper/commit/fd5c01d8f7c6feeed39e4440f5e9cdcd75667394))\n- **angular:** use class & ngClass on `<swiper>` component ([66c5a55](https://github.com/nolimits4web/Swiper/commit/66c5a55b76a5d7e58908bf3fad8866e16361244b))\n\n# [6.5.8](https://github.com/nolimits4web/Swiper/compare/v6.5.7...v6.5.8) (2021-04-23)\n\n### Bug Fixes\n\n- **components:** fixed issue with navigation, pagination, scrollbar custom elements added after initialization ([cfd4efd](https://github.com/nolimits4web/Swiper/commit/cfd4efd59fe422be7c36594234bcb54aaaf5cfc3)), closes [#4458](https://github.com/nolimits4web/Swiper/issues/4458)\n- **react:** make events reactive ([301ffb0](https://github.com/nolimits4web/Swiper/commit/301ffb096295017578e9309886686b42dd4b7785)), closes [#3762](https://github.com/nolimits4web/Swiper/issues/3762)\n\n### Features\n\n- **a11y:** add `a11y.slideRole` parameter for custom slide role ([097109f](https://github.com/nolimits4web/Swiper/commit/097109fceae580fe211f60c0be7218d6344baabe)), closes [#4435](https://github.com/nolimits4web/Swiper/issues/4435)\n- **history:** new `root` parameter to avoid issues with root path detection ([e6d1202](https://github.com/nolimits4web/Swiper/commit/e6d1202fc02ab1283da1fb71b5d3092874ba8aad)), closes [#3205](https://github.com/nolimits4web/Swiper/issues/3205)\n\n# [6.5.7](https://github.com/nolimits4web/Swiper/compare/v6.5.6...v6.5.7) (2021-04-16)\n\n### Bug Fixes\n\n- **react:** fixed issue with Virtual, Controller and Thumbs when running `React.StrictMode`\n\n### Features\n\n- **core:** new `swiper.setProgress` method to set whole Swiper translate progress (from 0 to 1)\n\n# [6.5.6](https://github.com/nolimits4web/Swiper/compare/v6.5.5...v6.5.6) (2021-04-09)\n\n### Bug Fixes\n\n- **angular:** custom html element support ([b7d0c1f](https://github.com/nolimits4web/Swiper/commit/b7d0c1f795fbf324ab03f805e47c211cb11ff5b9))\n- **angular:** custom html element support ([dec54c2](https://github.com/nolimits4web/Swiper/commit/dec54c23cb33fa9f6eae1539a51251a641e98088))\n\n# [6.5.5](https://github.com/nolimits4web/Swiper/compare/v6.5.4...v6.5.5) (2021-04-08)\n\n### Bug Fixes\n\n- **core:** removed Svelte from peerDependencies\n- **utils:** dom not writeable ([8775c1a](https://github.com/nolimits4web/Swiper/commit/8775c1a748541f7597525cf2eb7559788f4e6422))\n\n# [6.5.4](https://github.com/nolimits4web/Swiper/compare/v6.5.3...v6.5.4) (2021-04-05)\n\n### Bug Fixes\n\n- **core:** fix pagination and a11y classes escaping ([49e06f9](https://github.com/nolimits4web/Swiper/commit/49e06f9f35aecae1a002bdec679dae6d6aaebb01)), closes [#4403](https://github.com/nolimits4web/Swiper/issues/4403)\n- **svelte:** don't destroy on server-side ([8a8fb62](https://github.com/nolimits4web/Swiper/commit/8a8fb625a9ce2fc543e0aa8d81c1aed1e0b19c8f)), closes [#3961](https://github.com/nolimits4web/Swiper/issues/3961)\n\n# [6.5.3](https://github.com/nolimits4web/Swiper/compare/v6.5.2...v6.5.3) (2021-03-31)\n\n### Bug Fixes\n\n- **navigation:** fix wrong nav button position ([ef97693](https://github.com/nolimits4web/Swiper/commit/ef976937fb2a00cae4add0e3acabf66d1d1d35a3)), closes [#4393](https://github.com/nolimits4web/Swiper/issues/4393)\n\n# [6.5.2](https://github.com/nolimits4web/Swiper/compare/v6.5.1...v6.5.2) (2021-03-30)\n\n### Bug Fixes\n\n- **core:** fix params extending loosing Swiper instance ([32092ae](https://github.com/nolimits4web/Swiper/commit/32092ae9544b0ba3ecc6c3b65346afa546d0547d)), closes [#4384](https://github.com/nolimits4web/Swiper/issues/4384)\n\n# [6.5.1](https://github.com/nolimits4web/Swiper/compare/v6.5.0...v6.5.1) (2021-03-29)\n\n### Bug Fixes\n\n- **a11y:** correct `aria-roledescription` attribute name ([1b73c3b](https://github.com/nolimits4web/Swiper/commit/1b73c3b82dfd0b789650474bc5e13fd200115b28)), closes [#4371](https://github.com/nolimits4web/Swiper/issues/4371)\n- **core:** fixed **proto** pollution ([ec358de](https://github.com/nolimits4web/Swiper/commit/ec358deab79a8cd2529465f07a0ead5dbcc264ad))\n- **core:** fixed **proto** pollution ([9dad273](https://github.com/nolimits4web/Swiper/commit/9dad2739b7474f383474773d5ab898a0c29ac178))\n- isObject cross window ([7c36077](https://github.com/nolimits4web/Swiper/commit/7c36077c5e3442576769adef73daa8aa28997732))\n- isObject cross window ([95b5dfe](https://github.com/nolimits4web/Swiper/commit/95b5dfe16e7a3b565dd5b22504c6b430f2a660bb))\n- update virtual slides ([e33242c](https://github.com/nolimits4web/Swiper/commit/e33242ce41149265f04224380981c34386ec72b4))\n- **core:** replace unsupported Object.entries ([6dff71d](https://github.com/nolimits4web/Swiper/commit/6dff71dd3c3e49447d81e7cd543937e376bc9d0d)), closes [#4341](https://github.com/nolimits4web/Swiper/issues/4341)\n- **core:** use `getComputedStyle` helper ([9698e58](https://github.com/nolimits4web/Swiper/commit/9698e58101d7350a4be80c542bdd3352a2173a43)), closes [#4337](https://github.com/nolimits4web/Swiper/issues/4337)\n\n### Features\n\n- a11y.slideLabelMessage ([9fd6e68](https://github.com/nolimits4web/Swiper/commit/9fd6e68382b304d3163911cde75d77b07370e62c))\n- custom html element support ([f96db02](https://github.com/nolimits4web/Swiper/commit/f96db02f50a8067eff8241817681615b8b26b81d))\n- **navigation:** set `disabled` prop on nav element if it is a `<button>` element ([7536fbd](https://github.com/nolimits4web/Swiper/commit/7536fbda91a0c2887c200b7208dc8de3feb35bf8)), closes [#4312](https://github.com/nolimits4web/Swiper/issues/4312)\n\n# [6.5.0](https://github.com/nolimits4web/Swiper/compare/v6.4.15...v6.5.0) (2021-03-05)\n\n### Bug Fixes\n\n- **a11y:** space should trigger role button ([3d4039b](https://github.com/nolimits4web/Swiper/commit/3d4039bbfaddb60f969a35cc7bd3c2ac2121535d))\n- **core:** correctly update slideIndex when other elements are present in slides wrapper ([21e7713](https://github.com/nolimits4web/Swiper/commit/21e7713861f4f08d7c1fc4142db0171e7e4abf19))\n- **core:** don't toggle zoom during transition ([16f185e](https://github.com/nolimits4web/Swiper/commit/16f185e5447bc58ed78e924f283bc9ea2d6af131)), closes [#4259](https://github.com/nolimits4web/Swiper/issues/4259)\n- **core:** don't try to move slider when it is locked ([51fd048](https://github.com/nolimits4web/Swiper/commit/51fd04826669c705c936c8141ea5b27a640715ce)), closes [#4284](https://github.com/nolimits4web/Swiper/issues/4284)\n- **e2e:** initSwiper ([9915f8b](https://github.com/nolimits4web/Swiper/commit/9915f8b8698635e06815412c08b7d49cddba42d3))\n- **lazy:** fixed issue with lazy loading when freeMode stops without momentum ([82bcc5c](https://github.com/nolimits4web/Swiper/commit/82bcc5cc2ed3dc5c7995df45cfee1d76ed170139)), closes [#4274](https://github.com/nolimits4web/Swiper/issues/4274) [#4275](https://github.com/nolimits4web/Swiper/issues/4275)\n- **navigation:** don't hide navigation on pagination click ([7b7cccf](https://github.com/nolimits4web/Swiper/commit/7b7cccf610078a189731eecb542546353a5ad772)), closes [#4285](https://github.com/nolimits4web/Swiper/issues/4285)\n- **pagination:** don't hide pagination on navigation click ([68b8a93](https://github.com/nolimits4web/Swiper/commit/68b8a935a9032cf90b996ceb9d795ee61d7c18fc)), closes [#4285](https://github.com/nolimits4web/Swiper/issues/4285)\n- **svelte:** fix Svelte cjs exports ([478289c](https://github.com/nolimits4web/Swiper/commit/478289ce2ca8fc857434da65182b1bd14c3447c4)), closes [#4297](https://github.com/nolimits4web/Swiper/issues/4297)\n\n### Features\n\n- **components:** added \"resizeObserver\" boolean option/prop to enable ResizeObserver ([f03ffbb](https://github.com/nolimits4web/Swiper/commit/f03ffbb0ed2148da44540856251519b0845eeaa6)), closes [#4244](https://github.com/nolimits4web/Swiper/issues/4244)\n- **core:** added support to use ResizeObserver with new \"resizeObserver\" parameter ([5f80052](https://github.com/nolimits4web/Swiper/commit/5f8005274ee0f379cfe31d4cde65951816595aad)), closes [#4244](https://github.com/nolimits4web/Swiper/issues/4244)\n- **core:** possible to enable breakpoints based on container width (instead of window width) ([42db86d](https://github.com/nolimits4web/Swiper/commit/42db86d209ce0b199b8fd92160a1278c512d2b9e)), closes [#4244](https://github.com/nolimits4web/Swiper/issues/4244)\n- init cypress ([6159524](https://github.com/nolimits4web/Swiper/commit/6159524bc33fa8605eccaeec8ef241ae33b6be7d))\n\n# [6.4.15](https://github.com/nolimits4web/Swiper/compare/v6.4.14...v6.4.15) (2021-02-18)\n\n### Bug Fixes\n\n- **angular, vue, svelte:** add 'observer', etc. to params-list ([8f1cd29](https://github.com/nolimits4web/Swiper/commit/8f1cd290f5e2966d2bba6fca14709d040a250741))\n- **core:** correctly store class names ([02265ec](https://github.com/nolimits4web/Swiper/commit/02265ec7a9ee94649004afc312d3c010f79debb4)), closes [#4247](https://github.com/nolimits4web/Swiper/issues/4247)\n\n# [6.4.14](https://github.com/nolimits4web/Swiper/compare/v6.4.12...v6.4.14) (2021-02-17)\n\n### Bug Fixes\n\n- **svelte:** add \"observer\" params support to props ([703ea53](https://github.com/nolimits4web/Swiper/commit/703ea5301fb1739e904dd60ff2f35dbe0f0544ed))\n- **vue:** add \"observer\" params support to props ([1d37ff7](https://github.com/nolimits4web/Swiper/commit/1d37ff73407fa742cbd1855b668044e63ffd61eb))\n- fixed error bundling CJS module ([0cda5e4](https://github.com/nolimits4web/Swiper/commit/0cda5e4708ddb662dfddce3e058cbe57c28696b3)), closes [#4242](https://github.com/nolimits4web/Swiper/issues/4242)\n- **react:** add 'observer', etc. to params-list ([205c14e](https://github.com/nolimits4web/Swiper/commit/205c14eb619676c050f7708542ed716570faae48))\n\n### Features\n\n- **angular:** thumbs & controller support ([76acd28](https://github.com/nolimits4web/Swiper/commit/76acd2887139bb722e791c1473183cc7059afd82))\n\n# [6.4.12](https://github.com/nolimits4web/Swiper/compare/v6.4.11...v6.4.12) (2021-02-16)\n\n### Bug Fixes\n\n- **angular:** autoplay SSR ([4f1e9c4](https://github.com/nolimits4web/Swiper/commit/4f1e9c44bc00d2cc3c247ea7299e3530d7ee2405))\n- **angular:** don't enable observer when virtual enabled ([8810b18](https://github.com/nolimits4web/Swiper/commit/8810b188b59ca117f961bdd77ad4748dac1f97df))\n- **angular:** virtual SSR ([63fed99](https://github.com/nolimits4web/Swiper/commit/63fed999eed7b328b9ae01c0e229ad25601515ba))\n\n### Performance Improvements\n\n- **angular:** call swiperRef outside of angular ([4e544ef](https://github.com/nolimits4web/Swiper/commit/4e544ef337c167ba6d5171d59a70d7be59a99549))\n\n# [6.4.11](https://github.com/nolimits4web/Swiper/compare/v6.4.10...v6.4.11) (2021-02-06)\n\n### Bug Fixes\n\n- **angular:** BrowserAnimationsModule slides deletion ([fef6ebd](https://github.com/nolimits4web/Swiper/commit/fef6ebd89663b6bea5dd4dc30150ab642b3d23b4))\n- **react:** navigation, pagination and scrollbar is not disabled when [#4181](https://github.com/nolimits4web/Swiper/issues/4181) ([460787d](https://github.com/nolimits4web/Swiper/commit/460787d081915a927b217bd4b2588d0d979f949d))\n- **react:** correctly check for virtual params ([92c0137](https://github.com/nolimits4web/Swiper/commit/92c0137e4045dc926a44f1bced0b927a3ad17fb4))\n- **react:** support SwiperSlider components wrapped in higher order components and fix nested fragments bug [#4144](https://github.com/nolimits4web/Swiper/issues/4144)\n- **vue:** update virtual slides on nextTick ([5208b1a](https://github.com/nolimits4web/Swiper/commit/5208b1a63b63d1337a65841c873bcd8c0c01e49f)), closes [#4172](https://github.com/nolimits4web/Swiper/issues/4172)\n- **svelte/vue** navigation, pagination and scrollbar is not disabled when `false` [#4181](https://github.com/nolimits4web/Swiper/issues/4181) ([ffedb6b](https://github.com/nolimits4web/Swiper/commit/ffedb6baf44794098565b408d172c34119c33323))\n\n### Features\n\n- **angular:** use observer to update swiper on slides changes ([962a0c0](https://github.com/nolimits4web/Swiper/commit/962a0c037a2dfb3f37d2bbf10615ecd47dd8c123))\n- **angular:** use swipers observer ([30dd7c9](https://github.com/nolimits4web/Swiper/commit/30dd7c95a3bbc6ed3687f1f7581eabe261d278d9))\n\n## [6.4.10](https://github.com/nolimits4web/Swiper/compare/v6.4.9...v6.4.10) (2021-01-29)\n\n### Bug Fixes\n\n- **core:** don't throw error when trying to init on non existent element ([31aa87a](https://github.com/nolimits4web/Swiper/commit/31aa87a4d948912a855c06740180104a8feb56c7))\n- **core:** fixed issue with \"scroll container\" ([c3d0b97](https://github.com/nolimits4web/Swiper/commit/c3d0b9761aa641d0029a5f045db5eb4298e81a04)), closes [#4161](https://github.com/nolimits4web/Swiper/issues/4161)\n- **react:** fixed issut with Virtual Slides not working correctly ([c24f7ef](https://github.com/nolimits4web/Swiper/commit/c24f7ef8e3a1e5553dae7eed2710087d1e636571)), closes [#4162](https://github.com/nolimits4web/Swiper/issues/4162)\n- **vue:** fixed updating virtual slides on virtual data change ([5979102](https://github.com/nolimits4web/Swiper/commit/59791021b7c800e1c0a96243b96fd0ca541f0d24))\n\n## [6.4.9](https://github.com/nolimits4web/swiper/compare/v6.4.8...v6.4.9) - Released on January 28th, 2021\n\n### Bug Fixes\n\n- **angular:** Cannot set property 'classNames' of undefined ([13bcf39](https://github.com/nolimits4web/Swiper/commit/13bcf3988ac44718d75106c16cf1045e64c7d143))\n- **angular:** content slider ngIf ([4ca13e4](https://github.com/nolimits4web/Swiper/commit/4ca13e449135c0b7735bfabb04a9d4f05e78a8e3))\n- **angular:** tsconfig path ([f2dcf16](https://github.com/nolimits4web/Swiper/commit/f2dcf1664eea9601c760a9e2b0e68e0d564cac6b))\n- **angular:** zoom container custom class ([5d4f11c](https://github.com/nolimits4web/Swiper/commit/5d4f11c9d6a954803945e5d84fa38e33e67416c7))\n- **core:** disable extra grid item for free mode ([9159d89](https://github.com/nolimits4web/Swiper/commit/9159d899ec93df6f34824f72a48699676ef20b13)), closes [#4010](https://github.com/nolimits4web/Swiper/issues/4010)\n- **docs:** change url api -> swiper-api ([3dc9203](https://github.com/nolimits4web/Swiper/commit/3dc92037e728c9b4ade664ef2f45805f6328ff23))\n- **docs:** heading levels ([e8157e6](https://github.com/nolimits4web/Swiper/commit/e8157e6221e7bd44f9f91111c3eeb7f288dbe4fe))\n- **scrollbar:** fixed issue when initialized with empty `scrollbar.el` will throw an error on destroy\n- **svelte:** slots container start & end ([b23b4e1](https://github.com/nolimits4web/Swiper/commit/b23b4e1695f43563ba051aa1fcf7636009f1c4dd))\n- **zoom:** consider window scroll for offsets ([60cd60a](https://github.com/nolimits4web/Swiper/commit/60cd60ad0cfc681b16d984aed52b08f769794926)), closes [#4039](https://github.com/nolimits4web/Swiper/issues/4039)\n\n### Features\n\n- add allcontributors ([95b49b1](https://github.com/nolimits4web/Swiper/commit/95b49b14c60458fd258707f12f0aaa874cb9d781))\n- **angular:** custom classes ([acc678a](https://github.com/nolimits4web/Swiper/commit/acc678a1a6bdf76eebf8ab43cd1b66e12fab0309))\n\n## [6.4.8](https://github.com/nolimits4web/swiper/compare/v6.4.7...v6.4.8) - Released on January 22th, 2021\n\n- Core\n  - Improved default behavior on Windows touch screen devices\n- Types\n  - Some docs comments fixes\n\n## [6.4.7](https://github.com/nolimits4web/swiper/compare/v6.4.6...v6.4.7) - Released on January 21th, 2021\n\n- Types\n  - Added full docs comments for all Swiper parameters\n- Angular\n  - Proper support for zoom functionality with required extra \"zoom\" element. Can be enabled with `zoom` prop on slides, e.g. `<ng-template swiperSlide [zoom]=\"true\">`\n  - Fixed issue with SSR\n  - Fixed issue with not working custom `pagination.el`\n\n## [6.4.6](https://github.com/nolimits4web/swiper/compare/v6.4.5...v6.4.6) - Released on January 20th, 2021\n\n- Core\n  - `edgeSwipeDetection` parameter now can receive string `'prevent'` to prevent system swipe-back navigation\n  - Fixed issue when with decimal `slidesPerView` last slide never received \"active\" class/state\n  - Cube\n    - Fixed shadow rendering issues in Chrome\n- React/Svelte/Vue/Angular\n  - Fixed rendering issue when virtual slides used with breakpoints\n- Minor fixes\n\n## [6.4.5](https://github.com/nolimits4web/swiper/compare/v6.4.4...v6.4.5) - Released on December 18th, 2020\n\n- Fixed issue with `postinstall` script\n\n## [6.4.4](https://github.com/nolimits4web/swiper/compare/v6.4.1...v6.4.4) - Released on December 18th, 2020\n\n- Fixed issue with `postinstall` script\n- Now `.css` files are also available for all components\n- Svelte\n  - Fixed issue with wrong location of `.svelte` files in package\n- Angular\n  - Types fixes\n  - Added `[config]` support to pass all Swiper params as single object (https://github.com/nolimits4web/swiper/commit/f7d21c5f49860fdca62a31ccb62b01a790fd0df3)\n  - Added `(index)` active slide binding (https://github.com/nolimits4web/swiper/commit/86670bd7c1b95268919147662383804e664011a7)\n- Minor fixes\n\n## [6.4.1](https://github.com/nolimits4web/swiper/compare/v6.4.0...v6.4.1) - Released on December 9th, 2020\n\n- Fixed types errors introduced in `6.4.0`\n\n## [6.4.0](https://github.com/nolimits4web/swiper/compare/v6.3.5...v6.4.0) - Released on December 8th, 2020\n\n- All new Swiper Angular components (kudos to @vltansky) 🎉\n- React\n  - Now Swiper won't cleanup styles on destroy\n- Svelte\n  - Now svelte package contains source `.svelte` components\n  - Now Swiper won't cleanup styles on destroy\n- Vue\n  - Now Swiper won't cleanup styles on destroy\n- Lazy\n  - Now it has options to check is Swiper also is in view before loading the images (thanks to @ygj6)\n- Build\n  - Fixed sourcemap missing original sources\n- Lots of minor fixes\n\n## [6.3.5](https://github.com/nolimits4web/swiper/compare/v6.3.4...v6.3.5) - Released on October 30th, 2020\n\n- Build\n  - Fixed builds on Windows\n- Core\n  - Fixed no swiping class in shadow component (#3868)\n  - Typecheck for `slideTo`'s `index` parameter\n\n## [6.3.4](https://github.com/nolimits4web/swiper/compare/v6.3.3...v6.3.4) - Released on October 20th, 2020\n\n- Vue\n  - Fixed issue with `Maximum recursive updates`\n\n## [6.3.3](https://github.com/nolimits4web/swiper/compare/v6.3.2...v6.3.3) - Released on October 9th, 2020\n\n- Core\n  - Fixed issue with wrong slides calculation when slides have inner scrollbars\n- Autoplay\n  - Now it will continue autoplay if it reaches the end and new slides will be added later\n- React\n  - Fixed issue when slide render function data was set only after interaction\n- Minor fixes\n\n## [6.3.2](https://github.com/nolimits4web/swiper/compare/v6.3.1...v6.3.2) - Released on September 28th, 2020\n\n- Svelte\n  - Fixed issue with throwing error when using breakpoints\n\n## [6.3.1](https://github.com/nolimits4web/swiper/compare/v6.3.0...v6.3.1) - Released on September 25th, 2020\n\n- Core\n\n  - A11y\n    - Init module after all other modules initialized\n\n## [6.3.0](https://github.com/nolimits4web/swiper/compare/v6.2.0...v6.3.0) - Released on September 25th, 2020\n\n- Core\n\n  - A11y\n    - Added new parameters `containerMessage`, `containerRoleDescriptionMessage` and `itemRoleDescriptionMessage` (#3834 thanks to @jenemde)\n\n- React\n\n  - Now `SwiperSlide` component requires unique `virtualIndex` to be set so Swiper can know which slide is rendered exactly\n\n- Vue\n\n  - Fixed issue when `SwiperSlide` was not rendered if used with `v-for`\n  - Now `SwiperSlide` component requires unique `virtualIndex` to be set so Swiper can know which slide is rendered exactly\n\n- All new Swiper Svelte components:\n\n  ```html\n  <Swiper spaceBetween=\"{50}\" slidesPerView=\"{3}\">\n    <SwiperSlide>Slide 1</SwiperSlide>\n    <SwiperSlide>Slide 2</SwiperSlide>\n    ...\n  </Swiper>\n  <script>\n    import { Swiper, SwiperSlide } from 'swiper/svelte';\n  </script>\n  ```\n\n## [6.2.0](https://github.com/nolimits4web/swiper/compare/v6.1.3...v6.2.0) - Released on September 4rd, 2020\n\n- All new Swiper Vue.js (v3) components:\n\n  ```html\n  <template>\n    <swiper :space-between=\"50\" :slides-per-view=\"3\">\n      <swiper-slide>Slide 1</swiper-slide>\n      <swiper-slide>Slide 2</swiper-slide>\n      ...\n    </swiper>\n  </template>\n  <script>\n    import { Swiper, SwiperSlide } from 'swiper/vue';\n\n    export default {\n      components: {\n        Swiper,\n        SwiperSlide,\n      },\n    };\n  </script>\n  ```\n\n## [6.1.3](https://github.com/nolimits4web/swiper/compare/v6.1.2...v6.1.3) - Released on September 3rd, 2020\n\n- Core\n  - Pagination\n    - Now it won't set a11y attributes on customly rendered bullets\n- React\n  - Fixed issue with loop mode and breakpoints not being recalculate slides\n\n## [6.1.2](https://github.com/nolimits4web/swiper/compare/v6.1.1...v6.1.2) - Released on August 17th, 2020\n\n- React\n  - Fixed issue generating `useLayoutEffect` warning in Next.js\n  - Fixed issue with Virtual List in RTL mode\n\n## [6.1.1](https://github.com/nolimits4web/swiper/compare/v6.1.0...v6.1.1) - Released on July 31th, 2020\n\n- Fixed ESM/CJS import paths\n\n## [6.1.0](https://github.com/nolimits4web/swiper/compare/v6.0.4...v6.1.0) - Released on July 31th, 2020\n\n- Core\n  - Mousewheel\n    - New mousewheel parameters `thresholdDelta` and `thresholdTime` (#3720)\n  - Fixed issue with Navigation and Pagination `.less` files (#3724)\n  - Fixed issue with setting proper `sideEffects` causing some bundlers to not include imported styles (#3708)\n- React\n  - Now `SwiperSlide` accepts render function with `isActive`, `isVisible`, `isPrev`, `isNext`, `isDuplicate` props:\n    ```jsx\n    <Swiper>\n      <SwiperSlide>\n        {({ isActive }) => <div>Current slide is {isActive ? 'active' : 'not active'}</div>}\n      </SwiperSlide>\n      <SwiperSlide>...</SwiperSlide>\n      ...\n    </Swiper>\n    ```\n- Minor fixes\n\n## [6.0.4](https://github.com/nolimits4web/swiper/compare/v6.0.3...v6.0.4) - Released on July 15th, 2020\n\n- Fixed TS definitions for Swiper React component (#3692)\n\n## [6.0.3](https://github.com/nolimits4web/swiper/compare/v6.0.2...v6.0.3) - Released on July 14th, 2020\n\n- Dom7 updated to latest with correct `__proto__` setters/getters\n\n## [6.0.2](https://github.com/nolimits4web/swiper/compare/v6.0.1...v6.0.2) - Released on July 9th, 2020\n\n- React\n  - Now Swiper will be auto updated if `pagination.el`, `scrollbar.el`, `navigation.nextEl` and `navigation.prevEl` are passed from later-available refs\n\n## [6.0.1](https://github.com/nolimits4web/swiper/compare/v6.0.0...v6.0.1) - Released on July 7th, 2020\n\n- Core\n\n  - SCSS:Fixed issue with missing `$colors` var in Navigation and Pagination\n\n- React\n\n  - Fixed Swiper instance argument typings in event handler props\n  - Added event handler props definitions for modules events\n\n## [6.0.0](https://github.com/nolimits4web/swiper/compare/v5.4.5...v6.0.0) - Released on July 3rd, 2020\n\n- New NPM package structure\n\n  - All scripts transpiled to ES5\n  - New and renamed files (**BREAKING CHANGE**):\n    - `swiper.less` - core Swiper LESS\n    - `swiper.scss` - core Swiper SCSS\n    - `swiper-bundle.css` - Swiper bundle CSS\n    - `swiper-bundle.js` - Swiper bundle JavaScript in UMD format\n    - `swiper-bundle.cjs.js` - Swiper bundle JavaScript in CommonJS format\n    - `swiper-bundle.esm.js` - Swiper bundle JavaScript in ESM format\n    - `swiper.cjs.js` - Swiper core JavaScript in CommonJS format\n    - `swiper.esm.js` - Swiper core JavaScript in ESM format\n  - Following imports are now available\n    - `import Swiper from 'swiper'` - imports core version\n    - `import Swiper from 'swiper/bundle'` - imports bundle version\n    - `import Swiper from 'swiper/core'` - imports core version\n  - Components can be imported from core version using named imports, or using direct import:\n\n    ```js\n    import { Navigation } from 'swiper';\n    // or\n    import Navigation from 'swiper/components/navigation';\n\n    // and styles (Less or SCSS only)\n    import 'swiper/components/navigation/navigation.less';\n    ```\n\n- Full server-side rendering support (SSR) with new parameters:\n  - `userAgent` - device user agent, required for some initial detection\n  - `url` - required to correctly detect and set initial slide if Hash Navigation or History modules are used\n- New `loopPreventsSlide` boolean parameter (by default enabled), that prevents slidePrev/Next transitions while transition is in progress\n- Full support for Node.js DOM libraries like JSDOM and Domino\n- Added new `onAny(callback)` listener to listen for any swiper event\n- All events now emit `swiper` instance as a first argument (**BREAKING CHANGE**)\n- Added official TypeScript definitions\n- Updated to use next generation `dom7` and `ssr-window` libraries\n- All new Swiper React components:\n\n  ```jsx\n  import { Swiper, SwiperSlide } from 'swiper/react';\n\n  export default () => {\n    return (\n      <Swiper\n        spaceBetween={50}\n        slidesPerView={3}\n        onSwiper={(swiper) => console.log(swiper)}\n        onSlideChange={() => console.log('slide change')}\n      >\n        <SwiperSlide>Slide 1</SwiperSlide>\n        <SwiperSlide>Slide 2</SwiperSlide>\n        ...\n      </Swiper>\n    );\n  };\n  ```\n\n## [5.4.5](https://github.com/nolimits4web/swiper/compare/v5.4.3...v5.4.5) - Released on June 16th, 2020\n\n- Core\n  - Fixed issue when checkOverflow method could throw error if Navigation module wasn't installed (#3621)\n- Keyboard\n  - New parameter `pageUpDown` to enable/disable pageUp and pageDown keys (enabled by default)\n\n## [5.4.3](https://github.com/nolimits4web/swiper/compare/v5.4.2...v5.4.3) - Released on June 13th, 2020\n\n- Core\n  - Removed `UIWebView` text from code\n  - Fixed resize handler calling `slideTo` to last slide when it shouldn't\n\n## [5.4.2](https://github.com/nolimits4web/swiper/compare/v5.4.1...v5.4.2) - Released on June 3rd, 2020\n\n- Mousewheel\n  - Fixed issue when enabling `forceToAxis` also inverted scrolling\n- Coverflow Effect\n  - Added support for `scale` parameter (#3598)\n- Pagination\n  - Fixed detection of `uniqueNavElements` (#3590)\n\n## [5.4.1](https://github.com/nolimits4web/swiper/compare/v5.4.0...v5.4.1) - Released on May 20th, 2020\n\n- Fixed dependencies versions\n\n## [5.4.0](https://github.com/nolimits4web/swiper/compare/v5.3.8...v5.4.0) - Released on May 15th, 2020\n\n- Hash Navigation\n  - Added `hashChange` and `hashSet` events (#3557)\n- Lazy\n  - Added support for `<picture>` lazy loading (#3560)\n- Mousewheel\n  - Potentially improved vertical scrolling issues on Windows/Linux OS\n- Updated `ssr-window` and `dom7` dependencies to latest versions\n- Minor fixes\n\n## [5.3.8](https://github.com/nolimits4web/swiper/compare/v5.3.7...v5.3.8) - Released on April 24th, 2020\n\n- Core\n  - Fix iOS bug with double bounce on free mode momentum bounce\n- A11y\n  - Fixed focus ring on navigation buttons (#3544)\n  - Fixed RegExp issue in `paginationBulletMessage` (#3540, #3541)\n- Thumbs\n  - Added `thumbs.autoScrollOffset` parameter that allows to set on what thumbs active slide from edge. It should automatically move scroll thumbs\n- Minor fixes\n\n## [5.3.7](https://github.com/nolimits4web/swiper/compare/v5.3.6...v5.3.7) - Released on April 10th, 2020\n\n- Core\n  - Fixed `cssMode` behavior in RTL layout\n- Zoom\n  - Fixed issue with not working double-tap to toggle with virtual slides\n- Minor fixes\n\n## [5.3.6](https://github.com/nolimits4web/swiper/compare/v5.3.1...v5.3.6) - Released on February 29th, 2020\n\n- Core\n  - Fixed wrong auto height calculation with `centeredSlides` enabled\n- Lazy\n  - Now it will update auto height (if enabled) on lazy image loaded (#3466)\n- Zoom\n  - Fixed issue when previously active slide could be zoomed with `zoom.in()` API (#3451)\n  - Fixed issue when zoom didn't work on `<picture>` element (#3456)\n  - Added support for custom zoom-target element by adding `swiper-zoom-target` class to such elements\n- Coverflow Effect\n  - `stretch` parameter now can be set in `%` (#3468)\n- Minor fixes\n\n## [5.3.1](https://github.com/nolimits4web/swiper/compare/v5.3.0...v5.3.1) - Released on February 8th, 2020\n\n- Core\n  - Fixed issue when slider could stuck after last slide (#3414)\n  - Added `label` to list of form events to keep clicks on it (#3407)\n\n## [5.3.0](https://github.com/nolimits4web/swiper/compare/v5.2.1...v5.3.0) - Released on January 11th, 2020\n\n- Core\n  - New `slidesPerGroupSkip` behavior (#3361)\n  - New ratio-based breakpoints (#3389)\n  - Added SCSS interpolation (#3373, #3374)\n- Mousehweel\n  - Fixed issue when it can fail on load (#3383)\n- Minor fixes\n\n## [5.2.1](https://github.com/nolimits4web/swiper/compare/v5.2.0...v5.2.1) - Released on November 16th, 2019\n\n- Core\n  - New loop events `beforeLoopFix` and `loopFix`\n  - New parameter `updateOnWindowResize` (by default `true`) that will update/recalc swiper on window resize/orientationchange\n  - Added SCSS interpolation for `--swiper-theme-color` variable when not building from source (#3334)\n  - Quote SCSS color names (#3316)\n  - Fixed issue when `.once` could be called more than once (#3322)\n- Mousewheel\n  - Fixed scroll wheel unwanted frozen effect (#3328)\n- Thumbs\n  - New `multipleActiveThumbs` (by default `true`) option to control whether multiple thumbnail slides may get activated or not.\n- Minor fixes\n\n## [5.2.0](https://github.com/nolimits4web/swiper/compare/v5.1.0...v5.2.0) - Released on October 26th, 2019\n\n- Core\n  - New `centeredSlidesBounds` parameter that when enabled will keep first and last slides at bounds\n  - Fixed issue when `freeMode` could break position on resize (#2708, #3303)\n  - Fixed transition duration issue with `freeModeSticky` (#3302)\n  - Fixed issue with wrong row/column if not full groups (#3294)\n  - Fixed issue when `watchOverflow` and `slidesOffsetBefore`/`slidesOffsetAfter` couldn't work together (#3291)\n- Mousewheel\n  - Faster & smoother mousewheel inertial scrolling (#3304)\n- Package\n  - Added source maps to package builds (#3306)\n  - Added minified version of browser.esm.bundle\n- Minor fixes\n\n## [5.1.0](https://github.com/nolimits4web/swiper/compare/v5.0.4...v5.1.0) - Released on October 16th, 2019\n\n- Core\n  - Fixed issues with touch on iOS 13\n  - New `translateTo` method #3268\n- Pagination\n  - Improved dynamic bullets behavior when `loop: true` #3255\n- Zoom\n  - Fixed issue with pinch to zoom on Android\n- Minor fixes\n\n## [5.0.4](https://github.com/nolimits4web/swiper/compare/v5.0.3...v5.0.4) - Released on September 30th, 2019\n\n- Core\n  - Now on short swipes over navigation buttons, it will treat it like nav button click (#3237 by @robpop)\n  - Fixed issue when passing float `slidesPerView` could break loop mode (#3225 by @robpop)\n- Scrollbar\n  - Fixed issue with wrong \"pointer\" position calculation on scroll bar tap\n- Autoplay\n  - Fixed issue when it was `paused` after returning from hidden tab\n- Minor fixes\n\n## [5.0.3](https://github.com/nolimits4web/swiper/compare/v5.0.2...v5.0.3) - Released on September 19th, 2019\n\n- Core\n  - `touchEventsTarget` defaults back to `container`\n  - Added handling of `touchcancel` event #3219\n  - Fixed issue with wrong order calculation in `slidesPerColumnFill: 'row'` mode\n  - Fixed issue with slides missplacing when prepending slides in virtual mode\n  - Fixed issue when zoomed image still swiped to another slide on mobiles\n\n## [5.0.1](https://github.com/nolimits4web/swiper/compare/v5.0.0...v5.0.1) - Released on September 17th, 2019\n\n- Core\n  - Fixed typo in code\n\n## [5.0.0](https://github.com/nolimits4web/swiper/compare/v4.5.1...v5.0.0) - Released on September 17th, 2019\n\n- Core\n  - All new CSS Scroll Snap mode (can be enabled with `cssMode: true`). It doesn't support all of Swiper's features, but potentially should bring a much better performance in simple configurations\n  - Fully removed Internet Explorer support\n  - `breakpointsInverse` parameter has been removed and now `breakpoints` behave like with `breakpointsInverse: true` before.\n  - `touchMoveStopPropagation` parameter now defaults to `false`\n  - `click` event won't be fired with 300ms delay anymore. Now it will be fired at the same time as `tap` event\n  - When `slidesPerColumnFill: 'column'` it now uses `flex-direction: column` layout which requires specified height on swiper-container\n  - `touchEventsTarget` now defaults to `wrapper` (rather than `container` like before)\n  - `slidesPerColumn` now can be used with breakpoints\n  - Now Swiper styles use CSS Custom Properties (CSS Custom Variables) to specify swiper's color theme (color of navigation buttons/pagination). It is now `--swiper-theme-color: #007aff;`\n  - Improved `es` module \"tree-shake-ability\"\n  - New `swiper.esm.browser.bundle.js` package that can be used directly in browser (`import Swiper from 'swiper.esm.browser.bundle.js'`)\n- Autoplay\n  - Now it will be paused when document becomes hidden (in not active tab) and continued again when document becomes visible\n- Lazy\n  - Swiper preloader image replaced with a little bit simpler loader. Now its color can be changed with `--swiper-preloader-color` CSS custom property (which is defaults to `--swiper-theme-color`)\n- Pagination\n  - Active pagination bullets and pagination theme colors now use CSS Custom Properties. It can be defined with `--swiper-pagination-color` property (which is defaults to `--swiper-theme-color`)\n- Navigation\n  - Navigation icons reworked with built-in (base64) icon font. It allows to apply any color and size without replacing image\n  - Navigation buttons colors now use CSS Custom Properties. It can be defined with `--swiper-navigation-color` property (which is defaults to `--swiper-theme-color`)\n  - With `--swiper-navigation-size` (defaults to `44px`) it is now possible to change size of the navigation buttons (and icons)\n- Minor fixes and improvements\n\n## [4.5.1](https://github.com/nolimits4web/swiper/compare/v4.5.0...v4.5.1) - Released on September 13th, 2019\n\n- Core\n  - Fixed issue when callbacks fires on init even if it disabled (#2807)\n  - Fixed issue when \"swiper-slide-visible\" class name in some situations shows up when it shouldn't\n  - `slidesPerColumnFill: 'row'` now considers groups (#3077)\n- Thumbs\n  - Fixes bug 'Cannot read property `indexOf` of undefined' that sometimes occurs on use of thumbnails\n- Keyboard\n  - Added `PageUp`/`PageDown` keybindings.\n- Autoplay\n  - Fixed issue when window resize stopped autoplay\n- Parallax\n  - Fixed issue when parallax opacity didn't work (#3147)\n- Minor fixes and improvements\n\n## [4.5.0](https://github.com/nolimits4web/swiper/compare/v4.4.5...v4.5.0) - Released on February 22nd, 2019\n\n- Core\n  - New `swiper.changeDirection()` method to change direction from horizontal to vertical (and back) dynamically\n  - `direction` parameter can be used in breakpoints\n- Virtual Slides\n  - `swiper.virtual.appendSlide` now accepts array of slides to add\n  - `swiper.virtual.prependSlide` now accepts array of slides to prepend\n  - New `swiper.virtual.removeSlide(indexes)` to remove virtual selected slides\n  - New `swiper.virtual.removeAllSlides()` to remove all virtual slides\n- Navigation\n  - Now it emits `navigationHide` and `navigationShow` events when on nav hide/show\n- Pagination\n  - Now it emits `paginationHide` and `paginationShow` events when on pagination hide/show\n- Dom7 updated to latest 2.1.3\n  - Fixed issue when `.once` bound event could still be there after unbinding it with `.off`\n- Source\n  - Source styles are now available in SCSS in addition to LESS\n- Minor fixes and improvements\n\n## [4.4.6](https://github.com/nolimits4web/swiper/compare/v4.4.5...v4.4.6) - Released on December 19th, 2018\n\n- Core\n  - Fixed issue with wrong slide size calculation in some cases\n\n## [4.4.5](https://github.com/nolimits4web/swiper/compare/v4.4.2...v4.4.5) - Released on December 14th, 2018\n\n- Core\n  - New `observeSlideChildren` parameter to enable auto update on slide children update\n  - Fixed issue when slide padding was not considered when calculating sizes\n  - Fixed issue with wrong touch support detection on Windows Chrome\n  - Fixed some issues with wrong slides grid calculation in multi row mode\n- Zoom\n  - Now it emits `zoomChange` event with `scale`, `imageEl` and `slideEl` arguments\n- Minor fixes\n\n## [4.4.2](https://github.com/nolimits4web/swiper/compare/v4.4.1...v4.4.2) - Released on November 1st, 2018\n\n- New `touchStartForcePreventDefault` parameter to force touch start event prevent default\n- Breakpoints fix when breakpoint keys are strings\n- Fixed issue when draggable scrollbar may not work on desktop Safari\n- Fixed issue with wrong sort of Virtual Slides\n- Minor fixes\n\n## [4.4.1](https://github.com/nolimits4web/swiper/compare/v4.4.0...v4.4.1) - Released on September 14th, 2018\n\n- Fixed issue with preventing touchstart event\n\n## [4.4.0](https://github.com/nolimits4web/swiper/compare/v4.3.5...v4.4.0) - Released on September 14th, 2018\n\n- Core\n  - New `centerInsufficientSlides` parameter to center slides if the amount of slides less than `slidesPerView`\n  - New `breakpointsInverse` parameter (boolean), if enabled then it will count breakpoints in reversed direction, e.g. will override parameters if window width is more than specified breakpoint\n- Virtual Slides\n  - New `addSlidesBefore` and `addSlidesAfter` parameters to increase amount of pre-rendered slides\n- Thumbs\n  - All new \"Thumbs\" module/component designed to control slider thumbnails, in more logical and correct way than with Controller module.\n- Lots of minor fixes\n\n## [4.3.5](https://github.com/nolimits4web/swiper/compare/v4.3.3...v4.3.5) - Released on July 31th, 2018\n\n- Core\n  - `iOSEdgeSwipeThreshold` parameter renamed to just `edgeSwipeThreshold`. Old `iOSEdgeSwipeThreshold` name is still supported\n  - Improved observer performance if there are many mutations at a time. Thanks to @rayvincent-bsd\n- Controller\n  - Fixed issue with wrong auto height resizing\n- Scrollbar\n  - Fixed issue when it was using active event listeners instead of passive. Thanks to @nyon\n- Minor fixes\n\n## [4.3.3](https://github.com/nolimits4web/swiper/compare/v4.3.2...v4.3.3) - Released on June 5th, 2018\n\n- Core\n  - Fixed issue when slidePrev goes to wrong slide #2650\n  - Fixed issue when roundLength was not considered for grids calculation #2656\n  - Fixed typo in API #2659\n\n## [4.3.2](https://github.com/nolimits4web/swiper/compare/v4.3.0...v4.3.2) - Released on June 1st, 2018\n\n- Core\n  - Added `addSlide(index, slide)` method to add slide at required position. Thanks to @kochizufan\n  - Fixed issue with loop #2647. Thanks to @kochizufan\n- Pagination\n  - New `formatFractionCurrent(number)` parameter to format current number in Fraction pagination\n  - New `formatFractionTotal(number)` parameter to format total number in Fraction pagination\n- Minor fixes\n\n## [4.3.0](https://github.com/nolimits4web/swiper/compare/v4.2.6...v4.3.0) - Released on May 27th, 2018\n\n- Core\n  - Fixed issue when `swipeBack` sometimes slides to wrong slide\n  - Fixed issue when window resizing can break Coverflow effect layout\n  - Fixed issue with wrong detection of `iOSEdgeSwipeDetection`. Thanks to @langjun\n- Dom7 update to latest v2.0.6:\n  - Fixed issue with remove event listeners when they was not added\n- Minor fixes\n\n## [4.2.6](https://github.com/nolimits4web/swiper/compare/v4.2.5...v4.2.6) - Released on May 1st, 2018\n\n- `console.log` cleanup\n\n## [4.2.5](https://github.com/nolimits4web/swiper/compare/v4.2.2...v4.2.5) - Released on April 29th, 2018\n\n- Core\n  - Prevent apply grab cursor when swiper is locked\n  - Fixed breakpoint with loop getting wrong realIndex when on init\n  - Fixed \"transformed\" slides sizes calculation that could cause issues in with Coverflow effect\n- Autoplay\n  - Fixed issue that can cause memory leak\n- Dom7 update to latest\n  - Improved internal events proxies logic for better memory management\n- Minor fixes\n\n## [4.2.2](https://github.com/nolimits4web/swiper/compare/v4.2.0...v4.2.2) - Released on April 1st, 2018\n\n- Core\n  - Respect and update breakpoints when calling Swiper's `.update()` method\n- Pagination\n  - New `progressbarOpposite` parameter to make pagination progressbar opposite to `direction` parameter, means vertical progressbar for horizontal swiper direction and horizontal progressbar for vertical swiper direction\n- Mousewheel\n  - Fixed issue in `loop` + `freeMode` for loop not being set correctly\n- Minor fixes\n\n## [4.2.0](https://github.com/nolimits4web/swiper/compare/v4.1.6...v4.2.0) - Released on March 16th, 2018\n\n- Core\n  - `swiper.updateAutoHeight(speed)` now supports `speed` parameter to resize swiper wrapper with duration\n  - Fixed issues in free mode with `freeModeSticky` not being able to snap to closest snap point\n  - New `swiper.slideToClosest()` method to slide to closest snap point when it is somewhere in between\n- A11y (Accessibility)\n  - It is now enabled by default (if installed)\n- Controller\n  - Fixed RTL issue when vertical swiper controls horizontal one\n- Lazy\n  - Fixed issue when lazy loading not always triggered on window resize\n- Minor fixes\n\n## [4.1.6](https://github.com/nolimits4web/swiper/compare/v4.1.5...v4.1.6) - Released on February 11th, 2018\n\n- Fixed onTouchMoveOpposite event on touch devices\n\n## [4.1.5](https://github.com/nolimits4web/swiper/compare/v4.1.0...v4.1.5) - Released on February 10th, 2018\n\n- Improved touch events support on desktop Windows devices with touch screen\n- Improved \"loop fix\" when slider is in the free mode\n- New `noSwipingSelector` parameter that can be used instead of `noSwipingClass`\n- New `preventIntercationOnTransition` parameter to prevent interaction during slice change transition\n- New `.slideToLoop` method to be used in loop mode\n- Fixed issue with `slideChange` events being fired when slide wasn't actually changed\n- Scrollbar\n  - Now doesn't require to enable `simulateTouch` for desktops when it is `draggable`\n- Keyboard\n  - Fixed detection statement whether a swiper is in the viewport\n- Pagination\n  - Added new multiple main bullets support for dynamic bullets pagination\n- Zoom\n  - Now supports Virtual Slides\n- Minor fixes\n\n## [4.1.0](https://github.com/nolimits4web/swiper/compare/v4.0.7...v4.1.0) - Released on January 13th, 2018\n\n- Improved IE 10 support. But it is recommended to use [**proto** polyfill](https://www.npmjs.com/package/proto-polyfill)\n- Improved touch support for Edge\n- New `watchOverflow` (disabled by default). When enabled Swiper will be disabled and hide navigation buttons on case there are not enough slides for sliding\n- Autoplay\n  - New `reverseDirection` to enable autoplay in reverse direction\n  - New `waitForTransition` parameter when autoplay will wait for wrapper transition to continue (enabled by default). Can be disabled in case of using Virtual Translate when your slider may not have transition\n- Keyboard\n  - New `onlyInViewport` parameter (enabled by default). When enabled it will control sliders that are currently in viewport\n\n## [4.0.7](https://github.com/nolimits4web/swiper/compare/v4.0.6...v4.0.7) - Released on November 28th, 2017\n\n- Fixed issue with not working correctly `touchReleaseOnEdges` on iOS\n- Fixed issue with not working allowSlideNext/Prev change on Breakpoints\n- Fixed wrong scrollbar dragging when using custom `dragSize`\n- Minor fixes\n\n## [4.0.6](https://github.com/nolimits4web/swiper/compare/v4.0.5...v4.0.6) - Released on November 13th, 2017\n\n- Fixed Coverflow effect issue using with breakpoints\n- `iOSEdgeSwipeDetection` will also be in consideration with right-edge swipe\n- Fixed `freeModeSticky` behavior in RTL mode\n- Swiper now emits `breakpoint` event on breakpoint change\n- Minor fixes\n\n## [4.0.5](https://github.com/nolimits4web/swiper/compare/v4.0.3...v4.0.5) - Released on November 7th, 2017\n\n- Fixed issue with not working `noSwiping` parameter\n- Parallax now considers `slidesPerGroup` parameter\n- Zoom: improved gestures handling\n- Pagination: fixed issues with wrong positioned dynamic-bullets when there are not enough slides\n- Fixed issues with some effects being broken with enabled `breakpoints`\n- Minor fixes\n\n## [4.0.3](https://github.com/nolimits4web/swiper/compare/v4.0.2...v4.0.3) - Released on October 27th, 2017\n\n- Fixed Parallax opacity and scale transitions\n- Better compatability with SSR by using dummy `document` object\n- Fixed styles for dynamic pagination buttons in RTL mode\n- Fixed issue with last pagination button not being active with `slidesPerView: 'auto'`\n- Renamed build tasks: `build-dev` -> `build:dev`, `build-prod` -> `build:prod`\n\n## [4.0.2](https://github.com/nolimits4web/swiper/compare/v4.0.1...v4.0.2) - Released on October 18th, 2017\n\n- Lazy loading support for Virtual slides\n- Added `beforeResize` event\n- Minor fixes\n\n## [4.0.1](https://github.com/nolimits4web/swiper/compare/v4.0.0...v4.0.1) - Released on October 11th, 2017\n\n- Fixed issue with pagination being broken with loop mode\n- Reworked `realIndex` calculation ordering\n- ES-module files renamed (**possible breaking change**):\n  - `swiper.module.js` -> `swiper.esm.bundle.js` (exported by default)\n  - `swiper.modular.js` -> `swiper.esm.js`\n- Minor fixes\n\n## [4.0.0](https://github.com/nolimits4web/swiper/compare/v3.4.2...v4.0.0) - Released on October 4th, 2017 🎉\n\n- New API (check [Documentation](http://idangero.us/swiper/api/))\n- Virtual Slides - new module that keeps in DOM just required amount of slides\n- Source code has been fully rewritten in ES-next syntax\n- Dist package contains additional ES-next modules:\n  - `swiper.module.js` - swiper bundle for `import Swiper from 'swiper'`\n  - `swiper.modular.js` - modular version for using Swiper with required components only\n- New `scripts/build-config.js` for creating custom Swiper build with required components and custom color theme\n- jQuery version of Swiper has been removed\n- Improved compatibility with server-side rendering\n- Hundreds of improvements and fixes\n\n## 4.0.0-beta.4 - Released on September 20th, 2017\n\n- Fixed issue with draggable Scrollbar in RTL layout\n- Minor fixes\n\n## 4.0.0-beta.3 - Released on September 13th, 2017\n\n- Dom7 update to latest version\n- Small core refactoring to get better results within tree-shaking bundles\n\n## 4.0.0-beta.2 - Released on September 2nd, 2017\n\n- Disable a11y by default\n- Fixed issue with events sharing between multiple swipers\n- Fixed issue with resize handling after destroy\n- Few minor fixes\n\n## 4.0.0-beta.1 - Released on August 30th, 2017\n\n- Initial 4.0.0 release\n\n## 3.4.2 - Released on March 10th, 2017\n\n- Fixed an issue with lazy loading callbacks when swiper is destroyed\n- New `onAfterResize` and `onBeforeResize` callbacks\n- New `onKeyPress` callback when keyboard control is used\n- Fixed Chrome+Windows issue with not clickable links that have \"title\" attribute\n- Minor fixes\n\n## 3.4.1 - Released on December 13th, 2016\n\n- Fixed Zoom for RTL\n- Improved slideToClickedSlide behavior when loop is enabled\n- Minor fixes\n\n## 3.4.0 - Released on October 16th, 2016\n\n- **Custom build** available. Now you can create custom swiper build using the folowing modules: effects, lazy-load, scrollbar, controller, hashnav, history, keyboard, mousewheel, parallax, zoom, a11y. Using cli `gulp custom -zoom,effects,lazy-loading`\n- New **zoom** functionality that enables double tap and pinch to zoom slide's inner image:\n  - Required slide layout for zoom:\n    ```\n    <div class=\"swiper-slide\">\n      <div class=\"swiper-zoom-container\">\n        <img src=\"path/to/image\">\n      </div>\n    </div>\n    ```\n  - New zoom parameters:\n    - `zoom` - enable zoom functionality\n    - `zoomMax` - maximum image zoom multiplier, by default is `3`\n    - `zoomMin` - minimum image zoom multiplier, by default is `1`\n    - `zoomToggle` - enable/disable zoom-in by slide's double tap\n  - `zoomMax` can be also overridden for specific slide by using `data-swiper-zoom` attribute\n- New `swiper.enableTouchControl()` and `swiper.disableTouchControl()` methods to enable disable touch control (it toggles `onlyExternal` parameter)\n- New `swiper.realIndex` property in addition to `swiper.activeIndex` that returns index of active slide considering loop\n- New **History API** with new `history` parameter. It uses history pushState to set active slide URL\n- New `hashnavWatchState` parameter to navigate through slides (when hashnav is enabled) by browser history or by setting directly hash on document location\n- New `replaceState` parameter that work in addition to hashnav or history to replace current url state with the new one instead of adding it to history\n- New methods `s.unsetGrabCursor()` and `s.setGrabCursor()` to enable/disable grab cursor\n- Draggable Scrollbar now works when `simulateTouch:false`\n- New `normalizeSlideIndex` parameter to improve work of controller (see #1766)\n- `lazyLoadingInPrevNextAmount` now works with `slidesPerView: 'auto'`\n- New `passiveListeners` parameter to use passive event listeners to improve scrolling performance on mobile devices. Enabled by default\n- New `freeModeMomentumVelocityRatio` parameter to control moment velocity\n- Now it is possible to specify autoplay delay for every (or specific) slides by using `data-swiper-autoplay` attribute on them\n- Lazy loading now also respects `sizes` responsive images attribute\n- Improved mousewheel cross browser behavior (see #1797)\n- New `mousewheelEventsTarged` parameter (by default 'container') where you can specify mousewheel events target\n- New `onScroll` event/callback that triggers when swiping/scrolling happens with mousewheel\n- New `touchReleaseOnEdges` parameter to release touch events on slider edge position (beginning, end) and allow for further page scrolling\n- Multirow (slidesPerColumn) support for vertical direction, which is in this case becomes multicolumn\n- `paginationBulletRender` now accepts `swiper` instance as a first argument, `paginationBulletRender(index, className)` -> `paginationBulletRender(swiper, index, className)`\n- New \"swiper-slide-duplicate-active\", \"swiper-slide-duplicate-next\", \"swiper-slide-duplicate-prev\" classes that will be added in loop mode to the slides representing duplicated looped slides\n- All css classes are now configurable via new parameters: lazyLoadingClass, notificationClass, containerModifierClass, paginationClickableClass, paginationModifierClass, lazyStatusLoadingClass, lazyStatusLoadedClass, lazyPreloaderClass, notificationClass, preloaderClass, zoomContainerClass, slideDuplicateActiveClass, slideDuplicateNextClass, slideDuplicatePrevClass\n\n## 3.3.1 - Released on February 7th, 2016\n\n- New `uniqueNavElements` parameter. If enabled (by default) and navigation elements' parameters passed as the string (like `.pagination`) then Swiper will look for such elements through child elements first. Applies for pagination, prev/next buttons and scrollbar\n- New `onPaginationRendered` callback. Will be fired after pagination elements generated and added to DOM\n- New `.reLoop()` method, which combines `.destroyLoop()` + `.createLoop()` methods with additional positioning fixes. Useful to call after you have changed `slidesPerView` parameter, it will dynamically recreate duplicated slides required for loop\n- New `.nextButton` and `.prevButton` properties with Dom7/jQuery element with next/prev button HTML element\n- Fixed not working mousewheel control in IE 11\n- Fixed issue with lazy loading images not being recalculated after window resize\n- Fixed issues when using loop with breakpoints changing `slidesPerView/Group` parameters\n- Numerous minor fixes\n\n## 3.3.0 - Released on January 10th, 2016\n\n- New 3D Flip effect. Can be enabled with `effect: 'flip' parameter\n- New types of pagination with new parameters:\n  - `paginationType` - type of pagination. Can be `'bullets'` (default) or `'fraction'` or `'progress'` or `'custom'`\n  - `paginationFractionRender(swiper, currentClass, totalClass)` - custom function to render \"fraction\" type pagination\n  - `paginationProgressRender(swiper, progressbarClass)` - custom function to render \"progress\" type pagination\n  - `paginationCustomRender(swiper, current, total)` - custom function to render \"custom\" type pagination\n- New `lazyLoadingInPrevNextAmount` parameter allows to lazy load images in specified amount of next/prev slides\n- New `autoplayStopOnLast` parameter (`true` by default) tells to autoplay should it stop on last slide or start from first slide\n- New `onAutoplay(swiper)` callback\n- Minor fixes\n\n## 3.2.7 - Released on December 7th, 2015\n\n- Fixed issue with using HTMLElements for next/prevButton parameters with breakpoints\n- Fixed issue with not working Auto Height when using Controller\n\n## 3.2.6 - Released on November 28th, 2015\n\n- Fixed issue in RTL layout using `mousewheelControl`\n- Fixed issue in RTL layout using Parallax\n\n## 3.2.5 - Released on November 21st, 2015\n\n- New \"Auto Height\" mode when container/wrapper adapts to the height of currently active slide. Can be enabled with `autoHeight: true` parameter\n- Fixed issue with breakpoints in Firefox\n- Fixed issue with wrong slides position when using effects\n- Fixed issue with none-updated scroll bar after using `setWrapperTranslate`\n- Minor fixes\n\n## 3.2.0 - Released on November 7th, 2015\n\n- Added responsive breakpoints support using new `breakpoints` parameter. Now you can specify different `slidesPerView` and other similar parameters for different sizes:\n\n  ```js\n  slidesPerView: 5,\n  spaceBetween: 50,\n  breakpoints: {\n    1024: {\n      slidesPerView: 4,\n      spaceBetween: 40\n    },\n    768: {\n      slidesPerView: 3,\n      spaceBetween: 30\n    },\n    320: {\n      slidesPerView: 1,\n      spaceBetween: 10\n    }\n  }\n  ```\n\n- New callbacks: `onSlideNextStart`, `onSlideNextEnd`, `onSlidePrevStart`, `onSlidePrevEnd`\n- Added Meteor package `meteor add nolimits4web:swiper`\n- Fixed issue with mouse touchMove/End callbacks firing all the time\n- Fixed issue with mousewheel in Chrome\n- Minor fixes\n\n## 3.1.7 - Released on October 10th, 2015\n\n- Fixed issue with lazy loading trying to download `undefined`-src images\n- Fixed lazy loading on slides using jQuery version\n- Fixed issue with `slideToClickedSlide` with `loop` and `centeredSlides`\n- Fixed issue with wrong slides fill when number of slides less than `slidesPerView * slidesPerColumn` with `slidesPerColumnFill: 'row'`\n- Minor fixes\n\n## 3.1.5 - Released on September 28th, 2015\n\n- Added support for images `srcset` with lazy loading using `data-srcset` attribute\n- Fixed new Chrome errors with `WebkitCSSMatrix`\n- Fixed issue with `slideToClickedSlide` with `loop` and `centeredSlides`\n- New `freeModeMinimumVelocity` parameter to set minimum required touch velocity to trigger free mode momentum\n- Ability to make the Scrollbar draggable using new paramaters:\n  - `scrollbarDraggable` - (boolean) by default is `false`. Allows to enable draggable scrollbar\n  - `scrollbarSnapOnRelease` - (boolean) by default is `false`. Control slider snap on scrollbar release\n- Minor fixes\n\n## 3.1.2 - Released on August 22nd, 2015\n\n- Fixed issues with loop and mousewheel when swiper stopped on last slide\n- Improved mouse wheel behavior in latest Chrome\n- Fixed issue with `slidesPerView: 'auto'` and enabled `loop:true` mode to set `loopedSlides` to the amount of slides by default (if not specified)\n- New `mousewheelSensitivity: 1` parameter allows to tweak mouse wheel sensitivity\n- Fixed issue with updating swiper when swiping is locked (with `allowSwipeToNext`/`allowSwipeToPrev`)\n- Fixed issue with wrong calculating of \"visible\" slides with enabled `centeredSlides`\n- CSS fixes for 3D effects\n- New options to release Swiper events for swipe-to-go-back work in iOS UIWebView with two options:\n  - `iOSEdgeSwipeDetection` (by default is `false`) - enable ios edge detection and release Swiper events\n  - `iOSEdgeSwipeThreshold` (default value is `20`) - area in `px` from left edge of screen to release events\n- Improved source maps\n- Minor fixes\n\n## 3.1.0 - Released on July 14th, 2015\n\n- Accessibility (a11y)\n  - Fixed issue with wrong buttons labels\n  - Added support for pagination bullets\n  - New accessibility parameter for pagination label `paginationBulletMessage: 'Go to slide {{index}}'`\n- Controller\n  - New parameter `controlBy` which can be 'slide' (by default) or 'container'. Defines a way how to control another slider: slide by slide or depending on all slides/container (like before)\n  - Now controllers in `controlBy: 'slide'` (default) mode will respect grid of each other\n- Pagination\n  - New `paginationElement` parameter defines which HTML tag will be used to represent single pagination bullet. By default it is `span`\n- New `roundLengths` parameter (by default is `false`) to round values of slides width and height to prevent blurry texts on usual resolution screens\n- New `slidesOffsetBefore: 0` and `slidesOffsetAfter: 0` (in px) parameters to add additional slide offset within a container\n- Correct calculation for slides size when use CSS padding on `.swiper-container`\n- Fixed issue with not working onResize handler when swipes are locked\n- Fixed issue with \"jumping\" effect when you disable `onlyExternal` during touchmove\n- Fixed issue when slider goes to previous slide from last slide after window resize\n- Added new `swiper.jquery.umd.js` version for the environment where both Swiper and jQuery included as modules\n- Minor fixes\n\n## 3.0.8 - Released on June 14th, 2015\n\n- Fixed issue with wrong active index and callbacks in Fade effect\n- New mousewheel parameters:\n  - `mousewheelReleaseOnEdges` - will release mousewheel event and allow page scrolling when swiper is on edge positions (in the beginning or in the end)\n  - `mousewheelInvert` - option to invert mousewheel slides\n- Fixed issue with lazy loading in next slides when `slidesPerView` > 1\n- Fixed issue with resistance bounds when swiping is locked\n- Fixed issue with wrong slides order in multi-row mode (when `slidesPerColumn` > 1)\n- Fixed issue with not working keyboard control in RTL mode\n- Fixed issue with nested fade-effect swipers\n- Minor fixes\n\n## 3.0.7 - Released on April 25th, 2015\n\n- New `width` and `height` parameters to force Swiper size, useful when it is hidden on intialization\n- Better support for \"Scroll Container\". So now Swiper can be used as a scroll container with one single \"scrollable\"/\"swipeable\" slide\n- Added lazy loading for background images with `data-background` attribute on required elements\n- New \"Sticky Free Mode\" (with `freeModeSticky` parameter) which will snap to slides positions in free mode\n- Fixed issues with lazy loading\n- Fixed slide removing when loop mode is enabled\n- Fixed issues with Autoplay and Fade effect\n- Minor fixes\n\n## 3.0.6 - Released on March 27th, 2015\n\n- Fixed sometimes wrong slides position when using \"Fade\" effect\n- `.destroy(deleteInstance, cleanupStyles)` method now has second `cleanupStyles` argument, when passed - all custom styles will be removed from slides, wrapper and container. Useful if you need to destroy Swiper and to init again with new options or in different direction\n- Minor fixes\n\n## 3.0.5 - Released on March 21st, 2015\n\n- New Keyboard accessibility module to provide focusable navigation buttons and basic ARIA for screen readers with new parameters:\n  - `a11y: false` - enable accessibility\n  - `prevSlideMessage: 'Previous slide'` - message for screen readers for previous button\n  - `nextSlideMessage: 'Next slide'` - message for screen readers for next button\n  - `firstSlideMessage: 'This is the first slide'` - message for screen readers for previous button when swiper is on first slide\n  - `lastSlideMessage: 'This is the last slide'` - message for screen readers for next button when swiper is on last slide\n- New Emitter module. It allows to work with callbacks like with events, even adding them after initialization with new methods:\n  - `.on(event, handler)` - add event/callback\n  - `.off(event, handler)` - remove this event/callback\n  - `.once(event, handler)` - add event/callback that will be executed only once\n- Plugins API is back. It allows to write custom Swiper plugins\n- Better support for browser that don't support flexbox layout\n- New parameter `setWrapperSize` (be default it is `false`) to provide better compatibility with browser without flexbox support. Enabled this option and plugin will set width/height on swiper wrapper equal to total size of all slides\n- New `virtualTranslate` parameter. When it is enabled swiper will be operated as usual except it will not move. Useful when you may need to create custom slide transition\n- Added support for multiple Pagination containers\n- Fixed `onLazyImage...` callbacks\n- Fixed issue with not accessible links inside of Slides on Android < 4.4\n- Fixed pagination bullets behavior in loop mode with specified `slidesPerGroup`\n- Fixed issues with clicks on IE 10+ touch devices\n- Fixed issues with Coverflow support on IE 10+\n- Hashnav now will update document hash after transition to prevent browsers UI lags, not in the beginning like before\n- Super basic support for IE 9 with swiper.jquery version. No animation and transitions, but basic stuff like switching slides/pagination/scrollbars works\n\n## 3.0.4 - Released on March 6th, 2015\n\n- New Images Lazy Load component\n  - With new parameters `lazyLoading`, `lazyLoadingInPrevNext`, `lazyLoadingOnTransitionStart` (all disabled by default)\n  - With new callbacks `onLazyImageLoad` and `onLazyImageReady`\n- `updateOnImages` ready split into 2 parameters:\n  - `preloadImages` (by default is true) - to preload all images on swiper init\n  - `updateOnImages` (by default is true) - update swiper when all images loaded\n- Fixed issues with touchmove on focused form elements\n- New `onObserverUpdate` callback function to be called after updates by observer\n- Fixed issue with not working inputs with keyboard control for jQuery version\n- New `paginationBulletRender` parameter that accepts function which allow custom pagination elements layout\n- Hash Navigation will run callback depending on `runCallbacksOnInit` parameter\n- `watchVisibility` parameter renamed to `watchSlidesVisibility`\n\n## 3.0.3 - Released on March 1st, 2015\n\n- Fixed issue with not firing onSlideChangeEnd callback after calling .slideTo with\n  runCallbacks=false\n- Fixed values of isBeginning/isEnd when there is only one slide\n- New `crossFade` option for fade effect\n- Improved support for devices with both touch and mouse inputs, not yet on IE\n- Fixed not correctly working mousewheel and keyobard control in swiper.jquery version\n- New parallax module for transitions with parallax effects on internal elements\n- Improved .update and .onResize methods\n- Minor fixes\n\n## 3.0.2 - Released on February 22nd, 2015\n\n- Fixed issue with keyboard events not cleaned up with Swiper.destroy\n- Encoded inline SVG images for IE support\n- New callbacks\n  - onInit (swiper)\n  - onTouchMoveOpposite (swiper, e)\n- Fixed free mode momentum in RTL layout\n- `.update` method improved to fully cover what `onResize` do for full and correct update\n- Exposed `swiper.touches` object with the following properties: `startX`, `startY`, `currentX`, `currentY`, `diff`\n- New methods to remove slides\n  - `.removeSlide(index)` or `.removeSlide([indexes])` - to remove selected slides\n  - `.removeAllSlides()` - to remove all slides\n\n## 3.0.1 - Released on February 13th, 2015\n\n- Fixed issue with navigation buttons in Firefox in loop mode\n- Fixed issue with image dragging in IE 10+\n\n## 3.0.0 - Released on February 11th, 2015\n\n- Initial release of all new Swiper 3\n- Removed features\n  - Dropped support for old browsers. Now it is compatible with:\n    - iOS 7+\n    - Android 4+ (multirow mode only for Android 4.4+)\n    - Latest Chrome, Safari, Firefox and Opera desktop browsers\n    - WP 8+, IE 10+ (3D effects may not work correctly on IE because of wrong nested 3D transform support)\n  - Scroll Container. Removed in favor of pure CSS `overflow: auto` with `-webkit-overflow-scrolling: touch`\n- New features\n  - Swiper now uses modern flexbox layout, which by itself give more features and advantages\n  - Such Swiper 2.x plugins as Hash Navigation, Smooth Progress, 3D Flow and Scrollbar are now incorporated into Swiper 3.x core\n  - Full RTL support\n  - Built-in navigation buttons/arrows\n  - Controller. Now one Swiper could be controlled (or control itself) by another Swiper\n  - Multi row slides layout with `slidesPerColumn` option\n  - Better support for nested Swipers, now it is possible to use same-direction nested Swipers, like horizontal in horizontal\n  - Space between slides\n  - New transition effects: 3D Coverflow, 3D Cube and Fade transitions\n  - Slides are `border-box` now, so it is possible to use borders and paddings directly on slides\n  - Auto layout mode (`slidesPerView: 'auto'`) now gives more freedom, you can even specify slides sizes in % and use margins on them\n  - Mutation Observers. If enabled, Swiper will watch for changes in Dom and update its layout automatically\n  - Better clicks prevention during swiping\n- Many of API methods, parameters and callbacks are changed\n- Added a bit lightweight jQuery/Zepto version of Swiper that can be used if you use jQuery/Zepto in your project\n"
  },
  {
    "path": "CODE_CONTRIBUTORS.md",
    "content": "## Code Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/nolimits4web\"><img src=\"https://avatars.githubusercontent.com/u/999588?v=4?s=100\" width=\"100px;\" alt=\"Vladimir Kharlampidi\"/><br /><sub><b>Vladimir Kharlampidi</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=nolimits4web\" title=\"Code\">💻</a> <a href=\"#maintenance-nolimits4web\" title=\"Maintenance\">🚧</a> <a href=\"#infra-nolimits4web\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"#question-nolimits4web\" title=\"Answering Questions\">💬</a> <a href=\"https://github.com/nolimits4web/swiper/commits?author=nolimits4web\" title=\"Documentation\">📖</a> <a href=\"#ideas-nolimits4web\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n      <td align=\"center\"><a href=\"https://github.com/vltansky\"><img src=\"https://avatars.githubusercontent.com/u/5851280?v=4?s=100\" width=\"100px;\" alt=\"Vlad Tansky\"/><br /><sub><b>Vlad Tansky</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=vltansky\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/DAnn2012\"><img src=\"https://avatars.githubusercontent.com/u/1197819?v=4?s=100\" width=\"100px;\" alt=\"DAnn2012\"/><br /><sub><b>DAnn2012</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=DAnn2012\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/stephanebachelier\"><img src=\"https://avatars.githubusercontent.com/u/172615?v=4?s=100\" width=\"100px;\" alt=\"Stéphane Bachelier\"/><br /><sub><b>Stéphane Bachelier</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=stephanebachelier\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/robpop\"><img src=\"https://avatars.githubusercontent.com/u/13895584?v=4?s=100\" width=\"100px;\" alt=\"Robert F. Popeleski\"/><br /><sub><b>Robert F. Popeleski</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=robpop\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/ygj6\"><img src=\"https://avatars.githubusercontent.com/u/7699524?v=4?s=100\" width=\"100px;\" alt=\"yuangongji\"/><br /><sub><b>yuangongji</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ygj6\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/imjohansunden\"><img src=\"https://avatars.githubusercontent.com/u/19605741?v=4?s=100\" width=\"100px;\" alt=\"Johan Sundén\"/><br /><sub><b>Johan Sundén</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=imjohansunden\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/netcitylife\"><img src=\"https://avatars.githubusercontent.com/u/2089893?v=4?s=100\" width=\"100px;\" alt=\"Dmitry\"/><br /><sub><b>Dmitry</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=netcitylife\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/andyburke\"><img src=\"https://avatars.githubusercontent.com/u/273857?v=4?s=100\" width=\"100px;\" alt=\"Andy Burke\"/><br /><sub><b>Andy Burke</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=andyburke\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/tzvikaf\"><img src=\"https://avatars.githubusercontent.com/u/13975372?v=4?s=100\" width=\"100px;\" alt=\"Tzvika Farber\"/><br /><sub><b>Tzvika Farber</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=tzvikaf\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://macr.ae/\"><img src=\"https://avatars.githubusercontent.com/u/472830?v=4?s=100\" width=\"100px;\" alt=\"Callum Macrae\"/><br /><sub><b>Callum Macrae</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=callumacrae\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/jasonlav\"><img src=\"https://avatars.githubusercontent.com/u/7593912?v=4?s=100\" width=\"100px;\" alt=\"jasonlav\"/><br /><sub><b>jasonlav</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=jasonlav\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://plus.google.com/u/0/114487431636655655146\"><img src=\"https://avatars.githubusercontent.com/u/3106368?v=4?s=100\" width=\"100px;\" alt=\"Shashank Agarwal\"/><br /><sub><b>Shashank Agarwal</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=shashank1010\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/kochizufan\"><img src=\"https://avatars.githubusercontent.com/u/2221431?v=4?s=100\" width=\"100px;\" alt=\"Kohei Otsuka\"/><br /><sub><b>Kohei Otsuka</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=kochizufan\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://www.webo.agency/\"><img src=\"https://avatars.githubusercontent.com/u/2671726?v=4?s=100\" width=\"100px;\" alt=\"Patryk Padus\"/><br /><sub><b>Patryk Padus</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Triloworld\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://fatcode.pl/\"><img src=\"https://avatars.githubusercontent.com/u/150243?v=4?s=100\" width=\"100px;\" alt=\"Grzegorz Michlicki\"/><br /><sub><b>Grzegorz Michlicki</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=icek\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://cantaloupesys.com/\"><img src=\"https://avatars.githubusercontent.com/u/277214?v=4?s=100\" width=\"100px;\" alt=\"Justin Grant\"/><br /><sub><b>Justin Grant</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=justingrant\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/OrbintSoft\"><img src=\"https://avatars.githubusercontent.com/u/6378748?v=4?s=100\" width=\"100px;\" alt=\"Stefano Balzarotti\"/><br /><sub><b>Stefano Balzarotti</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=OrbintSoft\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/fenyagg\"><img src=\"https://avatars.githubusercontent.com/u/2457209?v=4?s=100\" width=\"100px;\" alt=\"Dmitry Chernyshev\"/><br /><sub><b>Dmitry Chernyshev</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=fenyagg\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.yoobic.com/\"><img src=\"https://avatars.githubusercontent.com/u/5446909?v=4?s=100\" width=\"100px;\" alt=\"Gilles Haiat\"/><br /><sub><b>Gilles Haiat</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ghaiat\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/weiz18\"><img src=\"https://avatars.githubusercontent.com/u/42139732?v=4?s=100\" width=\"100px;\" alt=\"weiz18\"/><br /><sub><b>weiz18</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=weiz18\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://oengi.com/\"><img src=\"https://avatars.githubusercontent.com/u/3628043?v=4?s=100\" width=\"100px;\" alt=\"Erik Engi\"/><br /><sub><b>Erik Engi</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=kireerik\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/GalCohen\"><img src=\"https://avatars.githubusercontent.com/u/1293368?v=4?s=100\" width=\"100px;\" alt=\"Gal Cohen\"/><br /><sub><b>Gal Cohen</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=GalCohen\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://martinbroder.com/\"><img src=\"https://avatars.githubusercontent.com/u/1118826?v=4?s=100\" width=\"100px;\" alt=\"Martin Broder\"/><br /><sub><b>Martin Broder</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mrtnbroder\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/Rikk\"><img src=\"https://avatars.githubusercontent.com/u/2916485?v=4?s=100\" width=\"100px;\" alt=\"Ricardo\"/><br /><sub><b>Ricardo</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Rikk\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://romanliutikov.com/\"><img src=\"https://avatars.githubusercontent.com/u/1355501?v=4?s=100\" width=\"100px;\" alt=\"Roman Liutikov\"/><br /><sub><b>Roman Liutikov</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=roman01la\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://baxang.com/\"><img src=\"https://avatars.githubusercontent.com/u/196302?v=4?s=100\" width=\"100px;\" alt=\"Sanghyun Park\"/><br /><sub><b>Sanghyun Park</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=baxang\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://girliemac.com/\"><img src=\"https://avatars.githubusercontent.com/u/107763?v=4?s=100\" width=\"100px;\" alt=\"Tomomi ❤ Imura\"/><br /><sub><b>Tomomi ❤ Imura</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=girliemac\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/jenemde\"><img src=\"https://avatars.githubusercontent.com/u/53625399?v=4?s=100\" width=\"100px;\" alt=\"jenemde\"/><br /><sub><b>jenemde</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=jenemde\" title=\"Code\">💻</a> <a href=\"#a11y-jenemde\" title=\"Accessibility\">️️️️♿️</a></td>\n      <td align=\"center\"><a href=\"http://www.navyxie.com/\"><img src=\"https://avatars.githubusercontent.com/u/1982716?v=4?s=100\" width=\"100px;\" alt=\"navy\"/><br /><sub><b>navy</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=navyxie\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/1sergiogarciap\"><img src=\"https://avatars.githubusercontent.com/u/64509552?v=4?s=100\" width=\"100px;\" alt=\"1sergiogarciap\"/><br /><sub><b>1sergiogarciap</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=1sergiogarciap\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/azaslavsky\"><img src=\"https://avatars.githubusercontent.com/u/3709945?v=4?s=100\" width=\"100px;\" alt=\"Alex Zaslavsky\"/><br /><sub><b>Alex Zaslavsky</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=azaslavsky\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/andreybs11\"><img src=\"https://avatars.githubusercontent.com/u/1462803?v=4?s=100\" width=\"100px;\" alt=\"Andrey Bolaños Sandoval\"/><br /><sub><b>Andrey Bolaños Sandoval</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=andreybs11\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://antoniodalsie.com/\"><img src=\"https://avatars.githubusercontent.com/u/13484843?v=4?s=100\" width=\"100px;\" alt=\"Antonio Dal Sie\"/><br /><sub><b>Antonio Dal Sie</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=exodusanto\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://bartnagel.ca/\"><img src=\"https://avatars.githubusercontent.com/u/199635?v=4?s=100\" width=\"100px;\" alt=\"Bart Nagel\"/><br /><sub><b>Bart Nagel</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=tremby\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/Garbanas\"><img src=\"https://avatars.githubusercontent.com/u/2815411?v=4?s=100\" width=\"100px;\" alt=\"Christoph Dörfel\"/><br /><sub><b>Christoph Dörfel</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Garbanas\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/DKvistgaard\"><img src=\"https://avatars.githubusercontent.com/u/1705203?v=4?s=100\" width=\"100px;\" alt=\"Daniel Kvistgaard\"/><br /><sub><b>Daniel Kvistgaard</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=DKvistgaard\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.gombac.si/\"><img src=\"https://avatars.githubusercontent.com/u/3872726?v=4?s=100\" width=\"100px;\" alt=\"Danijel Gombač\"/><br /><sub><b>Danijel Gombač</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=danijelGombac\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://twitter.com/dimayv\"><img src=\"https://avatars.githubusercontent.com/u/300067?v=4?s=100\" width=\"100px;\" alt=\"Dmitry IV.\"/><br /><sub><b>Dmitry IV.</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=dy\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://elcoklingen.nl/\"><img src=\"https://avatars.githubusercontent.com/u/716683?v=4?s=100\" width=\"100px;\" alt=\"Elco Klingen\"/><br /><sub><b>Elco Klingen</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=eklingen\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.oxydesign.fr/\"><img src=\"https://avatars.githubusercontent.com/u/2378180?v=4?s=100\" width=\"100px;\" alt=\"Nicolas Escoffier\"/><br /><sub><b>Nicolas Escoffier</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=OxyDesign\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/Evidica\"><img src=\"https://avatars.githubusercontent.com/u/6105827?v=4?s=100\" width=\"100px;\" alt=\"Patrick Mallahan\"/><br /><sub><b>Patrick Mallahan</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Evidica\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://aireset.com.br/\"><img src=\"https://avatars.githubusercontent.com/u/4226997?v=4?s=100\" width=\"100px;\" alt=\"Felipe\"/><br /><sub><b>Felipe</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=zhiru\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://www.linkedin.com/in/garrettmaringdev\"><img src=\"https://avatars.githubusercontent.com/u/8270120?v=4?s=100\" width=\"100px;\" alt=\"Garrett Maring\"/><br /><sub><b>Garrett Maring</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=garrettmaring\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/joejoseph00\"><img src=\"https://avatars.githubusercontent.com/u/1028526?v=4?s=100\" width=\"100px;\" alt=\"Joseph Olstad\"/><br /><sub><b>Joseph Olstad</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=joejoseph00\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/kostyabushuev\"><img src=\"https://avatars.githubusercontent.com/u/31274471?v=4?s=100\" width=\"100px;\" alt=\"Kostya Bushuev\"/><br /><sub><b>Kostya Bushuev</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=kostyabushuev\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://mevisio.com/\"><img src=\"https://avatars.githubusercontent.com/u/5296840?v=4?s=100\" width=\"100px;\" alt=\"Marcus Wejderot\"/><br /><sub><b>Marcus Wejderot</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=marwej\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/cfxd\"><img src=\"https://avatars.githubusercontent.com/u/1671933?v=4?s=100\" width=\"100px;\" alt=\"CFX\"/><br /><sub><b>CFX</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=cfxd\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/Mrliuchanghao\"><img src=\"https://avatars.githubusercontent.com/u/30208835?v=4?s=100\" width=\"100px;\" alt=\"HoH-World\"/><br /><sub><b>HoH-World</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Mrliuchanghao\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://relayto.com/\"><img src=\"https://avatars.githubusercontent.com/u/282871?v=4?s=100\" width=\"100px;\" alt=\"Nikita Korotaev\"/><br /><sub><b>Nikita Korotaev</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=websirnik\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/katerlouis\"><img src=\"https://avatars.githubusercontent.com/u/1983382?v=4?s=100\" width=\"100px;\" alt=\"René Eschke\"/><br /><sub><b>René Eschke</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=katerlouis\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.ryanzec.com/\"><img src=\"https://avatars.githubusercontent.com/u/444206?v=4?s=100\" width=\"100px;\" alt=\"Ryan Zec\"/><br /><sub><b>Ryan Zec</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ryanzec\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/SablinSergey\"><img src=\"https://avatars.githubusercontent.com/u/12068136?v=4?s=100\" width=\"100px;\" alt=\"Sergey Sablin\"/><br /><sub><b>Sergey Sablin</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=SablinSergey\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.magloft.com/\"><img src=\"https://avatars.githubusercontent.com/u/222509?v=4?s=100\" width=\"100px;\" alt=\"Tobias Strebitzer\"/><br /><sub><b>Tobias Strebitzer</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=tobiasstrebitzer\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/X4arms\"><img src=\"https://avatars.githubusercontent.com/u/1517616?v=4?s=100\" width=\"100px;\" alt=\"X4arms\"/><br /><sub><b>X4arms</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=X4arms\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://lacolonia.studio/\"><img src=\"https://avatars.githubusercontent.com/u/1528468?v=4?s=100\" width=\"100px;\" alt=\"Alessandro\"/><br /><sub><b>Alessandro</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=a-barbieri\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/amnausman\"><img src=\"https://avatars.githubusercontent.com/u/20682461?v=4?s=100\" width=\"100px;\" alt=\"amnausman\"/><br /><sub><b>amnausman</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=amnausman\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/crutch12\"><img src=\"https://avatars.githubusercontent.com/u/19373212?v=4?s=100\" width=\"100px;\" alt=\"Konstantin Barabanov\"/><br /><sub><b>Konstantin Barabanov</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=crutch12\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/michaelWoe\"><img src=\"https://avatars.githubusercontent.com/u/49037485?v=4?s=100\" width=\"100px;\" alt=\"michaelWoe\"/><br /><sub><b>michaelWoe</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=michaelWoe\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/timothyhague\"><img src=\"https://avatars.githubusercontent.com/u/9559835?v=4?s=100\" width=\"100px;\" alt=\"timothyhague\"/><br /><sub><b>timothyhague</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=timothyhague\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.cnblogs.com/blackstorm\"><img src=\"https://avatars.githubusercontent.com/u/8982188?v=4?s=100\" width=\"100px;\" alt=\"Yaojun Zheng\"/><br /><sub><b>Yaojun Zheng</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=hsxfjames\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/raahede\"><img src=\"https://avatars.githubusercontent.com/u/391833?v=4?s=100\" width=\"100px;\" alt=\"Frej Raahede Nielsen\"/><br /><sub><b>Frej Raahede Nielsen</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=raahede\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/mzkmzk\"><img src=\"https://avatars.githubusercontent.com/u/4627170?v=4?s=100\" width=\"100px;\" alt=\"404_K\"/><br /><sub><b>404_K</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mzkmzk\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/voxtex\"><img src=\"https://avatars.githubusercontent.com/u/735455?v=4?s=100\" width=\"100px;\" alt=\"Adam\"/><br /><sub><b>Adam</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=voxtex\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/promoinvideo\"><img src=\"https://avatars.githubusercontent.com/u/10633232?v=4?s=100\" width=\"100px;\" alt=\"Alberto Cobre\"/><br /><sub><b>Alberto Cobre</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=promoinvideo\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://alejandroiglesias.github.io/cv/\"><img src=\"https://avatars.githubusercontent.com/u/480640?v=4?s=100\" width=\"100px;\" alt=\"Alejandro García Iglesias\"/><br /><sub><b>Alejandro García Iglesias</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=alejandroiglesias\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://annekesinnema.nl/\"><img src=\"https://avatars.githubusercontent.com/u/7202272?v=4?s=100\" width=\"100px;\" alt=\"Anneke Sinnema\"/><br /><sub><b>Anneke Sinnema</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=anneke\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/kosminen\"><img src=\"https://avatars.githubusercontent.com/u/1532140?v=4?s=100\" width=\"100px;\" alt=\"Anssi Hautamäki\"/><br /><sub><b>Anssi Hautamäki</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=kosminen\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://anteprimorac.com.hr/\"><img src=\"https://avatars.githubusercontent.com/u/972083?v=4?s=100\" width=\"100px;\" alt=\"Ante Primorac\"/><br /><sub><b>Ante Primorac</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=anteprimorac\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/hanoii\"><img src=\"https://avatars.githubusercontent.com/u/677879?v=4?s=100\" width=\"100px;\" alt=\"Ariel Barreiro\"/><br /><sub><b>Ariel Barreiro</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=hanoii\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://arthurpf.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/2388720?v=4?s=100\" width=\"100px;\" alt=\"Arthur Franco\"/><br /><sub><b>Arthur Franco</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=arthurpf\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.austinknight.net/\"><img src=\"https://avatars.githubusercontent.com/u/1007248?v=4?s=100\" width=\"100px;\" alt=\"Austin Knight\"/><br /><sub><b>Austin Knight</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=austinknight\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/justb81\"><img src=\"https://avatars.githubusercontent.com/u/3680539?v=4?s=100\" width=\"100px;\" alt=\"Bastian Rang\"/><br /><sub><b>Bastian Rang</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=justb81\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://bitdeli.com/free\"><img src=\"https://avatars.githubusercontent.com/u/3092978?v=4?s=100\" width=\"100px;\" alt=\"Bitdeli Chef\"/><br /><sub><b>Bitdeli Chef</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=bitdeli-chef\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://pypi.org/user/Hackathon/\"><img src=\"https://avatars.githubusercontent.com/u/5810063?v=4?s=100\" width=\"100px;\" alt=\"Kimi.Huang\"/><br /><sub><b>Kimi.Huang</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Brightcells\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://brunolm.com/blog\"><img src=\"https://avatars.githubusercontent.com/u/706078?v=4?s=100\" width=\"100px;\" alt=\"BrunoLM\"/><br /><sub><b>BrunoLM</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=brunolm\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/Chepheus\"><img src=\"https://avatars.githubusercontent.com/u/9037206?v=4?s=100\" width=\"100px;\" alt=\"Cepheus\"/><br /><sub><b>Cepheus</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Chepheus\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://trentyang.com/\"><img src=\"https://avatars.githubusercontent.com/u/2827867?v=4?s=100\" width=\"100px;\" alt=\"yang2007chun\"/><br /><sub><b>yang2007chun</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Chun-Yang\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://daniel-ruf.de/\"><img src=\"https://avatars.githubusercontent.com/u/827205?v=4?s=100\" width=\"100px;\" alt=\"Daniel Ruf\"/><br /><sub><b>Daniel Ruf</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=DanielRuf\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/dfvalero\"><img src=\"https://avatars.githubusercontent.com/u/337955?v=4?s=100\" width=\"100px;\" alt=\"David Fernandez\"/><br /><sub><b>David Fernandez</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=dfvalero\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://davidhancock.co/\"><img src=\"https://avatars.githubusercontent.com/u/158586?v=4?s=100\" width=\"100px;\" alt=\"David Hancock\"/><br /><sub><b>David Hancock</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=davgothic\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/cartok\"><img src=\"https://avatars.githubusercontent.com/u/22181589?v=4?s=100\" width=\"100px;\" alt=\"cartok\"/><br /><sub><b>cartok</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=cartok\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://izifortune.com/\"><img src=\"https://avatars.githubusercontent.com/u/3394606?v=4?s=100\" width=\"100px;\" alt=\"Fabrizio Fortunato\"/><br /><sub><b>Fabrizio Fortunato</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=izifortune\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/FishErr\"><img src=\"https://avatars.githubusercontent.com/u/742467?v=4?s=100\" width=\"100px;\" alt=\"FishErr\"/><br /><sub><b>FishErr</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=FishErr\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/fritzmg\"><img src=\"https://avatars.githubusercontent.com/u/4970961?v=4?s=100\" width=\"100px;\" alt=\"Fritz Michael Gschwantner\"/><br /><sub><b>Fritz Michael Gschwantner</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=fritzmg\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://betaagency.ru/\"><img src=\"https://avatars.githubusercontent.com/u/1610882?v=4?s=100\" width=\"100px;\" alt=\"Gleb Mikheev\"/><br /><sub><b>Gleb Mikheev</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=glebmachine\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/gregtatum\"><img src=\"https://avatars.githubusercontent.com/u/22155328?v=4?s=100\" width=\"100px;\" alt=\"TatumCreative\"/><br /><sub><b>TatumCreative</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=TatumCreative\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/hanjukim\"><img src=\"https://avatars.githubusercontent.com/u/1264116?v=4?s=100\" width=\"100px;\" alt=\"Paul Kim\"/><br /><sub><b>Paul Kim</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=hanjukim\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/HeadFox\"><img src=\"https://avatars.githubusercontent.com/u/6277284?v=4?s=100\" width=\"100px;\" alt=\"Lucien PESLIER\"/><br /><sub><b>Lucien PESLIER</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=HeadFox\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/HerringtonDarkholme\"><img src=\"https://avatars.githubusercontent.com/u/2883231?v=4?s=100\" width=\"100px;\" alt=\"Herrington Darkholme\"/><br /><sub><b>Herrington Darkholme</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=HerringtonDarkholme\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/IronKinoko\"><img src=\"https://avatars.githubusercontent.com/u/32838658?v=4?s=100\" width=\"100px;\" alt=\"IronKinoko\"/><br /><sub><b>IronKinoko</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=IronKinoko\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://jakobstenqvist.com/\"><img src=\"https://avatars.githubusercontent.com/u/87466?v=4?s=100\" width=\"100px;\" alt=\"Jakob Stenqvist\"/><br /><sub><b>Jakob Stenqvist</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=stonebranch\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/sconix\"><img src=\"https://avatars.githubusercontent.com/u/921515?v=4?s=100\" width=\"100px;\" alt=\"Janne Julkunen\"/><br /><sub><b>Janne Julkunen</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=sconix\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/jasonkuhrt\"><img src=\"https://avatars.githubusercontent.com/u/284476?v=4?s=100\" width=\"100px;\" alt=\"Jason Kuhrt\"/><br /><sub><b>Jason Kuhrt</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=jasonkuhrt\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/Manduro\"><img src=\"https://avatars.githubusercontent.com/u/2545042?v=4?s=100\" width=\"100px;\" alt=\"Job\"/><br /><sub><b>Job</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=Manduro\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/johnferrie\"><img src=\"https://avatars.githubusercontent.com/u/1991460?v=4?s=100\" width=\"100px;\" alt=\"John Ferrie\"/><br /><sub><b>John Ferrie</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=johnferrie\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/sakuraineed\"><img src=\"https://avatars.githubusercontent.com/u/4065624?v=4?s=100\" width=\"100px;\" alt=\"Kenji Sakurai\"/><br /><sub><b>Kenji Sakurai</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=sakuraineed\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.linkedin.com/in/careykevin\"><img src=\"https://avatars.githubusercontent.com/u/9685146?v=4?s=100\" width=\"100px;\" alt=\"Kevin Carey\"/><br /><sub><b>Kevin Carey</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=careykevin\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"http://pagepro.pl/\"><img src=\"https://avatars.githubusercontent.com/u/245971?v=4?s=100\" width=\"100px;\" alt=\"Chris (Krzysztof) Lojniewski\"/><br /><sub><b>Chris (Krzysztof) Lojniewski</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=klojniewski-pagepro\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://twitter.com/ladislavjanecek\"><img src=\"https://avatars.githubusercontent.com/u/2696545?v=4?s=100\" width=\"100px;\" alt=\"Ladislav Janeček\"/><br /><sub><b>Ladislav Janeček</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ljanecek\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.lsouza.pro.br/\"><img src=\"https://avatars.githubusercontent.com/u/194708?v=4?s=100\" width=\"100px;\" alt=\"Luã de Souza\"/><br /><sub><b>Luã de Souza</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=luads\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://wiserdev.com/\"><img src=\"https://avatars.githubusercontent.com/u/1151616?v=4?s=100\" width=\"100px;\" alt=\"Luis\"/><br /><sub><b>Luis</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=luis-kaufmann-silva\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/blikblum\"><img src=\"https://avatars.githubusercontent.com/u/3047126?v=4?s=100\" width=\"100px;\" alt=\"Luiz Américo\"/><br /><sub><b>Luiz Américo</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=blikblum\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/LukasDrgon\"><img src=\"https://avatars.githubusercontent.com/u/15611832?v=4?s=100\" width=\"100px;\" alt=\"Lukas Drgon\"/><br /><sub><b>Lukas Drgon</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=LukasDrgon\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/waffle-iron\"><img src=\"https://avatars.githubusercontent.com/u/6912981?v=4?s=100\" width=\"100px;\" alt=\"Making GitHub Delicious.\"/><br /><sub><b>Making GitHub Delicious.</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=waffle-iron\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://silvenon.com/\"><img src=\"https://avatars.githubusercontent.com/u/471278?v=4?s=100\" width=\"100px;\" alt=\"Matija Marohnić\"/><br /><sub><b>Matija Marohnić</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=silvenon\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/damrbaby\"><img src=\"https://avatars.githubusercontent.com/u/237580?v=4?s=100\" width=\"100px;\" alt=\"Matthew Windwer\"/><br /><sub><b>Matthew Windwer</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=damrbaby\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/mehernosh\"><img src=\"https://avatars.githubusercontent.com/u/1410232?v=4?s=100\" width=\"100px;\" alt=\"Mehernosh Bhathena\"/><br /><sub><b>Mehernosh Bhathena</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mehernosh\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://memmie.lenglet.name/\"><img src=\"https://avatars.githubusercontent.com/u/729275?v=4?s=100\" width=\"100px;\" alt=\"Memmie Lenglet\"/><br /><sub><b>Memmie Lenglet</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mems\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/mibo-fdc\"><img src=\"https://avatars.githubusercontent.com/u/70259891?v=4?s=100\" width=\"100px;\" alt=\"Michael Bohn\"/><br /><sub><b>Michael Bohn</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mibo-fdc\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/wodka\"><img src=\"https://avatars.githubusercontent.com/u/385731?v=4?s=100\" width=\"100px;\" alt=\"Michael Schramm\"/><br /><sub><b>Michael Schramm</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=wodka\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://twitter.com/mhartington\"><img src=\"https://avatars.githubusercontent.com/u/2835826?v=4?s=100\" width=\"100px;\" alt=\"Mike Hartington\"/><br /><sub><b>Mike Hartington</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mhartington\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://mitch.app/\"><img src=\"https://avatars.githubusercontent.com/u/20656128?v=4?s=100\" width=\"100px;\" alt=\"Mitchell Heddles\"/><br /><sub><b>Mitchell Heddles</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mitchheddles\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/NLNicoo\"><img src=\"https://avatars.githubusercontent.com/u/6526666?v=4?s=100\" width=\"100px;\" alt=\"Nico\"/><br /><sub><b>Nico</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=NLNicoo\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/nil-ni-ck\"><img src=\"https://avatars.githubusercontent.com/u/8202448?v=4?s=100\" width=\"100px;\" alt=\"Nil\"/><br /><sub><b>Nil</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=nil-ni-ck\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://paulsprogrammingnotes.com/\"><img src=\"https://avatars.githubusercontent.com/u/992533?v=4?s=100\" width=\"100px;\" alt=\"Paul Brown\"/><br /><sub><b>Paul Brown</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=pawl\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/pbalmasov\"><img src=\"https://avatars.githubusercontent.com/u/3986749?v=4?s=100\" width=\"100px;\" alt=\"Pavel Balmasov\"/><br /><sub><b>Pavel Balmasov</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=pbalmasov\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/czajkowski\"><img src=\"https://avatars.githubusercontent.com/u/197684?v=4?s=100\" width=\"100px;\" alt=\"Piotr Czajkowski\"/><br /><sub><b>Piotr Czajkowski</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=czajkowski\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/PythonLinks\"><img src=\"https://avatars.githubusercontent.com/u/34622952?v=4?s=100\" width=\"100px;\" alt=\"PythonLinks\"/><br /><sub><b>PythonLinks</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=PythonLinks\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/rayvincent-bsd\"><img src=\"https://avatars.githubusercontent.com/u/41829998?v=4?s=100\" width=\"100px;\" alt=\"rayvincent-bsd\"/><br /><sub><b>rayvincent-bsd</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=rayvincent-bsd\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/RomanYazvinsky\"><img src=\"https://avatars.githubusercontent.com/u/32144682?v=4?s=100\" width=\"100px;\" alt=\"RomanYazvinsky\"/><br /><sub><b>RomanYazvinsky</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=RomanYazvinsky\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://remyboehler.ch/\"><img src=\"https://avatars.githubusercontent.com/u/442683?v=4?s=100\" width=\"100px;\" alt=\"Rémy\"/><br /><sub><b>Rémy</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=rrelmy\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://ksh-code.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/29705162?v=4?s=100\" width=\"100px;\" alt=\"Seonghoon Kim\"/><br /><sub><b>Seonghoon Kim</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=KSH-code\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/isairz\"><img src=\"https://avatars.githubusercontent.com/u/4544327?v=4?s=100\" width=\"100px;\" alt=\"Seongjun Kim\"/><br /><sub><b>Seongjun Kim</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=isairz\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://stackoverflow.com/users/3448527/dippas\"><img src=\"https://avatars.githubusercontent.com/u/10220287?v=4?s=100\" width=\"100px;\" alt=\"Serpa\"/><br /><sub><b>Serpa</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=dippas\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://staszek.codes/\"><img src=\"https://avatars.githubusercontent.com/u/34459296?v=4?s=100\" width=\"100px;\" alt=\"Stanisław Gregor\"/><br /><sub><b>Stanisław Gregor</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=staszek998\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/steve3d\"><img src=\"https://avatars.githubusercontent.com/u/670687?v=4?s=100\" width=\"100px;\" alt=\"Steve Yin\"/><br /><sub><b>Steve Yin</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=steve3d\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.grassmonk.net/\"><img src=\"https://avatars.githubusercontent.com/u/3535053?v=4?s=100\" width=\"100px;\" alt=\"Steven Eastland\"/><br /><sub><b>Steven Eastland</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=seastland\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://soenkekluth.com/\"><img src=\"https://avatars.githubusercontent.com/u/201338?v=4?s=100\" width=\"100px;\" alt=\"Sönke Kluth\"/><br /><sub><b>Sönke Kluth</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=soenkekluth\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://gitter.im/\"><img src=\"https://avatars.githubusercontent.com/u/8518239?v=4?s=100\" width=\"100px;\" alt=\"The Gitter Badger\"/><br /><sub><b>The Gitter Badger</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=gitter-badger\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/dogoku\"><img src=\"https://avatars.githubusercontent.com/u/761999?v=4?s=100\" width=\"100px;\" alt=\"Theo\"/><br /><sub><b>Theo</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=dogoku\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/timgates42\"><img src=\"https://avatars.githubusercontent.com/u/47873678?v=4?s=100\" width=\"100px;\" alt=\"Tim Gates\"/><br /><sub><b>Tim Gates</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=timgates42\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://tom-sherman.com/\"><img src=\"https://avatars.githubusercontent.com/u/9257001?v=4?s=100\" width=\"100px;\" alt=\"Tom Sherman\"/><br /><sub><b>Tom Sherman</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=tom-sherman\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/WarriorRocker\"><img src=\"https://avatars.githubusercontent.com/u/2924540?v=4?s=100\" width=\"100px;\" alt=\"WarriorRocker\"/><br /><sub><b>WarriorRocker</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=WarriorRocker\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/omgovich\"><img src=\"https://avatars.githubusercontent.com/u/206567?v=4?s=100\" width=\"100px;\" alt=\"Vlad Shilov\"/><br /><sub><b>Vlad Shilov</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=omgovich\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://vlad.io/\"><img src=\"https://avatars.githubusercontent.com/u/444833?v=4?s=100\" width=\"100px;\" alt=\"Vladimir Gurovich\"/><br /><sub><b>Vladimir Gurovich</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=vladgurovich\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/VladimirIvanin\"><img src=\"https://avatars.githubusercontent.com/u/15268753?v=4?s=100\" width=\"100px;\" alt=\"Vladimir Ivanin\"/><br /><sub><b>Vladimir Ivanin</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=VladimirIvanin\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/TreVld\"><img src=\"https://avatars.githubusercontent.com/u/42523020?v=4?s=100\" width=\"100px;\" alt=\"TreVld\"/><br /><sub><b>TreVld</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=TreVld\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://www.linkedin.com/in/waghcwb\"><img src=\"https://avatars.githubusercontent.com/u/6169950?v=4?s=100\" width=\"100px;\" alt=\"Wagner Souza\"/><br /><sub><b>Wagner Souza</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=waghcwb\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://yunuses.com/\"><img src=\"https://avatars.githubusercontent.com/u/1472881?v=4?s=100\" width=\"100px;\" alt=\"Yunus EŞ\"/><br /><sub><b>Yunus EŞ</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=codesignist\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/axten\"><img src=\"https://avatars.githubusercontent.com/u/1412778?v=4?s=100\" width=\"100px;\" alt=\"axten\"/><br /><sub><b>axten</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=axten\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://www.moustic.biz/\"><img src=\"https://avatars.githubusercontent.com/u/818237?v=4?s=100\" width=\"100px;\" alt=\"Cyrille\"/><br /><sub><b>Cyrille</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ccebrand\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://daleknauss.com/\"><img src=\"https://avatars.githubusercontent.com/u/2430232?v=4?s=100\" width=\"100px;\" alt=\"Dale Knauss\"/><br /><sub><b>Dale Knauss</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=daleknauss\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/danielkalen\"><img src=\"https://avatars.githubusercontent.com/u/10832620?v=4?s=100\" width=\"100px;\" alt=\"Daniel Kalen\"/><br /><sub><b>Daniel Kalen</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=danielkalen\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/apps/dependabot\"><img src=\"https://avatars.githubusercontent.com/in/29110?v=4?s=100\" width=\"100px;\" alt=\"dependabot[bot]\"/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=dependabot[bot]\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/devmi\"><img src=\"https://avatars.githubusercontent.com/u/19313261?v=4?s=100\" width=\"100px;\" alt=\"devmi\"/><br /><sub><b>devmi</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=devmi\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://owlwatch.com/\"><img src=\"https://avatars.githubusercontent.com/u/79165?v=4?s=100\" width=\"100px;\" alt=\"fabrizim\"/><br /><sub><b>fabrizim</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=fabrizim\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/hiroqn\"><img src=\"https://avatars.githubusercontent.com/u/909385?v=4?s=100\" width=\"100px;\" alt=\"hiroqn\"/><br /><sub><b>hiroqn</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=hiroqn\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://james-bell.co.uk/\"><img src=\"https://avatars.githubusercontent.com/u/1842481?v=4?s=100\" width=\"100px;\" alt=\"James Bell\"/><br /><sub><b>James Bell</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=jamesryanbell\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/knusperpixel\"><img src=\"https://avatars.githubusercontent.com/u/1455404?v=4?s=100\" width=\"100px;\" alt=\"knusperpixel\"/><br /><sub><b>knusperpixel</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=knusperpixel\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://langjun.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/7370806?v=4?s=100\" width=\"100px;\" alt=\"langjun\"/><br /><sub><b>langjun</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=langjun\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/lenny0702\"><img src=\"https://avatars.githubusercontent.com/u/2850927?v=4?s=100\" width=\"100px;\" alt=\"Lenny\"/><br /><sub><b>Lenny</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=lenny0702\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/mattdemps\"><img src=\"https://avatars.githubusercontent.com/u/2694295?v=4?s=100\" width=\"100px;\" alt=\"Matt\"/><br /><sub><b>Matt</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=mattdemps\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/n3gotium\"><img src=\"https://avatars.githubusercontent.com/u/3309521?v=4?s=100\" width=\"100px;\" alt=\"n3gotium\"/><br /><sub><b>n3gotium</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=n3gotium\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/naedx\"><img src=\"https://avatars.githubusercontent.com/u/1711099?v=4?s=100\" width=\"100px;\" alt=\"naedx\"/><br /><sub><b>naedx</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=naedx\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/nealnote\"><img src=\"https://avatars.githubusercontent.com/u/3173785?v=4?s=100\" width=\"100px;\" alt=\"nealnote\"/><br /><sub><b>nealnote</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=nealnote\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/osamaalsabbagh\"><img src=\"https://avatars.githubusercontent.com/u/2883742?v=4?s=100\" width=\"100px;\" alt=\"osamaalsabbagh\"/><br /><sub><b>osamaalsabbagh</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=osamaalsabbagh\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/pantcaser\"><img src=\"https://avatars.githubusercontent.com/u/33579079?v=4?s=100\" width=\"100px;\" alt=\"pantcaser\"/><br /><sub><b>pantcaser</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=pantcaser\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://ph1p.dev/\"><img src=\"https://avatars.githubusercontent.com/u/15351728?v=4?s=100\" width=\"100px;\" alt=\"Phil\"/><br /><sub><b>Phil</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=ph1p\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/pimlie\"><img src=\"https://avatars.githubusercontent.com/u/1067403?v=4?s=100\" width=\"100px;\" alt=\"Pim\"/><br /><sub><b>Pim</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=pimlie\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/andrey-glotov\"><img src=\"https://avatars.githubusercontent.com/u/1656509?v=4?s=100\" width=\"100px;\" alt=\"Andrey A. Glotov\"/><br /><sub><b>Andrey A. Glotov</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=andrey-glotov\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"https://github.com/rdsn\"><img src=\"https://avatars.githubusercontent.com/u/3916181?v=4?s=100\" width=\"100px;\" alt=\"rdsn\"/><br /><sub><b>rdsn</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=rdsn\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/shahjehanali1\"><img src=\"https://avatars.githubusercontent.com/u/8455072?v=4?s=100\" width=\"100px;\" alt=\"Shahjehan Ali\"/><br /><sub><b>Shahjehan Ali</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=shahjehanali1\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"http://jser.io/\"><img src=\"https://avatars.githubusercontent.com/u/1560179?v=4?s=100\" width=\"100px;\" alt=\"清泉古雾\"/><br /><sub><b>清泉古雾</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=JoveX\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/kashtian\"><img src=\"https://avatars.githubusercontent.com/u/17918091?v=4?s=100\" width=\"100px;\" alt=\"kashtian\"/><br /><sub><b>kashtian</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=kashtian\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/tienbuide\"><img src=\"https://avatars.githubusercontent.com/u/2574700?v=4?s=100\" width=\"100px;\" alt=\"tienbuide\"/><br /><sub><b>tienbuide</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=tienbuide\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/unicod3\"><img src=\"https://avatars.githubusercontent.com/u/2614110?v=4?s=100\" width=\"100px;\" alt=\"Sinan Ülker\"/><br /><sub><b>Sinan Ülker</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=unicod3\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/vaxul\"><img src=\"https://avatars.githubusercontent.com/u/3798226?v=4?s=100\" width=\"100px;\" alt=\"vaxul\"/><br /><sub><b>vaxul</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=vaxul\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\"><a href=\"http://raimonlapuente.com/\"><img src=\"https://avatars.githubusercontent.com/u/1092080?v=4?s=100\" width=\"100px;\" alt=\"Raimon Lapuente\"/><br /><sub><b>Raimon Lapuente</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=wolffan\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/yukulele\"><img src=\"https://avatars.githubusercontent.com/u/347244?v=4?s=100\" width=\"100px;\" alt=\"Clément P\"/><br /><sub><b>Clément P</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=yukulele\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/aPalenov\"><img src=\"https://avatars.githubusercontent.com/u/20544542?v=4?s=100\" width=\"100px;\" alt=\"Андрей\"/><br /><sub><b>Андрей</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=aPalenov\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://github.com/beomy\"><img src=\"https://avatars.githubusercontent.com/u/6986479?v=4?s=100\" width=\"100px;\" alt=\"이효범\"/><br /><sub><b>이효범</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=beomy\" title=\"Code\">💻</a></td>\n      <td align=\"center\"><a href=\"https://wolstenhol.me/\"><img src=\"https://avatars.githubusercontent.com/u/6339853?v=4?s=100\" width=\"100px;\" alt=\"Phil Wolstenholme\"/><br /><sub><b>Phil Wolstenholme</b></sub></a><br /><a href=\"#a11y-philwolstenholme\" title=\"Accessibility\">️️️️♿️</a></td>\n      <td align=\"center\"><a href=\"https://github.com/shahjehan-wpbrigade\"><img src=\"https://avatars.githubusercontent.com/u/65647117?v=4?s=100\" width=\"100px;\" alt=\"Shahjehan Ali\"/><br /><sub><b>Shahjehan Ali</b></sub></a><br /><a href=\"https://github.com/nolimits4web/swiper/commits?author=shahjehan-wpbrigade\" title=\"Documentation\">📖</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to make participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies within all project spaces, and it also applies when\nan individual is representing the project or its community in public spaces.\nExamples of representing a project or community include using an official\nproject e-mail address, posting via an official social media account, or acting\nas an appointed representative at an online or offline event. Representation of\na project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting Vladimir Kharlampidi <nolimits4web@gmail.com>. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to contribute\n\nSwiper loves to welcome your contributions. There are several ways to help out:\n\n* Create an [issue](https://github.com/nolimits4web/Swiper/issues) on GitHub, if you have found a bug\n* Write test cases or provide examples for open bug issues\n* Write patches for open bug/feature issues\n\nThere are a few guidelines that we need contributors to follow so that we have a\nchance of keeping on top of things.\n\n\n## Getting Started\n\n* Make sure you have a [GitHub account](https://github.com/signup/free).\n* Submit an [issue](https://github.com/nolimits4web/Swiper/issues), assuming one does not already exist.\n  * Clearly describe the issue including steps to reproduce when it is a bug.\n  * Make sure you fill in the earliest version that you know has the issue.\n* Fork the repository on GitHub.\n\n## Making Changes\n\n* Create a topic branch from where you want to base your work.\n  * This is usually the master branch.\n  * Only target release branches if you are certain your fix must be on that\n    branch.\n  * To quickly create a topic branch based on master; `git branch\n    master/my_contribution master` then checkout the new branch with `git\n    checkout master/my_contribution`. Better avoid working directly on the\n    `master` branch, to avoid conflicts if you pull in updates from origin.\n* Make commits of logical units.\n* Check for unnecessary whitespace with `git diff --check` before committing.\n* Use descriptive commit messages and reference the #issue number.\n\n## Submitting Changes\n\n* Push your changes to a topic branch in your fork of the repository.\n* Submit a pull request to the repository\n\n## Editor Config\n\nThe project uses .editorconfig to define the coding style of each file. We recommend that you install the Editor Config extension for your preferred IDE.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2019 Vladimir Kharlampidi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://swiperjs.com/images/share-banner.jpg\"/>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://swiperjs.com/get-started\">Get Started</a> |\n  <a href=\"https://swiperjs.com/swiper-api\">Documentation</a> |\n  <a href=\"https://swiperjs.com/demos\">Demos</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://opencollective.com/swiper\">\n    <img src=\"https://opencollective.com/swiper/all/badge.svg?label=financial+contributors\" alt=\"Financial Contributors on Open Collective\"/>\n  </a>\n  <a href=\"https://github.com/nolimits4web/swiper/actions?query=workflow%3ABuild\">\n    <img src=\"https://github.com/nolimits4web/swiper/workflows/Build/badge.svg\" alt=\"Build status\"/>\n  </a>\n  <a href=\"https://www.jsdelivr.com/package/npm/swiper\">\n    <img src=\"https://data.jsdelivr.com/v1/package/npm/swiper/badge?style=rounded\" alt=\"jsDelivr Hits\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/result?p=swiper\">\n    <img alt=\"tree-shakeable\" src=\"https://badgen.net/bundlephobia/tree-shaking/swiper\" />\n  </a>\n  <a href=\"https://npmjs.org/package/swiper\">\n    <img alt=\"types included\" src=\"https://badgen.net/npm/types/swiper\" />\n  </a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://opencollective.com/swiper/\" target=\"_blank\">\n  <img src=\"https://opencollective.com/swiper/donate/button@2x.png?color=blue\" width=300 />\n</a>\n</p>\n\n# Swiper\n\nSwiper - is the free and most modern mobile touch slider with hardware accelerated transitions and amazing native behavior. It is intended to be used in mobile websites, mobile web apps, and mobile native/hybrid apps.\n\nSwiper is not compatible with all platforms, it is a modern touch slider which is focused only on modern apps/platforms to bring the best experience and simplicity.\n\n## Features\n\n- **Tree-shakeable**: Only modules you use will be imported into your app's bundle.\n- **Mobile-friendly**: It is intended to be used in mobile websites, mobile web apps, and mobile native/hybrid apps.\n- **Library Agnostic**: Swiper doesn't require any JavaScript libraries like jQuery, which makes Swiper much smaller and faster. It can be safely used with libraries such as jQuery, Zepto, jQuery Mobile, etc.\n- **1:1 Touch movement**: By default, Swiper provides 1:1 touch movement interaction, but this ratio can be configured through Swiper settings.\n- **Mutation Observer**: Swiper has an option to enable Mutation Observer, with this feature Swiper will be automatically reinitialized and recalculate all required parameters if you make dynamic changes to the DOM, or in Swiper styles itself.\n- **Rich API**: Swiper comes with a very rich API. It allows creating your own pagination, navigation buttons, parallax effects and many more.\n- **RTL**: Swiper is the only slider that provides 100% RTL support with correct layout.\n- **Multi Row Slides Layout**: Swiper allows a multiple row slides layout, with a few slides per column.\n- **Transition Effects**: Fade, Flip, 3D Cube, 3D Coverflow.\n- **Two-way Control**: Swiper may be used as controller for any number of other Swipers, and even be controlled at the same time.\n- **Full Navigation Control**: Swiper comes with all required built-in navigation elements, such as Pagination, Navigation arrows and Scrollbar.\n- **Flexbox Layout**: Swiper uses modern flexbox layout for slides layout, which solves a lot of problems and time with size calculations. Such layout also allows configuring the Slides grid using pure CSS.\n- **Most Flexible Slides Layout Grid**: Swiper has a lot of parameters on initialization to make it as flexible as possible. You can control slides per view, per column, per group, space between slides, and many more.\n- **Images Lazy Loading**: Swiper Lazy Loading delays loading of images in inactive/invisible slides until the user swipes to them. Such feature could make the page load faster and improve Swiper performance.\n- **Virtual Slides**: Swiper comes with Virtual Slides feature that is great when you have a lot of slides or content-heavy/image-heavy slides so it will keep just the required amount of slides in DOM.\n- **Loop mode**\n- **Autoplay**\n- **Keyboard control**\n- **Mousewheel control**\n- **Nested sliders**\n- **History navigation**\n- **Hash navigation**\n- **Breakpoints configuration**\n- **Accessibility (A11y)**\n- **And many more ...**\n\n## Community\n\nThe Swiper community can be found on [GitHub Discussions](https://github.com/nolimits4web/swiper/discussions), where you can ask questions, voice ideas, and share your projects\n\nOur [Code of Conduct](https://github.com/nolimits4web/swiper/blob/master/CODE_OF_CONDUCT.md) applies to all Swiper community channels.\n\n## Dist / Build\n\nOn production use files (JS and CSS) only from `dist/` folder, there will be the most stable versions.\n\n### Development Build\n\nInstall all dependencies, in repo's root:\n\n```\n\n$ npm install\n\n```\n\nAnd build development version of Swiper:\n\n```\n\n$ npm run build\n\n```\n\nThe result is available in `dist/` folder.\n\n### Running demos:\n\nAll demos located in `./playground` folder. There you will find Core (HTML, JS), React, Vue versions.\nTo open demo, run:\n\n- **Core**: `npm run core`\n- **React**: `npm run react`\n- **Vue**: `npm run vue`\n\n### Production Build\n\n```\n\n$ npm run build:prod\n\n```\n\nProduction version will available in `dist/` folder.\n\n## Contributing\n\nAll changes should be committed to `src/` files only. Before you open an issue please review the [contributing](https://github.com/nolimits4web/swiper/blob/master/CONTRIBUTING.md) guideline.\n\n## Major Roadmapped Features\n\n- [Top Feature Requests](https://github.com/nolimits4web/swiper/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature+request%22+sort%3Areactions-%2B1-desc+) (Add your own votes using the 👍 reaction)\n- [Top Bugs 😱](https://github.com/nolimits4web/swiper/issues?q=is%3Aissue+is%3Aopen+-label%3A%22feature+request%22++sort%3Areactions-%2B1-desc+) (Add your own votes using the 👍 reaction)\n\n## Sponsors\n\n<!-- SPONSORS_TABLE_WRAP -->\n<table>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://fi.parhaatuudetkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/parhaatuudetkasinotcom.png\" alt=\"Uudet Nettikasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.vanguardngr.com/casino/fr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/vanguardngr-france.png\" alt=\"VanguardNGR France\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://marsbahis.com/tr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/noah23.png\" alt=\"Marsbahis: Marsbahis Giriş - Marsbahis Güncel Adres ve Üyelik\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://heinekenjazzaldia.eus/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinossinlicenciaespana.png\" alt=\"Casinos Sin Licencia En España\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://royalwriter.co.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/royal-writer.png\" alt=\"Skilled Writers for In-Depth Academic Papers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.masterpapers.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/masterpapers.png\" alt=\"Masterpapers - Qualified writers delivering excellence in every word!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosfest.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosfest.png\" alt=\"Best Online Casinos Canada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://grademiners.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/grademiners.png\" alt=\"Grademiners - Professional writers, original content, quality you can trust!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nettikasinot.org/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nettikasinot-org.png\" alt=\"Nettikasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nejlepsiceskacasina.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nejlepsiceskacasinacom.png\" alt=\"České Online Casino: Hrajte Bezpečně a Výhodně v 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://slovenskeonlinecasino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/slovenskeonlinecasinocom.png\" alt=\"Najlepšie Online Casino Slovensko 2024 | Október 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://ssmarket.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/ss-market.png\" alt=\"SS Market: Social Media Services Market\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://automatenspieler.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/automatenspieler.png\" alt=\"Automatenspieler\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://uusimmatkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/uusimmatkasinotcom.png\" alt=\"Uudet nettikasinot 2024 » Listaamme Suomen uudet kasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinohai.com/nettikasinot\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinohai.png\" alt=\"Nettikasinot 2022 | Löydä Luotettava & Turvallinen Nettikasino!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nongamstopodds.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopodds.png\" alt=\"NonGamStopOdds casino sites\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinotest.de\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotest.png\" alt=\"Online Casino Test 2022 » 90+ Casinos von Experten geprüft!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://parimatch.in/en/football/live\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/parimatch.png\" alt=\"Online sports betting and casino at Parimatch India\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casino-wise.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-wise-com.png\" alt=\"Casinos not on GamStop | Casino-Wise.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.nongamstopwager.com/casinos-not-on-gamstop/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopwager-com.png\" alt=\"Casinos not on GamStop UK 🏆 NonGamStopWager.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoauditor.com/online-casinos-cyprus/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoauditor.png\" alt=\"Online Casinos Cyprus - CasinoAuditor\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoshunter.com/online-casinos/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-hunter.png\" alt=\"Best Online Casinos in Canada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.stltoday.com/exclusive/3-top-rated-platforms-to-buy-tiktok-followers-for-fast-growth/article_74fb98eb-6019-5b74-9cda-803a7d4ac4a2.html\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers-stl-today.png\" alt=\"Buy TikTok Followers - STL Today\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://au.trustpilot.com/review/pokiesgambler.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pokiesgamblercom.png\" alt=\"Online Pokies in Australia\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://topl.co\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/no-deposit-casinos.png\" alt=\"No Deposit Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://brecktic.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/brecktic-ltd.png\" alt=\"Brecktic UK\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fortune365.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fortune365.png\" alt=\"fortune365\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cryptocasino-guide.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cryptocasino-guide.png\" alt=\"CryptoCasino Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fbpostlikes.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pankaj-jangir.png\" alt=\"Buy Facebook Likes for Post & Page\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/BusinessVault/comments/1nr32xk/whats_the_best_smm_panel_looking_for_suggestions/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/smm-panel19.png\" alt=\"SMM Panel\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://finance.yahoo.com/news/best-website-super-clone-watches-073500706.html\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/super-clone-prestige.png\" alt=\"Yahoo Finance - Super Clone Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://superclonereps.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/superclonewatch.png\" alt=\"superclonewatch\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://detecting-ai.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/detecting-aicom.png\" alt=\"AI Detector & AI Checker for ChatGPT, Gemini, Claude, & More\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.idsnews.com/article/2025/09/buy-instagram-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-ids-ne.png\" alt=\"Buy Instagram Followers - IDS News\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gmkoutsi.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gmkoutsi.png\" alt=\"gmkoutsi.com\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://interac-casino.com/en-ca/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/interac-casino-canada.png\" alt=\"Interac-casino.com - Canada\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://releaf.com/de/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/releaf-medizinischer-cannabis-shop.png\" alt=\"Releaf - Medizinischer Cannabis Shop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://legitcasino.vip/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/legit-casino.png\" alt=\"Legit Casino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.eurocommpr.at/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/eurocommpr.png\" alt=\"EuroCommpr\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://snapinsta.vin/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/snapinsta.png\" alt=\"SnapInsta\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gpc.fm/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/brand-new-online-casinos-usa-no-deposit-bonus.png\" alt=\"Brand New Online Casinos USA No Deposit Bonus\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/what-is-forex\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfmcom.png\" alt=\"fx取引とは\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bonustly.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonustly-best-crypto-casino-bonuses.png\" alt=\"Bonustly: Best Crypto Casino Bonuses\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinononaamsit.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinononaamsit-com.png\" alt=\"Migliori Casino non AAMS in Italia 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/what-is-forex\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfmcom.png\" alt=\"fx取引とは\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://opencollective.com/jokacasino\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/jokacasino.png\" alt=\"online casino australia JokaCasino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://swipey.ai/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/swipey.png\" alt=\"Swipey AI - NSFW Chat\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nondetected.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nondetected.png\" alt=\"Remove negative information from the Internet | NonDetected.com\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://opencollective.com/king-johnnie1\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/king-johnnie1.png\" alt=\"king Johnnie\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://collegian.com/sponsored/2025/03/buy-youtube-subscribers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-youtube-subscribers-collegian.png\" alt=\"buy YouTube subscribers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/InstagramEmpire/comments/1o8v7zx/whats_the_best_site_to_buy_instagram_followers/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-real-instagram-followers1.png\" alt=\"buy instagram followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinoranking.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinoranking.png\" alt=\"Luotettavat nettikasinot 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://newcasinos.vip/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/newcasinosvip.png\" alt=\"Best New Online Casinos in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.backlinksrocket.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/backlinksrocket.png\" alt=\"Buy Backlinks - High Quality SEO Backlink Services\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://kingjohnnie-au.casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kingjohnnie-casino-australia.svg\" alt=\"King Johnnie Casino Australia\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nomaspinn.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nomaspin.svg\" alt=\"Nomaspin Casino Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buytiktokfollowers.co/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers-co.png\" alt=\"Buy TikTok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tiktokfame.co/buy-tiktok-followers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tiktokfameco.png\" alt=\"Buy TikTok Followers & Get Fame\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.softorbits.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/softorbits.png\" alt=\"SoftOrbits - Easiest Photo Editing Software for Beginners\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinossinlicencia.eu/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-sin-licencia-en-espana1.png\" alt=\"casinos sin licencia en España\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://homeworkguy.org/someone-to-take-my-online-class\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/homeworkguy.png\" alt=\"someone to take my online class service\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.bestetf.net/list/artificial-intelligence/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bestetf.png\" alt=\"AI ETFs\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://superluxuryreps.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/superluxuryreps.png\" alt=\"Super Clone Watches - Trusted Dealer For 1:1 Replica Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hfm.com/int/jp/trading-education/how-to-trade-gold\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/hfm.png\" alt=\"ゴールド取引\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.reddit.com/r/MarketingMentor/comments/1cut7x5/where_to_buy_instagram_followers_likes/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/givemeboost.png\" alt=\"Buy Instagram Followers \" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://prestigewatches.co/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/prestige_watches.png\" alt=\"Super Clone Watches For Sale: Best Website for 1:1 Replica Watches\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://unaimytext.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/humanize-ai-unaimytext.png\" alt=\"humanize ai unaimytext\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinotopplistan.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotopplistan-com.png\" alt=\"Casino online - Vi jämför casinon på nätet i Sverige\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.kasinonetti.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/kasinonetti-com.png\" alt=\"Parhaat kasinot - Valitse turvallinen nettikasino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nogamstopcasinos.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/non-gamstop-casinos3.png\" alt=\"New Casinos Not on Gamstop - Best Non GamStop sites in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinonotongamstop.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-not-on-gamstop.webp\" alt=\"Casino not on GamStop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://socialfollowers.io/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/socialfollowers.png\" alt=\"The Best Social Media Promotion Service Provider\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinotreasure.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinotreasure.jpeg\" alt=\"Trusted Source for Online Casino Info , Games, Guides , Reviews\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.mixx.com/buy-instagram-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-mixx.png\" alt=\"Buy Instagram Followers with Instant Delivery\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://expressfollowers.com/buy-tiktok-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-tiktok-followers2.png\" alt=\"buy tiktok followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://boostlikes.uk/buy-youtube-subscribers-views/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-instagram-followers-uk.webp\" alt=\"Buy YouTube Subscribers & Views UK\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://miramtech.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/miramtech.png\" alt=\"Miramtech\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.uudetkasinot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/simon-johansson.svg\" alt=\"Uudet Nettikasinot Huhtikuu 2025 | Parhaat Uudet Kasinot\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://goldstarsocial.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/user-c1ad5e70.png\" alt=\"Goldstar Social\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://pistolocasino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/pistolocasino.png\" alt=\"Pistolo Casino\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://follower-boerse.de/product/tiktok-likes-kaufen/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tiktok-likes.png\" alt=\"TikTok Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.socialfollowers.uk/buy-tiktok-followers/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/social-followers.png\" alt=\"Buy Tiktok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.palace-luzern.ch/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/auslandische-online-casinos-schweiz.png\" alt=\"Online Casino Ausland: Beste ausländische Online Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://kasynoplonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonus-bez-depozytu.png\" alt=\"Kasyno online w Polsce\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buylikesservices.com/free-instagram-likes/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/free-instaram-likes.png\" alt=\"Free Instagram Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.favbet.ro/ro/casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/favbet-ro.jpeg\" alt=\"Casino online Favbet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://twesocial.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-twitter-followers-visit-twesocial.png\" alt=\"Buy X Followers from TweSocial (Instant & Cheap)\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://sidesmedia.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/sidesmedia.png\" alt=\"SidesMedia: Buy Followers, Views, Likes & More\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosinternacionalesonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosinternacionalesonline.png\" alt=\"Mejores Casinos Internacionales Online de España 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinokennis.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinokennis.png\" alt=\"CasinoKennis\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoonlineellada.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoonlineelladacom.png\" alt=\"casino online ellada\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.favbet.ua/uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/favbet.png\" alt=\"БК Favbet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.vso.org.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-not-on-gamstop10.png\" alt=\"casinos not on Gamstop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bonusoid.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bonusoidcom.png\" alt=\"Online Casinos mit deutscher Lizenz\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinofy.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinofy.png\" alt=\"Casinofy\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoallianz.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoallianz.png\" alt=\"CasinoAllianz\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinos.it.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-online-italia.png\" alt=\"casinò online Italia\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.stjamestheatre.co.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/non-gamstop-casinos.png\" alt=\"Top UK Casinos Not on GamStop in 2025\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nogamstopcasinos.org.uk/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nogamstopcasinos.png\" alt=\"nogamstopcasinos.org.uk\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://mysocialfollowing.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/mysocialfollowing.png\" alt=\"My Social Following\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://dashtickets.nz/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/dashtickets-new-zealand-gambling-magazine.png\" alt=\"DashTickets New Zealand gambling magazine\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tethercasinos.top/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tethercasinos.png\" alt=\"best tether casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.socialboosting.com/buy-tiktok-followers\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/socialboosting.png\" alt=\"Buy TikTok Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betking.com.ua/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betking.png\" alt=\"Онлайн казино та БК (ставки на спорт) в Україні\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tychebets.gr/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tychebets-gr.png\" alt=\"O Καλύτερος Οδηγός Online Καζίνο\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.top-casino.nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/top-casino.png\" alt=\"Top online casino's van Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://polskiesloty.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinekasyno-polis.jpg\" alt=\"Polskie Sloty\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://robocat.casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/robocat-casino.png\" alt=\"RoboCat Casino\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://zamsino.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/zamamamma.png\" alt=\"Zamsino.com 🎖️ Global Online Gambling Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betwinnerpartner.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betwinnerpartner.png\" alt=\"Betwinner Partner\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinosdeutschlandonline.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-casinos-deutschland.png\" alt=\"Online Casinos Deutschland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosportugal.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinos-portugal.png\" alt=\"Casinos online em Portugal\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bettingsite.cc/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betting-site.png\" alt=\"Betting Site\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.onlinecasinolegends.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-casino-legends.png\" alt=\"Online Casino Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nongamstopcasinos.net/gb/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nongamstopcasinosnet.png\" alt=\"UK Casinos not on GamStop 2025 - nongamstopcasinos.net\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://guidebook.betwinner.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/guidebook_betwinner_com.png\" alt=\"Guidebook.BetWinner\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://zondercruks.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/zondercruksnet.png\" alt=\"ZonderCruks - Online Gokken Zonder CRUKS\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosinlicenciaespana.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/mejores-casinos-sin-licencia-en-espana1.png\" alt=\"Mejores Casinos Sin Licencia en España\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://sanctionslawyers.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/sanctionslawyers-net.png\" alt=\"SANCTIONS LAW FIRM\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://interpollawfirm.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/interpollawfirmcom.png\" alt=\"Interpol Law Firm\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nongamstopbookiesuk.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/try-bookmakers-not-on-gamstop.png\" alt=\"try bookmakers not on GamStop\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://leofame.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/leofame.png\" alt=\"Buy Instagram Followers & Likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.teravisiontech.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/teravisiontech.webp\" alt=\"Accelerating Your Software Products | Teravision Technologies\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosgr.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-magyar.png\" alt=\"Casino Magyar\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosgr.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinecasinosgr-com.png\" alt=\"Ta καλύτερα διαδικτυακά καζίνο στην Ελλάδα το 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://bulkoid.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/bulkoid_com.png\" alt=\"Bulkoid\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.gokken-online.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gokken-online.png\" alt=\"Gokken Online\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://greece-casinos.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/greece-casinos.png\" alt=\"Greece Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.hellobonuses.com/nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-bonussen-nederland.png\" alt=\"Casino Bonussen Nederland\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.ownedcore.com/casino/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casino-usa.png\" alt=\"Casino No deposit Bonus 2024\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://blastup.com/buy-instagram-likes\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/blastup_com.png\" alt=\"Buy Instagram Likes - Real Likes & Instant Delivery!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://vedonlyontiyhtiot.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/vedonlyontiyhtiot-com.svg\" alt=\"Vedonlyontiyhtiot.com - Parhaat Vedolyöntiyhtiöt & Bonukset\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://celebian.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/celebian.png\" alt=\"Purchase TikTok followers, likes and views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://views4you.com/buy-youtube-views/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/buy-youtube-views-views4you.png\" alt=\"Buy Youtube Views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.upgrow.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/upgrow.png\" alt=\"UpGrow: #1 AI-Powered Instagram Growth | Real IG Followers\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.doublethebitcoin.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/doublethebitcoin.png\" alt=\"Best Bitcoin Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://topnoaccountcasinos.com/nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/topnoaccountcasinos.png\" alt=\"Topnoaccountcasinos casino zonder registratie\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.prointernet.in.ua/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/prointernet-2.png\" alt=\"Prointernet\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nexussmoke.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nexus-smoke.png\" alt=\"Nexus Smoke Premium E-Liquid and Luxury Vape Products\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.overlyzer.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/overlyzer_com.png\" alt=\"Overlyzer » football betting analyzer & soccer predictions\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://spelpressen.se/casino-reportage/casino-utan-svensk-licens\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/spelpressen-se.png\" alt=\"Casino utan Svensk Licens | Bästa Casinon utan Spelpaus 🎖️\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betfans.nl/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betfans.png\" alt=\"BetFans - Alles over online wedden; Bookmakers Vergelijken\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.onlineunitedstatescasinos.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/online-united-states-casinos.png\" alt=\"Top USA Online Casinos September 2023 | Online United States Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://philippinescasinos.ph/gcash/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/philippinescasinosph.png\" alt=\"Best Online Casino in Philippines using GCash | 2023 Rank\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cyberogism.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cyberogism.png\" alt=\"Technology, Security, Innovation, The Cyber World Now | Cyberogism\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://buycheapestfollowers.com/buy-instagram-reels-views\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/thebestsolution.png\" alt=\"Buy Instagram Reels Views\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://onlinecasinosspelen.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/onlinecasinosspelen.png\" alt=\"Onlinecasinosspelen.com site is dé nummer één gids, waardoor je gemakkelijk alle informatie van de top 10 online casino sites.\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://rotativka.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/rotativka.png\" alt=\"Rotativka.com - Най-добрите онлайн казина в България\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.casinoaustraliaonline.com/under-1-hour-withdrawal-casinos/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoaustraliaonline.png\" alt=\"Under 1 Hour Withdrawal Casinos in Australia - 2022\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betbetter-pa.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betbetter.png\" alt=\"PA Online Casino - List of Best Casinos in Pennsylvania\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinozonderregistratie.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/czrnet.png\" alt=\"Casino Zonder Registratie 2022 | CZR's Top No Account Casino's Ranglijst\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://nieuwe-casinos.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/nieuwecasinos.png\" alt=\"Nieuwe Online Casino's December 2022 | Overzicht van de top nieuwe casinos!\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://4rabet.com/app\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/4rabet.svg\" alt=\"cricket betting app\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.wisergamblers.com/de/casino-bonus-ohne-einzahlung/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/wisergamblers.png\" alt=\"WiserGamblers | Best Online Gambling Guide\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://betting-sider.net/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/betting-sider.png\" alt=\"betting sider\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://thecasinowizard.com/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/thecasinowizard.png\" alt=\"The Casino Wizard » Best Casinos & (No) Deposit Bonuses 2022\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fast.bet/ca/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fastbet-bet-ca.png\" alt=\"Fastest Payout Casinos in Canada [2022]\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://cliquestudios.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/cliquestudios.png\" alt=\"Clique Studios - Creative Digital Transformation\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://correctcasinos.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/correctcasinos.png\" alt=\"Correct Casinos | The Ultimate Guide to the Legit Online Casinos\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://writingmetier.com/extended-essay-writing-service/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/writingmetier.png\" alt=\"IB extended essay writing service\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.wizardslots.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/wizardslots.png\" alt=\"Online Slots - UK Slot Games - 500 FREE Spins at Wizard Slots\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://www.fortunegames.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/fortunegames.png\" alt=\"Fortune Games® | Free Spins No Deposit Slot Games | Online Slots\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://tankpenge.dk\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/tankpenge-dk.png\" alt=\"LÅN PENGE NU | Hurtige Online lån 2021 | Klik her og Ansøg i dag\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://veepn.com/vpn-apps/vpn-for-chrome/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/veepn.png\" alt=\"VPN for Chrome to Make Web Surfing 100% Safe\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinoexpo.se/casino-utan-registrering/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinoexpo.jpg\" alt=\"CasinoExpo casino utan registrering\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://najlepsibukmacherzy.pl/ranking-legalnych-bukmacherow/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/netpositive.png\" alt=\"Ranking Bukmacherów Legalnych 2020. Bukmacher nr 1 to...\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://casinosters.com\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/casinosters.svg\" alt=\"The Best Online Casinos in the UK » Gambling Sites by Casinosters\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://gamblizard.com/deposit-bonuses/deposit-10-pound/\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/gamblizard.png\" alt=\"Deposit £10 Play with 30, 40, 50, 60, 70, or 80 Pounds✔️ GambLizard\" width=\"160\">\n      </a>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"center\" valign=\"middle\">\n      <a href=\"https://goread.io/buy-instagram-likes\" target=\"_blank\">\n        <img src=\"https://swiperjs.com/images/sponsors/goread.png\" alt=\"Instagram likes\" width=\"160\">\n      </a>\n    </td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n    <td align=\"center\" valign=\"middle\"></td>\n  </tr>\n</table>\n<!-- SPONSORS_TABLE_WRAP -->\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"CODE_CONTRIBUTORS.md\"><img src=\"https://opencollective.com/swiper/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/swiper/contribute)]\n\n<a href=\"https://opencollective.com/swiper\"><img src=\"https://opencollective.com/swiper/individuals.svg?width=890\"></a>\n"
  },
  {
    "path": "TODO.md",
    "content": ""
  },
  {
    "path": "babel.config.json",
    "content": "{\n  \"presets\": [\"@babel/preset-react\", [\"@babel/preset-env\", { \"modules\": false, \"loose\": true }]]\n}\n"
  },
  {
    "path": "demos/010-default.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper');\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/020-navigation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/030-pagination.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/040-pagination-dynamic.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        dynamicBullets: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/050-pagination-progress.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        type: 'progressbar',\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/060-pagination-fraction.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        type: 'fraction',\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/070-pagination-custom.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n        renderBullet: function (index, className) {\n          return '<span class=\"' + className + '\">' + (index + 1) + '</span>';\n        },\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .swiper-pagination-bullet {\n      width: 20px;\n      height: 20px;\n      text-align: center;\n      line-height: 20px;\n      font-size: 12px;\n      color: #000;\n      opacity: 1;\n      background: rgba(0, 0, 0, 0.2);\n    }\n\n    .swiper-pagination-bullet-active {\n      color: #fff;\n      background: #007aff;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/080-scrollbar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Scrollbar -->\n    <div class=\"swiper-scrollbar\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      scrollbar: {\n        el: '.swiper-scrollbar',\n        hide: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/090-vertical.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      direction: 'vertical',\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/100-space-between.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/110-slides-per-view.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/120-slides-per-view-auto.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 'auto',\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n      width: 80%;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .swiper-slide:nth-child(2n) {\n      width: 60%;\n    }\n\n    .swiper-slide:nth-child(3n) {\n      width: 40%;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/125-snap-to-slide-edge.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo - Snap To Slide Edge</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <h2>Default behavior (snapToSlideEdge: false)</h2>\n  <p>Notice how at the end, the last slide aligns to the right edge</p>\n  <!-- Swiper without snapToSlideEdge -->\n  <div class=\"swiper swiper-default\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n    </div>\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n  <h2>With snapToSlideEdge: true</h2>\n  <p>Slides always stay aligned to their original position</p>\n  <!-- Swiper with snapToSlideEdge -->\n  <div class=\"swiper swiper-snap-edge\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n    </div>\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n\n    // Default behavior - last slide aligns to edge\n    var swiperDefault = new Swiper('.swiper-default', {\n      slidesPerView: 'auto',\n      spaceBetween: 20,\n      pagination: {\n        el: '.swiper-default .swiper-pagination',\n        clickable: true,\n      },\n    });\n\n    // With snapToSlideEdge - slides stay aligned\n    var swiperSnapEdge = new Swiper('.swiper-snap-edge', {\n      slidesPerView: 'auto',\n      spaceBetween: 20,\n      snapToSlideEdge: true,\n      pagination: {\n        el: '.swiper-snap-edge .swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 20px;\n    }\n\n    h2 {\n      margin: 20px 0 10px;\n    }\n\n    p {\n      margin: 0 0 10px;\n      color: #666;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 200px;\n      margin-bottom: 30px;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n      border-radius: 8px;\n      width: 100px;\n\n      /* Center slide text vertically */\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n\n    .swiper-default .swiper-slide {\n      background: #4a90d9;\n      color: #fff;\n    }\n\n    .swiper-snap-edge .swiper-slide {\n      background: #5cb85c;\n      color: #fff;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/130-centered.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 4,\n      spaceBetween: 30,\n      centeredSlides: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/140-centered-auto.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 'auto',\n      centeredSlides: true,\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n      width: 60%;\n    }\n\n    .swiper-slide:nth-child(2n) {\n      width: 40%;\n    }\n\n    .swiper-slide:nth-child(3n) {\n      width: 20%;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/145-css-mode.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      cssMode: true,\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      pagination: {\n        el: '.swiper-pagination'\n      },\n      mousewheel: true,\n      keyboard: true,\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/150-freemode.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      spaceBetween: 30,\n      freeMode: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/160-scroll-container.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">\n        <h4>Scroll Container</h4>\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus, ex eu sagittis faucibus, ligula ipsum\n          sagittis magna, et imperdiet dolor lectus eu libero. Vestibulum venenatis eget turpis sed faucibus. Maecenas\n          in ullamcorper orci, eu ullamcorper sem. Etiam elit ante, luctus non ante sit amet, sodales vulputate odio.\n          Aenean tristique nisl tellus, sit amet fringilla nisl volutpat cursus. Quisque dignissim lectus ac nunc\n          consectetur mattis. Proin vel hendrerit ipsum, et lobortis dolor. Vestibulum convallis, nibh et tincidunt\n          tristique, nisl risus facilisis lectus, ut interdum orci nisl ac nunc. Cras et aliquam felis. Quisque vel\n          ipsum at elit sodales posuere eget non est. Fusce convallis vestibulum dolor non volutpat. Vivamus vestibulum\n          quam ut ultricies pretium.</p>\n        <p>Suspendisse rhoncus fringilla nisl. Mauris eget lorem ac urna consectetur convallis non vel mi. Donec libero\n          dolor, volutpat ut urna sit amet, aliquet molestie purus. Phasellus faucibus, leo vel scelerisque lobortis,\n          ipsum leo sollicitudin metus, eget sagittis ante orci eu ipsum. Nulla ac mauris eu risus sagittis scelerisque\n          iaculis bibendum mauris. Cras ut egestas orci. Cras odio risus, sagittis ut nunc vitae, aliquam consectetur\n          purus. Vivamus ornare nunc vel tellus facilisis, quis dictum elit tincidunt. Donec accumsan nisi at laoreet\n          sodales. Cras at ullamcorper massa. Maecenas at facilisis ex. Nam mollis dignissim purus id efficitur.</p>\n        <p>Curabitur eget aliquam erat. Curabitur a neque vitae purus volutpat elementum. Vivamus quis vestibulum leo,\n          efficitur ullamcorper velit. Integer tincidunt finibus metus vel porta. Mauris sed mauris congue, pretium est\n          nec, malesuada purus. Nulla hendrerit consectetur arcu et lacinia. Suspendisse augue justo, convallis eget\n          arcu in, pretium tempor ligula. Nullam vulputate tincidunt est ut ullamcorper.</p>\n        <p>Curabitur sed sodales leo. Nulla facilisi. Etiam condimentum, nisi id tempor vulputate, nisi justo cursus\n          justo, pellentesque condimentum diam arcu sit amet leo. Cum sociis natoque penatibus et magnis dis parturient\n          montes, nascetur ridiculus mus. In placerat tellus a posuere vehicula. Donec diam massa, efficitur vitae\n          mattis et, pretium in augue. Fusce iaculis mi quis ante venenatis, sit amet pellentesque orci aliquam.\n          Vestibulum elementum posuere vehicula.</p>\n        <p>Sed tincidunt diam a massa pharetra faucibus. Praesent condimentum id arcu nec fringilla. Maecenas faucibus,\n          ante et venenatis interdum, erat mi eleifend dui, at convallis nisl est nec arcu. Duis vitae arcu rhoncus,\n          faucibus magna ut, tempus metus. Cras in nibh sed ipsum consequat rhoncus. Proin fringilla nulla ut augue\n          tempor fermentum. Nunc hendrerit non nisi vitae finibus. Donec eget ornare libero. Aliquam auctor erat enim, a\n          semper risus semper at. In ut dui in metus tincidunt euismod eget et lacus. Aenean et dictum urna, sed rhoncus\n          lorem. Duis pharetra sagittis odio. Etiam a libero ut nisi feugiat tincidunt vel vitae turpis. Maecenas vel\n          orci sit amet lorem hendrerit venenatis sollicitudin ut dui. Quisque rhoncus nibh in massa pretium\n          scelerisque.</p>\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus, ex eu sagittis faucibus, ligula ipsum\n          sagittis magna, et imperdiet dolor lectus eu libero. Vestibulum venenatis eget turpis sed faucibus. Maecenas\n          in ullamcorper orci, eu ullamcorper sem. Etiam elit ante, luctus non ante sit amet, sodales vulputate odio.\n          Aenean tristique nisl tellus, sit amet fringilla nisl volutpat cursus. Quisque dignissim lectus ac nunc\n          consectetur mattis. Proin vel hendrerit ipsum, et lobortis dolor. Vestibulum convallis, nibh et tincidunt\n          tristique, nisl risus facilisis lectus, ut interdum orci nisl ac nunc. Cras et aliquam felis. Quisque vel\n          ipsum at elit sodales posuere eget non est. Fusce convallis vestibulum dolor non volutpat. Vivamus vestibulum\n          quam ut ultricies pretium.</p>\n        <p>Suspendisse rhoncus fringilla nisl. Mauris eget lorem ac urna consectetur convallis non vel mi. Donec libero\n          dolor, volutpat ut urna sit amet, aliquet molestie purus. Phasellus faucibus, leo vel scelerisque lobortis,\n          ipsum leo sollicitudin metus, eget sagittis ante orci eu ipsum. Nulla ac mauris eu risus sagittis scelerisque\n          iaculis bibendum mauris. Cras ut egestas orci. Cras odio risus, sagittis ut nunc vitae, aliquam consectetur\n          purus. Vivamus ornare nunc vel tellus facilisis, quis dictum elit tincidunt. Donec accumsan nisi at laoreet\n          sodales. Cras at ullamcorper massa. Maecenas at facilisis ex. Nam mollis dignissim purus id efficitur.</p>\n        <p>Curabitur eget aliquam erat. Curabitur a neque vitae purus volutpat elementum. Vivamus quis vestibulum leo,\n          efficitur ullamcorper velit. Integer tincidunt finibus metus vel porta. Mauris sed mauris congue, pretium est\n          nec, malesuada purus. Nulla hendrerit consectetur arcu et lacinia. Suspendisse augue justo, convallis eget\n          arcu in, pretium tempor ligula. Nullam vulputate tincidunt est ut ullamcorper.</p>\n        <p>Curabitur sed sodales leo. Nulla facilisi. Etiam condimentum, nisi id tempor vulputate, nisi justo cursus\n          justo, pellentesque condimentum diam arcu sit amet leo. Cum sociis natoque penatibus et magnis dis parturient\n          montes, nascetur ridiculus mus. In placerat tellus a posuere vehicula. Donec diam massa, efficitur vitae\n          mattis et, pretium in augue. Fusce iaculis mi quis ante venenatis, sit amet pellentesque orci aliquam.\n          Vestibulum elementum posuere vehicula.</p>\n        <p>Sed tincidunt diam a massa pharetra faucibus. Praesent condimentum id arcu nec fringilla. Maecenas faucibus,\n          ante et venenatis interdum, erat mi eleifend dui, at convallis nisl est nec arcu. Duis vitae arcu rhoncus,\n          faucibus magna ut, tempus metus. Cras in nibh sed ipsum consequat rhoncus. Proin fringilla nulla ut augue\n          tempor fermentum. Nunc hendrerit non nisi vitae finibus. Donec eget ornare libero. Aliquam auctor erat enim, a\n          semper risus semper at. In ut dui in metus tincidunt euismod eget et lacus. Aenean et dictum urna, sed rhoncus\n          lorem. Duis pharetra sagittis odio. Etiam a libero ut nisi feugiat tincidunt vel vitae turpis. Maecenas vel\n          orci sit amet lorem hendrerit venenatis sollicitudin ut dui. Quisque rhoncus nibh in massa pretium\n          scelerisque.</p>\n      </div>\n    </div>\n    <!-- Add Scroll Bar -->\n    <div class=\"swiper-scrollbar\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      direction: 'vertical',\n      slidesPerView: 'auto',\n      freeMode: true,\n      scrollbar: {\n        el: '.swiper-scrollbar',\n      },\n      mousewheel: true,\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #fff;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      font-size: 18px;\n      height: auto;\n      -webkit-box-sizing: border-box;\n      box-sizing: border-box;\n      padding: 30px;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/170-slides-per-column.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      spaceBetween: 30,\n      grid: {\n        rows: 2,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n      height: calc((100% - 30px) / 2);\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/180-nested.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper swiper-h\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Horizontal Slide 1</div>\n      <div class=\"swiper-slide\">\n        <div class=\"swiper swiper-v\">\n          <div class=\"swiper-wrapper\">\n            <div class=\"swiper-slide\">Vertical Slide 1</div>\n            <div class=\"swiper-slide\">Vertical Slide 2</div>\n            <div class=\"swiper-slide\">Vertical Slide 3</div>\n            <div class=\"swiper-slide\">Vertical Slide 4</div>\n            <div class=\"swiper-slide\">Vertical Slide 5</div>\n          </div>\n          <div class=\"swiper-pagination swiper-pagination-v\"></div>\n        </div>\n      </div>\n      <div class=\"swiper-slide\">Horizontal Slide 3</div>\n      <div class=\"swiper-slide\">Horizontal Slide 4</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination-h\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiperH = new Swiper('.swiper-h', {\n      spaceBetween: 50,\n      pagination: {\n        el: '.swiper-pagination-h',\n        clickable: true,\n      },\n    });\n    var swiperV = new Swiper('.swiper-v', {\n      direction: 'vertical',\n      spaceBetween: 50,\n      pagination: {\n        el: '.swiper-pagination-v',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .swiper-v {\n      background: #eee;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/190-grab-cursor.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 4,\n      centeredSlides: true,\n      spaceBetween: 30,\n      grabCursor: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/200-infinite-loop.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 1,\n      spaceBetween: 30,\n      loop: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/210-infinite-loop-with-slides-per-group.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      spaceBetween: 30,\n      slidesPerGroup: 3,\n      loop: true,\n      loopFillGroupWithBlank: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/211-slides-per-group-skip.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-001.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-002.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-003.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-004.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-005.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-006.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-007.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-008.jpg\"></div>\n      <div class=\"swiper-slide\"><img src=\"//cdn.magloft.com/github/swiper/images/page-009.jpg\"></div>\n    </div>\n    <div class=\"swiper-scrollbar\"></div>\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 1,\n      centeredSlides: false,\n      slidesPerGroupSkip: 1,\n      grabCursor: true,\n      keyboard: { enabled: true },\n      breakpoints: { 769: { slidesPerView: 2, slidesPerGroup: 2 } },\n      scrollbar: { el: '.swiper-scrollbar' },\n      navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' },\n      pagination: { el: '.swiper-pagination', clickable: true }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body,\n    html {\n      padding: 0;\n      margin: 0;\n      position: relative;\n      height: 100%;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n    }\n\n    .swiper-slide img {\n      display: block;\n      width: 100%;\n    }\n\n    @media only screen and (min-width: 769px) {\n      .swiper-slide:first-child {\n        transition: transform 100ms;\n      }\n\n      .swiper-slide:first-child img {\n        transition: box-shadow 500ms;\n      }\n\n      .swiper-slide.swiper-slide-active:first-child {\n        transform: translateX(50%);\n        z-index: 2;\n      }\n\n      .swiper-slide.swiper-slide-active:first-child img {\n        box-shadow: 0px 32px 80px rgba(0, 0, 0, 0.35);\n      }\n\n      .swiper-slide:nth-child(2) {\n        transition: transform 100ms;\n      }\n\n      .swiper-slide.swiper-slide-next:nth-child(2) {\n        transform: translateX(55%);\n        z-index: 1;\n      }\n\n      .swiper[dir=rtl] .swiper-slide.swiper-slide-active:first-child {\n        transform: translateX(-50%);\n      }\n\n      .swiper[dir=rtl] .swiper-slide.swiper-slide-next:nth-child(2) {\n        transform: translateX(-55%);\n      }\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/220-effect-fade.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination-white\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next swiper-button-white\"></div>\n    <div class=\"swiper-button-prev swiper-button-white\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      spaceBetween: 30,\n      effect: 'fade',\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      background-position: center;\n      background-size: cover;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/230-effect-cube.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      effect: 'cube',\n      grabCursor: true,\n      cubeEffect: {\n        shadow: true,\n        slideShadows: true,\n        shadowOffset: 20,\n        shadowScale: 0.94,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #fff;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 300px;\n      height: 300px;\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      margin-left: -150px;\n      margin-top: -150px;\n    }\n\n    .swiper-slide {\n      background-position: center;\n      background-size: cover;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/240-effect-coverflow.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-7.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-8.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-9.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-10.jpg)\"></div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      effect: 'coverflow',\n      grabCursor: true,\n      centeredSlides: true,\n      slidesPerView: 'auto',\n      coverflowEffect: {\n        rotate: 50,\n        stretch: 0,\n        depth: 100,\n        modifier: 1,\n        slideShadows: true,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #fff;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      padding-top: 50px;\n      padding-bottom: 50px;\n    }\n\n    .swiper-slide {\n      background-position: center;\n      background-size: cover;\n      width: 300px;\n      height: 300px;\n\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/250-effect-flip.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n    </div>\n\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-button-next\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      effect: 'flip',\n      grabCursor: true,\n      pagination: {\n        el: '.swiper-pagination',\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #fff;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 300px;\n      height: 300px;\n      padding: 50px;\n      transform-style: preserve-3d;\n    }\n\n    .swiper-slide {\n      background-position: center;\n      background-size: cover;\n      width: 300px;\n      height: 300px;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/255-effect-cards.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      effect: 'cards',\n      grabCursor: true,\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #fff;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n    }\n\n    .swiper {\n      width: 240px;\n      height: 320px;\n    }\n\n    .swiper-slide {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      border-radius: 18px;\n      font-size: 22px;\n      font-weight: bold;\n      color: #fff;\n    }\n\n    .swiper-slide:nth-child(1n) {\n      background-color: rgb(206, 17, 17);\n    }\n\n    .swiper-slide:nth-child(2n) {\n      background-color: rgb(0, 140, 255);\n    }\n\n    .swiper-slide:nth-child(3n) {\n      background-color: rgb(10, 184, 111);\n    }\n\n    .swiper-slide:nth-child(4n) {\n      background-color: rgb(211, 122, 7);\n    }\n\n    .swiper-slide:nth-child(5n) {\n      background-color: rgb(118, 163, 12);\n    }\n\n    .swiper-slide:nth-child(6n) {\n      background-color: rgb(180, 10, 47);\n    }\n\n    .swiper-slide:nth-child(7n) {\n      background-color: rgb(35, 99, 19);\n    }\n\n    .swiper-slide:nth-child(8n) {\n      background-color: rgb(0, 68, 255);\n    }\n\n    .swiper-slide:nth-child(9n) {\n      background-color: rgb(218, 12, 218);\n    }\n\n    .swiper-slide:nth-child(10n) {\n      background-color: rgb(54, 94, 77);\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/257-effect-creative.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper swiper-1\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <div class=\"swiper swiper-2\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <div class=\"swiper swiper-3\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <div class=\"swiper swiper-4\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <div class=\"swiper swiper-5\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <div class=\"swiper swiper-6\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n\n    new Swiper('.swiper-1', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          translate: [0, 0, -400],\n        },\n        next: {\n          translate: ['100%', 0, 0]\n        }\n      }\n    });\n\n    new Swiper('.swiper-2', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          translate: ['-120%', 0, -500],\n        },\n        next: {\n          shadow: true,\n          translate: ['120%', 0, -500]\n        }\n      }\n    });\n\n    new Swiper('.swiper-3', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          translate: ['-20%', 0, -1],\n        },\n        next: {\n          translate: ['100%', 0, 0]\n        }\n      }\n    });\n\n    new Swiper('.swiper-4', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          translate: [0, 0, -800],\n          rotate: [180, 0, 0],\n        },\n        next: {\n          shadow: true,\n          translate: [0, 0, -800],\n          rotate: [-180, 0, 0]\n        }\n      }\n    });\n\n    new Swiper('.swiper-5', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          translate: ['-125%', 0, -800],\n          rotate: [0, 0, -90],\n        },\n        next: {\n          shadow: true,\n          translate: ['125%', 0, -800],\n          rotate: [0, 0, 90]\n        }\n      }\n    });\n\n    new Swiper('.swiper-6', {\n      grabCursor: true,\n      effect: 'creative',\n      creativeEffect: {\n        prev: {\n          shadow: true,\n          origin: 'left center',\n          translate: ['-5%', 0, -200],\n          rotate: [0, 100, 0],\n        },\n        next: {\n          origin: 'right center',\n          translate: ['5%', 0, -200],\n          rotate: [0, -100, 0],\n        }\n      }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      margin: 100px auto;\n      width: 320px;\n      height: 240px;\n    }\n\n    .swiper-slide {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 22px;\n      font-weight: bold;\n      color: #fff;\n    }\n\n    .swiper-slide:nth-child(1n) {\n      background-color: rgb(206, 17, 17);\n    }\n\n    .swiper-slide:nth-child(2n) {\n      background-color: rgb(0, 140, 255);\n    }\n\n    .swiper-slide:nth-child(3n) {\n      background-color: rgb(10, 184, 111);\n    }\n\n    .swiper-slide:nth-child(4n) {\n      background-color: rgb(211, 122, 7);\n    }\n\n    .swiper-slide:nth-child(5n) {\n      background-color: rgb(118, 163, 12);\n    }\n\n    .swiper-slide:nth-child(6n) {\n      background-color: rgb(180, 10, 47);\n    }\n\n    .swiper-slide:nth-child(7n) {\n      background-color: rgb(35, 99, 19);\n    }\n\n    .swiper-slide:nth-child(8n) {\n      background-color: rgb(0, 68, 255);\n    }\n\n    .swiper-slide:nth-child(9n) {\n      background-color: rgb(218, 12, 218);\n    }\n\n    .swiper-slide:nth-child(10n) {\n      background-color: rgb(54, 94, 77);\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/260-keyboard-control.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 1,\n      spaceBetween: 30,\n      keyboard: {\n        enabled: true,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/270-mousewheel-control.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\" />\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\" />\n\n  <!-- Link Swiper's CSS -->\n  <link rel=\"stylesheet\" href=\"../dist/swiper-bundle.min.css\" />\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      direction: 'vertical',\n      slidesPerView: 1,\n      spaceBetween: 30,\n      mousewheel: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/280-autoplay.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      spaceBetween: 30,\n      centeredSlides: true,\n      autoplay: {\n        delay: 2500,\n        disableOnInteraction: false,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/290-dynamic-slides.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n  <p class=\"append-buttons\">\n    <a href=\"#\" class=\"prepend-2-slides\">Prepend 2 Slides</a>\n    <a href=\"#\" class=\"prepend-slide\">Prepend Slide</a>\n    <a href=\"#\" class=\"append-slide\">Append Slide</a>\n    <a href=\"#\" class=\"append-2-slides\">Append 2 Slides</a>\n  </p>\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var appendNumber = 4;\n    var prependNumber = 1;\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      centeredSlides: true,\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n    document.querySelector('.prepend-2-slides').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.prependSlide([\n        '<div class=\"swiper-slide\">Slide ' + (--prependNumber) + '</div>',\n        '<div class=\"swiper-slide\">Slide ' + (--prependNumber) + '</div>'\n      ]);\n    });\n    document.querySelector('.prepend-slide').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.prependSlide('<div class=\"swiper-slide\">Slide ' + (--prependNumber) + '</div>');\n    });\n    document.querySelector('.append-slide').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.appendSlide('<div class=\"swiper-slide\">Slide ' + (++appendNumber) + '</div>');\n    });\n    document.querySelector('.append-2-slides').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.appendSlide([\n        '<div class=\"swiper-slide\">Slide ' + (++appendNumber) + '</div>',\n        '<div class=\"swiper-slide\">Slide ' + (++appendNumber) + '</div>'\n      ]);\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin: 20px auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .append-buttons {\n      text-align: center;\n      margin-top: 20px;\n    }\n\n    .append-buttons a {\n      display: inline-block;\n      border: 1px solid #007aff;\n      color: #007aff;\n      text-decoration: none;\n      padding: 4px 10px;\n      border-radius: 4px;\n      margin: 0 10px;\n      font-size: 13px;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/300-thumbs-gallery.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n\n\n\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper gallery-top\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-7.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-8.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-9.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-10.jpg)\"></div>\n    </div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next swiper-button-white\"></div>\n    <div class=\"swiper-button-prev swiper-button-white\"></div>\n  </div>\n  <div class=\"swiper gallery-thumbs\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-7.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-8.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-9.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-10.jpg)\"></div>\n    </div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var galleryThumbs = new Swiper('.gallery-thumbs', {\n      spaceBetween: 10,\n      slidesPerView: 4,\n      freeMode: true,\n      watchSlidesProgress: true,\n    });\n    var galleryTop = new Swiper('.gallery-top', {\n      spaceBetween: 10,\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      thumbs: {\n        swiper: galleryThumbs\n      }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #000;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      background-size: cover;\n      background-position: center;\n    }\n\n    .gallery-top {\n      height: 80%;\n      width: 100%;\n    }\n\n    .gallery-thumbs {\n      height: 20%;\n      box-sizing: border-box;\n      padding: 10px 0;\n    }\n\n    .gallery-thumbs .swiper-slide {\n      width: 25%;\n      height: 100%;\n      opacity: 0.4;\n    }\n\n    .gallery-thumbs .swiper-slide-thumb-active {\n      opacity: 1;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/310-thumbs-gallery-loop.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n\n\n\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper gallery-top\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-7.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-8.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-9.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-10.jpg)\"></div>\n    </div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next swiper-button-white\"></div>\n    <div class=\"swiper-button-prev swiper-button-white\"></div>\n  </div>\n  <div class=\"swiper gallery-thumbs\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-1.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-2.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-3.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-4.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-5.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-6.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-7.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-8.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-9.jpg)\"></div>\n      <div class=\"swiper-slide\" style=\"background-image:url(./images/nature-10.jpg)\"></div>\n    </div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var galleryThumbs = new Swiper('.gallery-thumbs', {\n      spaceBetween: 10,\n      slidesPerView: 4,\n      loop: true,\n      freeMode: true,\n      loopedSlides: 5, //looped slides should be the same\n      watchSlidesProgress: true,\n    });\n    var galleryTop = new Swiper('.gallery-top', {\n      spaceBetween: 10,\n      loop: true,\n      loopedSlides: 5, //looped slides should be the same\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      thumbs: {\n        swiper: galleryThumbs,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #000;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .swiper-slide {\n      background-size: cover;\n      background-position: center;\n    }\n\n    .gallery-top {\n      height: 80%;\n      width: 100%;\n    }\n\n    .gallery-thumbs {\n      height: 20%;\n      box-sizing: border-box;\n      padding: 10px 0;\n    }\n\n    .gallery-thumbs .swiper-slide {\n      height: 100%;\n      opacity: 0.4;\n    }\n\n    .gallery-thumbs .swiper-slide-thumb-active {\n      opacity: 1;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/320-multiple-swipers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper swiper1\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination1\"></div>\n  </div>\n\n  <!-- Swiper -->\n  <div class=\"swiper swiper2\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination2\"></div>\n  </div>\n\n  <!-- Swiper -->\n  <div class=\"swiper swiper3\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination3\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper1 = new Swiper('.swiper1', {\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination1',\n        clickable: true,\n      },\n    });\n    var swiper2 = new Swiper('.swiper2', {\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination2',\n        clickable: true,\n      },\n    });\n    var swiper3 = new Swiper('.swiper3', {\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination3',\n        clickable: true,\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin: 20px 0;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/330-hash-navigation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" data-hash=\"slide1\">Slide 1</div>\n      <div class=\"swiper-slide\" data-hash=\"slide2\">Slide 2</div>\n      <div class=\"swiper-slide\" data-hash=\"slide3\">Slide 3</div>\n      <div class=\"swiper-slide\" data-hash=\"slide4\">Slide 4</div>\n      <div class=\"swiper-slide\" data-hash=\"slide5\">Slide 5</div>\n      <div class=\"swiper-slide\" data-hash=\"slide6\">Slide 6</div>\n      <div class=\"swiper-slide\" data-hash=\"slide7\">Slide 7</div>\n      <div class=\"swiper-slide\" data-hash=\"slide8\">Slide 8</div>\n      <div class=\"swiper-slide\" data-hash=\"slide9\">Slide 9</div>\n      <div class=\"swiper-slide\" data-hash=\"slide10\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      spaceBetween: 30,\n      hashNavigation: {\n        watchState: true,\n      },\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/340-history.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Swiper Playground</title>\n  <meta name=\"viewport\" content=\"width=device-width\">\n\n</head>\n\n<body>\n  <div class=\"swiper\">\n    <div class=\"swiper-scrollbar\"></div>\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\" data-history=\"1\">Slide 1</div>\n      <div class=\"swiper-slide\" data-history=\"Slide 2\">Slide 2</div>\n      <div class=\"swiper-slide\" data-history=\"3\">Slide 3</div>\n      <div class=\"swiper-slide\" data-history=\"Slide 4\">Slide 4</div>\n      <div class=\"swiper-slide\" data-history=\"5\">Slide 5</div>\n      <div class=\"swiper-slide\" data-history=\"Slide 6\">Slide 6</div>\n      <div class=\"swiper-slide\" data-history=\"7\">Slide 7</div>\n      <div class=\"swiper-slide\" data-history=\"Slide 8\">Slide 8</div>\n      <div class=\"swiper-slide\" data-history=\"9\">Slide 9</div>\n      <div class=\"swiper-slide\" data-history=\"Slide 10\">Slide 10</div>\n    </div>\n    <div class=\"swiper-pagination\"></div>\n  </div>\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      spaceBetween: 50,\n      slidesPerView: 1,\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      pagination: {\n        el: '.swiper-pagination',\n      },\n      history: {\n        key: 'slide',\n      },\n    });\n  </script>\n\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/350-rtl.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\" dir=\"rtl\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Navigation -->\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-button-next\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/360-parallax.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"parallax-bg\" style=\"background-image:url(./images/nature-1.jpg)\" data-swiper-parallax=\"-23%\"></div>\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">\n        <div class=\"title\" data-swiper-parallax=\"-300\">Slide 1</div>\n        <div class=\"subtitle\" data-swiper-parallax=\"-200\">Subtitle</div>\n        <div class=\"text\" data-swiper-parallax=\"-100\">\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dictum mattis velit, sit amet faucibus\n            felis iaculis nec. Nulla laoreet justo vitae porttitor porttitor. Suspendisse in sem justo. Integer laoreet\n            magna nec elit suscipit, ac laoreet nibh euismod. Aliquam hendrerit lorem at elit facilisis rutrum. Ut at\n            ullamcorper velit. Nulla ligula nisi, imperdiet ut lacinia nec, tincidunt ut libero. Aenean feugiat non eros\n            quis feugiat.</p>\n        </div>\n      </div>\n      <div class=\"swiper-slide\">\n        <div class=\"title\" data-swiper-parallax=\"-300\" data-swiper-parallax-opacity=\"0\">Slide 2</div>\n        <div class=\"subtitle\" data-swiper-parallax=\"-200\">Subtitle</div>\n        <div class=\"text\" data-swiper-parallax=\"-100\">\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dictum mattis velit, sit amet faucibus\n            felis iaculis nec. Nulla laoreet justo vitae porttitor porttitor. Suspendisse in sem justo. Integer laoreet\n            magna nec elit suscipit, ac laoreet nibh euismod. Aliquam hendrerit lorem at elit facilisis rutrum. Ut at\n            ullamcorper velit. Nulla ligula nisi, imperdiet ut lacinia nec, tincidunt ut libero. Aenean feugiat non eros\n            quis feugiat.</p>\n        </div>\n      </div>\n      <div class=\"swiper-slide\">\n        <div class=\"title\" data-swiper-parallax=\"-300\">Slide 3</div>\n        <div class=\"subtitle\" data-swiper-parallax=\"-200\">Subtitle</div>\n        <div class=\"text\" data-swiper-parallax=\"-100\">\n          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dictum mattis velit, sit amet faucibus\n            felis iaculis nec. Nulla laoreet justo vitae porttitor porttitor. Suspendisse in sem justo. Integer laoreet\n            magna nec elit suscipit, ac laoreet nibh euismod. Aliquam hendrerit lorem at elit facilisis rutrum. Ut at\n            ullamcorper velit. Nulla ligula nisi, imperdiet ut lacinia nec, tincidunt ut libero. Aenean feugiat non eros\n            quis feugiat.</p>\n        </div>\n      </div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination-white\"></div>\n    <!-- Add Navigation -->\n    <div class=\"swiper-button-prev swiper-button-white\"></div>\n    <div class=\"swiper-button-next swiper-button-white\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      speed: 600,\n      parallax: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n      background: #000;\n    }\n\n    .swiper-slide {\n      font-size: 18px;\n      color: #fff;\n      -webkit-box-sizing: border-box;\n      box-sizing: border-box;\n      padding: 40px 60px;\n    }\n\n    .parallax-bg {\n      position: absolute;\n      left: 0;\n      top: 0;\n      width: 130%;\n      height: 100%;\n      -webkit-background-size: cover;\n      background-size: cover;\n      background-position: center;\n    }\n\n    .swiper-slide .title {\n      font-size: 41px;\n      font-weight: 300;\n    }\n\n    .swiper-slide .subtitle {\n      font-size: 21px;\n    }\n\n    .swiper-slide .text {\n      font-size: 14px;\n      max-width: 400px;\n      line-height: 1.3;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/370-lazy-load-images.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">\n        <!-- Required loading=\"lazy\" attribute -->\n        <img src=\"./images/nature-1.jpg\" loading=\"lazy\">\n        <!-- Preloader image -->\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n      <div class=\"swiper-slide\">\n        <img src=\"./images/nature-2.jpg\" loading=\"lazy\">\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n      <div class=\"swiper-slide\">\n        <img src=\"./images/nature-3.jpg\" loading=\"lazy\">\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n      <div class=\"swiper-slide\">\n        <img src=\"./images/nature-4.jpg\" loading=\"lazy\">\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n      <div class=\"swiper-slide\">\n        <img src=\"./images/nature-5.jpg\" loading=\"lazy\">\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n      <div class=\"swiper-slide\">\n        <img src=\"./images/nature-6.jpg\" loading=\"lazy\">\n        <div class=\"swiper-lazy-preloader swiper-lazy-preloader-white\"></div>\n      </div>\n\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination-white\"></div>\n    <!-- Navigation -->\n    <div class=\"swiper-button-next swiper-button-white\"></div>\n    <div class=\"swiper-button-prev swiper-button-white\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      // Enable lazy loading\n      lazy: true,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #000;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #000;\n\n    }\n\n    .swiper-slide img {\n      width: auto;\n      height: auto;\n      max-width: 100%;\n      max-height: 100%;\n      -ms-transform: translate(-50%, -50%);\n      -webkit-transform: translate(-50%, -50%);\n      -moz-transform: translate(-50%, -50%);\n      transform: translate(-50%, -50%);\n      position: absolute;\n      left: 50%;\n      top: 50%;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/380-responsive-breakpoints.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 1,\n      spaceBetween: 10,\n      // init: false,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      breakpoints: {\n        640: {\n          slidesPerView: 2,\n          spaceBetween: 20,\n        },\n        768: {\n          slidesPerView: 4,\n          spaceBetween: 40,\n        },\n        1024: {\n          slidesPerView: 5,\n          spaceBetween: 50,\n        },\n      }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/381-ratio-breakpoints.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 1,\n      spaceBetween: 10,\n      // init: false,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      breakpoints: {\n        '@0.00': {\n          slidesPerView: 1,\n          spaceBetween: 10,\n        },\n        '@0.75': {\n          slidesPerView: 2,\n          spaceBetween: 20,\n        },\n        '@1.00': {\n          slidesPerView: 3,\n          spaceBetween: 40,\n        },\n        '@1.50': {\n          slidesPerView: 4,\n          spaceBetween: 50,\n        },\n      }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/390-autoheight.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      autoHeight: true, //enable auto height\n      spaceBetween: 20,\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n    }\n\n    .swiper .swiper-slide {\n      height: 300px;\n      line-height: 300px;\n    }\n\n    .swiper .swiper-slide:nth-child(2n) {\n      height: 500px;\n      line-height: 500px;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/400-zoom.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">\n        <div class=\"swiper-zoom-container\">\n          <img src=\"./images/nature-1.jpg\">\n        </div>\n      </div>\n      <div class=\"swiper-slide\">\n        <div class=\"swiper-zoom-container\">\n          <img src=\"./images/nature-2.jpg\">\n        </div>\n      </div>\n      <div class=\"swiper-slide\">\n        <div class=\"swiper-zoom-container\">\n          <img src=\"./images/nature-3.jpg\">\n        </div>\n      </div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination swiper-pagination-white\"></div>\n    <!-- Add Navigation -->\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-button-next\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      zoom: true,\n      pagination: {\n        el: '.swiper-pagination',\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #000;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      overflow: hidden;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/410-virtual-slides.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\"></div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Arrows -->\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n  <p class=\"append-buttons\">\n    <a href=\"#\" class=\"prepend-2-slides\">Prepend 2 Slides</a>\n    <a href=\"#\" class=\"slide-1\">Slide 1</a>\n    <a href=\"#\" class=\"slide-250\">Slide 250</a>\n    <a href=\"#\" class=\"slide-500\">Slide 500</a>\n    <a href=\"#\" class=\"append-slide\">Append Slide</a>\n  </p>\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var appendNumber = 600;\n    var prependNumber = 1;\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      centeredSlides: true,\n      spaceBetween: 30,\n      pagination: {\n        el: '.swiper-pagination',\n        type: 'fraction',\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      virtual: {\n        slides: (function () {\n          var slides = [];\n          for (var i = 0; i < 600; i += 1) {\n            slides.push('Slide ' + (i + 1));\n          }\n          return slides;\n        }()),\n      },\n    });\n    document.querySelector('.slide-1').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.slideTo(0, 0);\n    });\n    document.querySelector('.slide-250').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.slideTo(249, 0);\n    });\n    document.querySelector('.slide-500').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.slideTo(499, 0);\n    });\n    document.querySelector('.prepend-2-slides').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.virtual.prependSlide([\n        'Slide ' + (--prependNumber),\n        'Slide ' + (--prependNumber)\n      ]);\n    });\n    document.querySelector('.append-slide').addEventListener('click', function (e) {\n      e.preventDefault();\n      swiper.virtual.appendSlide('Slide ' + (++appendNumber));\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin: 20px auto;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .append-buttons {\n      text-align: center;\n      margin-top: 20px;\n    }\n\n    .append-buttons a {\n      display: inline-block;\n      border: 1px solid #007aff;\n      color: #007aff;\n      text-decoration: none;\n      padding: 4px 10px;\n      border-radius: 4px;\n      margin: 0 10px;\n      font-size: 13px;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/420-custom-plugin.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n      <div class=\"swiper-slide\">Slide 8</div>\n      <div class=\"swiper-slide\">Slide 9</div>\n      <div class=\"swiper-slide\">Slide 10</div>\n    </div>\n    <!-- Add Pagination -->\n    <div class=\"swiper-pagination\"></div>\n    <!-- Add Navigation -->\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-button-next\"></div>\n  </div>\n\n\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n\n    /* ========\n    Debugger plugin, simple demo plugin to console.log some of callbacks\n    ======== */\n    function myPlugin({ swiper, extendParams, on }) {\n      extendParams({\n        debugger: false,\n      });\n\n      on('init', () => {\n        if (!swiper.params.debugger) return;\n        console.log('init');\n      });\n      on('click', (swiper, e) => {\n        if (!swiper.params.debugger) return;\n        console.log('click');\n      });\n      on('tap', (swiper, e) => {\n        if (!swiper.params.debugger) return;\n        console.log('tap');\n      });\n      on('doubleTap', (swiper, e) => {\n        if (!swiper.params.debugger) return;\n        console.log('doubleTap');\n      });\n      on('sliderMove', (swiper, e) => {\n        if (!swiper.params.debugger) return;\n        console.log('sliderMove');\n      });\n      on('slideChange', () => {\n        if (!swiper.params.debugger) return;\n        console.log('slideChange', swiper.previousIndex, '->', swiper.activeIndex);\n      });\n      on('slideChangeTransitionStart', () => {\n        if (!swiper.params.debugger) return;\n        console.log('slideChangeTransitionStart');\n      });\n      on('slideChangeTransitionEnd', () => {\n        if (!swiper.params.debugger) return;\n        console.log('slideChangeTransitionEnd');\n      });\n      on('transitionStart', () => {\n        if (!swiper.params.debugger) return;\n        console.log('transitionStart');\n      });\n      on('transitionEnd', () => {\n        if (!swiper.params.debugger) return;\n        console.log('transitionEnd');\n      });\n      on('fromEdge', () => {\n        if (!swiper.params.debugger) return;\n        console.log('fromEdge');\n      });\n      on('reachBeginning', () => {\n        if (!swiper.params.debugger) return;\n        console.log('reachBeginning');\n      });\n      on('reachEnd', () => {\n        if (!swiper.params.debugger) return;\n        console.log('reachEnd');\n      });\n\n    }\n\n    // Install Plugin To Swiper\n    Swiper.use([myPlugin]);\n\n    // Init Swiper\n    var swiper = new Swiper('.swiper', {\n      pagination: {\n        el: '.swiper-pagination',\n        clickable: true,\n      },\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      // Enable debugger\n      debugger: true,\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/430-slideable-menu.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide menu\">Menu slide</div>\n      <div class=\"swiper-slide content\">\n        <div class=\"menu-button\">\n          <div class=\"bar\"></div>\n          <div class=\"bar\"></div>\n          <div class=\"bar\"></div>\n        </div>\n        Content slide\n      </div>\n    </div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var menuButton = document.querySelector('.menu-button');\n    var openMenu = function () {\n      swiper.slidePrev();\n    };\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 'auto',\n      initialSlide: 1,\n      resistanceRatio: 0,\n      slideToClickedSlide: true,\n      on: {\n        slideChangeTransitionStart: function () {\n          var slider = this;\n          if (slider.activeIndex === 0) {\n            menuButton.classList.add('cross');\n            // required because of slideToClickedSlide\n            menuButton.removeEventListener('click', openMenu, true);\n          } else {\n            menuButton.classList.remove('cross');\n          }\n        }\n        , slideChangeTransitionEnd: function () {\n          var slider = this;\n          if (slider.activeIndex === 1) {\n            menuButton.addEventListener('click', openMenu, true);\n          }\n        },\n      }\n    });\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    .menu {\n      min-width: 100px;\n      width: 70%;\n      max-width: 320px;\n\n      background-color: #2C8DFB;\n      color: #fff;\n    }\n\n    .content {\n      width: 100%;\n    }\n\n    .menu-button {\n      position: absolute;\n      top: 0px;\n      left: 0px;\n\n      padding: 15px;\n\n      cursor: pointer;\n\n      -webkit-transition: .3s;\n      transition: .3s;\n\n      background-color: #2C8DFB;\n\n      /*margin: 14px;\n\t\t\tborder-radius: 5px;*/\n    }\n\n    .menu-button .bar:nth-of-type(1) {\n      margin-top: 0px;\n    }\n\n    .menu-button .bar:nth-of-type(3) {\n      margin-bottom: 0px;\n    }\n\n    .bar {\n      position: relative;\n      display: block;\n\n      width: 50px;\n      height: 5px;\n\n      margin: 10px auto;\n      background-color: #fff;\n\n      border-radius: 10px;\n\n      -webkit-transition: .3s;\n      transition: .3s;\n    }\n\n    .menu-button:hover .bar:nth-of-type(1) {\n      -webkit-transform: translateY(1.5px) rotate(-4.5deg);\n      -ms-transform: translateY(1.5px) rotate(-4.5deg);\n      transform: translateY(1.5px) rotate(-4.5deg);\n    }\n\n    .menu-button:hover .bar:nth-of-type(2) {\n      opacity: .9;\n    }\n\n    .menu-button:hover .bar:nth-of-type(3) {\n      -webkit-transform: translateY(-1.5px) rotate(4.5deg);\n      -ms-transform: translateY(-1.5px) rotate(4.5deg);\n      transform: translateY(-1.5px) rotate(4.5deg);\n    }\n\n    .cross .bar:nth-of-type(1) {\n      -webkit-transform: translateY(15px) rotate(-45deg);\n      -ms-transform: translateY(15px) rotate(-45deg);\n      transform: translateY(15px) rotate(-45deg);\n    }\n\n    .cross .bar:nth-of-type(2) {\n      opacity: 0;\n    }\n\n    .cross .bar:nth-of-type(3) {\n      -webkit-transform: translateY(-15px) rotate(45deg);\n      -ms-transform: translateY(-15px) rotate(45deg);\n      transform: translateY(-15px) rotate(45deg);\n    }\n\n    .cross:hover .bar:nth-of-type(1) {\n      -webkit-transform: translateY(13.5px) rotate(-40.5deg);\n      -ms-transform: translateY(13.5px) rotate(-40.5deg);\n      transform: translateY(13.5px) rotate(-40.5deg);\n    }\n\n    .cross:hover .bar:nth-of-type(2) {\n      opacity: .1;\n    }\n\n    .cross:hover .bar:nth-of-type(3) {\n      -webkit-transform: translateY(-13.5px) rotate(40.5deg);\n      -ms-transform: translateY(-13.5px) rotate(40.5deg);\n      transform: translateY(-13.5px) rotate(40.5deg);\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/440-change-direction.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n  <!-- Swiper -->\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n      <div class=\"swiper-slide\">Resize me!</div>\n    </div>\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n  </div>\n\n\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var swiper = new Swiper('.swiper', {\n      slidesPerView: 3,\n      direction: getDirection(),\n      navigation: {\n        nextEl: '.swiper-button-next',\n        prevEl: '.swiper-button-prev',\n      },\n      on: {\n        resize: function () {\n          swiper.changeDirection(getDirection());\n        }\n      }\n    });\n\n    function getDirection() {\n      var windowWidth = window.innerWidth;\n      var direction = window.innerWidth <= 760 ? 'vertical' : 'horizontal';\n\n      return direction;\n    }\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n\n      /* Center slide text vertically */\n      display: -webkit-box;\n      display: -ms-flexbox;\n      display: -webkit-flex;\n      display: flex;\n      -webkit-box-pack: center;\n      -ms-flex-pack: center;\n      -webkit-justify-content: center;\n      justify-content: center;\n      -webkit-box-align: center;\n      -ms-flex-align: center;\n      -webkit-align-items: center;\n      align-items: center;\n    }\n\n    @media (max-width: 760px) {\n      .swiper-button-next {\n        right: 20px;\n        transform: rotate(90deg);\n      }\n\n      .swiper-button-prev {\n        left: 20px;\n        transform: rotate(90deg);\n      }\n    }\n  </style>\n</body>\n\n</html>"
  },
  {
    "path": "demos/450-watchSlidesVisibility.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demo</title>\n</head>\n\n<body>\n  <!-- Swiper -->\n  <h3>Slider5 is visible when you slide to 2,3, or 4, and slider5 has \"swiper-slide-visible\" className</h3> <br>\n\n  <div class=\"swiper\" id=\"swiper2\" style=\"width:800px;\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide active-slider\">\n        slider1</div>\n      <div class=\"swiper-slide\" style=\"background: #8acc7d;\">\n        slider2</div>\n      <div class=\"swiper-slide\" style=\"background: #b7cc7d;\">\n        slider3</div>\n      <div class=\"swiper-slide\" style=\"background: #9eb75c;\">\n        slider4</div>\n      <div class=\"swiper-slide\" style=\"background: #7da8cc;\">\n        slider5</div>\n      <div class=\"swiper-slide\" style=\"background: #9f7dcc;\">\n        slider6</div>\n      <div class=\"swiper-slide\" style=\"background: #96cc7d;\">\n        slider7</div>\n      <div class=\"swiper-slide\" style=\"background: #cc7dae;\">\n        slider8</div>\n    </div>\n  </div>\n\n  <!-- Initialize Swiper -->\n  <script type=\"module\">\n    import Swiper from 'swiper/swiper-bundle.mjs';\n    import 'swiper/swiper-bundle.css';\n    var mySwiper2 = new Swiper('#swiper2', {\n      watchSlidesProgress: true,\n      slidesPerView: 3\n\n    })\n  </script>\n\n  <!-- Demo styles -->\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper-slide {\n      height: 300px;\n      background: #882525;\n      line-height: 300px;\n      text-align: center;\n    }\n  </style>\n\n</body>\n\n</html>"
  },
  {
    "path": "demos/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <title>Swiper demos</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n  <h1>Swiper demos</h1>\n\n  <ul>\n    <li><a href=\"/010-default.html\">010-default</a></li>\n    <li><a href=\"/020-navigation.html\">020-navigation</a></li>\n    <li><a href=\"/030-pagination.html\">030-pagination</a></li>\n    <li><a href=\"/040-pagination-dynamic.html\">040-pagination-dynamic</a></li>\n    <li><a href=\"/050-pagination-progress.html\">050-pagination-progress</a></li>\n    <li><a href=\"/060-pagination-fraction.html\">060-pagination-fraction</a></li>\n    <li><a href=\"/070-pagination-custom.html\">070-pagination-custom</a></li>\n    <li><a href=\"/080-scrollbar.html\">080-scrollbar</a></li>\n    <li><a href=\"/090-vertical.html\">090-vertical</a></li>\n    <li><a href=\"/100-space-between.html\">100-space-between</a></li>\n    <li><a href=\"/110-slides-per-view.html\">110-slides-per-view</a></li>\n    <li><a href=\"/120-slides-per-view-auto.html\">120-slides-per-view-auto</a></li>\n    <li><a href=\"/125-snap-to-slide-edge.html\">125-snap-to-slide-edge</a></li>\n    <li><a href=\"/130-centered.html\">130-centered</a></li>\n    <li><a href=\"/140-centered-auto.html\">140-centered-auto</a></li>\n    <li><a href=\"/145-css-mode.html\">145-css-mode</a></li>\n    <li><a href=\"/150-freemode.html\">150-freemode</a></li>\n    <li><a href=\"/160-scroll-container.html\">160-scroll-container</a></li>\n    <li><a href=\"/170-slides-per-column.html\">170-slides-per-column</a></li>\n    <li><a href=\"/180-nested.html\">180-nested</a></li>\n    <li><a href=\"/190-grab-cursor.html\">190-grab-cursor</a></li>\n    <li><a href=\"/200-infinite-loop.html\">200-infinite-loop</a></li>\n    <li><a href=\"/210-infinite-loop-with-slides-per-group.html\">210-infinite-loop-with-slides-per-group</a></li>\n    <li><a href=\"/211-slides-per-group-skip.html\">211-slides-per-group-skip</a></li>\n    <li><a href=\"/220-effect-fade.html\">220-effect-fade</a></li>\n    <li><a href=\"/230-effect-cube.html\">230-effect-cube</a></li>\n    <li><a href=\"/240-effect-coverflow.html\">240-effect-coverflow</a></li>\n    <li><a href=\"/250-effect-flip.html\">250-effect-flip</a></li>\n    <li><a href=\"/255-effect-cards.html\">255-effect-cards</a></li>\n    <li><a href=\"/257-effect-creative.html\">257-effect-creative</a></li>\n    <li><a href=\"/260-keyboard-control.html\">260-keyboard-control</a></li>\n    <li><a href=\"/270-mousewheel-control.html\">270-mousewheel-control</a></li>\n    <li><a href=\"/280-autoplay.html\">280-autoplay</a></li>\n    <li><a href=\"/290-dynamic-slides.html\">290-dynamic-slides</a></li>\n    <li><a href=\"/300-thumbs-gallery.html\">300-thumbs-gallery</a></li>\n    <li><a href=\"/310-thumbs-gallery-loop.html\">310-thumbs-gallery-loop</a></li>\n    <li><a href=\"/320-multiple-swipers.html\">320-multiple-swipers</a></li>\n    <li><a href=\"/330-hash-navigation.html\">330-hash-navigation</a></li>\n    <li><a href=\"/340-history.html\">340-history</a></li>\n    <li><a href=\"/350-rtl.html\">350-rtl</a></li>\n    <li><a href=\"/360-parallax.html\">360-parallax</a></li>\n    <li><a href=\"/370-lazy-load-images.html\">370-lazy-load-images</a></li>\n    <li><a href=\"/380-responsive-breakpoints.html\">380-responsive-breakpoints</a></li>\n    <li><a href=\"/381-ratio-breakpoints.html\">381-ratio-breakpoints</a></li>\n    <li><a href=\"/390-autoheight.html\">390-autoheight</a></li>\n    <li><a href=\"/400-zoom.html\">400-zoom</a></li>\n    <li><a href=\"/410-virtual-slides.html\">410-virtual-slides</a></li>\n    <li><a href=\"/420-custom-plugin.html\">420-custom-plugin</a></li>\n    <li><a href=\"/430-slideable-menu.html\">430-slideable-menu</a></li>\n    <li><a href=\"/440-change-direction.html\">440-change-direction</a></li>\n    <li><a href=\"/450-watchSlidesVisibility.html\">450-watchSlidesVisibility</a></li>\n  </ul>\n</body>\n\n</html>\n"
  },
  {
    "path": "demos/vite.config.js",
    "content": "import path from 'path';\n\nexport default {\n  server: {\n    host: '0.0.0.0',\n  },\n  resolve: {\n    alias: {\n      swiper: path.resolve(__dirname, '../dist/'),\n    },\n  },\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"swiper-src\",\n  \"version\": \"12.1.2\",\n  \"description\": \"Most modern mobile touch slider and framework with hardware accelerated transitions\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"node scripts/build\",\n    \"build:prod\": \"node scripts/build --prod\",\n    \"build-icons-font\": \"python ./scripts/icon-font/generate.py\",\n    \"watch\": \"node scripts/watch\",\n    \"demos\": \"npm run build && concurrently --kill-others \\\"vite ./demos/\\\" \\\"npm run watch\\\" \",\n    \"core\": \"npm run build && concurrently --kill-others \\\"vite ./playground/core\\\" \\\"npm run watch\\\" \",\n    \"element\": \"npm run build && concurrently --kill-others \\\"vite ./playground/element\\\" \\\"npm run watch\\\" \",\n    \"react\": \"npm run build && concurrently --kill-others \\\"vite ./playground/react\\\" \\\"npm run watch\\\"\",\n    \"vue\": \"npm run build && concurrently --kill-others \\\"vite ./playground/vue\\\" \\\"npm run watch\\\"\",\n    \"prettier\": \"prettier \\\"**/*.+(js|json|scss|css|less|ts|jsx|mjs)\\\"\",\n    \"format\": \"npm run prettier -- --write\",\n    \"check-format\": \"npm run prettier -- --list-different\",\n    \"lint\": \"eslint --ext .js,.jsx .\",\n    \"validate\": \"npm-run-all --parallel check-format lint\",\n    \"release\": \"npm run validate && node ./scripts/release\",\n    \"test\": \"npm run validate && npm run build:prod\",\n    \"changelog\": \"npx conventional-changelog -p angular -i CHANGELOG.md -u -s\",\n    \"build-sponsors\": \"node scripts/build-sponsors.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/nolimits4web/Swiper.git\"\n  },\n  \"keywords\": [\n    \"swiper\",\n    \"swipe\",\n    \"slider\",\n    \"touch\",\n    \"ios\",\n    \"mobile\",\n    \"cordova\",\n    \"phonegap\",\n    \"app\",\n    \"framework\",\n    \"framework7\",\n    \"carousel\",\n    \"gallery\",\n    \"plugin\",\n    \"vue\",\n    \"slideshow\"\n  ],\n  \"author\": \"Vladimir Kharlampidi\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/nolimits4web/swiper/issues\"\n  },\n  \"homepage\": \"https://swiperjs.com\",\n  \"funding\": [\n    {\n      \"type\": \"patreon\",\n      \"url\": \"https://www.patreon.com/vladimirkharlampidi\"\n    },\n    {\n      \"type\": \"open_collective\",\n      \"url\": \"http://opencollective.com/swiper\"\n    }\n  ],\n  \"engines\": {\n    \"node\": \">= 4.7.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.23.0\",\n    \"@babel/core\": \"^7.23.2\",\n    \"@babel/preset-env\": \"^7.23.2\",\n    \"@babel/preset-react\": \"^7.22.15\",\n    \"@rollup/plugin-babel\": \"^6.0.4\",\n    \"@rollup/plugin-node-resolve\": \"^15.2.3\",\n    \"@rollup/plugin-replace\": \"^5.0.2\",\n    \"@types/react\": \"^18.2.31\",\n    \"@vitejs/plugin-vue\": \"^4.4.0\",\n    \"autoprefixer\": \"^10.4.21\",\n    \"chalk\": \"^5.3.0\",\n    \"clean-css\": \"^5.3.3\",\n    \"concurrently\": \"^8.2.2\",\n    \"conventional-changelog-cli\": \"^2.2.2\",\n    \"cross-env\": \"^7.0.3\",\n    \"cssnano\": \"^7.1.1\",\n    \"elapsed-time-logger\": \"^1.1.7\",\n    \"eslint\": \"^8.52.0\",\n    \"eslint-config-airbnb-base\": \"^15.0.0\",\n    \"eslint-config-prettier\": \"^9.0.0\",\n    \"eslint-plugin-import\": \"^2.29.0\",\n    \"eslint-plugin-prettier\": \"^5.0.1\",\n    \"eslint-plugin-react\": \"^7.33.2\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"exec-sh\": \"^0.4.0\",\n    \"fs-extra\": \"^11.1.1\",\n    \"globby\": \"^13.2.2\",\n    \"inquirer\": \"^9.2.11\",\n    \"less\": \"^4.2.0\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"postcss\": \"^8.5.6\",\n    \"postcss-nested\": \"^7.0.2\",\n    \"prettier\": \"^3.0.3\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"rimraf\": \"^5.0.5\",\n    \"rollup\": \"^4.1.4\",\n    \"ssr-window\": \"^5.0.1\",\n    \"terser\": \"^5.44.0\",\n    \"vite\": \"^4.5.0\",\n    \"vue\": \"^3.3.6\"\n  }\n}\n"
  },
  {
    "path": "playground/core/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <title>Swiper Playground</title>\n  <meta name=\"viewport\" content=\"width=device-width\" />\n  <style>\n    html,\n    body {\n      position: relative;\n      height: 100%;\n    }\n\n    body {\n      background: #eee;\n      font-family: Helvetica Neue, Helvetica, Arial, sans-serif;\n      font-size: 14px;\n      color: #000;\n      margin: 0;\n      padding: 0;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 100%;\n    }\n\n    .swiper-slide {\n      text-align: center;\n      font-size: 18px;\n      background: #fff;\n      display: flex !important;\n      justify-content: center;\n      align-items: center;\n    }\n  </style>\n</head>\n\n<body>\n  <div class=\"swiper\">\n    <div class=\"swiper-wrapper\">\n      <div class=\"swiper-slide\">Slide 1</div>\n      <div class=\"swiper-slide\">Slide 2</div>\n      <div class=\"swiper-slide\">Slide 3</div>\n      <div class=\"swiper-slide\">Slide 4</div>\n      <div class=\"swiper-slide\">Slide 5</div>\n      <div class=\"swiper-slide\">Slide 6</div>\n      <div class=\"swiper-slide\">Slide 7</div>\n    </div>\n    <div class=\"swiper-button-next\"></div>\n    <div class=\"swiper-button-prev\"></div>\n    <div class=\"swiper-pagination\"></div>\n    <div class=\"swiper-scrollbar\"></div>\n  </div>\n\n\n  <script type=\"module\">\n    // // eslint-disable-next-line\n    import 'swiper/swiper-bundle.css';\n\n    // // eslint-disable-next-line\n    import Swiper from 'swiper/swiper-bundle.mjs';\n\n    window.swiper = new Swiper(\".swiper\", {\n      slidesPerView: 'auto',\n      // spaceBetween: 30,\n      scrollbar: {\n        el: '.swiper-scrollbar',\n      },\n      pagination: {\n        el: \".swiper-pagination\",\n        clickable: true\n      },\n      navigation: {\n        nextEl: \".swiper-button-next\",\n        prevEl: \".swiper-button-prev\"\n      },\n    });\n\n  </script>\n</body>\n\n</html>"
  },
  {
    "path": "playground/core/vite.config.js",
    "content": "import path from 'path';\n\nexport default {\n  server: {\n    host: '0.0.0.0',\n  },\n  resolve: {\n    alias: {\n      swiper: path.resolve(__dirname, '../../dist/'),\n    },\n  },\n};\n"
  },
  {
    "path": "playground/element/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <title>Swiper Playground</title>\n  <meta name=\"viewport\" content=\"width=device-width\" />\n</head>\n\n<body>\n  <swiper-container navigation>\n    <swiper-slide>Slide 1</swiper-slide>\n    <swiper-slide>Slide 2</swiper-slide>\n    <swiper-slide>Slide 3</swiper-slide>\n    <swiper-slide>Slide 4</swiper-slide>\n    <swiper-slide>Slide 5</swiper-slide>\n  </swiper-container>\n  <style>\n    body,\n    html {\n      padding: 0;\n      margin: 0;\n      position: relative;\n      height: 100%;\n    }\n\n    swiper-container {\n      width: 100%;\n      height: 300px;\n      margin: 50px auto;\n    }\n\n    swiper-slide {\n      background: #f1f1f1;\n      color: #000;\n      text-align: center;\n      line-height: 300px;\n    }\n  </style>\n  <script type=\"module\">\n    import { register } from 'swiper/element/bundle';\n    register();\n\n    // document.querySelector('swiper-container').initialize();\n  </script>\n</body>\n\n</html>"
  },
  {
    "path": "playground/element/vite.config.js",
    "content": "import path from 'path';\n\nexport default {\n  server: {\n    host: '0.0.0.0',\n  },\n  resolve: {\n    alias: {\n      'swiper/element/bundle': path.resolve(__dirname, '../../dist/swiper-element-bundle.mjs'),\n      'swiper/element': path.resolve(__dirname, '../../dist/swiper-element.mjs'),\n      'swiper/bundle': path.resolve(__dirname, '../../dist/swiper-bundle.mjs'),\n      swiper: path.resolve(__dirname, '../../dist/'),\n    },\n  },\n};\n"
  },
  {
    "path": "playground/react/App.jsx",
    "content": "/* eslint-disable no-restricted-globals */\nimport React from 'react';\n// eslint-disable-next-line\nimport { A11y, Navigation, Pagination, Scrollbar, Mousewheel } from 'swiper/modules';\n// eslint-disable-next-line\nimport { Swiper, SwiperSlide } from 'swiper/swiper-react';\n\nconst App = () => {\n  return (\n    <main>\n      <Swiper\n        modules={[Pagination, Mousewheel, Navigation, Scrollbar]}\n        onSwiper={(swiper) => (window.swiper = swiper)}\n        slidesPerView={3.3}\n        threshold={2}\n        spaceBetween={10}\n        navigation={true}\n        scrollbar\n        mousewheel={{ forceToAxis: true, sensitivity: 0.1, releaseOnEdges: true }}\n        pagination={{ clickable: true }}\n      >\n        <SwiperSlide>Slide 1</SwiperSlide>\n        <SwiperSlide>Slide 2</SwiperSlide>\n        <SwiperSlide>Slide 3</SwiperSlide>\n        <SwiperSlide>Slide 4</SwiperSlide>\n        <SwiperSlide>Slide 5</SwiperSlide>\n      </Swiper>\n    </main>\n  );\n};\n\nexport default App;\n"
  },
  {
    "path": "playground/react/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Swiper React</title>\n  <style>\n    body,\n    html {\n      padding: 0;\n      margin: 0;\n      position: relative;\n      height: 100%;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin: 50px auto;\n    }\n\n    .swiper-slide {\n      background: #f1f1f1;\n      color: #000;\n      text-align: center;\n      line-height: 300px;\n    }\n  </style>\n</head>\n\n<body>\n  <div id=\"app\"></div>\n  <script type=\"module\" src=\"./main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "playground/react/main.js",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\n// eslint-disable-next-line\nimport 'swiper/swiper-bundle.css';\nimport App from './App.jsx';\n\n// eslint-disable-next-line\nconst root = createRoot(document.getElementById('app'));\nroot.render(React.createElement(App));\n"
  },
  {
    "path": "playground/react/vite.config.js",
    "content": "import path from 'path';\n\nexport default {\n  resolve: {\n    alias: {\n      swiper: path.resolve(__dirname, '../../dist/'),\n    },\n  },\n};\n"
  },
  {
    "path": "playground/vue/App.vue",
    "content": "<template>\n  <main>\n    <swiper\n      @swiper=\"onSwiper\"\n      :slidesPerView=\"3\"\n      :spaceBetween=\"50\"\n      navigation\n      :scrollbar=\"{ draggable: true }\"\n      :pagination=\"{ clickable: true }\"\n      :modules=\"modules\"\n    >\n      <swiper-slide><innerComp>Slide 1</innerComp></swiper-slide>\n      <swiper-slide>Slide 2</swiper-slide>\n      <swiper-slide>Slide 3</swiper-slide>\n      <swiper-slide>Slide 4</swiper-slide>\n      <swiper-slide>Slide 5</swiper-slide>\n      <swiper-slide>Slide 6</swiper-slide>\n      <swiper-slide>Slide 7</swiper-slide>\n      <swiper-slide>Slide 8</swiper-slide>\n      <swiper-slide>Slide 9</swiper-slide>\n      <swiper-slide>Slide 10</swiper-slide>\n    </swiper>\n  </main>\n</template>\n<script>\n// eslint-disable-next-line\nimport { Navigation, Pagination, Scrollbar, A11y } from 'swiper/modules';\n// eslint-disable-next-line\nimport { Swiper, SwiperSlide } from 'swiper/swiper-vue';\nimport innerComp from './innerComp.vue';\n\nexport default {\n  components: {\n    Swiper,\n    SwiperSlide,\n    innerComp,\n  },\n\n  setup() {\n    const onSwiper = (swiper) => {\n      window.swiper = swiper;\n    };\n    return {\n      modules: [Navigation, Pagination, Scrollbar, A11y],\n      onSwiper,\n    };\n  },\n};\n</script>\n"
  },
  {
    "path": "playground/vue/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Swiper Vue</title>\n  <style>\n    body,\n    html {\n      padding: 0;\n      margin: 0;\n      position: relative;\n      height: 100%;\n    }\n\n    .swiper {\n      width: 100%;\n      height: 300px;\n      margin: 50px auto;\n    }\n\n    .swiper-slide {\n      background: #f1f1f1;\n      color: #000;\n      text-align: center;\n      line-height: 300px;\n    }\n  </style>\n</head>\n\n<body>\n  <div id=\"app\"></div>\n  <script type=\"module\" src=\"./main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "playground/vue/innerComp.vue",
    "content": "<template>\n  test - {{ swiperSlide.isActive }} - {{ swiperSlide.isNext }}\n  <button @click=\"swiper.slideNext()\">Next</button>\n</template>\n<script>\nimport { inject } from 'vue';\nexport default {\n  setup() {\n    const swiper = inject('swiper');\n    const swiperSlide = inject('swiperSlide');\n    console.log({ swiper, swiperSlide });\n    return {\n      swiper,\n      swiperSlide,\n    };\n    // console.log(swiper, slideData);\n  },\n};\n</script>\n"
  },
  {
    "path": "playground/vue/main.js",
    "content": "// eslint-disable-next-line\nimport 'swiper/swiper-bundle.css';\nimport { createApp } from 'vue';\nimport App from './App.vue';\n\nconst app = createApp(App);\n\napp.mount('#app');\n"
  },
  {
    "path": "playground/vue/vite.config.js",
    "content": "import path from 'path';\nimport vue from '@vitejs/plugin-vue';\n\nexport default {\n  plugins: [vue()],\n  resolve: {\n    alias: {\n      swiper: path.resolve(__dirname, '../../dist/'),\n    },\n  },\n};\n"
  },
  {
    "path": "scripts/build-config.js",
    "content": "import { parseSwiperBuildModulesEnv } from './utils/helper.js';\n\nconst envBuildModules = parseSwiperBuildModulesEnv();\n\nexport const modules = envBuildModules || [\n  'virtual',\n  'keyboard',\n  'mousewheel',\n  'navigation',\n  'pagination',\n  'scrollbar',\n  'parallax',\n  'zoom',\n  'controller',\n  'a11y',\n  'history',\n  'hash-navigation',\n  'autoplay',\n  'thumbs',\n  'free-mode',\n  'grid',\n  'manipulation',\n  'effect-fade',\n  'effect-cube',\n  'effect-flip',\n  'effect-coverflow',\n  'effect-creative',\n  'effect-cards',\n];\n\nexport default {\n  modules,\n};\n"
  },
  {
    "path": "scripts/build-modules.js",
    "content": "/* eslint-disable no-shadow */\nimport fs from 'fs';\nimport { rollup } from 'rollup';\nimport { nodeResolve } from '@rollup/plugin-node-resolve';\nimport replace from '@rollup/plugin-replace';\nimport { babel } from '@rollup/plugin-babel';\nimport elapsed from 'elapsed-time-logger';\nimport chalk from 'chalk';\nimport getElementStyles from './utils/get-element-styles.js';\nimport { modules as configModules } from './build-config.js';\nimport { capitalizeString } from './utils/helper.js';\nimport minify from './utils/minify.js';\nimport { banner } from './utils/banner.js';\nimport isProd from './utils/isProd.js';\n\nexport default async function buildModules() {\n  elapsed.start('modules');\n\n  const modules = [];\n  configModules.forEach((name) => {\n    const capitalized = capitalizeString(name);\n    const jsFilePath = `./src/modules/${name}/${name}.mjs`;\n    if (fs.existsSync(jsFilePath)) {\n      modules.push({ name, capitalized });\n    }\n  });\n\n  // eslint-disable-next-line\n  const modulesPaths = configModules.map((name) => {\n    return `./src/modules/${name}/${name}.mjs`;\n  });\n\n  // Create element bundle\n  const coreElementContent = fs\n    .readFileSync('./src/swiper-element.mjs', 'utf-8')\n    .replace(`import Swiper from './swiper.mjs';`, `import Swiper from './swiper-bundle.mjs';`);\n  fs.writeFileSync('./src/swiper-element-bundle.mjs', coreElementContent);\n\n  const output = await rollup({\n    external: ['react', 'vue'],\n    input: [\n      './src/swiper.mjs',\n      './src/swiper-bundle.mjs',\n      './src/swiper-element.mjs',\n      './src/swiper-element-bundle.mjs',\n      './src/swiper-vue.mjs',\n      './src/swiper-react.mjs',\n      ...modulesPaths,\n      './src/swiper-effect-utils.mjs',\n    ],\n    plugins: [\n      replace({\n        delimiters: ['', ''],\n        '//IMPORT_MODULES': modules\n          .map((mod) => `import ${mod.capitalized} from './modules/${mod.name}/${mod.name}.mjs';`)\n          .join('\\n'),\n        '//INSTALL_MODULES': modules.map((mod) => `${mod.capitalized}`).join(',\\n  '),\n        '//EXPORT': 'export default Swiper; export { Swiper }',\n      }),\n      nodeResolve({ mainFields: ['module', 'main', 'jsnext'], rootDir: './src' }),\n      babel({ babelHelpers: 'bundled' }),\n    ],\n    onwarn() {},\n  });\n\n  await output.write({\n    dir: `./dist/tmp`,\n    format: 'esm',\n    entryFileNames: '[name].mjs',\n    hoistTransitiveImports: false,\n    chunkFileNames: (i) => {\n      if (i.name === 'swiper') return `swiper-core.mjs`;\n      return `[name].mjs`;\n    },\n  });\n\n  // REARRANGE FILES\n  const files = fs.readdirSync(`./dist/tmp`);\n  if (!fs.existsSync(`./dist/modules`)) {\n    fs.mkdirSync(`./dist/modules`);\n  }\n  files.forEach((fileName) => {\n    const folderName = fileName.split('.mjs')[0];\n    if (fs.existsSync(`./src/modules/${folderName}`)) {\n      fs.copyFileSync(`./dist/tmp/${fileName}`, `./dist/modules/${fileName}`);\n      fs.unlinkSync(`./dist/tmp/${fileName}`);\n    } else if (\n      (fileName.indexOf('swiper-') !== 0 && fileName !== 'swiper.mjs') ||\n      fileName === 'swiper-core.mjs'\n    ) {\n      if (!fs.existsSync('./dist/shared')) {\n        fs.mkdirSync('./dist/shared');\n      }\n      fs.copyFileSync(`./dist/tmp/${fileName}`, `./dist/shared/${fileName}`);\n      fs.unlinkSync(`./dist/tmp/${fileName}`);\n    } else {\n      fs.copyFileSync(`./dist/tmp/${fileName}`, `./dist/${fileName}`);\n      fs.unlinkSync(`./dist/tmp/${fileName}`);\n    }\n  });\n  if (fs.existsSync('./dist/tmp')) {\n    fs.rmdirSync('./dist/tmp');\n  }\n\n  // FIX IMPORTS\n  fs.readdirSync('./dist/modules')\n    .filter((f) => f.includes('.mjs'))\n    .forEach((modName) => {\n      const content = fs\n        .readFileSync(`./dist/modules/${modName}`, 'utf-8')\n        .replace(/from '\\.\\//g, `from '../shared/`);\n      fs.writeFileSync(`./dist/modules/${modName}`, content);\n    });\n\n  const { core, bundle, slide } = await getElementStyles();\n\n  fs.readdirSync('./dist/')\n    .filter((f) => f.includes('.mjs'))\n    .forEach((f) => {\n      let content = fs.readFileSync(`./dist/${f}`, 'utf-8');\n      if (f === 'swiper-bundle.mjs') {\n        content = content\n          .replace(/from '\\.\\/swiper-core/g, `from './shared/swiper-core`)\n          .replace(\n            /import ([0-9A-Za-z]*) from '\\.\\/([0-9a-z-]*).mjs'/g,\n            `import $1 from './modules/$2.mjs'`,\n          );\n      } else {\n        content = content.replace(/from '\\.\\//g, `from './shared/`);\n      }\n      // ADD ELEMENT STYLES\n      if (f === 'swiper-element.mjs') {\n        content = content\n          .replace('//SWIPER_STYLES', `const SwiperCSS = \\`${core}\\``)\n          .replace('//SWIPER_SLIDE_STYLES', `const SwiperSlideCSS = \\`${slide}\\``);\n      }\n      if (f === 'swiper-element-bundle.mjs') {\n        content = content\n          .replace('/swiper-bundle.js', `/swiper-bundle.mjs`)\n          .replace('//SWIPER_STYLES', `const SwiperCSS = \\`${bundle}\\``)\n          .replace('//SWIPER_SLIDE_STYLES', `const SwiperSlideCSS = \\`${slide}\\``);\n      }\n      // ADD BANNER\n      const bannerName = f.includes('react')\n        ? 'React'\n        : f.includes('vue')\n        ? 'Vue'\n        : f.includes('element')\n        ? 'Custom Element'\n        : '';\n\n      fs.writeFileSync(`./dist/${f}`, `${banner(bannerName)}\\n${content}`);\n    });\n\n  // MODULES_INDEX\n  fs.writeFileSync(\n    './dist/modules/index.mjs',\n    modules\n      .map((mod) => `export {default as ${mod.capitalized}} from './${mod.name}.mjs';`)\n      .join('\\n'),\n  );\n\n  // IIFE\n  const replaceExports = {};\n  ['swiper-bundle.mjs', 'swiper.mjs'].forEach((f) => {\n    const content = fs.readFileSync(`./dist/${f}`, 'utf-8');\n    const before = content.match(/export { ([^,]*), ([^}]*) }/)[0];\n    const after = before.replace(/export { ([^,]*), ([^}]*) }/, `export {$2}`);\n\n    replaceExports[f] = {\n      before,\n      after,\n    };\n    fs.writeFileSync(\n      `./dist/${f}`,\n      content.replace(replaceExports[f].before, replaceExports[f].after),\n    );\n  });\n\n  await Promise.all(\n    ['swiper-bundle.mjs', 'swiper.mjs', 'swiper-element.mjs', 'swiper-element-bundle.mjs'].map(\n      async (f) => {\n        const output = await rollup({\n          input: `./dist/${f}`,\n          plugins: [\n            replace({\n              preventAssignment: true,\n              delimiters: ['', ''],\n              'export { SwiperContainer, SwiperSlide, register };': 'register();',\n            }),\n          ],\n        });\n        await output.write({\n          file: `./dist/${f.replace('.mjs', '.js')}`,\n          format: 'iife',\n          name: f === 'swiper-bundle.mjs' || f === 'swiper.mjs' ? 'Swiper' : '',\n          banner: banner(f.includes('element') ? 'Custom Element' : ''),\n        });\n      },\n    ),\n  );\n\n  ['swiper-bundle.mjs', 'swiper.mjs'].forEach((f) => {\n    const content = fs.readFileSync(`./dist/${f}`, 'utf-8');\n    fs.writeFileSync(\n      `./dist/${f}`,\n      content.replace(replaceExports[f].after, replaceExports[f].before),\n    );\n  });\n\n  // REMOVE ELEMENT BUNDLE\n  if (isProd) {\n    fs.unlinkSync('./src/swiper-element-bundle.mjs');\n  }\n\n  if (!isProd) {\n    elapsed.end('modules', chalk.green('Modules build completed!'));\n    return;\n  }\n\n  // MINIFY\n  await Promise.all([\n    // MINIFY SHARED\n    ...fs\n      .readdirSync('./dist/shared')\n      .filter((f) => f.endsWith('.mjs') && !f.includes('.min'))\n      .map((f) => minify(f, `./dist/shared/${f}`)),\n    // MINIFY MODULES\n    ...fs\n      .readdirSync('./dist/modules')\n      .filter((f) => f.endsWith('.mjs') && !f.includes('.min'))\n      .map((f) => minify(f, `./dist/modules/${f}`)),\n    // MINIFY ROOT\n    ...fs\n      .readdirSync('./dist/')\n      .filter(\n        (f) =>\n          f.endsWith('.mjs') && !f.includes('.min') && !f.includes('react') && !f.includes('vue'),\n      )\n      .map((f) => {\n        const bannerName = f.includes('react')\n          ? 'React'\n          : f.includes('vue')\n          ? 'Vue'\n          : f.includes('element')\n          ? 'Custom Element'\n          : '';\n        return minify(f, `./dist/${f}`, bannerName);\n      }),\n    // IIFE\n    ...['swiper-bundle.js', 'swiper.js', 'swiper-element.js', 'swiper-element-bundle.js'].map(\n      (f) => {\n        const bannerName = f.includes('element') ? 'Custom Element' : '';\n        return minify(f, `./dist/${f}`, bannerName);\n      },\n    ),\n  ]);\n\n  elapsed.end('modules', chalk.green('Modules build completed!'));\n}\n"
  },
  {
    "path": "scripts/build-sponsors.js",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport https from 'https';\nimport * as url from 'url';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\nconst getSponsors = () => {\n  return new Promise((resolve, reject) => {\n    https\n      .get('https://swiperjs.com/sponsors-list.json', (resp) => {\n        let data = '';\n        // A chunk of data has been received.\n        resp.on('data', (chunk) => {\n          data += chunk;\n        });\n        // The whole response has been received. Print out the result.\n        resp.on('end', () => {\n          resolve(JSON.parse(data));\n        });\n      })\n      .on('error', (err) => {\n        reject(err);\n      });\n  });\n};\nconst buildTables = (sponsors) => {\n  const tableSponsors = [\n    ...(sponsors['Platinum Sponsor'] || []),\n    ...(sponsors['Gold Sponsor'] || []),\n    ...(sponsors['Silver Sponsor'] || []),\n    ...(sponsors['Sponsor'] || []), // eslint-disable-line\n  ];\n  let tableContent = '';\n  if (tableSponsors.length > 0) {\n    const rows = [];\n    const perRow = 12;\n    let rowIndex = 0;\n    tableSponsors.forEach((item, index) => {\n      const colIndex = index - perRow * rowIndex;\n      if (colIndex > perRow - 1) rowIndex += 1;\n      if (!rows[rowIndex]) rows[rowIndex] = [];\n      rows[rowIndex].push(item);\n    });\n    if (rows.length > 0 && rows[rows.length - 1].length < perRow) {\n      rows[rows.length - 1].push(...Array.from({ length: perRow - rows[rows.length - 1].length }));\n    }\n    tableContent = `\\n<table>\\n${rows\n      .map((items) =>\n        [\n          `  <tr>`,\n          items\n            .map((item) =>\n              !item\n                ? '    <td align=\"center\" valign=\"middle\"></td>'\n                : [\n                    `    <td align=\"center\" valign=\"middle\">`,\n                    `      <a href=\"${item.link}\" target=\"_blank\">`,\n                    `        <img src=\"https://swiperjs.com/images/sponsors/${item.image}\" alt=\"${item.title}\" width=\"160\">`,\n                    `      </a>`,\n                    `    </td>`,\n                  ].join('\\n'),\n            )\n            .join('\\n'),\n          `  </tr>`,\n        ].join('\\n'),\n      )\n      .join('\\n')}\\n</table>\\n`;\n  }\n  const backersContent = fs\n    .readFileSync(path.resolve(__dirname, '../BACKERS.md'), 'utf-8')\n    .split('<!-- SPONSORS_TABLE_WRAP -->');\n  backersContent[1] = tableContent;\n  const readmeContent = fs\n    .readFileSync(path.resolve(__dirname, '../README.md'), 'utf-8')\n    .split('<!-- SPONSORS_TABLE_WRAP -->');\n  readmeContent[1] = tableContent;\n  fs.writeFileSync(\n    path.resolve(__dirname, '../BACKERS.md'),\n    backersContent.join('<!-- SPONSORS_TABLE_WRAP -->'),\n  );\n  fs.writeFileSync(\n    path.resolve(__dirname, '../README.md'),\n    readmeContent.join('<!-- SPONSORS_TABLE_WRAP -->'),\n  );\n};\nconst buildSponsorsList = async (sponsors) => {\n  const silverSponsorsContent = sponsors['Silver Sponsor'].map((item) =>\n    `\n  - [${item.title}](${item.link})\n  `.trim(),\n  );\n  const sponsorsContent = sponsors.Sponsor.map((item) =>\n    `\n  - [${item.title}](${item.link})\n  `.trim(),\n  );\n  let backersContent = fs.readFileSync(path.resolve(__dirname, '../BACKERS.md'), 'utf-8');\n  backersContent = backersContent.split('<!-- SILVER_SPONSOR -->');\n  backersContent[1] = `\\n${silverSponsorsContent.join('\\n')}\\n`;\n  backersContent = backersContent.join('<!-- SILVER_SPONSOR -->');\n  backersContent = backersContent.split('<!-- SPONSOR -->');\n  backersContent[1] = `\\n${sponsorsContent.join('\\n')}\\n`;\n  backersContent = backersContent.join('<!-- SPONSOR -->');\n  fs.writeFileSync(path.resolve(__dirname, '../BACKERS.md'), backersContent);\n};\nconst buildSponsors = async () => {\n  const entries = await getSponsors();\n  const sponsors = {};\n  if (entries) {\n    const items = [...entries];\n    items.sort((a, b) => {\n      return new Date(a.createdAt) > new Date(b.createdAt) ? -1 : 1;\n    });\n    items.forEach((item) => {\n      if (!sponsors[item.plan]) sponsors[item.plan] = [];\n      sponsors[item.plan].push(item);\n    });\n  }\n  buildTables(sponsors);\n  buildSponsorsList(sponsors);\n};\nbuildSponsors();\n"
  },
  {
    "path": "scripts/build-styles.js",
    "content": "import fs from 'fs-extra';\nimport path from 'path';\nimport { globby } from 'globby';\nimport * as url from 'url';\nimport chalk from 'chalk';\nimport elapsed from 'elapsed-time-logger';\nimport autoprefixer from './utils/autoprefixer.js';\nimport minifyCSS from './utils/minify-css.js';\nimport { banner } from './utils/banner.js';\nimport config from './build-config.js';\nimport { outputDir } from './utils/output-dir.js';\nimport isProd from './utils/isProd.js';\nimport { getSplittedCSS, proceedReplacements } from './utils/get-element-styles.js';\nimport unwrapCss from './utils/unwrap-css.js';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nconst buildCSS = async ({ isBundle, modules, minified }) => {\n  const coreContent = await fs.readFile(path.resolve(__dirname, '../src/swiper.css'), 'utf8');\n  const modulesContent = [];\n  for (const mod of modules) {\n    modulesContent.push(\n      // eslint-disable-next-line no-await-in-loop\n      await fs.readFile(path.resolve(__dirname, `../src/modules/${mod}/${mod}.css`), 'utf8'),\n    );\n  }\n\n  const swiperCSS = await autoprefixer(coreContent);\n  const swiperBundleCSS = await autoprefixer([coreContent, ...modulesContent].join('\\n'));\n\n  const fileName = isBundle ? 'swiper-bundle' : 'swiper';\n  // Write file\n  await fs.ensureDir(`./${outputDir}`);\n\n  await fs.writeFile(\n    `./${outputDir}/${fileName}.css`,\n    `${banner()}\\n${isBundle ? swiperBundleCSS : swiperCSS}`,\n  );\n\n  if (minified) {\n    const minifiedContent = await minifyCSS(isBundle ? swiperBundleCSS : swiperCSS);\n    await fs.writeFile(`./${outputDir}/${fileName}.min.css`, `${banner()}\\n${minifiedContent}`);\n  }\n};\nexport default async function buildStyles() {\n  elapsed.start('styles');\n  // eslint-disable-next-line import/no-named-as-default-member\n  const modules = config.modules.filter((name) => {\n    const cssFilePath = `./src/modules/${name}/${name}.css`;\n    return fs.existsSync(cssFilePath);\n  });\n  buildCSS({ isBundle: true, modules, minified: isProd });\n  buildCSS({ isBundle: false, modules, minified: isProd });\n  if (isProd) {\n    // Copy css\n    const files = await globby(['**/**.css'], {\n      cwd: path.resolve(__dirname, '../src'),\n    });\n    await Promise.all(\n      files.map(async (file) => {\n        let distFilePath = path.resolve(__dirname, `../${outputDir}`, file);\n        const srcFilePath = path.resolve(__dirname, '../src', file);\n        let distFileContent = fs.readFileSync(srcFilePath, 'utf-8');\n        if (file === 'swiper.css') {\n          distFileContent = `${banner()}\\n${distFileContent}`;\n        }\n        if (distFilePath.includes('/modules/') || distFilePath.includes('\\\\modules\\\\')) {\n          distFilePath = distFilePath\n            .replace(/modules\\/([a-zA-Z0-9-]*)/, 'modules')\n            .replace(/modules\\\\([a-zA-Z0-9-]*)/, 'modules');\n        }\n        await fs.ensureDir(path.dirname(distFilePath));\n        await fs.writeFile(distFilePath, distFileContent);\n      }),\n    );\n    const modulesCSSFiles = await globby(['**/**.css'], {\n      cwd: path.resolve(__dirname, '../dist/modules'),\n      absolute: true,\n    });\n    await Promise.all(\n      modulesCSSFiles.map(async (filePath) => {\n        const cssContent = await fs.readFile(filePath, 'utf-8');\n        const resultCSS = await autoprefixer(cssContent);\n        const unwrappedCSS = await unwrapCss(resultCSS);\n        const resultCSSElement = proceedReplacements(getSplittedCSS(unwrappedCSS).container);\n        const resultFilePath = filePath.replace(/\\.css$/, '');\n        const minifiedCSS = await minifyCSS(resultCSS);\n        const minifiedCSSElement = await minifyCSS(resultCSSElement);\n        await fs.writeFile(`${resultFilePath}.css`, resultCSS);\n        await fs.writeFile(`${resultFilePath}-element.css`, resultCSSElement);\n        await fs.writeFile(`${resultFilePath}.min.css`, minifiedCSS);\n        await fs.writeFile(`${resultFilePath}-element.min.css`, minifiedCSSElement);\n      }),\n    );\n  }\n  elapsed.end('styles', chalk.green('Styles build completed!'));\n}\n"
  },
  {
    "path": "scripts/build-types.js",
    "content": "import path from 'path';\nimport { globby } from 'globby';\nimport elapsed from 'elapsed-time-logger';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport * as url from 'url';\nimport { outputDir } from './utils/output-dir.js';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nexport default async function buildTypes() {\n  elapsed.start('types');\n  let coreEventsReact = '';\n  let coreEventsVue = '';\n  let coreEventsElement = '';\n  let modulesEventsReact = '';\n  let modulesEventsVue = '';\n  let modulesEventsElement = '';\n\n  const replaceInstances = (content) => {\n    return content\n      .replace(/this: Swiper, /g, '')\n      .replace(/this: Swiper/g, '')\n      .replace(/swiper: Swiper/g, 'swiper: SwiperClass');\n  };\n  const getCoreEventsContent = async () => {\n    let coreEventsContent = await fs.readFile(\n      path.resolve(__dirname, '../src/types/swiper-events.d.ts'),\n      'utf-8',\n    );\n    coreEventsContent = coreEventsContent\n      .split('// CORE_EVENTS_START')[1]\n      .split('// CORE_EVENTS_END')[0];\n    coreEventsElement = coreEventsContent.replace(\n      / ([a-zA-Z_?]*): ([^;]*);/g,\n      (string, name, args) => {\n        if (\n          name.includes('_') ||\n          name.toLowerCase() === 'classnames' ||\n          name.toLowerCase() === 'index'\n        ) {\n          return '';\n        }\n        args = args\n          .replace('(', '')\n          .replace(')', '')\n          .split('=>')[0]\n          .replace('SwiperClass', 'Swiper')\n          .trim();\n        return ` ${name.toLowerCase()}: CustomEvent<[${args}]>;`;\n      },\n    );\n    coreEventsReact = replaceInstances(\n      coreEventsContent.replace(/ ([a-zA-Z]*): \\(/g, (string, name) => {\n        return ` on${name[0].toUpperCase()}${name.substr(1)}?: (`;\n      }),\n    );\n    coreEventsVue = replaceInstances(\n      coreEventsContent.replace(/ ([a-zA-Z_?]*): \\(/g, (string, name) => {\n        return ` ${name.replace('?', '')}: (`;\n      }),\n    );\n  };\n  const getModulesEventsContent = async () => {\n    const eventsFiles = await globby('src/types/modules/*.d.ts');\n    await Promise.all(\n      eventsFiles.map(async (eventsFile) => {\n        if (eventsFile.indexOf('public-api') > -1 || eventsFile.indexOf('index') > -1) {\n          return;\n        }\n        let eventsContent = await fs.readFile(eventsFile, 'utf-8');\n        eventsContent = eventsContent.split('Events {')[1].split('}')[0].trim();\n        if (eventsContent.length) {\n          modulesEventsElement += eventsContent.replace(\n            / ([a-zA-Z]*): ([^;]*);/g,\n            (string, name, args) => {\n              args = args\n                .replace('(', '')\n                .replace(')', '')\n                .split('=>')[0]\n                .replace('SwiperClass', 'Swiper')\n                .trim();\n              return ` ${name.toLowerCase()}: CustomEvent<[${args}]>;`;\n            },\n          );\n          modulesEventsReact += replaceInstances(\n            eventsContent.replace(/ ([a-zA-Z]*): \\(/g, (string, name) => {\n              return ` on${name[0].toUpperCase()}${name.substr(1)}?: (`;\n            }),\n          );\n          modulesEventsVue += replaceInstances(\n            eventsContent.replace(/ ([a-zA-Z_?]*): \\(/g, (string, name) => {\n              return ` ${name.replace('?', '')}: (`;\n            }),\n          );\n        }\n      }),\n    );\n  };\n\n  let files;\n  await Promise.all([\n    getCoreEventsContent(),\n    getModulesEventsContent(),\n    (async () => {\n      files = await globby('**/*.d.ts', { cwd: path.resolve(__dirname, '../src') });\n    })(),\n  ]);\n\n  await Promise.all(\n    files.map(async (file) => {\n      const fileContent = await fs.readFile(path.resolve(__dirname, '../src', file), 'utf-8');\n      const destPath = path.resolve(__dirname, `../${outputDir}`, file);\n      await fs.ensureDir(path.dirname(destPath));\n      const processTypingFile = async (eventsCode, modulesCode) => {\n        const content = fileContent\n          .replace('// MODULES_EVENTS', eventsCode)\n          .replace('// CORE_EVENTS', modulesCode);\n        return fs.writeFile(destPath, content);\n      };\n      if (file.includes('swiper-element.d.ts')) {\n        return processTypingFile(coreEventsElement, modulesEventsElement);\n      }\n      if (file.includes('swiper-react.d.ts')) {\n        return processTypingFile(coreEventsReact, modulesEventsReact);\n      }\n      if (file.includes('swiper-vue.d.ts')) {\n        return processTypingFile(coreEventsVue, modulesEventsVue);\n      }\n      return fs.writeFile(destPath, fileContent);\n    }),\n  );\n  elapsed.end('types', chalk.green('Types build completed!'));\n}\n"
  },
  {
    "path": "scripts/build.js",
    "content": "import chalk from 'chalk';\nimport fs from 'fs-extra';\nimport elapsed from 'elapsed-time-logger';\nimport buildTypes from './build-types.js';\nimport buildStyles from './build-styles.js';\nimport buildModules from './build-modules.js';\nimport { outputDir } from './utils/output-dir.js';\nimport isProd from './utils/isProd.js';\n\nclass Build {\n  constructor() {\n    this.tasks = [];\n    // eslint-disable-next-line no-constructor-return\n    return this;\n  }\n\n  add(flag, buildFn) {\n    this.tasks.push(() => buildFn());\n    return this;\n  }\n\n  async run() {\n    if (isProd) {\n      await fs.remove(`./${outputDir}`);\n      await fs.ensureDir(`./${outputDir}`);\n    }\n    await fs.copy('./src/copy/', `./${outputDir}`);\n\n    try {\n      for (const buildFn of this.tasks) {\n        await buildFn(); // eslint-disable-line\n      }\n    } catch (err) {\n      console.error(err);\n      process.exit(1);\n    }\n    return true;\n  }\n}\n(async () => {\n  elapsed.start('build');\n  const build = new Build();\n  await build\n    .add('modules', buildModules)\n    .add('types', buildTypes)\n    .add('styles', buildStyles)\n    .run();\n  elapsed.end('build', chalk.bold.green('Build completed'));\n})();\n"
  },
  {
    "path": "scripts/release.js",
    "content": "import exec from 'exec-sh';\nimport inquirer from 'inquirer';\nimport fs from 'fs';\nimport path from 'path';\nimport { rimraf } from 'rimraf';\nimport * as url from 'url';\n\nconst pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url)));\nconst childPkg = JSON.parse(fs.readFileSync(new URL('../src/copy/package.json', import.meta.url)));\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nasync function release() {\n  const date = new Date();\n  const formatter = new Intl.DateTimeFormat('en', {\n    day: 'numeric',\n    year: 'numeric',\n    month: 'long',\n  });\n  const releaseDate = formatter.format(date);\n\n  const options = await inquirer.prompt([\n    {\n      type: 'input',\n      name: 'version',\n      message: 'Version:',\n      default: pkg.version,\n    },\n    {\n      type: 'list',\n      name: 'alpha',\n      message: 'Alpha?',\n      when: (opts) => opts.version.indexOf('alpha') >= 0,\n      choices: [\n        {\n          name: 'YES',\n          value: true,\n        },\n        {\n          name: 'NO',\n          value: false,\n        },\n      ],\n    },\n    {\n      type: 'list',\n      name: 'beta',\n      message: 'Beta?',\n      when: (opts) => opts.version.indexOf('beta') >= 0,\n      choices: [\n        {\n          name: 'YES',\n          value: true,\n        },\n        {\n          name: 'NO',\n          value: false,\n        },\n      ],\n    },\n    {\n      type: 'list',\n      name: 'next',\n      message: 'Next?',\n      when: (opts) => opts.version.indexOf('next') >= 0,\n      choices: [\n        {\n          name: 'YES',\n          value: true,\n        },\n        {\n          name: 'NO',\n          value: false,\n        },\n      ],\n    },\n  ]);\n  // Set version\n  pkg.version = options.version;\n  childPkg.version = options.version;\n  childPkg.releaseDate = releaseDate;\n  // Copy dependencies\n  childPkg.dependencies = pkg.dependencies;\n  fs.writeFileSync(path.resolve(__dirname, '../package.json'), `${JSON.stringify(pkg, null, 2)}\\n`);\n  fs.writeFileSync(\n    path.resolve(__dirname, '../src/copy/package.json'),\n    `${JSON.stringify(childPkg, null, 2)}\\n`,\n  );\n\n  await exec.promise('git pull');\n  await exec.promise('npm i');\n  rimraf.sync(path.resolve(__dirname, 'dir'));\n  fs.mkdirSync(path.resolve(__dirname, 'dir'));\n  await exec.promise(`npm run build:prod`);\n  await exec.promise('git add .');\n  await exec.promise(`git commit -m ${pkg.version} --no-verify`);\n  await exec.promise('git push');\n  await exec.promise(`git tag v${pkg.version}`);\n  await exec.promise('git push origin --tags');\n  if (options.beta) {\n    await exec.promise('cd ./dist && npm publish --tag beta');\n  } else if (options.alpha || options.next) {\n    await exec.promise('cd ./dist && npm publish --tag next');\n  } else {\n    await exec.promise('cd ./dist && npm publish');\n  }\n}\nrelease();\n"
  },
  {
    "path": "scripts/utils/autoprefixer.js",
    "content": "import postcss from 'postcss';\nimport autoprefixer from 'autoprefixer';\n\nexport default async (content, { from = undefined, to = undefined } = {}) =>\n  new Promise((resolve, reject) => {\n    postcss([autoprefixer])\n      .process(content, { from, to })\n      .then((result) => {\n        result.warnings().forEach((warn) => {\n          console.warn(warn.toString());\n        });\n        resolve(result.css);\n      })\n      .catch((err) => {\n        reject(err);\n        throw err;\n      });\n  });\n"
  },
  {
    "path": "scripts/utils/banner.js",
    "content": "import fs from 'fs-extra';\n\nconst pkg = JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url)));\nconst date = {\n  day: new Date().getDate(),\n  month:\n    'January February March April May June July August September October November December'.split(\n      ' ',\n    )[new Date().getMonth()],\n  year: new Date().getFullYear(),\n};\nfunction banner(name = null) {\n  return `${`\n/**\n * Swiper ${name ? `${name} ` : ''}${pkg.version}\n * ${pkg.description}\n * ${pkg.homepage}\n *\n * Copyright 2014-${date.year} ${pkg.author}\n *\n * Released under the ${pkg.license} License\n *\n * Released on: ${date.month} ${date.day}, ${date.year}\n */\n`.trim()}\\n`;\n}\nasync function addBannerToFile(file, name) {\n  const content = await fs.readFile(file, 'utf-8');\n  await fs.writeFile(file, `${banner(name)}\\n${content}`);\n}\nexport { banner };\nexport { addBannerToFile };\nexport default {\n  banner,\n  addBannerToFile,\n};\n"
  },
  {
    "path": "scripts/utils/get-element-styles.js",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport * as url from 'url';\nimport autoprefixer from './autoprefixer.js';\nimport minifyCss from './minify-css.js';\nimport config from '../build-config.js';\nimport unwrapCss from './unwrap-css.js';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nexport const getSplittedCSS = (content) => {\n  const cssStylesSlideCore = (content.split(`/* Slide styles start */`)[1] || '').split(\n    `/* Slide styles end */`,\n  )[0];\n  const cssStylesSlideCube = (content.split(`/* Cube slide shadows start */`)[1] || '').split(\n    `/* Cube slide shadows end */`,\n  )[0];\n  const cssStylesSlideFlip = (content.split(`/* Flip slide shadows start */`)[1] || '').split(\n    `/* Flip slide shadows end */`,\n  )[0];\n  const cssStylesSlideZoom = (content.split(`/* Zoom container styles start */`)[1] || '').split(\n    `/* Zoom container styles end */`,\n  )[0];\n  content = content\n    .replace(cssStylesSlideCore, '')\n    .replace(cssStylesSlideCube, '')\n    .replace(cssStylesSlideFlip, '')\n    .replace(cssStylesSlideZoom, '');\n\n  return {\n    slides: [\n      cssStylesSlideCore || '',\n      cssStylesSlideCube || '',\n      cssStylesSlideFlip || '',\n      cssStylesSlideZoom || '',\n    ].join('\\n'),\n    container: content,\n  };\n};\nexport const proceedReplacements = (content = '') => {\n  // eslint-disable-next-line\n  const replace = ['invisible-blank', 'visible', 'zoomed', 'active', 'next', 'prev'];\n\n  content = content\n    .replace(/:root/g, ':host')\n    .split('\\n')\n    .map((line) => {\n      if (line.includes('.swiper {')) {\n        return line.replace('.swiper {', '.swiper {width: 100%; height: 100%;');\n      }\n      if (line.includes('> .swiper-wrapper > .swiper-slide')) {\n        return line.replace('> .swiper-wrapper > .swiper-slide', '::slotted(swiper-slide)');\n      }\n      let replaced = '';\n      if (line.includes('.swiper-slide ')) {\n        replaced = line.replaceAll(/\\.swiper-slide /g, '::slotted(swiper-slide) ');\n      }\n      if (line.includes('.swiper-slide,')) {\n        replaced = line.replaceAll(/\\.swiper-slide,/g, '::slotted(swiper-slide),');\n      }\n      if (line.includes('.swiper-slide:')) {\n        replaced = line.replaceAll(/\\.swiper-slide:/g, '::slotted(swiper-slide):');\n      }\n      replace.forEach((key) => {\n        const l = replaced || line;\n        if (l.includes(`.swiper-slide-${key}`)) {\n          replaced = l.replaceAll(`.swiper-slide-${key}`, `::slotted(.swiper-slide-${key})`);\n        }\n      });\n      if (replaced) {\n        return replaced;\n      }\n\n      return line;\n    })\n    .join('\\n');\n  return content;\n};\nconst proceedSlideReplacements = (content) => {\n  content = content\n    .split('\\n')\n    .map((line) => {\n      if (line === '.swiper-lazy-preloader {') {\n        return line.replace(\n          '.swiper-lazy-preloader {',\n          '.swiper-lazy-preloader {animation: swiper-preloader-spin 1s infinite linear;',\n        );\n      }\n      if (line.includes('animation: swiper-preloader-spin 1s infinite linear;')) {\n        return '';\n      }\n      if (line.includes('.swiper-zoom-container')) {\n        return line.replace('.swiper-zoom-container', '::slotted(.swiper-zoom-container)');\n      }\n      if (line.includes('--swiper-preloader-color:')) return '';\n      if (line.includes('.swiper-3d .swiper-slide-shadow')) {\n        return line.replace('.swiper-3d ', '::slotted(').replace(',', '),').replace(' {', ') {');\n      }\n      if (line.includes('.swiper-cube .swiper-slide-shadow')) {\n        return line.replace('.swiper-cube ', '::slotted(').replace(',', '),').replace(' {', ') {');\n      }\n      if (line.includes('.swiper-flip .swiper-slide-shadow')) {\n        return line.replace('.swiper-flip ', '::slotted(').replace(',', '),').replace(' {', ') {');\n      }\n      return line;\n    })\n    .join('\\n');\n  return content;\n};\n\nexport default async function getElementStyles() {\n  // eslint-disable-next-line\n  const modules = config.modules.filter((name) => {\n    const cssFilePath = `./src/modules/${name}/${name}.css`;\n    return fs.existsSync(cssFilePath);\n  });\n\n  const cssContentBundle = await fs.readFileSync(\n    path.resolve(__dirname, '../../src/swiper.css'),\n    'utf8',\n  );\n  const modulesCSSContent = [];\n  for (const mod of modules) {\n    modulesCSSContent.push(\n      // eslint-disable-next-line no-await-in-loop\n      await fs.readFileSync(path.resolve(__dirname, `../../src/modules/${mod}/${mod}.css`), 'utf8'),\n    );\n  }\n\n  const cssContentCore = await fs.readFileSync(\n    path.resolve(__dirname, '../../src/swiper.css'),\n    'utf8',\n  );\n\n  let cssStylesBundle = await unwrapCss(\n    await autoprefixer([cssContentBundle, ...modulesCSSContent].join('\\n')),\n  );\n  let cssStylesCore = await unwrapCss(await autoprefixer(cssContentCore));\n  // eslint-disable-next-line\n  let cssStylesSlide = getSplittedCSS(cssStylesBundle).slides;\n  cssStylesBundle = getSplittedCSS(cssStylesBundle).container;\n  cssStylesCore = getSplittedCSS(cssStylesCore).container;\n\n  cssStylesBundle = proceedReplacements(cssStylesBundle);\n  cssStylesCore = proceedReplacements(cssStylesCore);\n  cssStylesSlide = proceedSlideReplacements(cssStylesSlide);\n\n  cssStylesBundle = await minifyCss(cssStylesBundle);\n  cssStylesCore = await minifyCss(cssStylesCore);\n  cssStylesSlide = await minifyCss(cssStylesSlide);\n  return {\n    core: cssStylesCore,\n    bundle: cssStylesBundle,\n    slide: cssStylesSlide,\n  };\n}\n"
  },
  {
    "path": "scripts/utils/helper.js",
    "content": "export function capitalizeString(str) {\n  return str.replace(/(?:^|-)([a-z])/g, (m, char) => char.toUpperCase());\n}\n\n/**\n * Parse build modules from env `SWIPER_BUILD_MODULES`.<br>\n * Will return null if env is not set or empty\n * @returns {string[]|null}\n */\nexport function parseSwiperBuildModulesEnv() {\n  if (process.env.SWIPER_BUILD_MODULES) {\n    const buildModules = process.env.SWIPER_BUILD_MODULES.split(/[,\\s]+/).filter(\n      (moduleName) => moduleName, // ensure to empty will be removed\n    );\n    if (buildModules.length) return buildModules;\n  }\n  return null;\n}\n"
  },
  {
    "path": "scripts/utils/isProd.js",
    "content": "function isProd() {\n  const argv = process.argv.slice(2).map((v) => v.toLowerCase());\n  return argv.includes('--prod');\n}\nexport default isProd();\n"
  },
  {
    "path": "scripts/utils/less.js",
    "content": "import less from 'less';\nimport path from 'path';\nimport * as url from 'url';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nexport default (content, resolvePath = path.resolve(__dirname, '../../src/core')) =>\n  new Promise((resolve, reject) => {\n    less\n      .render(content, { paths: [resolvePath] })\n      .then((result) => {\n        resolve(result.css);\n      })\n      .catch((err) => {\n        reject(err);\n        throw err;\n      });\n  });\n"
  },
  {
    "path": "scripts/utils/minify-css.js",
    "content": "import postcss from 'postcss';\nimport cssnano from 'cssnano';\n\nexport default (content) => {\n  return new Promise((resolve, reject) => {\n    if (content instanceof Promise) {\n      content\n        .then((c) => {\n          postcss([cssnano()])\n            .process(c, { from: undefined, to: undefined })\n            .then((result) => resolve(result.css));\n        })\n        .catch((err) => {\n          reject(err);\n          throw err;\n        });\n      return;\n    }\n    postcss([cssnano()])\n      .process(content, { from: undefined, to: undefined })\n      .then((res) => {\n        resolve(res.css);\n      });\n  });\n};\n"
  },
  {
    "path": "scripts/utils/minify.js",
    "content": "import { minify } from 'terser';\nimport fs from 'fs';\nimport { banner } from './banner.js';\n\nexport default async (fileName, filePath, bannerName) => {\n  const content = fs\n    .readFileSync(filePath, 'utf-8')\n    .replace(/from '([A-Za-z0-9./-]*).mjs';/g, 'from \"$1.min.mjs\";');\n  const fileExt = fileName.includes('.mjs') ? '.mjs' : '.js';\n  const { code, map } = await minify(content, {\n    sourceMap: {\n      filename: `${fileName}${fileExt}`,\n      url: `${fileName.replace(fileExt, `.min${fileExt}`)}.map`,\n    },\n    output: {\n      preamble: typeof bannerName !== 'undefined' ? banner(bannerName) : '',\n    },\n  }).catch((err) => {\n    console.error(`Terser failed on file ${fileName}: ${err.toString()}`);\n  });\n  fs.writeFileSync(filePath.replace(fileExt, `.min${fileExt}`), code);\n  fs.writeFileSync(filePath.replace(`${fileExt}`, `.min${fileExt}.map`), map);\n};\n"
  },
  {
    "path": "scripts/utils/output-dir.js",
    "content": "export const outputDir = 'dist';\n"
  },
  {
    "path": "scripts/utils/unwrap-css.js",
    "content": "import postcss from 'postcss';\nimport nested from 'postcss-nested';\n\nexport default (content) => {\n  return new Promise((resolve, reject) => {\n    if (content instanceof Promise) {\n      content\n        .then((c) => {\n          postcss([nested()])\n            .process(c, { from: undefined, to: undefined })\n            .then((result) => resolve(result.css));\n        })\n        .catch((err) => {\n          reject(err);\n          throw err;\n        });\n      return;\n    }\n    postcss([nested()])\n      .process(content, { from: undefined, to: undefined })\n      .then((res) => {\n        resolve(res.css);\n      });\n  });\n};\n"
  },
  {
    "path": "scripts/watch.js",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport * as url from 'url';\nimport buildTypes from './build-types.js';\nimport buildStyles from './build-styles.js';\nimport buildModules from './build-modules.js';\n\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\nconsole.log(chalk.cyan('Watching file changes ...'));\nconst watchFunction = async (fileName) => {\n  if (fileName.includes('swiper-element-bundle.mjs')) return;\n  if (fileName.includes('.css')) {\n    console.log('Building styles');\n    await buildStyles();\n    console.log('Building styles DONE');\n    return;\n  }\n  if (fileName.includes('.d.ts')) {\n    console.log('Building Types');\n    await buildTypes();\n    return;\n  }\n  if (fileName.includes('.mjs') || fileName.includes('.js')) {\n    console.log('Building JS');\n    await buildModules();\n    return;\n  }\n  console.log('something wrong...');\n};\nlet watchTimeout;\nfs.watch(path.resolve(__dirname, '../src'), { recursive: true }, (eventType, fileName) => {\n  clearTimeout(watchTimeout);\n  watchTimeout = setTimeout(() => {\n    watchFunction(fileName);\n  }, 100);\n});\n"
  },
  {
    "path": "src/components-shared/get-changed-params.mjs",
    "content": "import { paramsList } from './params-list.mjs';\nimport { isObject } from './utils.mjs';\n\nfunction getChangedParams(swiperParams, oldParams, children, oldChildren, getKey) {\n  const keys = [];\n  if (!oldParams) return keys;\n  const addKey = (key) => {\n    if (keys.indexOf(key) < 0) keys.push(key);\n  };\n  if (children && oldChildren) {\n    const oldChildrenKeys = oldChildren.map(getKey);\n    const childrenKeys = children.map(getKey);\n    if (oldChildrenKeys.join('') !== childrenKeys.join('')) addKey('children');\n    if (oldChildren.length !== children.length) addKey('children');\n  }\n  const watchParams = paramsList.filter((key) => key[0] === '_').map((key) => key.replace(/_/, ''));\n  watchParams.forEach((key) => {\n    if (key in swiperParams && key in oldParams) {\n      if (isObject(swiperParams[key]) && isObject(oldParams[key])) {\n        const newKeys = Object.keys(swiperParams[key]);\n        const oldKeys = Object.keys(oldParams[key]);\n        if (newKeys.length !== oldKeys.length) {\n          addKey(key);\n        } else {\n          newKeys.forEach((newKey) => {\n            if (swiperParams[key][newKey] !== oldParams[key][newKey]) {\n              addKey(key);\n            }\n          });\n          oldKeys.forEach((oldKey) => {\n            if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key);\n          });\n        }\n      } else if (swiperParams[key] !== oldParams[key]) {\n        addKey(key);\n      }\n    }\n  });\n  return keys;\n}\n\nexport { getChangedParams };\n"
  },
  {
    "path": "src/components-shared/get-element-params.mjs",
    "content": "import { attrToProp, extend, isObject } from './utils.mjs';\nimport { paramsList } from './params-list.mjs';\nimport defaults from '../core/defaults.mjs';\n\nconst formatValue = (val) => {\n  if (parseFloat(val) === Number(val)) return Number(val);\n  if (val === 'true') return true;\n  if (val === '') return true;\n  if (val === 'false') return false;\n  if (val === 'null') return null;\n  if (val === 'undefined') return undefined;\n  if (typeof val === 'string' && val.includes('{') && val.includes('}') && val.includes('\"')) {\n    let v;\n    try {\n      v = JSON.parse(val);\n    } catch (err) {\n      v = val;\n    }\n    return v;\n  }\n  return val;\n};\n\nconst modulesParamsList = [\n  'a11y',\n  'autoplay',\n  'controller',\n  'cards-effect',\n  'coverflow-effect',\n  'creative-effect',\n  'cube-effect',\n  'fade-effect',\n  'flip-effect',\n  'free-mode',\n  'grid',\n  'hash-navigation',\n  'history',\n  'keyboard',\n  'mousewheel',\n  'navigation',\n  'pagination',\n  'parallax',\n  'scrollbar',\n  'thumbs',\n  'virtual',\n  'zoom',\n];\n\nfunction getParams(element, propName, propValue) {\n  const params = {};\n  const passedParams = {};\n  extend(params, defaults);\n\n  const localParamsList = [...paramsList, 'on'];\n\n  const allowedParams = localParamsList.map((key) => key.replace(/_/, ''));\n\n  // First check props\n  localParamsList.forEach((paramName) => {\n    paramName = paramName.replace('_', '');\n    if (typeof element[paramName] !== 'undefined') {\n      passedParams[paramName] = element[paramName];\n    }\n  });\n\n  // Attributes\n  const attrsList = [...element.attributes];\n  if (typeof propName === 'string' && typeof propValue !== 'undefined') {\n    attrsList.push({ name: propName, value: isObject(propValue) ? { ...propValue } : propValue });\n  }\n  attrsList.forEach((attr) => {\n    const moduleParam = modulesParamsList.find((mParam) => attr.name.startsWith(`${mParam}-`));\n    if (moduleParam) {\n      const parentObjName = attrToProp(moduleParam);\n      const subObjName = attrToProp(attr.name.split(`${moduleParam}-`)[1]);\n      if (typeof passedParams[parentObjName] === 'undefined') {\n        passedParams[parentObjName] = {};\n      }\n      if (passedParams[parentObjName] === true) {\n        passedParams[parentObjName] = { enabled: true };\n      }\n      if (passedParams[parentObjName] === false) {\n        passedParams[parentObjName] = { enabled: false };\n      }\n      passedParams[parentObjName][subObjName] = formatValue(attr.value);\n    } else {\n      const name = attrToProp(attr.name);\n      if (!allowedParams.includes(name)) return;\n      const value = formatValue(attr.value);\n      if (passedParams[name] && modulesParamsList.includes(attr.name) && !isObject(value)) {\n        if (passedParams[name].constructor !== Object) {\n          passedParams[name] = {};\n        }\n        passedParams[name].enabled = !!value;\n      } else {\n        passedParams[name] = value;\n      }\n    }\n  });\n\n  extend(params, passedParams);\n\n  if (params.navigation) {\n    params.navigation = {\n      prevEl: '.swiper-button-prev',\n      nextEl: '.swiper-button-next',\n      ...(params.navigation !== true ? params.navigation : {}),\n    };\n  } else if (params.navigation === false) {\n    delete params.navigation;\n  }\n\n  if (params.scrollbar) {\n    params.scrollbar = {\n      el: '.swiper-scrollbar',\n      ...(params.scrollbar !== true ? params.scrollbar : {}),\n    };\n  } else if (params.scrollbar === false) {\n    delete params.scrollbar;\n  }\n\n  if (params.pagination) {\n    params.pagination = {\n      el: '.swiper-pagination',\n      ...(params.pagination !== true ? params.pagination : {}),\n    };\n  } else if (params.pagination === false) {\n    delete params.pagination;\n  }\n  return { params, passedParams };\n}\n\nexport { getParams };\n"
  },
  {
    "path": "src/components-shared/get-params.mjs",
    "content": "import { isObject, extend } from './utils.mjs';\nimport { paramsList } from './params-list.mjs';\nimport defaults from '../core/defaults.mjs';\n\nfunction getParams(obj = {}, splitEvents = true) {\n  const params = {\n    on: {},\n  };\n  const events = {};\n  const passedParams = {};\n  extend(params, defaults);\n  params._emitClasses = true;\n  params.init = false;\n\n  const rest = {};\n  const allowedParams = paramsList.map((key) => key.replace(/_/, ''));\n  const plainObj = Object.assign({}, obj);\n  Object.keys(plainObj).forEach((key) => {\n    if (typeof obj[key] === 'undefined') return;\n    if (allowedParams.indexOf(key) >= 0) {\n      if (isObject(obj[key])) {\n        params[key] = {};\n        passedParams[key] = {};\n        extend(params[key], obj[key]);\n        extend(passedParams[key], obj[key]);\n      } else {\n        params[key] = obj[key];\n        passedParams[key] = obj[key];\n      }\n    } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {\n      if (splitEvents) {\n        events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n      } else {\n        params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n      }\n    } else {\n      rest[key] = obj[key];\n    }\n  });\n  ['navigation', 'pagination', 'scrollbar'].forEach((key) => {\n    if (params[key] === true) params[key] = {};\n    if (params[key] === false) delete params[key];\n  });\n\n  return { params, passedParams, rest, events };\n}\n\nexport { getParams };\n"
  },
  {
    "path": "src/components-shared/mount-swiper.mjs",
    "content": "import { needsNavigation, needsPagination, needsScrollbar } from './utils.mjs';\n\nfunction mountSwiper({ el, nextEl, prevEl, paginationEl, scrollbarEl, swiper }, swiperParams) {\n  if (needsNavigation(swiperParams) && nextEl && prevEl) {\n    swiper.params.navigation.nextEl = nextEl;\n    swiper.originalParams.navigation.nextEl = nextEl;\n    swiper.params.navigation.prevEl = prevEl;\n    swiper.originalParams.navigation.prevEl = prevEl;\n  }\n  if (needsPagination(swiperParams) && paginationEl) {\n    swiper.params.pagination.el = paginationEl;\n    swiper.originalParams.pagination.el = paginationEl;\n  }\n  if (needsScrollbar(swiperParams) && scrollbarEl) {\n    swiper.params.scrollbar.el = scrollbarEl;\n    swiper.originalParams.scrollbar.el = scrollbarEl;\n  }\n  swiper.init(el);\n}\n\nexport { mountSwiper };\n"
  },
  {
    "path": "src/components-shared/params-list.mjs",
    "content": "/* underscore in name -> watch for changes */\nconst paramsList = [\n  'eventsPrefix',\n  'injectStyles',\n  'injectStylesUrls',\n  'modules',\n  'init',\n  '_direction',\n  'oneWayMovement',\n  'swiperElementNodeName',\n  'touchEventsTarget',\n  'initialSlide',\n  '_speed',\n  'cssMode',\n  'updateOnWindowResize',\n  'resizeObserver',\n  'nested',\n  'focusableElements',\n  '_enabled',\n  '_width',\n  '_height',\n  'preventInteractionOnTransition',\n  'userAgent',\n  'url',\n  '_edgeSwipeDetection',\n  '_edgeSwipeThreshold',\n  '_freeMode',\n  '_autoHeight',\n  'setWrapperSize',\n  'virtualTranslate',\n  '_effect',\n  'breakpoints',\n  'breakpointsBase',\n  '_spaceBetween',\n  '_slidesPerView',\n  'maxBackfaceHiddenSlides',\n  '_grid',\n  '_slidesPerGroup',\n  '_slidesPerGroupSkip',\n  '_slidesPerGroupAuto',\n  '_centeredSlides',\n  '_centeredSlidesBounds',\n  '_slidesOffsetBefore',\n  '_slidesOffsetAfter',\n  'normalizeSlideIndex',\n  '_centerInsufficientSlides',\n  '_snapToSlideEdge',\n  '_watchOverflow',\n  'roundLengths',\n  'touchRatio',\n  'touchAngle',\n  'simulateTouch',\n  '_shortSwipes',\n  '_longSwipes',\n  'longSwipesRatio',\n  'longSwipesMs',\n  '_followFinger',\n  'allowTouchMove',\n  '_threshold',\n  'touchMoveStopPropagation',\n  'touchStartPreventDefault',\n  'touchStartForcePreventDefault',\n  'touchReleaseOnEdges',\n  'uniqueNavElements',\n  '_resistance',\n  '_resistanceRatio',\n  '_watchSlidesProgress',\n  '_grabCursor',\n  'preventClicks',\n  'preventClicksPropagation',\n  '_slideToClickedSlide',\n  '_loop',\n  'loopAdditionalSlides',\n  'loopAddBlankSlides',\n  'loopPreventsSliding',\n  '_rewind',\n  '_allowSlidePrev',\n  '_allowSlideNext',\n  '_swipeHandler',\n  '_noSwiping',\n  'noSwipingClass',\n  'noSwipingSelector',\n  'passiveListeners',\n  'containerModifierClass',\n  'slideClass',\n  'slideActiveClass',\n  'slideVisibleClass',\n  'slideFullyVisibleClass',\n  'slideNextClass',\n  'slidePrevClass',\n  'slideBlankClass',\n  'wrapperClass',\n  'lazyPreloaderClass',\n  'lazyPreloadPrevNext',\n  'runCallbacksOnInit',\n  'observer',\n  'observeParents',\n  'observeSlideChildren',\n\n  // modules\n  'a11y',\n  '_autoplay',\n  '_controller',\n  'coverflowEffect',\n  'cubeEffect',\n  'fadeEffect',\n  'flipEffect',\n  'creativeEffect',\n  'cardsEffect',\n  'hashNavigation',\n  'history',\n  'keyboard',\n  'mousewheel',\n  '_navigation',\n  '_pagination',\n  'parallax',\n  '_scrollbar',\n  '_thumbs',\n  'virtual',\n  'zoom',\n  'control',\n];\nexport { paramsList };\n"
  },
  {
    "path": "src/components-shared/update-on-virtual-data.mjs",
    "content": "export const updateOnVirtualData = (swiper) => {\n  if (\n    !swiper ||\n    swiper.destroyed ||\n    !swiper.params.virtual ||\n    (swiper.params.virtual && !swiper.params.virtual.enabled)\n  )\n    return;\n  swiper.updateSlides();\n  swiper.updateProgress();\n  swiper.updateSlidesClasses();\n  swiper.emit('_virtualUpdated');\n  if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) {\n    swiper.parallax.setTranslate();\n  }\n};\n"
  },
  {
    "path": "src/components-shared/update-swiper.mjs",
    "content": "import { setInnerHTML } from '../shared/utils.mjs';\nimport { isObject } from './utils.mjs';\n\nfunction updateSwiper({\n  swiper,\n  slides,\n  passedParams,\n  changedParams,\n  nextEl,\n  prevEl,\n  scrollbarEl,\n  paginationEl,\n}) {\n  const updateParams = changedParams.filter(\n    (key) => key !== 'children' && key !== 'direction' && key !== 'wrapperClass',\n  );\n  const { params: currentParams, pagination, navigation, scrollbar, virtual, thumbs } = swiper;\n  let needThumbsInit;\n  let needControllerInit;\n  let needPaginationInit;\n  let needScrollbarInit;\n  let needNavigationInit;\n  let loopNeedDestroy;\n  let loopNeedEnable;\n  let loopNeedReloop;\n  if (\n    changedParams.includes('thumbs') &&\n    passedParams.thumbs &&\n    passedParams.thumbs.swiper &&\n    !passedParams.thumbs.swiper.destroyed &&\n    currentParams.thumbs &&\n    (!currentParams.thumbs.swiper || currentParams.thumbs.swiper.destroyed)\n  ) {\n    needThumbsInit = true;\n  }\n  if (\n    changedParams.includes('controller') &&\n    passedParams.controller &&\n    passedParams.controller.control &&\n    currentParams.controller &&\n    !currentParams.controller.control\n  ) {\n    needControllerInit = true;\n  }\n  if (\n    changedParams.includes('pagination') &&\n    passedParams.pagination &&\n    (passedParams.pagination.el || paginationEl) &&\n    (currentParams.pagination || currentParams.pagination === false) &&\n    pagination &&\n    !pagination.el\n  ) {\n    needPaginationInit = true;\n  }\n\n  if (\n    changedParams.includes('scrollbar') &&\n    passedParams.scrollbar &&\n    (passedParams.scrollbar.el || scrollbarEl) &&\n    (currentParams.scrollbar || currentParams.scrollbar === false) &&\n    scrollbar &&\n    !scrollbar.el\n  ) {\n    needScrollbarInit = true;\n  }\n  if (\n    changedParams.includes('navigation') &&\n    passedParams.navigation &&\n    (passedParams.navigation.prevEl || prevEl) &&\n    (passedParams.navigation.nextEl || nextEl) &&\n    (currentParams.navigation || currentParams.navigation === false) &&\n    navigation &&\n    !navigation.prevEl &&\n    !navigation.nextEl\n  ) {\n    needNavigationInit = true;\n  }\n\n  const destroyModule = (mod) => {\n    if (!swiper[mod]) return;\n    swiper[mod].destroy();\n    if (mod === 'navigation') {\n      if (swiper.isElement) {\n        swiper[mod].prevEl.remove();\n        swiper[mod].nextEl.remove();\n      }\n      currentParams[mod].prevEl = undefined;\n      currentParams[mod].nextEl = undefined;\n      swiper[mod].prevEl = undefined;\n      swiper[mod].nextEl = undefined;\n    } else {\n      if (swiper.isElement) {\n        swiper[mod].el.remove();\n      }\n      currentParams[mod].el = undefined;\n      swiper[mod].el = undefined;\n    }\n  };\n\n  if (changedParams.includes('loop') && swiper.isElement) {\n    if (currentParams.loop && !passedParams.loop) {\n      loopNeedDestroy = true;\n    } else if (!currentParams.loop && passedParams.loop) {\n      loopNeedEnable = true;\n    } else {\n      loopNeedReloop = true;\n    }\n  }\n\n  updateParams.forEach((key) => {\n    if (isObject(currentParams[key]) && isObject(passedParams[key])) {\n      Object.assign(currentParams[key], passedParams[key]);\n      if (\n        (key === 'navigation' || key === 'pagination' || key === 'scrollbar') &&\n        'enabled' in passedParams[key] &&\n        !passedParams[key].enabled\n      ) {\n        destroyModule(key);\n      }\n    } else {\n      const newValue = passedParams[key];\n      if (\n        (newValue === true || newValue === false) &&\n        (key === 'navigation' || key === 'pagination' || key === 'scrollbar')\n      ) {\n        if (newValue === false) {\n          destroyModule(key);\n        }\n      } else {\n        currentParams[key] = passedParams[key];\n      }\n    }\n  });\n\n  if (\n    updateParams.includes('controller') &&\n    !needControllerInit &&\n    swiper.controller &&\n    swiper.controller.control &&\n    currentParams.controller &&\n    currentParams.controller.control\n  ) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n\n  if (changedParams.includes('children') && slides && virtual && currentParams.virtual.enabled) {\n    virtual.slides = slides;\n    virtual.update(true);\n  } else if (changedParams.includes('virtual') && virtual && currentParams.virtual.enabled) {\n    if (slides) virtual.slides = slides;\n    virtual.update(true);\n  }\n  if (changedParams.includes('children') && slides && currentParams.loop) {\n    loopNeedReloop = true;\n  }\n\n  if (needThumbsInit) {\n    const initialized = thumbs.init();\n    if (initialized) thumbs.update(true);\n  }\n\n  if (needControllerInit) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n\n  if (needPaginationInit) {\n    if (swiper.isElement && (!paginationEl || typeof paginationEl === 'string')) {\n      paginationEl = document.createElement('div');\n      paginationEl.classList.add('swiper-pagination');\n      paginationEl.part.add('pagination');\n      swiper.el.appendChild(paginationEl);\n    }\n    if (paginationEl) currentParams.pagination.el = paginationEl;\n    pagination.init();\n    pagination.render();\n    pagination.update();\n  }\n\n  if (needScrollbarInit) {\n    if (swiper.isElement && (!scrollbarEl || typeof scrollbarEl === 'string')) {\n      scrollbarEl = document.createElement('div');\n      scrollbarEl.classList.add('swiper-scrollbar');\n      scrollbarEl.part.add('scrollbar');\n      swiper.el.appendChild(scrollbarEl);\n    }\n    if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;\n    scrollbar.init();\n    scrollbar.updateSize();\n    scrollbar.setTranslate();\n  }\n\n  if (needNavigationInit) {\n    if (swiper.isElement) {\n      if (!nextEl || typeof nextEl === 'string') {\n        nextEl = document.createElement('div');\n        nextEl.classList.add('swiper-button-next');\n        setInnerHTML(nextEl, swiper.navigation.arrowSvg);\n        nextEl.part.add('button-next');\n        swiper.el.appendChild(nextEl);\n      }\n      if (!prevEl || typeof prevEl === 'string') {\n        prevEl = document.createElement('div');\n        prevEl.classList.add('swiper-button-prev');\n        setInnerHTML(prevEl, swiper.navigation.arrowSvg);\n        prevEl.part.add('button-prev');\n        swiper.el.appendChild(prevEl);\n      }\n    }\n    if (nextEl) currentParams.navigation.nextEl = nextEl;\n    if (prevEl) currentParams.navigation.prevEl = prevEl;\n    navigation.init();\n    navigation.update();\n  }\n\n  if (changedParams.includes('allowSlideNext')) {\n    swiper.allowSlideNext = passedParams.allowSlideNext;\n  }\n  if (changedParams.includes('allowSlidePrev')) {\n    swiper.allowSlidePrev = passedParams.allowSlidePrev;\n  }\n  if (changedParams.includes('direction')) {\n    swiper.changeDirection(passedParams.direction, false);\n  }\n  if (loopNeedDestroy || loopNeedReloop) {\n    swiper.loopDestroy();\n  }\n  if (loopNeedEnable || loopNeedReloop) {\n    swiper.loopCreate();\n  }\n  swiper.update();\n}\nexport { updateSwiper };\n"
  },
  {
    "path": "src/components-shared/utils.mjs",
    "content": "function isObject(o) {\n  return (\n    typeof o === 'object' &&\n    o !== null &&\n    o.constructor &&\n    Object.prototype.toString.call(o).slice(8, -1) === 'Object' &&\n    !o.__swiper__\n  );\n}\n\nfunction extend(target, src) {\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  Object.keys(src)\n    .filter((key) => noExtend.indexOf(key) < 0)\n    .forEach((key) => {\n      if (typeof target[key] === 'undefined') target[key] = src[key];\n      else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n        if (src[key].__swiper__) target[key] = src[key];\n        else extend(target[key], src[key]);\n      } else {\n        target[key] = src[key];\n      }\n    });\n}\n\nfunction needsNavigation(params = {}) {\n  return (\n    params.navigation &&\n    typeof params.navigation.nextEl === 'undefined' &&\n    typeof params.navigation.prevEl === 'undefined'\n  );\n}\nfunction needsPagination(params = {}) {\n  return params.pagination && typeof params.pagination.el === 'undefined';\n}\nfunction needsScrollbar(params = {}) {\n  return params.scrollbar && typeof params.scrollbar.el === 'undefined';\n}\nfunction uniqueClasses(classNames = '') {\n  const classes = classNames\n    .split(' ')\n    .map((c) => c.trim())\n    .filter((c) => !!c);\n  const unique = [];\n  classes.forEach((c) => {\n    if (unique.indexOf(c) < 0) unique.push(c);\n  });\n  return unique.join(' ');\n}\n\nfunction attrToProp(attrName = '') {\n  return attrName.replace(/-[a-z]/g, (l) => l.toUpperCase().replace('-', ''));\n}\n\nfunction wrapperClass(className = '') {\n  if (!className) return 'swiper-wrapper';\n  if (!className.includes('swiper-wrapper')) return `swiper-wrapper ${className}`;\n  return className;\n}\n\nexport {\n  isObject,\n  extend,\n  needsNavigation,\n  needsPagination,\n  needsScrollbar,\n  uniqueClasses,\n  attrToProp,\n  wrapperClass,\n};\n"
  },
  {
    "path": "src/copy/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2019 Vladimir Kharlampidi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "src/copy/README.md",
    "content": "Swiper\n==========\n\nSwiper - is the free and most modern mobile touch slider with hardware accelerated transitions and amazing native behavior. It is intended to be used in mobile websites, mobile web apps, and mobile native/hybrid apps.\n\nSwiper is not compatible with all platforms, it is a modern touch slider which is focused only on modern apps/platforms to bring the best experience and simplicity.\n\n# Getting Started\n  * [Getting Started Guide](https://swiperjs.com/get-started/)\n  * [API](https://swiperjs.com/swiper-api/)\n  * [Demos](https://swiperjs.com/demos/)\n"
  },
  {
    "path": "src/copy/package.json",
    "content": "{\n  \"name\": \"swiper\",\n  \"version\": \"12.1.2\",\n  \"description\": \"Most modern mobile touch slider and framework with hardware accelerated transitions\",\n  \"typings\": \"swiper.d.ts\",\n  \"type\": \"module\",\n  \"main\": \"./swiper.mjs\",\n  \"module\": \"./swiper.mjs\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./swiper.d.ts\",\n      \"default\": \"./swiper.mjs\"\n    },\n    \"./effect-utils\": {\n      \"types\": \"./swiper-effect-utils.d.ts\",\n      \"default\": \"./swiper-effect-utils.mjs\"\n    },\n    \"./core\": {\n      \"types\": \"./swiper.d.ts\",\n      \"default\": \"./swiper.mjs\"\n    },\n    \"./bundle\": {\n      \"types\": \"./swiper.d.ts\",\n      \"default\": \"./swiper-bundle.mjs\"\n    },\n    \"./css\": \"./swiper.css\",\n    \"./swiper.css\": \"./swiper.css\",\n    \"./css/bundle\": \"./swiper-bundle.css\",\n    \"./swiper-bundle.css\": \"./swiper-bundle.css\",\n    \"./css/a11y\": \"./modules/a11y.css\",\n    \"./css/autoplay\": \"./modules/autoplay.css\",\n    \"./css/controller\": \"./modules/controller.css\",\n    \"./css/effect-coverflow\": \"./modules/effect-coverflow.css\",\n    \"./css/effect-cube\": \"./modules/effect-cube.css\",\n    \"./css/effect-fade\": \"./modules/effect-fade.css\",\n    \"./css/effect-flip\": \"./modules/effect-flip.css\",\n    \"./css/effect-creative\": \"./modules/effect-creative.css\",\n    \"./css/effect-cards\": \"./modules/effect-cards.css\",\n    \"./css/free-mode\": \"./modules/free-mode.css\",\n    \"./css/grid\": \"./modules/grid.css\",\n    \"./css/hash-navigation\": \"./modules/hash-navigation.css\",\n    \"./css/history\": \"./modules/history.css\",\n    \"./css/keyboard\": \"./modules/keyboard.css\",\n    \"./css/manipulation\": \"./modules/manipulation.css\",\n    \"./css/mousewheel\": \"./modules/mousewheel.css\",\n    \"./css/navigation\": \"./modules/navigation.css\",\n    \"./css/pagination\": \"./modules/pagination.css\",\n    \"./css/parallax\": \"./modules/parallax.css\",\n    \"./css/scrollbar\": \"./modules/scrollbar.css\",\n    \"./css/thumbs\": \"./modules/thumbs.css\",\n    \"./css/virtual\": \"./modules/virtual.css\",\n    \"./css/zoom\": \"./modules/zoom.css\",\n    \"./element\": {\n      \"types\": \"./swiper-element.d.ts\",\n      \"default\": \"./swiper-element.mjs\"\n    },\n    \"./element/bundle\": {\n      \"types\": \"./swiper-element.d.ts\",\n      \"default\": \"./swiper-element-bundle.mjs\"\n    },\n    \"./element-bundle\": {\n      \"types\": \"./swiper-element.d.ts\",\n      \"default\": \"./swiper-element-bundle.mjs\"\n    },\n    \"./element/css/a11y\": \"./modules/a11y-element.css\",\n    \"./element/css/autoplay\": \"./modules/autoplay-element.css\",\n    \"./element/css/controller\": \"./modules/controller-element.css\",\n    \"./element/css/effect-coverflow\": \"./modules/effect-coverflow-element.css\",\n    \"./element/css/effect-cube\": \"./modules/effect-cube-element.css\",\n    \"./element/css/effect-fade\": \"./modules/effect-fade-element.css\",\n    \"./element/css/effect-flip\": \"./modules/effect-flip-element.css\",\n    \"./element/css/effect-creative\": \"./modules/effect-creative-element.css\",\n    \"./element/css/effect-cards\": \"./modules/effect-cards-element.css\",\n    \"./element/css/free-mode\": \"./modules/free-mode-element.css\",\n    \"./element/css/grid\": \"./modules/grid-element.css\",\n    \"./element/css/hash-navigation\": \"./modules/hash-navigation-element.css\",\n    \"./element/css/history\": \"./modules/history-element.css\",\n    \"./element/css/keyboard\": \"./modules/keyboard-element.css\",\n    \"./element/css/manipulation\": \"./modules/manipulation-element.css\",\n    \"./element/css/mousewheel\": \"./modules/mousewheel-element.css\",\n    \"./element/css/navigation\": \"./modules/navigation-element.css\",\n    \"./element/css/pagination\": \"./modules/pagination-element.css\",\n    \"./element/css/parallax\": \"./modules/parallax-element.css\",\n    \"./element/css/scrollbar\": \"./modules/scrollbar-element.css\",\n    \"./element/css/thumbs\": \"./modules/thumbs-element.css\",\n    \"./element/css/virtual\": \"./modules/virtual-element.css\",\n    \"./element/css/zoom\": \"./modules/zoom-element.css\",\n    \"./react\": {\n      \"types\": \"./swiper-react.d.ts\",\n      \"default\": \"./swiper-react.mjs\"\n    },\n    \"./vue\": {\n      \"types\": \"./swiper-vue.d.ts\",\n      \"default\": \"./swiper-vue.mjs\"\n    },\n    \"./modules\": {\n      \"types\": \"./types/modules/index.d.ts\",\n      \"default\": \"./modules/index.mjs\"\n    },\n    \"./types\": \"./types/index.d.ts\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"modules\": [\n        \"./types/modules/index.d.ts\"\n      ],\n      \"element\": [\n        \"./swiper-element.d.ts\"\n      ],\n      \"element/bundle\": [\n        \"./swiper-element.d.ts\"\n      ],\n      \"react\": [\n        \"./swiper-react.d.ts\"\n      ],\n      \"vue\": [\n        \"./swiper-vue.d.ts\"\n      ]\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/nolimits4web/Swiper.git\"\n  },\n  \"keywords\": [\n    \"swiper\",\n    \"swipe\",\n    \"slider\",\n    \"touch\",\n    \"ios\",\n    \"mobile\",\n    \"cordova\",\n    \"phonegap\",\n    \"app\",\n    \"framework\",\n    \"framework7\",\n    \"carousel\",\n    \"gallery\",\n    \"plugin\",\n    \"react\",\n    \"vue\",\n    \"slideshow\"\n  ],\n  \"author\": \"Vladimir Kharlampidi\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/nolimits4web/swiper/issues\"\n  },\n  \"homepage\": \"https://swiperjs.com\",\n  \"funding\": [\n    {\n      \"type\": \"patreon\",\n      \"url\": \"https://www.patreon.com/swiperjs\"\n    },\n    {\n      \"type\": \"open_collective\",\n      \"url\": \"http://opencollective.com/swiper\"\n    }\n  ],\n  \"engines\": {\n    \"node\": \">= 4.7.0\"\n  },\n  \"releaseDate\": \"February 18, 2026\"\n}\n"
  },
  {
    "path": "src/core/breakpoints/getBreakpoint.mjs",
    "content": "import { getWindow } from 'ssr-window';\n\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || (base === 'container' && !containerEl)) return undefined;\n  let breakpoint = false;\n\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n\n  const points = Object.keys(breakpoints).map((point) => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return { value, point };\n    }\n    return { value: point, point };\n  });\n\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n  for (let i = 0; i < points.length; i += 1) {\n    const { point, value } = points[i];\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n  return breakpoint || 'max';\n}\n"
  },
  {
    "path": "src/core/breakpoints/index.mjs",
    "content": "import setBreakpoint from './setBreakpoint.mjs';\nimport getBreakpoint from './getBreakpoint.mjs';\n\nexport default { setBreakpoint, getBreakpoint };\n"
  },
  {
    "path": "src/core/breakpoints/setBreakpoint.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport { extend } from '../../shared/utils.mjs';\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n  const swiper = this;\n  const { realIndex, initialized, params, el } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) return;\n  const document = getDocument();\n\n  // Get breakpoint for window/container width and update parameters\n  const breakpointsBase =\n    params.breakpointsBase === 'window' || !params.breakpointsBase\n      ? params.breakpointsBase\n      : 'container';\n  const breakpointContainer =\n    ['window', 'container'].includes(params.breakpointsBase) || !params.breakpointsBase\n      ? swiper.el\n      : document.querySelector(params.breakpointsBase);\n\n  const breakpoint = swiper.getBreakpoint(breakpoints, breakpointsBase, breakpointContainer);\n\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n\n  const wasGrabCursor = swiper.params.grabCursor;\n  const isGrabCursor = breakpointParams.grabCursor;\n\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    el.classList.remove(\n      `${params.containerModifierClass}grid`,\n      `${params.containerModifierClass}grid-column`,\n    );\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    el.classList.add(`${params.containerModifierClass}grid`);\n    if (\n      (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column') ||\n      (!breakpointParams.grid.fill && params.grid.fill === 'column')\n    ) {\n      el.classList.add(`${params.containerModifierClass}grid-column`);\n    }\n    swiper.emitContainerClasses();\n  }\n  if (wasGrabCursor && !isGrabCursor) {\n    swiper.unsetGrabCursor();\n  } else if (!wasGrabCursor && isGrabCursor) {\n    swiper.setGrabCursor();\n  }\n\n  // Toggle navigation, pagination, scrollbar\n  ['navigation', 'pagination', 'scrollbar'].forEach((prop) => {\n    if (typeof breakpointParams[prop] === 'undefined') return;\n    const wasModuleEnabled = params[prop] && params[prop].enabled;\n    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;\n    if (wasModuleEnabled && !isModuleEnabled) {\n      swiper[prop].disable();\n    }\n    if (!wasModuleEnabled && isModuleEnabled) {\n      swiper[prop].enable();\n    }\n  });\n\n  const directionChanged =\n    breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop =\n    params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n  const wasLoop = params.loop;\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n  extend(swiper.params, breakpointParams);\n\n  const isEnabled = swiper.params.enabled;\n  const hasLoop = swiper.params.loop;\n\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev,\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (initialized) {\n    if (needsReLoop) {\n      swiper.loopDestroy();\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (!wasLoop && hasLoop) {\n      swiper.loopCreate(realIndex);\n      swiper.updateSlides();\n    } else if (wasLoop && !hasLoop) {\n      swiper.loopDestroy();\n    }\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}\n"
  },
  {
    "path": "src/core/check-overflow/index.mjs",
    "content": "function checkOverflow() {\n  const swiper = this;\n  const { isLocked: wasLocked, params } = swiper;\n  const { slidesOffsetBefore } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge =\n      swiper.slidesGrid[lastSlideIndex] +\n      swiper.slidesSizesGrid[lastSlideIndex] +\n      slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\n\nexport default { checkOverflow };\n"
  },
  {
    "path": "src/core/classes/addClasses.mjs",
    "content": "function prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach((item) => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach((classNames) => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\n\nexport default function addClasses() {\n  const swiper = this;\n  const { classNames, params, rtl, el, device } = swiper;\n  // prettier-ignore\n  const suffixes = prepareClasses([\n    'initialized',\n    params.direction,\n    { 'free-mode': swiper.params.freeMode && params.freeMode.enabled },\n    { 'autoheight': params.autoHeight },\n    { 'rtl': rtl },\n    { 'grid': params.grid && params.grid.rows > 1 },\n    { 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' },\n    { 'android': device.android },\n    { 'ios': device.ios },\n    { 'css-mode': params.cssMode },\n    { 'centered': params.cssMode && params.centeredSlides },\n    { 'watch-progress': params.watchSlidesProgress },\n  ], params.containerModifierClass);\n  classNames.push(...suffixes);\n  el.classList.add(...classNames);\n  swiper.emitContainerClasses();\n}\n"
  },
  {
    "path": "src/core/classes/index.mjs",
    "content": "import addClasses from './addClasses.mjs';\nimport removeClasses from './removeClasses.mjs';\n\nexport default { addClasses, removeClasses };\n"
  },
  {
    "path": "src/core/classes/removeClasses.mjs",
    "content": "export default function removeClasses() {\n  const swiper = this;\n  const { el, classNames } = swiper;\n  if (!el || typeof el === 'string') return;\n\n  el.classList.remove(...classNames);\n  swiper.emitContainerClasses();\n}\n"
  },
  {
    "path": "src/core/core.mjs",
    "content": "/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport {\n  extend,\n  deleteProps,\n  createElement,\n  elementChildren,\n  elementStyle,\n  elementIndex,\n} from '../shared/utils.mjs';\nimport { getSupport } from '../shared/get-support.mjs';\nimport { getDevice } from '../shared/get-device.mjs';\nimport { getBrowser } from '../shared/get-browser.mjs';\n\nimport Resize from './modules/resize/resize.mjs';\nimport Observer from './modules/observer/observer.mjs';\n\nimport eventsEmitter from './events-emitter.mjs';\n\nimport update from './update/index.mjs';\nimport translate from './translate/index.mjs';\nimport transition from './transition/index.mjs';\nimport slide from './slide/index.mjs';\nimport loop from './loop/index.mjs';\nimport grabCursor from './grab-cursor/index.mjs';\nimport events from './events/index.mjs';\nimport breakpoints from './breakpoints/index.mjs';\nimport classes from './classes/index.mjs';\nimport checkOverflow from './check-overflow/index.mjs';\n\nimport defaults from './defaults.mjs';\nimport moduleExtendParams from './moduleExtendParams.mjs';\nimport { processLazyPreloader, preload } from '../shared/process-lazy-preloader.mjs';\n\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events,\n  breakpoints,\n  checkOverflow,\n  classes,\n};\n\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n    if (\n      args.length === 1 &&\n      args[0].constructor &&\n      Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object'\n    ) {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n    if (!params) params = {};\n\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n\n    const document = getDocument();\n\n    if (\n      params.el &&\n      typeof params.el === 'string' &&\n      document.querySelectorAll(params.el).length > 1\n    ) {\n      const swipers = [];\n      document.querySelectorAll(params.el).forEach((containerEl) => {\n        const newParams = extend({}, params, { el: containerEl });\n        swipers.push(new Swiper(newParams));\n      });\n      // eslint-disable-next-line no-constructor-return\n      return swipers;\n    }\n\n    // Swiper Instance\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({ userAgent: params.userAgent });\n    swiper.browser = getBrowser();\n\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n    if (params.modules && Array.isArray(params.modules)) {\n      params.modules.forEach((mod) => {\n        if (typeof mod === 'function' && swiper.modules.indexOf(mod) < 0) {\n          swiper.modules.push(mod);\n        }\n      });\n    }\n\n    const allModulesParams = {};\n    swiper.modules.forEach((mod) => {\n      mod({\n        params,\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper),\n      });\n    });\n\n    // Extend defaults with modules params\n    const swiperParams = extend({}, defaults, allModulesParams);\n\n    // Extend defaults with passed params\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params);\n\n    // add event listeners\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach((eventName) => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    }\n\n    // Extend Swiper\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n\n      // Classes\n      classNames: [],\n\n      // Slides\n      slides: [],\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n\n      //\n      isBeginning: true,\n      isEnd: false,\n\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n\n      cssOverflowAdjustment() {\n        // Returns 0 unless `translate` is > 2**23\n        // Should be subtracted from css values to prevent overflow\n        return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;\n      },\n\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n\n      // Touch Events\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: 0,\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        startMoving: undefined,\n        pointerId: null,\n        touchId: null,\n      },\n\n      // Clicks\n      allowClick: true,\n\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0,\n      },\n\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0,\n    });\n\n    swiper.emit('_swiper');\n\n    // Init\n    if (swiper.params.init) {\n      swiper.init();\n    }\n\n    // Return app instance\n    // eslint-disable-next-line no-constructor-return\n    return swiper;\n  }\n\n  getDirectionLabel(property) {\n    if (this.isHorizontal()) {\n      return property;\n    }\n    // prettier-ignore\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom',\n    }[property];\n  }\n\n  getSlideIndex(slideEl) {\n    const { slidesEl, params } = this;\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n    const firstSlideIndex = elementIndex(slides[0]);\n    return elementIndex(slideEl) - firstSlideIndex;\n  }\n\n  getSlideIndexByData(index) {\n    return this.getSlideIndex(\n      this.slides.find((slideEl) => slideEl.getAttribute('data-swiper-slide-index') * 1 === index),\n    );\n  }\n\n  getSlideIndexWhenGrid(index) {\n    if (this.grid && this.params.grid && this.params.grid.rows > 1) {\n      if (this.params.grid.fill === 'column') {\n        index = Math.floor(index / this.params.grid.rows);\n      } else if (this.params.grid.fill === 'row') {\n        index = index % Math.ceil(this.slides.length / this.params.grid.rows);\n      }\n    }\n    return index;\n  }\n\n  recalcSlides() {\n    const swiper = this;\n    const { slidesEl, params } = swiper;\n    swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n  }\n\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n    swiper.emit('enable');\n  }\n\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n    swiper.emit('disable');\n  }\n\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter((className) => {\n      return (\n        className.indexOf('swiper') === 0 ||\n        className.indexOf(swiper.params.containerModifierClass) === 0\n      );\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    if (swiper.destroyed) return '';\n\n    return slideEl.className\n      .split(' ')\n      .filter((className) => {\n        return (\n          className.indexOf('swiper-slide') === 0 ||\n          className.indexOf(swiper.params.slideClass) === 0\n        );\n      })\n      .join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.forEach((slideEl) => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({ slideEl, classNames });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;\n    let spv = 1;\n    if (typeof params.slidesPerView === 'number') return params.slidesPerView;\n\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;\n      let breakLoop;\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += Math.ceil(slides[i].swiperSlideSize);\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact\n            ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize\n            : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n    return spv;\n  }\n\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const { snapGrid, params } = swiper;\n    // Breakpoints\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    [...swiper.el.querySelectorAll('[loading=\"lazy\"]')].forEach((imageEl) => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      }\n    });\n\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(\n        Math.max(translateValue, swiper.maxTranslate()),\n        swiper.minTranslate(),\n      );\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n    let translated;\n    if (params.freeMode && params.freeMode.enabled && !params.cssMode) {\n      setTranslate();\n      if (params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if (\n        (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n        swiper.isEnd &&\n        !params.centeredSlides\n      ) {\n        const slides =\n          swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;\n        translated = swiper.slideTo(slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n      if (!translated) {\n        setTranslate();\n      }\n    }\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n    swiper.emit('update');\n  }\n\n  changeDirection(newDirection, needUpdate = true) {\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n    if (\n      newDirection === currentDirection ||\n      (newDirection !== 'horizontal' && newDirection !== 'vertical')\n    ) {\n      return swiper;\n    }\n\n    swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);\n    swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n\n    swiper.params.direction = newDirection;\n\n    swiper.slides.forEach((slideEl) => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n\n    return swiper;\n  }\n\n  changeLanguageDirection(direction) {\n    const swiper = this;\n    if ((swiper.rtl && direction === 'rtl') || (!swiper.rtl && direction === 'ltr')) return;\n    swiper.rtl = direction === 'rtl';\n    swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;\n    if (swiper.rtl) {\n      swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'rtl';\n    } else {\n      swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);\n      swiper.el.dir = 'ltr';\n    }\n    swiper.update();\n  }\n\n  mount(element) {\n    const swiper = this;\n    if (swiper.mounted) return true;\n\n    // Find el\n    let el = element || swiper.params.el;\n    if (typeof el === 'string') {\n      el = document.querySelector(el);\n    }\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n    if (\n      el.parentNode &&\n      el.parentNode.host &&\n      el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()\n    ) {\n      swiper.isElement = true;\n    }\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = el.shadowRoot.querySelector(getWrapperSelector());\n        // Children needs to return slot items\n        return res;\n      }\n      return elementChildren(el, getWrapperSelector())[0];\n    };\n    // Find Wrapper\n    let wrapperEl = getWrapper();\n    if (!wrapperEl && swiper.params.createElements) {\n      wrapperEl = createElement('div', swiper.params.wrapperClass);\n      el.append(wrapperEl);\n      elementChildren(el, `.${swiper.params.slideClass}`).forEach((slideEl) => {\n        wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      el,\n      wrapperEl,\n      slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,\n      hostEl: swiper.isElement ? el.parentNode.host : el,\n      mounted: true,\n\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',\n      rtlTranslate:\n        swiper.params.direction === 'horizontal' &&\n        (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),\n      wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box',\n    });\n\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n\n    swiper.emit('beforeInit');\n\n    // Set breakpoint\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    // Add Classes\n    swiper.addClasses();\n\n    // Update size\n    swiper.updateSize();\n\n    // Update slides\n    swiper.updateSlides();\n\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    }\n\n    // Set Grab Cursor\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    // Slide To Initial Slide\n    if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.slideTo(\n        swiper.params.initialSlide + swiper.virtual.slidesBefore,\n        0,\n        swiper.params.runCallbacksOnInit,\n        false,\n        true,\n      );\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    }\n\n    // Create loop\n    if (swiper.params.loop) {\n      swiper.loopCreate(undefined, true);\n    }\n\n    // Attach events\n    swiper.attachEvents();\n    const lazyElements = [...swiper.el.querySelectorAll('[loading=\"lazy\"]')];\n    if (swiper.isElement) {\n      lazyElements.push(...swiper.hostEl.querySelectorAll('[loading=\"lazy\"]'));\n    }\n    lazyElements.forEach((imageEl) => {\n      if (imageEl.complete) {\n        processLazyPreloader(swiper, imageEl);\n      } else {\n        imageEl.addEventListener('load', (e) => {\n          processLazyPreloader(swiper, e.target);\n        });\n      }\n    });\n    preload(swiper);\n\n    // Init Flag\n    swiper.initialized = true;\n\n    preload(swiper);\n\n    // Emit\n    swiper.emit('init');\n    swiper.emit('afterInit');\n\n    return swiper;\n  }\n\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const { params, el, wrapperEl, slides } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n\n    swiper.emit('beforeDestroy');\n\n    // Init Flag\n    swiper.initialized = false;\n\n    // Detach events\n    swiper.detachEvents();\n\n    // Destroy loop\n    if (params.loop) {\n      swiper.loopDestroy();\n    }\n\n    // Cleanup styles\n    if (cleanStyles) {\n      swiper.removeClasses();\n      if (el && typeof el !== 'string') {\n        el.removeAttribute('style');\n      }\n      if (wrapperEl) {\n        wrapperEl.removeAttribute('style');\n      }\n      if (slides && slides.length) {\n        slides.forEach((slideEl) => {\n          slideEl.classList.remove(\n            params.slideVisibleClass,\n            params.slideFullyVisibleClass,\n            params.slideActiveClass,\n            params.slideNextClass,\n            params.slidePrevClass,\n          );\n          slideEl.removeAttribute('style');\n          slideEl.removeAttribute('data-swiper-slide-index');\n        });\n      }\n    }\n\n    swiper.emit('destroy');\n\n    // Detach emitter events\n    Object.keys(swiper.eventsListeners).forEach((eventName) => {\n      swiper.off(eventName);\n    });\n\n    if (deleteInstance !== false) {\n      if (swiper.el && typeof swiper.el !== 'string') {\n        swiper.el.swiper = null;\n      }\n      deleteProps(swiper);\n    }\n    swiper.destroyed = true;\n\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return defaults;\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach((m) => Swiper.installModule(m));\n      return Swiper;\n    }\n    Swiper.installModule(module);\n    return Swiper;\n  }\n}\n\nObject.keys(prototypes).forEach((prototypeGroup) => {\n  Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\n\nSwiper.use([Resize, Observer]);\n\nexport default Swiper;\n"
  },
  {
    "path": "src/core/defaults.mjs",
    "content": "export default {\n  init: true,\n  direction: 'horizontal',\n  oneWayMovement: false,\n  swiperElementNodeName: 'SWIPER-CONTAINER',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  eventsPrefix: 'swiper',\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n\n  // Overrides\n  width: null,\n  height: null,\n\n  //\n  preventInteractionOnTransition: false,\n\n  // ssr\n  userAgent: null,\n  url: null,\n\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n\n  // Autoheight\n  autoHeight: false,\n\n  // Set wrapper width\n  setWrapperSize: false,\n\n  // Virtual Translate\n  virtualTranslate: false,\n\n  // Effects\n  effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0, // in px\n  slidesOffsetAfter: 0, // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  snapToSlideEdge: false,\n\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n\n  // Round length\n  roundLengths: false,\n\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 5,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n\n  // Progress\n  watchSlidesProgress: false,\n\n  // Cursor\n  grabCursor: false,\n\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n\n  // loop\n  loop: false,\n  loopAddBlankSlides: true,\n  loopAdditionalSlides: 0,\n  loopPreventsSliding: true,\n\n  // rewind\n  rewind: false,\n\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null, // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n\n  // Passive Listeners\n  passiveListeners: true,\n\n  maxBackfaceHiddenSlides: 10,\n\n  // NS\n  containerModifierClass: 'swiper-', // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideFullyVisibleClass: 'swiper-slide-fully-visible',\n  slideNextClass: 'swiper-slide-next',\n  slidePrevClass: 'swiper-slide-prev',\n  wrapperClass: 'swiper-wrapper',\n  lazyPreloaderClass: 'swiper-lazy-preloader',\n  lazyPreloadPrevNext: 0,\n\n  // Callbacks\n  runCallbacksOnInit: true,\n\n  // Internals\n  _emitClasses: false,\n};\n"
  },
  {
    "path": "src/core/events/index.mjs",
    "content": "import { getDocument } from 'ssr-window';\n\nimport onTouchStart from './onTouchStart.mjs';\nimport onTouchMove from './onTouchMove.mjs';\nimport onTouchEnd from './onTouchEnd.mjs';\nimport onResize from './onResize.mjs';\nimport onClick from './onClick.mjs';\nimport onScroll from './onScroll.mjs';\nimport onLoad from './onLoad.mjs';\nimport onDocumentTouchStart from './onDocumentTouchStart.mjs';\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const { params, el, wrapperEl, device } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method;\n  if (!el || typeof el === 'string') return;\n\n  // Touch Events\n  document[domMethod]('touchstart', swiper.onDocumentTouchStart, { passive: false, capture });\n  el[domMethod]('touchstart', swiper.onTouchStart, { passive: false });\n  el[domMethod]('pointerdown', swiper.onTouchStart, { passive: false });\n  document[domMethod]('touchmove', swiper.onTouchMove, { passive: false, capture });\n  document[domMethod]('pointermove', swiper.onTouchMove, { passive: false, capture });\n  document[domMethod]('touchend', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('pointerup', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('pointercancel', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('touchcancel', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('pointerout', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('pointerleave', swiper.onTouchEnd, { passive: true });\n  document[domMethod]('contextmenu', swiper.onTouchEnd, { passive: true });\n\n  // Prevent Links Clicks\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  }\n\n  // Resize handler\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](\n      device.ios || device.android\n        ? 'resize orientationchange observerUpdate'\n        : 'resize observerUpdate',\n      onResize,\n      true,\n    );\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n\n  // Images loader\n  el[domMethod]('load', swiper.onLoad, { capture: true });\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const { params } = swiper;\n\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n\n  swiper.onClick = onClick.bind(swiper);\n  swiper.onLoad = onLoad.bind(swiper);\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\nexport default {\n  attachEvents,\n  detachEvents,\n};\n"
  },
  {
    "path": "src/core/events/onClick.mjs",
    "content": "export default function onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}\n"
  },
  {
    "path": "src/core/events/onDocumentTouchStart.mjs",
    "content": "export default function onDocumentTouchStart() {\n  const swiper = this;\n  if (swiper.documentTouchHandlerProceeded) return;\n  swiper.documentTouchHandlerProceeded = true;\n  if (swiper.params.touchReleaseOnEdges) {\n    swiper.el.style.touchAction = 'auto';\n  }\n}\n"
  },
  {
    "path": "src/core/events/onLoad.mjs",
    "content": "import { processLazyPreloader } from '../../shared/process-lazy-preloader.mjs';\n\nexport default function onLoad(e) {\n  const swiper = this;\n  processLazyPreloader(swiper, e.target);\n  if (\n    swiper.params.cssMode ||\n    (swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight)\n  ) {\n    return;\n  }\n  swiper.update();\n}\n"
  },
  {
    "path": "src/core/events/onResize.mjs",
    "content": "export default function onResize() {\n  const swiper = this;\n\n  const { params, el } = swiper;\n\n  if (el && el.offsetWidth === 0) return;\n\n  // Breakpoints\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  }\n\n  // Save locks\n  const { allowSlideNext, allowSlidePrev, snapGrid } = swiper;\n\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n  // Disable locks on resize\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n\n  swiper.updateSize();\n  swiper.updateSlides();\n\n  swiper.updateSlidesClasses();\n  const isVirtualLoop = isVirtual && params.loop;\n  if (\n    (params.slidesPerView === 'auto' || params.slidesPerView > 1) &&\n    swiper.isEnd &&\n    !swiper.isBeginning &&\n    !swiper.params.centeredSlides &&\n    !isVirtualLoop\n  ) {\n    const slides = isVirtual ? swiper.virtual.slides : swiper.slides;\n    swiper.slideTo(slides.length - 1, 0, false, true);\n  } else {\n    if (swiper.params.loop && !isVirtual) {\n      swiper.slideToLoop(swiper.realIndex, 0, false, true);\n    } else {\n      swiper.slideTo(swiper.activeIndex, 0, false, true);\n    }\n  }\n\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    clearTimeout(swiper.autoplay.resizeTimeout);\n    swiper.autoplay.resizeTimeout = setTimeout(() => {\n      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n        swiper.autoplay.resume();\n      }\n    }, 500);\n  }\n  // Return locks after resize\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}\n"
  },
  {
    "path": "src/core/events/onScroll.mjs",
    "content": "export default function onScroll() {\n  const swiper = this;\n  const { wrapperEl, rtlTranslate, enabled } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  }\n  // eslint-disable-next-line\n  if (swiper.translate === 0) swiper.translate = 0;\n\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, false);\n}\n"
  },
  {
    "path": "src/core/events/onTouchEnd.mjs",
    "content": "import { now, nextTick } from '../../shared/utils.mjs';\n\nexport default function onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let targetTouch;\n  const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';\n  if (!isTouchEvent) {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    if (e.pointerId !== data.pointerId) return;\n    targetTouch = e;\n  } else {\n    targetTouch = [...e.changedTouches].find((t) => t.identifier === data.touchId);\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  }\n\n  if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {\n    const proceed =\n      ['pointercancel', 'contextmenu'].includes(e.type) &&\n      (swiper.browser.isSafari || swiper.browser.isWebView);\n    if (!proceed) {\n      return;\n    }\n  }\n\n  data.pointerId = null;\n  data.touchId = null;\n  const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n  data.allowTouchCallbacks = false;\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  // Return Grab Cursor\n  if (\n    params.grabCursor &&\n    data.isMoved &&\n    data.isTouched &&\n    (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)\n  ) {\n    swiper.setGrabCursor(false);\n  }\n\n  // Time diff\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime;\n\n  // Tap, doubleTap, Click\n  if (swiper.allowClick) {\n    const pathTree = e.path || (e.composedPath && e.composedPath());\n    swiper.updateClickedSlide((pathTree && pathTree[0]) || e.target, pathTree);\n    swiper.emit('tap click', e);\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (\n    !data.isTouched ||\n    !data.isMoved ||\n    !swiper.swipeDirection ||\n    (touches.diff === 0 && !data.loopSwapReset) ||\n    (data.currentTranslate === data.startTranslate && !data.loopSwapReset)\n  ) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n\n  let currentPos;\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({ currentPos });\n    return;\n  }\n\n  // Find current slide\n  const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n  for (\n    let i = 0;\n    i < slidesGrid.length;\n    i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup\n  ) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (swipeToLast || (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment])) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (swipeToLast || currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  }\n\n  let rewindFirstIndex = null;\n  let rewindLastIndex = null;\n  if (params.rewind) {\n    if (swiper.isBeginning) {\n      rewindLastIndex =\n        params.virtual && params.virtual.enabled && swiper.virtual\n          ? swiper.virtual.slides.length - 1\n          : swiper.slides.length - 1;\n    } else if (swiper.isEnd) {\n      rewindFirstIndex = 0;\n    }\n  }\n  // Find current slide size\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio)\n        swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);\n      else swiper.slideTo(stopIndex);\n    }\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) {\n        swiper.slideTo(stopIndex + increment);\n      } else if (\n        rewindLastIndex !== null &&\n        ratio < 0 &&\n        Math.abs(ratio) > params.longSwipesRatio\n      ) {\n        swiper.slideTo(rewindLastIndex);\n      } else {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    const isNavButtonTarget =\n      swiper.navigation &&\n      (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n      }\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}\n"
  },
  {
    "path": "src/core/events/onTouchMove.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport { now } from '../../shared/utils.mjs';\n\nexport default function onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const { params, touches, rtlTranslate: rtl, enabled } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && event.pointerType === 'mouse') return;\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (e.type === 'pointermove') {\n    if (data.touchId !== null) return; // return from pointer if we use touch\n    const id = e.pointerId;\n    if (id !== data.pointerId) return;\n  }\n\n  let targetTouch;\n  if (e.type === 'touchmove') {\n    targetTouch = [...e.changedTouches].find((t) => t.identifier === data.touchId);\n    if (!targetTouch || targetTouch.identifier !== data.touchId) return;\n  } else {\n    targetTouch = e;\n  }\n\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n    return;\n  }\n\n  const pageX = targetTouch.pageX;\n  const pageY = targetTouch.pageY;\n\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n\n  if (!swiper.allowTouchMove) {\n    if (!e.target.matches(data.focusableElements)) {\n      swiper.allowClick = false;\n    }\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY,\n      });\n      data.touchStartTime = now();\n    }\n    return;\n  }\n  if (params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (\n        (pageY < touches.startY && swiper.translate <= swiper.maxTranslate()) ||\n        (pageY > touches.startY && swiper.translate >= swiper.minTranslate())\n      ) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (\n      rtl &&\n      ((pageX > touches.startX && -swiper.translate <= swiper.maxTranslate()) ||\n        (pageX < touches.startX && -swiper.translate >= swiper.minTranslate()))\n    ) {\n      return;\n    } else if (\n      !rtl &&\n      ((pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) ||\n        (pageX > touches.startX && swiper.translate >= swiper.minTranslate()))\n    ) {\n      return;\n    }\n  }\n  if (\n    document.activeElement &&\n    document.activeElement.matches(data.focusableElements) &&\n    document.activeElement !== e.target &&\n    e.pointerType !== 'mouse'\n  ) {\n    document.activeElement.blur();\n  }\n  if (document.activeElement) {\n    if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n\n  touches.previousX = touches.currentX;\n  touches.previousY = touches.currentY;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)\n    return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n    if (\n      (swiper.isHorizontal() && touches.currentY === touches.startY) ||\n      (swiper.isVertical() && touches.currentX === touches.startX)\n    ) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n        data.isScrolling = swiper.isHorizontal()\n          ? touchAngle > params.touchAngle\n          : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n  if (data.isScrolling || (e.type === 'touchmove' && data.preventTouchMoveFromPointerMove)) {\n    data.isTouched = false;\n    return;\n  }\n  if (!data.startMoving) {\n    return;\n  }\n  swiper.allowClick = false;\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  let touchesDiff = swiper.isHorizontal()\n    ? touches.currentX - touches.previousX\n    : touches.currentY - touches.previousY;\n\n  if (params.oneWayMovement) {\n    diff = Math.abs(diff) * (rtl ? 1 : -1);\n    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);\n  }\n  touches.diff = diff;\n\n  diff *= params.touchRatio;\n  if (rtl) {\n    diff = -diff;\n    touchesDiff = -touchesDiff;\n  }\n\n  const prevTouchesDirection = swiper.touchesDirection;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';\n\n  const isLoop = swiper.params.loop && !params.cssMode;\n  const allowLoopFix =\n    (swiper.touchesDirection === 'next' && swiper.allowSlideNext) ||\n    (swiper.touchesDirection === 'prev' && swiper.allowSlidePrev);\n  if (!data.isMoved) {\n    if (isLoop && allowLoopFix) {\n      swiper.loopFix({ direction: swiper.swipeDirection });\n    }\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n    if (swiper.animating) {\n      const evt = new window.CustomEvent('transitionend', {\n        bubbles: true,\n        cancelable: true,\n        detail: {\n          bySwiperTouchMove: true,\n        },\n      });\n      swiper.wrapperEl.dispatchEvent(evt);\n    }\n    data.allowMomentumBounce = false;\n    // Grab Cursor\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n    swiper.emit('sliderFirstMove', e);\n  }\n  let loopFixed;\n  let time = new Date().getTime();\n\n  if (\n    params._loopSwapReset !== false &&\n    data.isMoved &&\n    data.allowThresholdMove &&\n    prevTouchesDirection !== swiper.touchesDirection &&\n    isLoop &&\n    allowLoopFix &&\n    Math.abs(diff) >= 1\n  ) {\n    Object.assign(touches, {\n      startX: pageX,\n      startY: pageY,\n      currentX: pageX,\n      currentY: pageY,\n      startTranslate: data.currentTranslate,\n    });\n    data.loopSwapReset = true;\n    data.startTranslate = data.currentTranslate;\n    return;\n  }\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n  if (diff > 0) {\n    if (\n      isLoop &&\n      allowLoopFix &&\n      !loopFixed &&\n      data.allowThresholdMove &&\n      data.currentTranslate >\n        (params.centeredSlides\n          ? swiper.minTranslate() -\n            swiper.slidesSizesGrid[swiper.activeIndex + 1] -\n            (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2\n              ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween\n              : 0) -\n            swiper.params.spaceBetween\n          : swiper.minTranslate())\n    ) {\n      swiper.loopFix({ direction: 'prev', setTranslate: true, activeSlideIndex: 0 });\n    }\n    if (data.currentTranslate > swiper.minTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate =\n          swiper.minTranslate() -\n          1 +\n          (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n      }\n    }\n  } else if (diff < 0) {\n    if (\n      isLoop &&\n      allowLoopFix &&\n      !loopFixed &&\n      data.allowThresholdMove &&\n      data.currentTranslate <\n        (params.centeredSlides\n          ? swiper.maxTranslate() +\n            swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] +\n            swiper.params.spaceBetween +\n            (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2\n              ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] +\n                swiper.params.spaceBetween\n              : 0)\n          : swiper.maxTranslate())\n    ) {\n      swiper.loopFix({\n        direction: 'next',\n        setTranslate: true,\n        activeSlideIndex:\n          swiper.slides.length -\n          (params.slidesPerView === 'auto'\n            ? swiper.slidesPerViewDynamic()\n            : Math.ceil(parseFloat(params.slidesPerView, 10))),\n      });\n    }\n    if (data.currentTranslate < swiper.maxTranslate()) {\n      disableParentSwiper = false;\n      if (params.resistance) {\n        data.currentTranslate =\n          swiper.maxTranslate() +\n          1 -\n          (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n      }\n    }\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  }\n\n  // Directions locks\n  if (\n    !swiper.allowSlideNext &&\n    swiper.swipeDirection === 'next' &&\n    data.currentTranslate < data.startTranslate\n  ) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (\n    !swiper.allowSlidePrev &&\n    swiper.swipeDirection === 'prev' &&\n    data.currentTranslate > data.startTranslate\n  ) {\n    data.currentTranslate = data.startTranslate;\n  }\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  // Threshold\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal()\n          ? touches.currentX - touches.startX\n          : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return;\n\n  // Update active index in free mode\n  if (\n    (params.freeMode && params.freeMode.enabled && swiper.freeMode) ||\n    params.watchSlidesProgress\n  ) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  }\n  // Update progress\n  swiper.updateProgress(data.currentTranslate);\n  // Update translate\n  swiper.setTranslate(data.currentTranslate);\n}\n"
  },
  {
    "path": "src/core/events/onTouchStart.mjs",
    "content": "import { getWindow, getDocument } from 'ssr-window';\nimport { now, elementIsChildOf } from '../../shared/utils.mjs';\n\n// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\nfunction closestElement(selector, base = this) {\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    if (!found && !el.getRootNode) {\n      return null;\n    }\n    return found || __closestFrom(el.getRootNode().host);\n  }\n  return __closestFrom(base);\n}\n\nfunction preventEdgeSwipe(swiper, event, startX) {\n  const window = getWindow();\n  const { params } = swiper;\n  const edgeSwipeDetection = params.edgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold;\n  if (\n    edgeSwipeDetection &&\n    (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)\n  ) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n      return true;\n    }\n    return false;\n  }\n  return true;\n}\n\nexport default function onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  const data = swiper.touchEventsData;\n  if (e.type === 'pointerdown') {\n    if (data.pointerId !== null && data.pointerId !== e.pointerId) {\n      return;\n    }\n    data.pointerId = e.pointerId;\n  } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {\n    data.touchId = e.targetTouches[0].identifier;\n  }\n  if (e.type === 'touchstart') {\n    // don't proceed touch event\n    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);\n    return;\n  }\n\n  const { params, touches, enabled } = swiper;\n  if (!enabled) return;\n  if (!params.simulateTouch && e.pointerType === 'mouse') return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n\n  let targetEl = e.target;\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!elementIsChildOf(targetEl, swiper.wrapperEl)) return;\n  }\n  if ('which' in e && e.which === 3) return;\n  if ('button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return;\n\n  // change target el for shadow root component\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n  // eslint-disable-next-line\n  const eventPath = e.composedPath ? e.composedPath() : e.path;\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {\n    targetEl = eventPath[0];\n  }\n\n  const noSwipingSelector = params.noSwipingSelector\n    ? params.noSwipingSelector\n    : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot);\n\n  // use closestElement for shadow root element to get the actual closest for nested shadow root element\n  if (\n    params.noSwiping &&\n    (isTargetShadow\n      ? closestElement(noSwipingSelector, targetEl)\n      : targetEl.closest(noSwipingSelector))\n  ) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!targetEl.closest(params.swipeHandler)) return;\n  }\n\n  touches.currentX = e.pageX;\n  touches.currentY = e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY;\n\n  // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  if (!preventEdgeSwipe(swiper, e, startX)) {\n    return;\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined,\n  });\n\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n  let preventDefault = true;\n  if (targetEl.matches(data.focusableElements)) {\n    preventDefault = false;\n    if (targetEl.nodeName === 'SELECT') {\n      data.isTouched = false;\n    }\n  }\n\n  if (\n    document.activeElement &&\n    document.activeElement.matches(data.focusableElements) &&\n    document.activeElement !== targetEl &&\n    (e.pointerType === 'mouse' ||\n      (e.pointerType !== 'mouse' && !targetEl.matches(data.focusableElements)))\n  ) {\n    document.activeElement.blur();\n  }\n\n  const shouldPreventDefault =\n    preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n  if (\n    (params.touchStartForcePreventDefault || shouldPreventDefault) &&\n    !targetEl.isContentEditable\n  ) {\n    e.preventDefault();\n  }\n  if (\n    params.freeMode &&\n    params.freeMode.enabled &&\n    swiper.freeMode &&\n    swiper.animating &&\n    !params.cssMode\n  ) {\n    swiper.freeMode.onTouchStart();\n  }\n  swiper.emit('touchStart', e);\n}\n"
  },
  {
    "path": "src/core/events-emitter.mjs",
    "content": "/* eslint-disable no-underscore-dangle */\n\nexport default {\n  on(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach((event) => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n\n  once(events, handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n      handler.apply(self, args);\n    }\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n    return self;\n  },\n\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n    return self;\n  },\n\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach((event) => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (\n            eventHandler === handler ||\n            (eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler)\n          ) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners || self.destroyed) return self;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n\n    eventsArray.forEach((event) => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach((eventHandler) => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler) => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  },\n};\n"
  },
  {
    "path": "src/core/grab-cursor/index.mjs",
    "content": "import setGrabCursor from './setGrabCursor.mjs';\nimport unsetGrabCursor from './unsetGrabCursor.mjs';\n\nexport default {\n  setGrabCursor,\n  unsetGrabCursor,\n};\n"
  },
  {
    "path": "src/core/grab-cursor/setGrabCursor.mjs",
    "content": "export default function setGrabCursor(moving) {\n  const swiper = this;\n  if (\n    !swiper.params.simulateTouch ||\n    (swiper.params.watchOverflow && swiper.isLocked) ||\n    swiper.params.cssMode\n  )\n    return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n"
  },
  {
    "path": "src/core/grab-cursor/unsetGrabCursor.mjs",
    "content": "export default function unsetGrabCursor() {\n  const swiper = this;\n  if ((swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) {\n    return;\n  }\n  if (swiper.isElement) {\n    swiper.__preventObserver__ = true;\n  }\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n  if (swiper.isElement) {\n    requestAnimationFrame(() => {\n      swiper.__preventObserver__ = false;\n    });\n  }\n}\n"
  },
  {
    "path": "src/core/loop/index.mjs",
    "content": "import loopCreate from './loopCreate.mjs';\nimport loopFix from './loopFix.mjs';\nimport loopDestroy from './loopDestroy.mjs';\n\nexport default {\n  loopCreate,\n  loopFix,\n  loopDestroy,\n};\n"
  },
  {
    "path": "src/core/loop/loopCreate.mjs",
    "content": "import { createElement, elementChildren, showWarning } from '../../shared/utils.mjs';\n\nexport default function loopCreate(slideRealIndex, initial) {\n  const swiper = this;\n  const { params, slidesEl } = swiper;\n  if (!params.loop || (swiper.virtual && swiper.params.virtual.enabled)) return;\n\n  const initSlides = () => {\n    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);\n\n    slides.forEach((el, index) => {\n      el.setAttribute('data-swiper-slide-index', index);\n    });\n  };\n\n  const clearBlankSlides = () => {\n    const slides = elementChildren(slidesEl, `.${params.slideBlankClass}`);\n\n    slides.forEach((el) => {\n      el.remove();\n    });\n    if (slides.length > 0) {\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    }\n  };\n\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n  if (params.loopAddBlankSlides && (params.slidesPerGroup > 1 || gridEnabled)) {\n    clearBlankSlides();\n  }\n\n  const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);\n\n  const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;\n  const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;\n\n  const addBlankSlides = (amountOfSlides) => {\n    for (let i = 0; i < amountOfSlides; i += 1) {\n      const slideEl = swiper.isElement\n        ? createElement('swiper-slide', [params.slideBlankClass])\n        : createElement('div', [params.slideClass, params.slideBlankClass]);\n      swiper.slidesEl.append(slideEl);\n    }\n  };\n\n  if (shouldFillGroup) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = slidesPerGroup - (swiper.slides.length % slidesPerGroup);\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning(\n        'Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)',\n      );\n    }\n\n    initSlides();\n  } else if (shouldFillGrid) {\n    if (params.loopAddBlankSlides) {\n      const slidesToAdd = params.grid.rows - (swiper.slides.length % params.grid.rows);\n      addBlankSlides(slidesToAdd);\n      swiper.recalcSlides();\n      swiper.updateSlides();\n    } else {\n      showWarning(\n        'Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)',\n      );\n    }\n    initSlides();\n  } else {\n    initSlides();\n  }\n\n  const bothDirections =\n    params.centeredSlides || !!params.slidesOffsetBefore || !!params.slidesOffsetAfter;\n  swiper.loopFix({\n    slideRealIndex,\n    direction: bothDirections ? undefined : 'next',\n    initial,\n  });\n}\n"
  },
  {
    "path": "src/core/loop/loopDestroy.mjs",
    "content": "export default function loopDestroy() {\n  const swiper = this;\n  const { params, slidesEl } = swiper;\n  if (!params.loop || !slidesEl || (swiper.virtual && swiper.params.virtual.enabled)) return;\n  swiper.recalcSlides();\n\n  const newSlidesOrder = [];\n  swiper.slides.forEach((slideEl) => {\n    const index =\n      typeof slideEl.swiperSlideIndex === 'undefined'\n        ? slideEl.getAttribute('data-swiper-slide-index') * 1\n        : slideEl.swiperSlideIndex;\n    newSlidesOrder[index] = slideEl;\n  });\n  swiper.slides.forEach((slideEl) => {\n    slideEl.removeAttribute('data-swiper-slide-index');\n  });\n  newSlidesOrder.forEach((slideEl) => {\n    slidesEl.append(slideEl);\n  });\n  swiper.recalcSlides();\n  swiper.slideTo(swiper.realIndex, 0);\n}\n"
  },
  {
    "path": "src/core/loop/loopFix.mjs",
    "content": "import { showWarning } from '../../shared/utils.mjs';\n\nexport default function loopFix({\n  slideRealIndex,\n  slideTo = true,\n  direction,\n  setTranslate,\n  activeSlideIndex,\n  initial,\n  byController,\n  byMousewheel,\n} = {}) {\n  const swiper = this;\n\n  if (!swiper.params.loop) return;\n  swiper.emit('beforeLoopFix');\n  const { slides, allowSlidePrev, allowSlideNext, slidesEl, params } = swiper;\n  const { centeredSlides, slidesOffsetBefore, slidesOffsetAfter, initialSlide } = params;\n  const bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;\n\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n\n  if (swiper.virtual && params.virtual.enabled) {\n    if (slideTo) {\n      if (!bothDirections && swiper.snapIndex === 0) {\n        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);\n      } else if (bothDirections && swiper.snapIndex < params.slidesPerView) {\n        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);\n      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {\n        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);\n      }\n    }\n    swiper.allowSlidePrev = allowSlidePrev;\n    swiper.allowSlideNext = allowSlideNext;\n    swiper.emit('loopFix');\n    return;\n  }\n  let slidesPerView = params.slidesPerView;\n  if (slidesPerView === 'auto') {\n    slidesPerView = swiper.slidesPerViewDynamic();\n  } else {\n    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));\n    if (bothDirections && slidesPerView % 2 === 0) {\n      slidesPerView = slidesPerView + 1;\n    }\n  }\n\n  const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;\n  let loopedSlides = bothDirections\n    ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2))\n    : slidesPerGroup;\n\n  if (loopedSlides % slidesPerGroup !== 0) {\n    loopedSlides += slidesPerGroup - (loopedSlides % slidesPerGroup);\n  }\n  loopedSlides += params.loopAdditionalSlides;\n  swiper.loopedSlides = loopedSlides;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n\n  if (\n    slides.length < slidesPerView + loopedSlides ||\n    (swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2)\n  ) {\n    showWarning(\n      'Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters',\n    );\n  } else if (gridEnabled && params.grid.fill === 'row') {\n    showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');\n  }\n\n  const prependSlidesIndexes = [];\n  const appendSlidesIndexes = [];\n\n  const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;\n\n  const isInitialOverflow = initial && cols - initialSlide < slidesPerView && !bothDirections;\n\n  let activeIndex = isInitialOverflow ? initialSlide : swiper.activeIndex;\n\n  if (typeof activeSlideIndex === 'undefined') {\n    activeSlideIndex = swiper.getSlideIndex(\n      slides.find((el) => el.classList.contains(params.slideActiveClass)),\n    );\n  } else {\n    activeIndex = activeSlideIndex;\n  }\n\n  const isNext = direction === 'next' || !direction;\n  const isPrev = direction === 'prev' || !direction;\n\n  let slidesPrepended = 0;\n  let slidesAppended = 0;\n\n  const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;\n  const activeColIndexWithShift =\n    activeColIndex +\n    (bothDirections && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);\n  // prepend last slides before start\n  if (activeColIndexWithShift < loopedSlides) {\n    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);\n    for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        const colIndexToPrepend = cols - index - 1;\n        for (let i = slides.length - 1; i >= 0; i -= 1) {\n          if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);\n        }\n        // slides.forEach((slide, slideIndex) => {\n        //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);\n        // });\n      } else {\n        prependSlidesIndexes.push(cols - index - 1);\n      }\n    }\n  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {\n    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);\n    if (isInitialOverflow) {\n      slidesAppended = Math.max(slidesAppended, slidesPerView - cols + initialSlide + 1);\n    }\n\n    for (let i = 0; i < slidesAppended; i += 1) {\n      const index = i - Math.floor(i / cols) * cols;\n      if (gridEnabled) {\n        slides.forEach((slide, slideIndex) => {\n          if (slide.column === index) appendSlidesIndexes.push(slideIndex);\n        });\n      } else {\n        appendSlidesIndexes.push(index);\n      }\n    }\n  }\n  swiper.__preventObserver__ = true;\n  requestAnimationFrame(() => {\n    swiper.__preventObserver__ = false;\n  });\n  if (swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {\n    if (appendSlidesIndexes.includes(activeSlideIndex)) {\n      appendSlidesIndexes.splice(appendSlidesIndexes.indexOf(activeSlideIndex), 1);\n    }\n    if (prependSlidesIndexes.includes(activeSlideIndex)) {\n      prependSlidesIndexes.splice(prependSlidesIndexes.indexOf(activeSlideIndex), 1);\n    }\n  }\n\n  if (isPrev) {\n    prependSlidesIndexes.forEach((index) => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.prepend(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n  if (isNext) {\n    appendSlidesIndexes.forEach((index) => {\n      slides[index].swiperLoopMoveDOM = true;\n      slidesEl.append(slides[index]);\n      slides[index].swiperLoopMoveDOM = false;\n    });\n  }\n\n  swiper.recalcSlides();\n  if (params.slidesPerView === 'auto') {\n    swiper.updateSlides();\n  } else if (\n    gridEnabled &&\n    ((prependSlidesIndexes.length > 0 && isPrev) || (appendSlidesIndexes.length > 0 && isNext))\n  ) {\n    swiper.slides.forEach((slide, slideIndex) => {\n      swiper.grid.updateSlide(slideIndex, slide, swiper.slides);\n    });\n  }\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n  if (slideTo) {\n    if (prependSlidesIndexes.length > 0 && isPrev) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate =\n              swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        if (setTranslate) {\n          const shift = gridEnabled\n            ? prependSlidesIndexes.length / params.grid.rows\n            : prependSlidesIndexes.length;\n          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);\n          swiper.touchEventsData.currentTranslate = swiper.translate;\n        }\n      }\n    } else if (appendSlidesIndexes.length > 0 && isNext) {\n      if (typeof slideRealIndex === 'undefined') {\n        const currentSlideTranslate = swiper.slidesGrid[activeIndex];\n        const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];\n        const diff = newSlideTranslate - currentSlideTranslate;\n        if (byMousewheel) {\n          swiper.setTranslate(swiper.translate - diff);\n        } else {\n          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);\n          if (setTranslate) {\n            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;\n            swiper.touchEventsData.currentTranslate =\n              swiper.touchEventsData.currentTranslate - diff;\n          }\n        }\n      } else {\n        const shift = gridEnabled\n          ? appendSlidesIndexes.length / params.grid.rows\n          : appendSlidesIndexes.length;\n        swiper.slideTo(swiper.activeIndex - shift, 0, false, true);\n      }\n    }\n  }\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.controller && swiper.controller.control && !byController) {\n    const loopParams = {\n      slideRealIndex,\n      direction,\n      setTranslate,\n      activeSlideIndex,\n      byController: true,\n    };\n    if (Array.isArray(swiper.controller.control)) {\n      swiper.controller.control.forEach((c) => {\n        if (!c.destroyed && c.params.loop)\n          c.loopFix({\n            ...loopParams,\n            slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false,\n          });\n      });\n    } else if (\n      swiper.controller.control instanceof swiper.constructor &&\n      swiper.controller.control.params.loop\n    ) {\n      swiper.controller.control.loopFix({\n        ...loopParams,\n        slideTo:\n          swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false,\n      });\n    }\n  }\n\n  swiper.emit('loopFix');\n}\n"
  },
  {
    "path": "src/core/moduleExtendParams.mjs",
    "content": "import { extend } from '../shared/utils.mjs';\n\nexport default function moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = { enabled: true };\n    }\n    if (\n      moduleParamName === 'navigation' &&\n      params[moduleParamName] &&\n      params[moduleParamName].enabled &&\n      !params[moduleParamName].prevEl &&\n      !params[moduleParamName].nextEl\n    ) {\n      params[moduleParamName].auto = true;\n    }\n    if (\n      ['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 &&\n      params[moduleParamName] &&\n      params[moduleParamName].enabled &&\n      !params[moduleParamName].el\n    ) {\n      params[moduleParamName].auto = true;\n    }\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n    if (!params[moduleParamName]) params[moduleParamName] = { enabled: false };\n    extend(allModulesParams, obj);\n  };\n}\n"
  },
  {
    "path": "src/core/modules/observer/observer.mjs",
    "content": "import { getWindow } from 'ssr-window';\nimport { elementParents } from '../../../shared/utils.mjs';\n\nexport default function Observer({ swiper, extendParams, on, emit }) {\n  const observers = [];\n  const window = getWindow();\n  const attach = (target, options = {}) => {\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc((mutations) => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (swiper.__preventObserver__) return;\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList:\n        swiper.isElement || (typeof options.childList === 'undefined' ? true : options).childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData,\n    });\n\n    observers.push(observer);\n  };\n  const init = () => {\n    if (!swiper.params.observer) return;\n    if (swiper.params.observeParents) {\n      const containerParents = elementParents(swiper.hostEl);\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    }\n    // Observe container\n    attach(swiper.hostEl, {\n      childList: swiper.params.observeSlideChildren,\n    });\n\n    // Observe wrapper\n    attach(swiper.wrapperEl, { attributes: false });\n  };\n  const destroy = () => {\n    observers.forEach((observer) => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false,\n  });\n  on('init', init);\n  on('destroy', destroy);\n}\n"
  },
  {
    "path": "src/core/modules/resize/resize.mjs",
    "content": "import { getWindow } from 'ssr-window';\n\nexport default function Resize({ swiper, on, emit }) {\n  const window = getWindow();\n  let observer = null;\n  let animationFrame = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver((entries) => {\n      animationFrame = window.requestAnimationFrame(() => {\n        const { width, height } = swiper;\n        let newWidth = width;\n        let newHeight = height;\n        entries.forEach(({ contentBoxSize, contentRect, target }) => {\n          if (target && target !== swiper.el) return;\n          newWidth = contentRect\n            ? contentRect.width\n            : (contentBoxSize[0] || contentBoxSize).inlineSize;\n          newHeight = contentRect\n            ? contentRect.height\n            : (contentBoxSize[0] || contentBoxSize).blockSize;\n        });\n        if (newWidth !== width || newHeight !== height) {\n          resizeHandler();\n        }\n      });\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (animationFrame) {\n      window.cancelAnimationFrame(animationFrame);\n    }\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}\n"
  },
  {
    "path": "src/core/slide/index.mjs",
    "content": "import slideTo from './slideTo.mjs';\nimport slideToLoop from './slideToLoop.mjs';\nimport slideNext from './slideNext.mjs';\nimport slidePrev from './slidePrev.mjs';\nimport slideReset from './slideReset.mjs';\nimport slideToClosest from './slideToClosest.mjs';\nimport slideToClickedSlide from './slideToClickedSlide.mjs';\n\nexport default {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide,\n};\n"
  },
  {
    "path": "src/core/slide/slideNext.mjs",
    "content": "/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const { enabled, params, animating } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  let perGroup = params.slidesPerGroup;\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n    swiper.loopFix({ direction: 'next' });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {\n      requestAnimationFrame(() => {\n        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n      });\n      return true;\n    }\n  }\n  if (params.rewind && swiper.isEnd) {\n    return swiper.slideTo(0, speed, runCallbacks, internal);\n  }\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}\n"
  },
  {
    "path": "src/core/slide/slidePrev.mjs",
    "content": "/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const { params, snapGrid, slidesGrid, rtlTranslate, enabled, animating } = swiper;\n  if (!enabled || swiper.destroyed) return swiper;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n\n  if (params.loop) {\n    if (animating && !isVirtual && params.loopPreventsSliding) return false;\n\n    swiper.loopFix({ direction: 'prev' });\n    // eslint-disable-next-line\n    swiper._clientLeft = swiper.wrapperEl.clientLeft;\n  }\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map((val) => normalize(val));\n\n  const isFreeMode = params.freeMode && params.freeMode.enabled;\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n  if (typeof prevSnap === 'undefined' && (params.cssMode || isFreeMode)) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = isFreeMode\n        ? snapGrid[prevSnapIndex]\n        : snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n  let prevIndex = 0;\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n    if (\n      params.slidesPerView === 'auto' &&\n      params.slidesPerGroup === 1 &&\n      params.slidesPerGroupAuto\n    ) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n  if (params.rewind && swiper.isBeginning) {\n    const lastIndex =\n      swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual\n        ? swiper.virtual.slides.length - 1\n        : swiper.slides.length - 1;\n    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {\n    requestAnimationFrame(() => {\n      swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n    });\n    return true;\n  }\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}\n"
  },
  {
    "path": "src/core/slide/slideReset.mjs",
    "content": "/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed, runCallbacks = true, internal) {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}\n"
  },
  {
    "path": "src/core/slide/slideTo.mjs",
    "content": "import { getBrowser } from '../../shared/get-browser.mjs';\nimport { animateCSSModeScroll } from '../../shared/utils.mjs';\n\nexport default function slideTo(index = 0, speed, runCallbacks = true, internal, initial) {\n  if (typeof index === 'string') {\n    index = parseInt(index, 10);\n  }\n\n  const swiper = this;\n\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled,\n  } = swiper;\n\n  if (\n    (!enabled && !internal && !initial) ||\n    swiper.destroyed ||\n    (swiper.animating && params.preventInteractionOnTransition)\n  ) {\n    return false;\n  }\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  const translate = -snapGrid[snapIndex];\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (\n          normalizedTranslate >= normalizedGrid &&\n          normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2\n        ) {\n          slideIndex = i;\n        } else if (\n          normalizedTranslate >= normalizedGrid &&\n          normalizedTranslate < normalizedGridNext\n        ) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  }\n  // Directions locks\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (\n      !swiper.allowSlideNext &&\n      (rtl\n        ? translate > swiper.translate && translate > swiper.minTranslate()\n        : translate < swiper.translate && translate < swiper.minTranslate())\n    ) {\n      return false;\n    }\n    if (\n      !swiper.allowSlidePrev &&\n      translate > swiper.translate &&\n      translate > swiper.maxTranslate()\n    ) {\n      if ((activeIndex || 0) !== slideIndex) {\n        return false;\n      }\n    }\n  }\n\n  if (slideIndex !== (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  // Update progress\n  swiper.updateProgress(translate);\n\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';\n  else if (slideIndex < activeIndex) direction = 'prev';\n  else direction = 'reset';\n\n  // initial virtual\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  const isInitialVirtual = isVirtual && initial;\n  // Update Index\n  if (\n    !isInitialVirtual &&\n    ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate))\n  ) {\n    swiper.updateActiveIndex(slideIndex);\n    // Update Height\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n    swiper.updateSlidesClasses();\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n    return false;\n  }\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n    if (speed === 0) {\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n\n      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {\n        swiper._cssModeVirtualInitialSet = true;\n        requestAnimationFrame(() => {\n          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n        });\n      } else {\n        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n      }\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._immediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({ swiper, targetPosition: t, side: isH ? 'left' : 'top' });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth',\n      });\n    }\n    return true;\n  }\n\n  const browser = getBrowser();\n  const isSafari = browser.isSafari;\n  if (isVirtual && !initial && isSafari && swiper.isElement) {\n    swiper.virtual.update(false, false, slideIndex);\n  }\n  swiper.setTransition(speed);\n  swiper.setTranslate(translate);\n  swiper.updateActiveIndex(slideIndex);\n  swiper.updateSlidesClasses();\n  swiper.emit('beforeTransitionStart', speed, internal);\n  swiper.transitionStart(runCallbacks, direction);\n\n  if (speed === 0) {\n    swiper.transitionEnd(runCallbacks, direction);\n  } else if (!swiper.animating) {\n    swiper.animating = true;\n    if (!swiper.onSlideToWrapperTransitionEnd) {\n      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n        if (!swiper || swiper.destroyed) return;\n        if (e.target !== this) return;\n        swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.onSlideToWrapperTransitionEnd = null;\n        delete swiper.onSlideToWrapperTransitionEnd;\n        swiper.transitionEnd(runCallbacks, direction);\n      };\n    }\n    swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n  }\n\n  return true;\n}\n"
  },
  {
    "path": "src/core/slide/slideToClickedSlide.mjs",
    "content": "import { elementChildren, nextTick } from '../../shared/utils.mjs';\n\nexport default function slideToClickedSlide() {\n  const swiper = this;\n  if (swiper.destroyed) return;\n  const { params, slidesEl } = swiper;\n\n  const slidesPerView =\n    params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.getSlideIndexWhenGrid(swiper.clickedIndex);\n\n  let realIndex;\n  const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;\n  const isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);\n    if (params.centeredSlides) {\n      swiper.slideToLoop(realIndex);\n    } else if (\n      slideToIndex >\n      (isGrid\n        ? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1)\n        : swiper.slides.length - slidesPerView)\n    ) {\n      swiper.loopFix();\n      slideToIndex = swiper.getSlideIndex(\n        elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index=\"${realIndex}\"]`)[0],\n      );\n\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}\n"
  },
  {
    "path": "src/core/slide/slideToClosest.mjs",
    "content": "/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(speed, runCallbacks = true, internal, threshold = 0.5) {\n  const swiper = this;\n  if (swiper.destroyed) return;\n\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}\n"
  },
  {
    "path": "src/core/slide/slideToLoop.mjs",
    "content": "export default function slideToLoop(index = 0, speed, runCallbacks = true, internal) {\n  if (typeof index === 'string') {\n    const indexAsNumber = parseInt(index, 10);\n\n    index = indexAsNumber;\n  }\n  const swiper = this;\n  if (swiper.destroyed) return;\n\n  if (typeof speed === 'undefined') {\n    speed = swiper.params.speed;\n  }\n\n  const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;\n  let newIndex = index;\n  if (swiper.params.loop) {\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      // eslint-disable-next-line\n      newIndex = newIndex + swiper.virtual.slidesBefore;\n    } else {\n      let targetSlideIndex;\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        targetSlideIndex = swiper.slides.find(\n          (slideEl) => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex,\n        ).column;\n      } else {\n        targetSlideIndex = swiper.getSlideIndexByData(newIndex);\n      }\n\n      const cols = gridEnabled\n        ? Math.ceil(swiper.slides.length / swiper.params.grid.rows)\n        : swiper.slides.length;\n\n      const { centeredSlides, slidesOffsetBefore, slidesOffsetAfter } = swiper.params;\n      const bothDirections = centeredSlides || !!slidesOffsetBefore || !!slidesOffsetAfter;\n      let slidesPerView = swiper.params.slidesPerView;\n      if (slidesPerView === 'auto') {\n        slidesPerView = swiper.slidesPerViewDynamic();\n      } else {\n        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));\n        if (bothDirections && slidesPerView % 2 === 0) {\n          slidesPerView = slidesPerView + 1;\n        }\n      }\n      let needLoopFix = cols - targetSlideIndex < slidesPerView;\n      if (bothDirections) {\n        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);\n      }\n      if (internal && bothDirections && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {\n        needLoopFix = false;\n      }\n\n      if (needLoopFix) {\n        const direction = bothDirections\n          ? targetSlideIndex < swiper.activeIndex\n            ? 'prev'\n            : 'next'\n          : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView\n          ? 'next'\n          : 'prev';\n        swiper.loopFix({\n          direction,\n          slideTo: true,\n          activeSlideIndex:\n            direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,\n          slideRealIndex: direction === 'next' ? swiper.realIndex : undefined,\n        });\n      }\n\n      if (gridEnabled) {\n        const slideIndex = newIndex * swiper.params.grid.rows;\n        newIndex = swiper.slides.find(\n          (slideEl) => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex,\n        ).column;\n      } else {\n        newIndex = swiper.getSlideIndexByData(newIndex);\n      }\n    }\n  }\n\n  requestAnimationFrame(() => {\n    swiper.slideTo(newIndex, speed, runCallbacks, internal);\n  });\n  return swiper;\n}\n"
  },
  {
    "path": "src/core/transition/index.mjs",
    "content": "import setTransition from './setTransition.mjs';\nimport transitionStart from './transitionStart.mjs';\nimport transitionEnd from './transitionEnd.mjs';\n\nexport default {\n  setTransition,\n  transitionStart,\n  transitionEnd,\n};\n"
  },
  {
    "path": "src/core/transition/setTransition.mjs",
    "content": "export default function setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.wrapperEl.style.transitionDuration = `${duration}ms`;\n    swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}\n"
  },
  {
    "path": "src/core/transition/transitionEmit.mjs",
    "content": "export default function transitionEmit({ swiper, runCallbacks, direction, step }) {\n  const { activeIndex, previousIndex } = swiper;\n  let dir = direction;\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';\n    else if (activeIndex < previousIndex) dir = 'prev';\n    else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\n  if (runCallbacks && dir === 'reset') {\n    swiper.emit(`slideResetTransition${step}`);\n  } else if (runCallbacks && activeIndex !== previousIndex) {\n    swiper.emit(`slideChangeTransition${step}`);\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}\n"
  },
  {
    "path": "src/core/transition/transitionEnd.mjs",
    "content": "import transitionEmit from './transitionEmit.mjs';\n\nexport default function transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const { params } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n\n  transitionEmit({ swiper, runCallbacks, direction, step: 'End' });\n}\n"
  },
  {
    "path": "src/core/transition/transitionStart.mjs",
    "content": "import transitionEmit from './transitionEmit.mjs';\n\nexport default function transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const { params } = swiper;\n  if (params.cssMode) return;\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  transitionEmit({ swiper, runCallbacks, direction, step: 'Start' });\n}\n"
  },
  {
    "path": "src/core/translate/getTranslate.mjs",
    "content": "import { getTranslate } from '../../shared/utils.mjs';\n\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n\n  const { params, rtlTranslate: rtl, translate, wrapperEl } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = getTranslate(wrapperEl, axis);\n  currentTranslate += swiper.cssOverflowAdjustment();\n  if (rtl) currentTranslate = -currentTranslate;\n\n  return currentTranslate || 0;\n}\n"
  },
  {
    "path": "src/core/translate/index.mjs",
    "content": "import getTranslate from './getTranslate.mjs';\nimport setTranslate from './setTranslate.mjs';\nimport minTranslate from './minTranslate.mjs';\nimport maxTranslate from './maxTranslate.mjs';\nimport translateTo from './translateTo.mjs';\n\nexport default {\n  getTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo,\n};\n"
  },
  {
    "path": "src/core/translate/maxTranslate.mjs",
    "content": "export default function maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}\n"
  },
  {
    "path": "src/core/translate/minTranslate.mjs",
    "content": "export default function minTranslate() {\n  return -this.snapGrid[0];\n}\n"
  },
  {
    "path": "src/core/translate/setTranslate.mjs",
    "content": "export default function setTranslate(translate, byController) {\n  const swiper = this;\n  const { rtlTranslate: rtl, params, wrapperEl, progress } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y;\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    if (swiper.isHorizontal()) {\n      x -= swiper.cssOverflowAdjustment();\n    } else {\n      y -= swiper.cssOverflowAdjustment();\n    }\n    wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;\n  }\n\n  // Check if we need to update progress\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, byController);\n}\n"
  },
  {
    "path": "src/core/translate/translateTo.mjs",
    "content": "import { animateCSSModeScroll } from '../../shared/utils.mjs';\n\nexport default function translateTo(\n  translate = 0,\n  speed = this.params.speed,\n  runCallbacks = true,\n  translateBounds = true,\n  internal,\n) {\n  const swiper = this;\n\n  const { params, wrapperEl } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;\n  else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;\n  else newTranslate = translate;\n\n  // Update progress\n  swiper.updateProgress(newTranslate);\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({ swiper, targetPosition: -newTranslate, side: isH ? 'left' : 'top' });\n        return true;\n      }\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth',\n      });\n    }\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n    if (!swiper.animating) {\n      swiper.animating = true;\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.wrapperEl.removeEventListener(\n            'transitionend',\n            swiper.onTranslateToWrapperTransitionEnd,\n          );\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n          swiper.animating = false;\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n      swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}\n"
  },
  {
    "path": "src/core/update/index.mjs",
    "content": "import updateSize from './updateSize.mjs';\nimport updateSlides from './updateSlides.mjs';\nimport updateAutoHeight from './updateAutoHeight.mjs';\nimport updateSlidesOffset from './updateSlidesOffset.mjs';\nimport updateSlidesProgress from './updateSlidesProgress.mjs';\nimport updateProgress from './updateProgress.mjs';\nimport updateSlidesClasses from './updateSlidesClasses.mjs';\nimport updateActiveIndex from './updateActiveIndex.mjs';\nimport updateClickedSlide from './updateClickedSlide.mjs';\n\nexport default {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide,\n};\n"
  },
  {
    "path": "src/core/update/updateActiveIndex.mjs",
    "content": "import { preload } from '../../shared/process-lazy-preloader.mjs';\n\nexport function getActiveIndexByTranslate(swiper) {\n  const { slidesGrid, params } = swiper;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  let activeIndex;\n  for (let i = 0; i < slidesGrid.length; i += 1) {\n    if (typeof slidesGrid[i + 1] !== 'undefined') {\n      if (\n        translate >= slidesGrid[i] &&\n        translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2\n      ) {\n        activeIndex = i;\n      } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n        activeIndex = i + 1;\n      }\n    } else if (translate >= slidesGrid[i]) {\n      activeIndex = i;\n    }\n  }\n  // Normalize slideIndex\n  if (params.normalizeSlideIndex) {\n    if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n  }\n  return activeIndex;\n}\nexport default function updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex,\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n\n  const getVirtualRealIndex = (aIndex) => {\n    let realIndex = aIndex - swiper.virtual.slidesBefore;\n    if (realIndex < 0) {\n      realIndex = swiper.virtual.slides.length + realIndex;\n    }\n    if (realIndex >= swiper.virtual.slides.length) {\n      realIndex -= swiper.virtual.slides.length;\n    }\n    return realIndex;\n  };\n  if (typeof activeIndex === 'undefined') {\n    activeIndex = getActiveIndexByTranslate(swiper);\n  }\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n  if (activeIndex === previousIndex && !swiper.params.loop) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n    return;\n  }\n  if (\n    activeIndex === previousIndex &&\n    swiper.params.loop &&\n    swiper.virtual &&\n    swiper.params.virtual.enabled\n  ) {\n    swiper.realIndex = getVirtualRealIndex(activeIndex);\n    return;\n  }\n\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n\n  const normalizeSlideIndexToColumn = (index) => {\n    if (!gridEnabled) return index;\n    return Math.floor(index / params.grid.rows);\n  };\n\n  // Get real index\n  let realIndex;\n  if (swiper.virtual && params.virtual.enabled) {\n    if (params.loop) {\n      realIndex = getVirtualRealIndex(activeIndex);\n    } else {\n      realIndex = activeIndex;\n    }\n  } else if (gridEnabled) {\n    const firstSlideInColumn = swiper.slides.find((slideEl) => slideEl.column === activeIndex);\n    let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);\n    if (Number.isNaN(activeSlideIndex)) {\n      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);\n    }\n    realIndex = Math.floor(activeSlideIndex / params.grid.rows);\n  } else if (swiper.slides[activeIndex]) {\n    const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');\n    if (slideIndex) {\n      realIndex = parseInt(slideIndex, 10);\n    } else {\n      realIndex = activeIndex;\n    }\n  } else {\n    realIndex = activeIndex;\n  }\n\n  Object.assign(swiper, {\n    previousSnapIndex,\n    snapIndex,\n    previousRealIndex,\n    realIndex,\n    previousIndex,\n    activeIndex,\n  });\n\n  if (swiper.initialized) {\n    preload(swiper);\n  }\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    if (previousRealIndex !== realIndex) {\n      swiper.emit('realIndexChange');\n    }\n    swiper.emit('slideChange');\n  }\n}\n"
  },
  {
    "path": "src/core/update/updateAutoHeight.mjs",
    "content": "export default function updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n\n  const getSlideByIndex = (index) => {\n    if (isVirtual) {\n      return swiper.slides[swiper.getSlideIndexByData(index)];\n    }\n    return swiper.slides[index];\n  };\n  // Find slides currently in view\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      (swiper.visibleSlides || []).forEach((slide) => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  }\n\n  // Find new height from highest slide in view\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  }\n\n  // Update Height\n  if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;\n}\n"
  },
  {
    "path": "src/core/update/updateClickedSlide.mjs",
    "content": "export default function updateClickedSlide(el, path) {\n  const swiper = this;\n  const params = swiper.params;\n  let slide = el.closest(`.${params.slideClass}, swiper-slide`);\n  if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {\n    [...path.slice(path.indexOf(el) + 1, path.length)].forEach((pathEl) => {\n      if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {\n        slide = pathEl;\n      }\n    });\n  }\n  let slideFound = false;\n  let slideIndex;\n\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n  if (\n    params.slideToClickedSlide &&\n    swiper.clickedIndex !== undefined &&\n    swiper.clickedIndex !== swiper.activeIndex\n  ) {\n    swiper.slideToClickedSlide();\n  }\n}\n"
  },
  {
    "path": "src/core/update/updateProgress.mjs",
    "content": "export default function updateProgress(translate) {\n  const swiper = this;\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1;\n    // eslint-disable-next-line\n    translate = (swiper && swiper.translate && swiper.translate * multiplier) || 0;\n  }\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let { progress, isBeginning, isEnd, progressLoop } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;\n    const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;\n    isBeginning = isBeginningRounded || progress <= 0;\n    isEnd = isEndRounded || progress >= 1;\n    if (isBeginningRounded) progress = 0;\n    if (isEndRounded) progress = 1;\n  }\n\n  if (params.loop) {\n    const firstSlideIndex = swiper.getSlideIndexByData(0);\n    const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);\n    const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];\n    const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];\n    const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];\n    const translateAbs = Math.abs(translate);\n    if (translateAbs >= firstSlideTranslate) {\n      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;\n    } else {\n      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;\n    }\n    if (progressLoop > 1) progressLoop -= 1;\n  }\n\n  Object.assign(swiper, {\n    progress,\n    progressLoop,\n    isBeginning,\n    isEnd,\n  });\n\n  if (params.watchSlidesProgress || (params.centeredSlides && params.autoHeight))\n    swiper.updateSlidesProgress(translate);\n\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n  if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {\n    swiper.emit('fromEdge');\n  }\n\n  swiper.emit('progress', progress);\n}\n"
  },
  {
    "path": "src/core/update/updateSize.mjs",
    "content": "import { elementStyle } from '../../shared/utils.mjs';\n\nexport default function updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const el = swiper.el;\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = el.clientWidth;\n  }\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = el.clientHeight;\n  }\n  if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {\n    return;\n  }\n\n  // Subtract paddings\n  width =\n    width -\n    parseInt(elementStyle(el, 'padding-left') || 0, 10) -\n    parseInt(elementStyle(el, 'padding-right') || 0, 10);\n  height =\n    height -\n    parseInt(elementStyle(el, 'padding-top') || 0, 10) -\n    parseInt(elementStyle(el, 'padding-bottom') || 0, 10);\n\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height,\n  });\n}\n"
  },
  {
    "path": "src/core/update/updateSlides.mjs",
    "content": "import {\n  elementChildren,\n  elementOuterSize,\n  elementStyle,\n  setCSSProperty,\n} from '../../shared/utils.mjs';\n\nexport default function updateSlides() {\n  const swiper = this;\n\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n\n  const { wrapperEl, slidesEl, rtlTranslate: rtl, wrongRTL } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n\n  let offsetBefore = params.slidesOffsetBefore;\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n\n  const swiperSize = swiper.size - offsetBefore - offsetAfter;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n\n  swiper.virtualSize = -spaceBetween - offsetBefore - offsetAfter;\n\n  // reset margins\n  slides.forEach((slideEl) => {\n    if (rtl) {\n      slideEl.style.marginLeft = '';\n    } else {\n      slideEl.style.marginRight = '';\n    }\n    slideEl.style.marginBottom = '';\n    slideEl.style.marginTop = '';\n  });\n\n  // reset cssMode offsets\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  // set cssMode offsets\n  if (params.cssMode) {\n    setCSSProperty(wrapperEl, '--swiper-slides-offset-before', `${offsetBefore}px`);\n    setCSSProperty(wrapperEl, '--swiper-slides-offset-after', `${offsetAfter}px`);\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n  if (gridEnabled) {\n    swiper.grid.initSlides(slides);\n  } else if (swiper.grid) {\n    swiper.grid.unsetSlides();\n  }\n\n  // Calc slides\n  let slideSize;\n\n  const shouldResetSlideSize =\n    params.slidesPerView === 'auto' &&\n    params.breakpoints &&\n    Object.keys(params.breakpoints).filter((key) => {\n      return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n    }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides[i];\n    if (slide) {\n      if (gridEnabled) {\n        swiper.grid.updateSlide(i, slide, slides);\n      }\n      if (elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line\n    }\n\n    if (isVirtual && params.slidesPerView === 'auto') {\n      if (params.virtual.slidesPerViewAutoSlideSize) {\n        slideSize = params.virtual.slidesPerViewAutoSlideSize;\n      }\n      if (slideSize && slide) {\n        if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n        slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    } else if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slide.style[swiper.getDirectionLabel('width')] = ``;\n      }\n      const slideStyles = getComputedStyle(slide);\n      const currentTransform = slide.style.transform;\n      const currentWebKitTransform = slide.style.webkitTransform;\n      if (currentTransform) {\n        slide.style.transform = 'none';\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = 'none';\n      }\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal()\n          ? elementOuterSize(slide, 'width', true)\n          : elementOuterSize(slide, 'height', true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const { clientWidth, offsetWidth } = slide;\n          slideSize =\n            width +\n            paddingLeft +\n            paddingRight +\n            marginLeft +\n            marginRight +\n            (offsetWidth - clientWidth);\n        }\n      }\n      if (currentTransform) {\n        slide.style.transform = currentTransform;\n      }\n      if (currentWebKitTransform) {\n        slide.style.webkitTransform = currentWebKitTransform;\n      }\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n      if (slide) {\n        slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n    if (slide) {\n      slide.swiperSlideSize = slideSize;\n    }\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0)\n        slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (\n        (index - Math.min(swiper.params.slidesPerGroupSkip, index)) %\n          swiper.params.slidesPerGroup ===\n        0\n      )\n        snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n\n    prevSlideSize = slideSize;\n\n    index += 1;\n  }\n\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;\n  }\n  if (params.setWrapperSize) {\n    wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid);\n  }\n\n  // Remove last grid elements depending on width\n  if (!params.centeredSlides) {\n    // Check if snapToSlideEdge should be applied\n    const isFractionalSlidesPerView =\n      params.slidesPerView !== 'auto' && params.slidesPerView % 1 !== 0;\n    const shouldSnapToSlideEdge =\n      params.snapToSlideEdge &&\n      !params.loop &&\n      (params.slidesPerView === 'auto' || isFractionalSlidesPerView);\n\n    // Calculate the last allowed snap index when snapToSlideEdge is enabled\n    // This ensures minimum slides are visible at the end\n    let lastAllowedSnapIndex = snapGrid.length;\n    if (shouldSnapToSlideEdge) {\n      let minVisibleSlides;\n      if (params.slidesPerView === 'auto') {\n        // For 'auto' mode, calculate how many slides fit based on actual sizes\n        minVisibleSlides = 1;\n        let accumulatedSize = 0;\n        for (let i = slidesSizesGrid.length - 1; i >= 0; i -= 1) {\n          accumulatedSize +=\n            slidesSizesGrid[i] + (i < slidesSizesGrid.length - 1 ? spaceBetween : 0);\n          if (accumulatedSize <= swiperSize) {\n            minVisibleSlides = slidesSizesGrid.length - i;\n          } else {\n            break;\n          }\n        }\n      } else {\n        minVisibleSlides = Math.floor(params.slidesPerView);\n      }\n      lastAllowedSnapIndex = Math.max(slidesLength - minVisibleSlides, 0);\n    }\n\n    const newSlidesGrid = [];\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n      if (shouldSnapToSlideEdge) {\n        // When snapToSlideEdge is enabled, only keep snaps up to lastAllowedSnapIndex\n        if (i <= lastAllowedSnapIndex) {\n          newSlidesGrid.push(slidesGridItem);\n        }\n      } else if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        // When snapToSlideEdge is disabled, keep snaps that fit within scrollable area\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n    snapGrid = newSlidesGrid;\n\n    if (\n      Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) >\n      1\n    ) {\n      // Only add edge-aligned snap if snapToSlideEdge is not enabled\n      if (!shouldSnapToSlideEdge) {\n        snapGrid.push(swiper.virtualSize - swiperSize);\n      }\n    }\n  }\n  if (isVirtual && params.loop) {\n    const size = slidesSizesGrid[0] + spaceBetween;\n    if (params.slidesPerGroup > 1) {\n      const groups = Math.ceil(\n        (swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup,\n      );\n      const groupSize = size * params.slidesPerGroup;\n      for (let i = 0; i < groups; i += 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);\n      }\n    }\n    for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {\n      if (params.slidesPerGroup === 1) {\n        snapGrid.push(snapGrid[snapGrid.length - 1] + size);\n      }\n      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);\n      swiper.virtualSize += size;\n    }\n  }\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (spaceBetween !== 0) {\n    const key =\n      swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');\n    slides\n      .filter((_, slideIndex) => {\n        if (!params.cssMode || params.loop) return true;\n        if (slideIndex === slides.length - 1) {\n          return false;\n        }\n        return true;\n      })\n      .forEach((slideEl) => {\n        slideEl.style[key] = `${spaceBetween}px`;\n      });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach((slideSizeValue) => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    const maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0;\n    snapGrid = snapGrid.map((snap) => {\n      if (snap <= 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach((slideSizeValue) => {\n      allSlidesSize += slideSizeValue + (spaceBetween || 0);\n    });\n    allSlidesSize -= spaceBetween;\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid,\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(\n      wrapperEl,\n      '--swiper-centered-offset-after',\n      `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`,\n    );\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);\n  }\n\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n\n  swiper.emit('slidesUpdated');\n\n  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n    const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);\n    if (slidesLength <= params.maxBackfaceHiddenSlides) {\n      if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);\n    } else if (hasClassBackfaceClassAdded) {\n      swiper.el.classList.remove(backFaceHiddenClass);\n    }\n  }\n}\n"
  },
  {
    "path": "src/core/update/updateSlidesClasses.mjs",
    "content": "import { elementChildren, elementNextAll, elementPrevAll } from '../../shared/utils.mjs';\n\nconst toggleSlideClasses = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\n\nexport default function updateSlidesClasses() {\n  const swiper = this;\n\n  const { slides, params, slidesEl, activeIndex } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;\n\n  const getFilteredSlide = (selector) => {\n    return elementChildren(\n      slidesEl,\n      `.${params.slideClass}${selector}, swiper-slide${selector}`,\n    )[0];\n  };\n\n  let activeSlide;\n  let prevSlide;\n  let nextSlide;\n  if (isVirtual) {\n    if (params.loop) {\n      let slideIndex = activeIndex - swiper.virtual.slidesBefore;\n      if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;\n      if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${slideIndex}\"]`);\n    } else {\n      activeSlide = getFilteredSlide(`[data-swiper-slide-index=\"${activeIndex}\"]`);\n    }\n  } else {\n    if (gridEnabled) {\n      activeSlide = slides.find((slideEl) => slideEl.column === activeIndex);\n      nextSlide = slides.find((slideEl) => slideEl.column === activeIndex + 1);\n      prevSlide = slides.find((slideEl) => slideEl.column === activeIndex - 1);\n    } else {\n      activeSlide = slides[activeIndex];\n    }\n  }\n\n  if (activeSlide) {\n    if (!gridEnabled) {\n      // Next Slide\n      nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !nextSlide) {\n        nextSlide = slides[0];\n      }\n\n      // Prev Slide\n      prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];\n      if (params.loop && !prevSlide === 0) {\n        prevSlide = slides[slides.length - 1];\n      }\n    }\n  }\n\n  slides.forEach((slideEl) => {\n    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);\n    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);\n    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);\n  });\n\n  swiper.emitSlidesClasses();\n}\n"
  },
  {
    "path": "src/core/update/updateSlidesOffset.mjs",
    "content": "export default function updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n  // eslint-disable-next-line\n  const minusOffset = swiper.isElement\n    ? swiper.isHorizontal()\n      ? swiper.wrapperEl.offsetLeft\n      : swiper.wrapperEl.offsetTop\n    : 0;\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset =\n      (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) -\n      minusOffset -\n      swiper.cssOverflowAdjustment();\n  }\n}\n"
  },
  {
    "path": "src/core/update/updateSlidesProgress.mjs",
    "content": "const toggleSlideClasses = (slideEl, condition, className) => {\n  if (condition && !slideEl.classList.contains(className)) {\n    slideEl.classList.add(className);\n  } else if (!condition && slideEl.classList.contains(className)) {\n    slideEl.classList.remove(className);\n  }\n};\n\nexport default function updateSlidesProgress(translate = (this && this.translate) || 0) {\n  const swiper = this;\n  const params = swiper.params;\n\n  const { slides, rtlTranslate: rtl, snapGrid } = swiper;\n\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate;\n\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n\n  let spaceBetween = params.spaceBetween;\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiper.size;\n  } else if (typeof spaceBetween === 'string') {\n    spaceBetween = parseFloat(spaceBetween);\n  }\n\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n\n    const slideProgress =\n      (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) /\n      (slide.swiperSlideSize + spaceBetween);\n    const originalSlideProgress =\n      (offsetCenter -\n        snapGrid[0] +\n        (params.centeredSlides ? swiper.minTranslate() : 0) -\n        slideOffset) /\n      (slide.swiperSlideSize + spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n\n    const isFullyVisible =\n      slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];\n\n    const isVisible =\n      (slideBefore >= 0 && slideBefore < swiper.size - 1) ||\n      (slideAfter > 1 && slideAfter <= swiper.size) ||\n      (slideBefore <= 0 && slideAfter >= swiper.size);\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n    }\n    toggleSlideClasses(slide, isVisible, params.slideVisibleClass);\n    toggleSlideClasses(slide, isFullyVisible, params.slideFullyVisibleClass);\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n}\n"
  },
  {
    "path": "src/modules/a11y/a11y.css",
    "content": "/* a11y */\n.swiper .swiper-notification {\n  position: absolute;\n  left: 0;\n  top: 0;\n  pointer-events: none;\n  opacity: 0;\n  z-index: -1000;\n}\n"
  },
  {
    "path": "src/modules/a11y/a11y.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport classesToSelector from '../../shared/classes-to-selector.mjs';\nimport {\n  createElement,\n  elementIndex,\n  makeElementsArray,\n  setInnerHTML,\n} from '../../shared/utils.mjs';\n\nexport default function A11y({ swiper, extendParams, on }) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      containerRole: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group',\n      id: null,\n      scrollOnFocus: true,\n      wrapperLiveRegion: true,\n    },\n  });\n\n  swiper.a11y = {\n    clicked: false,\n  };\n\n  let liveRegion = null;\n  let preventFocusHandler;\n  let focusTargetSlideEl;\n  let visibilityChangedTimestamp = new Date().getTime();\n\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    setInnerHTML(notification, message);\n  }\n\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n  function makeElFocusable(el) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('tabIndex', '0');\n    });\n  }\n  function makeElNotFocusable(el) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('tabIndex', '-1');\n    });\n  }\n  function addElRole(el, role) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('role', role);\n    });\n  }\n  function addElRoleDescription(el, description) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-roledescription', description);\n    });\n  }\n  function addElControls(el, controls) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-controls', controls);\n    });\n  }\n  function addElLabel(el, label) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-label', label);\n    });\n  }\n  function addElId(el, id) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('id', id);\n    });\n  }\n  function addElLive(el, live) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-live', live);\n    });\n  }\n  function disableEl(el) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-disabled', true);\n    });\n  }\n  function enableEl(el) {\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.setAttribute('aria-disabled', false);\n    });\n  }\n\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const targetEl = e.target;\n    if (\n      swiper.pagination &&\n      swiper.pagination.el &&\n      (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))\n    ) {\n      if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;\n    }\n    if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) {\n      const prevEls = makeElementsArray(swiper.navigation.prevEl);\n      const nextEls = makeElementsArray(swiper.navigation.nextEl);\n      if (nextEls.includes(targetEl)) {\n        if (!(swiper.isEnd && !swiper.params.loop)) {\n          swiper.slideNext();\n        }\n        if (swiper.isEnd) {\n          notify(params.lastSlideMessage);\n        } else {\n          notify(params.nextSlideMessage);\n        }\n      }\n      if (prevEls.includes(targetEl)) {\n        if (!(swiper.isBeginning && !swiper.params.loop)) {\n          swiper.slidePrev();\n        }\n        if (swiper.isBeginning) {\n          notify(params.firstSlideMessage);\n        } else {\n          notify(params.prevSlideMessage);\n        }\n      }\n    }\n\n    if (\n      swiper.pagination &&\n      targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))\n    ) {\n      targetEl.click();\n    }\n  }\n\n  function updateNavigation() {\n    if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;\n    const { nextEl, prevEl } = swiper.navigation;\n\n    if (prevEl) {\n      if (swiper.isBeginning) {\n        disableEl(prevEl);\n        makeElNotFocusable(prevEl);\n      } else {\n        enableEl(prevEl);\n        makeElFocusable(prevEl);\n      }\n    }\n    if (nextEl) {\n      if (swiper.isEnd) {\n        disableEl(nextEl);\n        makeElNotFocusable(nextEl);\n      } else {\n        enableEl(nextEl);\n        makeElFocusable(nextEl);\n      }\n    }\n  }\n\n  function hasPagination() {\n    return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;\n  }\n\n  function hasClickablePagination() {\n    return hasPagination() && swiper.params.pagination.clickable;\n  }\n\n  function updatePagination() {\n    const params = swiper.params.a11y;\n    if (!hasPagination()) return;\n    swiper.pagination.bullets.forEach((bulletEl) => {\n      if (swiper.params.pagination.clickable) {\n        makeElFocusable(bulletEl);\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole(bulletEl, 'button');\n          addElLabel(\n            bulletEl,\n            params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, elementIndex(bulletEl) + 1),\n          );\n        }\n      }\n      if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {\n        bulletEl.setAttribute('aria-current', 'true');\n      } else {\n        bulletEl.removeAttribute('aria-current');\n      }\n    });\n  }\n\n  const initNavEl = (el, wrapperId, message) => {\n    makeElFocusable(el);\n    if (el.tagName !== 'BUTTON') {\n      addElRole(el, 'button');\n      el.addEventListener('keydown', onEnterOrSpaceKey);\n    }\n    addElLabel(el, message);\n    addElControls(el, wrapperId);\n  };\n\n  const handlePointerDown = (e) => {\n    if (\n      focusTargetSlideEl &&\n      focusTargetSlideEl !== e.target &&\n      !focusTargetSlideEl.contains(e.target)\n    ) {\n      preventFocusHandler = true;\n    }\n    swiper.a11y.clicked = true;\n  };\n  const handlePointerUp = () => {\n    preventFocusHandler = false;\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        if (!swiper.destroyed) {\n          swiper.a11y.clicked = false;\n        }\n      });\n    });\n  };\n\n  const onVisibilityChange = (e) => {\n    visibilityChangedTimestamp = new Date().getTime();\n  };\n\n  const handleFocus = (e) => {\n    if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return;\n    if (new Date().getTime() - visibilityChangedTimestamp < 100) return;\n\n    const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n    if (!slideEl || !swiper.slides.includes(slideEl)) return;\n    focusTargetSlideEl = slideEl;\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    const isActive =\n      (isVirtual\n        ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10)\n        : swiper.slides.indexOf(slideEl)) === swiper.activeIndex;\n    const isVisible =\n      swiper.params.watchSlidesProgress &&\n      swiper.visibleSlides &&\n      swiper.visibleSlides.includes(slideEl);\n    if (isActive || isVisible) return;\n    if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n    if (swiper.isHorizontal()) {\n      swiper.el.scrollLeft = 0;\n    } else {\n      swiper.el.scrollTop = 0;\n    }\n    requestAnimationFrame(() => {\n      if (preventFocusHandler) return;\n      if (swiper.params.loop) {\n        swiper.slideToLoop(\n          swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))),\n          0,\n        );\n      } else if (isVirtual) {\n        swiper.slideTo(\n          swiper.getSlideIndexWhenGrid(\n            parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10),\n          ),\n          0,\n        );\n      } else {\n        swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0);\n      }\n\n      preventFocusHandler = false;\n    });\n  };\n\n  const initSlides = () => {\n    const params = swiper.params.a11y;\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);\n    }\n    if (params.slideRole) {\n      addElRole(swiper.slides, params.slideRole);\n    }\n\n    const slidesLength = swiper.slides.length;\n    if (params.slideLabelMessage) {\n      swiper.slides.forEach((slideEl, index) => {\n        const slideIndex = swiper.params.loop\n          ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10)\n          : index;\n        const ariaLabelMessage = params.slideLabelMessage\n          .replace(/\\{\\{index\\}\\}/, slideIndex + 1)\n          .replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n        addElLabel(slideEl, ariaLabelMessage);\n      });\n    }\n  };\n\n  const init = () => {\n    const params = swiper.params.a11y;\n    swiper.el.append(liveRegion);\n\n    // Container\n    const containerEl = swiper.el;\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);\n    }\n    if (params.containerMessage) {\n      addElLabel(containerEl, params.containerMessage);\n    }\n    if (params.containerRole) {\n      addElRole(containerEl, params.containerRole);\n    }\n\n    // Wrapper\n    const wrapperEl = swiper.wrapperEl;\n    const wrapperId =\n      params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    addElId(wrapperEl, wrapperId);\n    if (params.wrapperLiveRegion) {\n      const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n      addElLive(wrapperEl, live);\n    }\n\n    // Slide\n    initSlides();\n\n    // Navigation\n    let { nextEl, prevEl } = swiper.navigation ? swiper.navigation : {};\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n\n    if (nextEl) {\n      nextEl.forEach((el) => initNavEl(el, wrapperId, params.nextSlideMessage));\n    }\n    if (prevEl) {\n      prevEl.forEach((el) => initNavEl(el, wrapperId, params.prevSlideMessage));\n    }\n\n    // Pagination\n    if (hasClickablePagination()) {\n      const paginationEl = makeElementsArray(swiper.pagination.el);\n      paginationEl.forEach((el) => {\n        el.addEventListener('keydown', onEnterOrSpaceKey);\n      });\n    }\n\n    // Tab focus\n    const document = getDocument();\n    document.addEventListener('visibilitychange', onVisibilityChange);\n    swiper.el.addEventListener('focus', handleFocus, true);\n    swiper.el.addEventListener('pointerdown', handlePointerDown, true);\n    swiper.el.addEventListener('pointerup', handlePointerUp, true);\n  };\n  function destroy() {\n    if (liveRegion) liveRegion.remove();\n    let { nextEl, prevEl } = swiper.navigation ? swiper.navigation : {};\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (nextEl) {\n      nextEl.forEach((el) => el.removeEventListener('keydown', onEnterOrSpaceKey));\n    }\n    if (prevEl) {\n      prevEl.forEach((el) => el.removeEventListener('keydown', onEnterOrSpaceKey));\n    }\n\n    // Pagination\n    if (hasClickablePagination()) {\n      const paginationEl = makeElementsArray(swiper.pagination.el);\n      paginationEl.forEach((el) => {\n        el.removeEventListener('keydown', onEnterOrSpaceKey);\n      });\n    }\n\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n    // Tab focus\n    if (swiper.el && typeof swiper.el !== 'string') {\n      swiper.el.removeEventListener('focus', handleFocus, true);\n      swiper.el.removeEventListener('pointerdown', handlePointerDown, true);\n      swiper.el.removeEventListener('pointerup', handlePointerUp, true);\n    }\n  }\n\n  on('beforeInit', () => {\n    liveRegion = createElement('span', swiper.params.a11y.notificationClass);\n    liveRegion.setAttribute('aria-live', 'assertive');\n    liveRegion.setAttribute('aria-atomic', 'true');\n  });\n\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n  });\n  on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {\n    if (!swiper.params.a11y.enabled) return;\n    initSlides();\n  });\n  on('fromEdge toEdge afterInit lock unlock', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}\n"
  },
  {
    "path": "src/modules/autoplay/autoplay.css",
    "content": ""
  },
  {
    "path": "src/modules/autoplay/autoplay.mjs",
    "content": "/* eslint no-underscore-dangle: \"off\" */\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\n\nexport default function Autoplay({ swiper, extendParams, on, emit, params }) {\n  swiper.autoplay = {\n    running: false,\n    paused: false,\n    timeLeft: 0,\n  };\n\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: false,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false,\n    },\n  });\n  let timeout;\n  let raf;\n  let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;\n  let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;\n  let autoplayTimeLeft;\n  let autoplayStartTime = new Date().getTime();\n  let wasPaused;\n  let isTouched;\n  let pausedByTouch;\n  let touchStartTimeout;\n  let slideChanged;\n  let pausedByInteraction;\n  let pausedByPointerEnter;\n\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;\n    if (e.target !== swiper.wrapperEl) return;\n\n    swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);\n    if (pausedByPointerEnter || (e.detail && e.detail.bySwiperTouchMove)) {\n      return;\n    }\n    resume();\n  }\n\n  const calcTimeLeft = () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) {\n      wasPaused = true;\n    } else if (wasPaused) {\n      autoplayDelayCurrent = autoplayTimeLeft;\n      wasPaused = false;\n    }\n    const timeLeft = swiper.autoplay.paused\n      ? autoplayTimeLeft\n      : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();\n    swiper.autoplay.timeLeft = timeLeft;\n    emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);\n    raf = requestAnimationFrame(() => {\n      calcTimeLeft();\n    });\n  };\n\n  const getSlideDelay = () => {\n    let activeSlideEl;\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      activeSlideEl = swiper.slides.find((slideEl) =>\n        slideEl.classList.contains('swiper-slide-active'),\n      );\n    } else {\n      activeSlideEl = swiper.slides[swiper.activeIndex];\n    }\n    if (!activeSlideEl) return undefined;\n    const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);\n    return currentSlideDelay;\n  };\n\n  const getTotalDelay = () => {\n    let totalDelay = swiper.params.autoplay.delay;\n    const currentSlideDelay = getSlideDelay();\n    if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0) {\n      totalDelay = currentSlideDelay;\n    }\n    return totalDelay;\n  };\n\n  const run = (delayForce) => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    cancelAnimationFrame(raf);\n    calcTimeLeft();\n\n    let delay = delayForce;\n    if (typeof delay === 'undefined') {\n      delay = getTotalDelay();\n      autoplayDelayTotal = delay;\n      autoplayDelayCurrent = delay;\n    }\n\n    autoplayTimeLeft = delay;\n    const speed = swiper.params.speed;\n    const proceed = () => {\n      if (!swiper || swiper.destroyed) return;\n      if (swiper.params.autoplay.reverseDirection) {\n        if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {\n          swiper.slidePrev(speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          swiper.slideTo(swiper.slides.length - 1, speed, true, true);\n          emit('autoplay');\n        }\n      } else {\n        if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {\n          swiper.slideNext(speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          swiper.slideTo(0, speed, true, true);\n          emit('autoplay');\n        }\n      }\n      if (swiper.params.cssMode) {\n        autoplayStartTime = new Date().getTime();\n        requestAnimationFrame(() => {\n          run();\n        });\n      }\n    };\n    if (delay > 0) {\n      clearTimeout(timeout);\n      timeout = setTimeout(() => {\n        proceed();\n      }, delay);\n    } else {\n      requestAnimationFrame(() => {\n        proceed();\n      });\n    }\n\n    // eslint-disable-next-line\n    return delay;\n  };\n\n  const start = () => {\n    autoplayStartTime = new Date().getTime();\n    swiper.autoplay.running = true;\n    run();\n    emit('autoplayStart');\n  };\n\n  const stop = () => {\n    swiper.autoplay.running = false;\n    clearTimeout(timeout);\n    cancelAnimationFrame(raf);\n    emit('autoplayStop');\n  };\n  const pause = (internal, reset) => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n\n    clearTimeout(timeout);\n    if (!internal) {\n      pausedByInteraction = true;\n    }\n\n    const proceed = () => {\n      emit('autoplayPause');\n      if (swiper.params.autoplay.waitForTransition) {\n        swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);\n      } else {\n        resume();\n      }\n    };\n\n    swiper.autoplay.paused = true;\n    if (reset) {\n      slideChanged = false;\n      proceed();\n      return;\n    }\n    const delay = autoplayTimeLeft || swiper.params.autoplay.delay;\n    autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);\n    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;\n    if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;\n    proceed();\n  };\n\n  const resume = () => {\n    if (\n      (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) ||\n      swiper.destroyed ||\n      !swiper.autoplay.running\n    )\n      return;\n    autoplayStartTime = new Date().getTime();\n    if (pausedByInteraction) {\n      pausedByInteraction = false;\n      run(autoplayTimeLeft);\n    } else {\n      run();\n    }\n    swiper.autoplay.paused = false;\n    emit('autoplayResume');\n  };\n\n  const onVisibilityChange = () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    const document = getDocument();\n    if (document.visibilityState === 'hidden') {\n      pausedByInteraction = true;\n      pause(true);\n    }\n    if (document.visibilityState === 'visible') {\n      resume();\n    }\n  };\n\n  const onPointerEnter = (e) => {\n    if (e.pointerType !== 'mouse') return;\n    pausedByInteraction = true;\n    pausedByPointerEnter = true;\n    if (swiper.animating || swiper.autoplay.paused) return;\n    pause(true);\n  };\n\n  const onPointerLeave = (e) => {\n    if (e.pointerType !== 'mouse') return;\n    pausedByPointerEnter = false;\n    if (swiper.autoplay.paused) {\n      resume();\n    }\n  };\n\n  const attachMouseEvents = () => {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.el.addEventListener('pointerenter', onPointerEnter);\n      swiper.el.addEventListener('pointerleave', onPointerLeave);\n    }\n  };\n\n  const detachMouseEvents = () => {\n    if (swiper.el && typeof swiper.el !== 'string') {\n      swiper.el.removeEventListener('pointerenter', onPointerEnter);\n      swiper.el.removeEventListener('pointerleave', onPointerLeave);\n    }\n  };\n\n  const attachDocumentEvents = () => {\n    const document = getDocument();\n    document.addEventListener('visibilitychange', onVisibilityChange);\n  };\n\n  const detachDocumentEvents = () => {\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  };\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      attachMouseEvents();\n      attachDocumentEvents();\n\n      start();\n    }\n  });\n\n  on('destroy', () => {\n    detachMouseEvents();\n    detachDocumentEvents();\n    if (swiper.autoplay.running) {\n      stop();\n    }\n  });\n\n  on('_freeModeStaticRelease', () => {\n    if (pausedByTouch || pausedByInteraction) {\n      resume();\n    }\n  });\n  on('_freeModeNoMomentumRelease', () => {\n    if (!swiper.params.autoplay.disableOnInteraction) {\n      pause(true, true);\n    } else {\n      stop();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    if (internal || !swiper.params.autoplay.disableOnInteraction) {\n      pause(true, true);\n    } else {\n      stop();\n    }\n  });\n\n  on('sliderFirstMove', () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n      return;\n    }\n    isTouched = true;\n    pausedByTouch = false;\n    pausedByInteraction = false;\n    touchStartTimeout = setTimeout(() => {\n      pausedByInteraction = true;\n      pausedByTouch = true;\n      pause(true);\n    }, 200);\n  });\n\n  on('touchEnd', () => {\n    if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;\n    clearTimeout(touchStartTimeout);\n    clearTimeout(timeout);\n\n    if (swiper.params.autoplay.disableOnInteraction) {\n      pausedByTouch = false;\n      isTouched = false;\n      return;\n    }\n\n    if (pausedByTouch && swiper.params.cssMode) resume();\n    pausedByTouch = false;\n    isTouched = false;\n  });\n\n  on('slideChange', () => {\n    if (swiper.destroyed || !swiper.autoplay.running) return;\n    slideChanged = true;\n\n    if (swiper.autoplay.paused) {\n      autoplayTimeLeft = getTotalDelay();\n      autoplayDelayTotal = getTotalDelay();\n    }\n  });\n\n  Object.assign(swiper.autoplay, {\n    start,\n    stop,\n    pause,\n    resume,\n  });\n}\n"
  },
  {
    "path": "src/modules/controller/controller.css",
    "content": ""
  },
  {
    "path": "src/modules/controller/controller.mjs",
    "content": "/* eslint no-bitwise: [\"error\", { \"allow\": [\">>\"] }] */\nimport { elementTransitionEnd, nextTick } from '../../shared/utils.mjs';\n\nexport default function Controller({ swiper, extendParams, on }) {\n  extendParams({\n    controller: {\n      control: undefined,\n      inverse: false,\n      by: 'slide', // or 'container'\n    },\n  });\n\n  swiper.controller = {\n    control: undefined,\n  };\n\n  function LinearSpline(x, y) {\n    const binarySearch = (function search() {\n      let maxIndex;\n      let minIndex;\n      let guess;\n      return (array, val) => {\n        minIndex = -1;\n        maxIndex = array.length;\n        while (maxIndex - minIndex > 1) {\n          guess = (maxIndex + minIndex) >> 1;\n          if (array[guess] <= val) {\n            minIndex = guess;\n          } else {\n            maxIndex = guess;\n          }\n        }\n        return maxIndex;\n      };\n    })();\n    this.x = x;\n    this.y = y;\n    this.lastIndex = x.length - 1;\n    // Given an x value (x2), return the expected y2 value:\n    // (x1,y1) is the known point before given value,\n    // (x3,y3) is the known point after given value.\n    let i1;\n    let i3;\n\n    this.interpolate = function interpolate(x2) {\n      if (!x2) return 0;\n\n      // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n      i3 = binarySearch(this.x, x2);\n      i1 = i3 - 1;\n\n      // We have our indexes i1 & i3, so we can calculate already:\n      // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n      return (\n        ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]\n      );\n    };\n    return this;\n  }\n  function getInterpolateFunction(c) {\n    swiper.controller.spline = swiper.params.loop\n      ? new LinearSpline(swiper.slidesGrid, c.slidesGrid)\n      : new LinearSpline(swiper.snapGrid, c.snapGrid);\n  }\n  function setTranslate(_t, byController) {\n    const controlled = swiper.controller.control;\n    let multiplier;\n    let controlledTranslate;\n    const Swiper = swiper.constructor;\n    function setControlledTranslate(c) {\n      if (c.destroyed) return;\n\n      // this will create an Interpolate function based on the snapGrids\n      // x is the Grid of the scrolled scroller and y will be the controlled scroller\n      // it makes sense to create this only once and recall it for the interpolation\n      // the function does a lot of value caching for performance\n      const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;\n      if (swiper.params.controller.by === 'slide') {\n        getInterpolateFunction(c);\n        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n        // but it did not work out\n        controlledTranslate = -swiper.controller.spline.interpolate(-translate);\n      }\n\n      if (!controlledTranslate || swiper.params.controller.by === 'container') {\n        multiplier =\n          (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());\n        if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {\n          multiplier = 1;\n        }\n        controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();\n      }\n\n      if (swiper.params.controller.inverse) {\n        controlledTranslate = c.maxTranslate() - controlledTranslate;\n      }\n      c.updateProgress(controlledTranslate);\n      c.setTranslate(controlledTranslate, swiper);\n      c.updateActiveIndex();\n      c.updateSlidesClasses();\n    }\n    if (Array.isArray(controlled)) {\n      for (let i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTranslate(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTranslate(controlled);\n    }\n  }\n  function setTransition(duration, byController) {\n    const Swiper = swiper.constructor;\n    const controlled = swiper.controller.control;\n    let i;\n    function setControlledTransition(c) {\n      if (c.destroyed) return;\n\n      c.setTransition(duration, swiper);\n      if (duration !== 0) {\n        c.transitionStart();\n        if (c.params.autoHeight) {\n          nextTick(() => {\n            c.updateAutoHeight();\n          });\n        }\n        elementTransitionEnd(c.wrapperEl, () => {\n          if (!controlled) return;\n          c.transitionEnd();\n        });\n      }\n    }\n    if (Array.isArray(controlled)) {\n      for (i = 0; i < controlled.length; i += 1) {\n        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n          setControlledTransition(controlled[i]);\n        }\n      }\n    } else if (controlled instanceof Swiper && byController !== controlled) {\n      setControlledTransition(controlled);\n    }\n  }\n\n  function removeSpline() {\n    if (!swiper.controller.control) return;\n    if (swiper.controller.spline) {\n      swiper.controller.spline = undefined;\n      delete swiper.controller.spline;\n    }\n  }\n  on('beforeInit', () => {\n    if (\n      typeof window !== 'undefined' && // eslint-disable-line\n      (typeof swiper.params.controller.control === 'string' ||\n        swiper.params.controller.control instanceof HTMLElement)\n    ) {\n      const controlElements =\n        typeof swiper.params.controller.control === 'string'\n          ? [...document.querySelectorAll(swiper.params.controller.control)]\n          : [swiper.params.controller.control];\n\n      controlElements.forEach((controlElement) => {\n        if (!swiper.controller.control) swiper.controller.control = [];\n        if (controlElement && controlElement.swiper) {\n          swiper.controller.control.push(controlElement.swiper);\n        } else if (controlElement) {\n          const eventName = `${swiper.params.eventsPrefix}init`;\n          const onControllerSwiper = (e) => {\n            swiper.controller.control.push(e.detail[0]);\n            swiper.update();\n            controlElement.removeEventListener(eventName, onControllerSwiper);\n          };\n          controlElement.addEventListener(eventName, onControllerSwiper);\n        }\n      });\n\n      return;\n    }\n    swiper.controller.control = swiper.params.controller.control;\n  });\n  on('update', () => {\n    removeSpline();\n  });\n  on('resize', () => {\n    removeSpline();\n  });\n  on('observerUpdate', () => {\n    removeSpline();\n  });\n  on('setTranslate', (_s, translate, byController) => {\n    if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n    swiper.controller.setTranslate(translate, byController);\n  });\n  on('setTransition', (_s, duration, byController) => {\n    if (!swiper.controller.control || swiper.controller.control.destroyed) return;\n    swiper.controller.setTransition(duration, byController);\n  });\n\n  Object.assign(swiper.controller, {\n    setTranslate,\n    setTransition,\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-cards/effect-cards.css",
    "content": ".swiper.swiper-cards {\n  overflow: visible;\n}\n.swiper-cards {\n  .swiper-slide {\n    transform-origin: center bottom;\n    backface-visibility: hidden;\n    overflow: hidden;\n  }\n}\n"
  },
  {
    "path": "src/modules/effect-cards/effect-cards.mjs",
    "content": "import createShadow from '../../shared/create-shadow.mjs';\nimport effectInit from '../../shared/effect-init.mjs';\nimport effectTarget from '../../shared/effect-target.mjs';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.mjs';\nimport { getSlideTransformEl } from '../../shared/utils.mjs';\n\nexport default function EffectCards({ swiper, extendParams, on }) {\n  extendParams({\n    cardsEffect: {\n      slideShadows: true,\n      rotate: true,\n      perSlideRotate: 2,\n      perSlideOffset: 8,\n    },\n  });\n\n  const setTranslate = () => {\n    const { slides, activeIndex, rtlTranslate: rtl } = swiper;\n    const params = swiper.params.cardsEffect;\n    const { startTranslate, isTouched } = swiper.touchEventsData;\n    const currentTranslate = rtl ? -swiper.translate : swiper.translate;\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      const slideProgress = slideEl.progress;\n      const progress = Math.min(Math.max(slideProgress, -4), 4);\n      let offset = slideEl.swiperSlideOffset;\n      if (swiper.params.centeredSlides && !swiper.params.cssMode) {\n        swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;\n      }\n      if (swiper.params.centeredSlides && swiper.params.cssMode) {\n        offset -= slides[0].swiperSlideOffset;\n      }\n      let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let tY = 0;\n      const tZ = -100 * Math.abs(progress);\n      let scale = 1;\n      let rotate = -params.perSlideRotate * progress;\n\n      let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;\n\n      const slideIndex =\n        swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;\n\n      const isSwipeToNext =\n        (slideIndex === activeIndex || slideIndex === activeIndex - 1) &&\n        progress > 0 &&\n        progress < 1 &&\n        (isTouched || swiper.params.cssMode) &&\n        currentTranslate < startTranslate;\n      const isSwipeToPrev =\n        (slideIndex === activeIndex || slideIndex === activeIndex + 1) &&\n        progress < 0 &&\n        progress > -1 &&\n        (isTouched || swiper.params.cssMode) &&\n        currentTranslate > startTranslate;\n\n      if (isSwipeToNext || isSwipeToPrev) {\n        const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;\n        rotate += -28 * progress * subProgress;\n        scale += -0.5 * subProgress;\n        tXAdd += 96 * subProgress;\n        tY = `${\n          (params.rotate || swiper.isHorizontal() ? -25 : 0) * subProgress * Math.abs(progress)\n        }%`;\n      }\n      if (progress < 0) {\n        // next\n        tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;\n      } else if (progress > 0) {\n        // prev\n        tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;\n      } else {\n        tX = `${tX}px`;\n      }\n      if (!swiper.isHorizontal()) {\n        const prevY = tY;\n        tY = tX;\n        tX = prevY;\n      }\n\n      const scaleString =\n        progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;\n\n      /* eslint-disable */\n      const transform = `\n        translate3d(${tX}, ${tY}, ${tZ}px)\n        rotateZ(${params.rotate ? (rtl ? -rotate : rotate) : 0}deg)\n        scale(${scaleString})\n      `;\n      /* eslint-enable */\n\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n        if (!shadowEl) {\n          shadowEl = createShadow('cards', slideEl);\n        }\n        if (shadowEl)\n          shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);\n      }\n\n      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n    }\n  };\n\n  const setTransition = (duration) => {\n    const transformElements = swiper.slides.map((slideEl) => getSlideTransformEl(slideEl));\n    transformElements.forEach((el) => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow').forEach((shadowEl) => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n\n    effectVirtualTransitionEnd({ swiper, duration, transformElements });\n  };\n\n  effectInit({\n    effect: 'cards',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      _loopSwapReset: false,\n      watchSlidesProgress: true,\n      loopAdditionalSlides: swiper.params.cardsEffect.rotate ? 3 : 2,\n      centeredSlides: true,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-coverflow/effect-coverflow.css",
    "content": ".swiper-coverflow {\n}\n"
  },
  {
    "path": "src/modules/effect-coverflow/effect-coverflow.mjs",
    "content": "import createShadow from '../../shared/create-shadow.mjs';\nimport effectInit from '../../shared/effect-init.mjs';\nimport effectTarget from '../../shared/effect-target.mjs';\nimport { getRotateFix, getSlideTransformEl } from '../../shared/utils.mjs';\n\nexport default function EffectCoverflow({ swiper, extendParams, on }) {\n  extendParams({\n    coverflowEffect: {\n      rotate: 50,\n      stretch: 0,\n      depth: 100,\n      scale: 1,\n      modifier: 1,\n      slideShadows: true,\n    },\n  });\n\n  const setTranslate = () => {\n    const { width: swiperWidth, height: swiperHeight, slides, slidesSizesGrid } = swiper;\n    const params = swiper.params.coverflowEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const transform = swiper.translate;\n    const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;\n    const rotate = isHorizontal ? params.rotate : -params.rotate;\n    const translate = params.depth;\n    const r = getRotateFix(swiper);\n    // Each slide offset from center\n    for (let i = 0, length = slides.length; i < length; i += 1) {\n      const slideEl = slides[i];\n      const slideSize = slidesSizesGrid[i];\n      const slideOffset = slideEl.swiperSlideOffset;\n      const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;\n      const offsetMultiplier =\n        typeof params.modifier === 'function'\n          ? params.modifier(centerOffset)\n          : centerOffset * params.modifier;\n\n      let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;\n      let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;\n      // var rotateZ = 0\n      let translateZ = -translate * Math.abs(offsetMultiplier);\n\n      let stretch = params.stretch;\n      // Allow percentage to make a relative stretch for responsive sliders\n      if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {\n        stretch = (parseFloat(params.stretch) / 100) * slideSize;\n      }\n      let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;\n      let translateX = isHorizontal ? stretch * offsetMultiplier : 0;\n\n      let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);\n\n      // Fix for ultra small values\n      if (Math.abs(translateX) < 0.001) translateX = 0;\n      if (Math.abs(translateY) < 0.001) translateY = 0;\n      if (Math.abs(translateZ) < 0.001) translateZ = 0;\n      if (Math.abs(rotateY) < 0.001) rotateY = 0;\n      if (Math.abs(rotateX) < 0.001) rotateX = 0;\n      if (Math.abs(scale) < 0.001) scale = 0;\n\n      const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${r(\n        rotateX,\n      )}deg) rotateY(${r(rotateY)}deg) scale(${scale})`;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = slideTransform;\n\n      slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n\n      if (params.slideShadows) {\n        // Set shadows\n        let shadowBeforeEl = isHorizontal\n          ? slideEl.querySelector('.swiper-slide-shadow-left')\n          : slideEl.querySelector('.swiper-slide-shadow-top');\n        let shadowAfterEl = isHorizontal\n          ? slideEl.querySelector('.swiper-slide-shadow-right')\n          : slideEl.querySelector('.swiper-slide-shadow-bottom');\n        if (!shadowBeforeEl) {\n          shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');\n        }\n        if (!shadowAfterEl) {\n          shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');\n        }\n        if (shadowBeforeEl)\n          shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n        if (shadowAfterEl)\n          shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;\n      }\n    }\n  };\n  const setTransition = (duration) => {\n    const transformElements = swiper.slides.map((slideEl) => getSlideTransformEl(slideEl));\n\n    transformElements.forEach((el) => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll(\n        '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n      ).forEach((shadowEl) => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n  };\n\n  effectInit({\n    effect: 'coverflow',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => true,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-creative/effect-creative.css",
    "content": ".swiper-creative {\n  .swiper-slide {\n    backface-visibility: hidden;\n    overflow: hidden;\n    transition-property: transform, opacity, height;\n  }\n}\n"
  },
  {
    "path": "src/modules/effect-creative/effect-creative.mjs",
    "content": "import createShadow from '../../shared/create-shadow.mjs';\nimport effectInit from '../../shared/effect-init.mjs';\nimport effectTarget from '../../shared/effect-target.mjs';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.mjs';\nimport { getRotateFix, getSlideTransformEl } from '../../shared/utils.mjs';\n\nexport default function EffectCreative({ swiper, extendParams, on }) {\n  extendParams({\n    creativeEffect: {\n      limitProgress: 1,\n      shadowPerProgress: false,\n      progressMultiplier: 1,\n      perspective: true,\n      prev: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1,\n      },\n      next: {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        opacity: 1,\n        scale: 1,\n      },\n    },\n  });\n\n  const getTranslateValue = (value) => {\n    if (typeof value === 'string') return value;\n    return `${value}px`;\n  };\n\n  const setTranslate = () => {\n    const { slides, wrapperEl, slidesSizesGrid } = swiper;\n    const params = swiper.params.creativeEffect;\n    const { progressMultiplier: multiplier } = params;\n\n    const isCenteredSlides = swiper.params.centeredSlides;\n    const rotateFix = getRotateFix(swiper);\n\n    if (isCenteredSlides) {\n      const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;\n      wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;\n    }\n\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      const slideProgress = slideEl.progress;\n      const progress = Math.min(\n        Math.max(slideEl.progress, -params.limitProgress),\n        params.limitProgress,\n      );\n      let originalProgress = progress;\n\n      if (!isCenteredSlides) {\n        originalProgress = Math.min(\n          Math.max(slideEl.originalProgress, -params.limitProgress),\n          params.limitProgress,\n        );\n      }\n\n      const offset = slideEl.swiperSlideOffset;\n      const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];\n      const r = [0, 0, 0];\n      let custom = false;\n      if (!swiper.isHorizontal()) {\n        t[1] = t[0];\n        t[0] = 0;\n      }\n      let data = {\n        translate: [0, 0, 0],\n        rotate: [0, 0, 0],\n        scale: 1,\n        opacity: 1,\n      };\n      if (progress < 0) {\n        data = params.next;\n        custom = true;\n      } else if (progress > 0) {\n        data = params.prev;\n        custom = true;\n      }\n      // set translate\n      t.forEach((value, index) => {\n        t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(\n          progress * multiplier,\n        )}))`;\n      });\n      // set rotates\n      r.forEach((value, index) => {\n        let val = data.rotate[index] * Math.abs(progress * multiplier);\n        r[index] = val;\n      });\n\n      slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;\n\n      const translateString = t.join(', ');\n      const rotateString = `rotateX(${rotateFix(r[0])}deg) rotateY(${rotateFix(\n        r[1],\n      )}deg) rotateZ(${rotateFix(r[2])}deg)`;\n      const scaleString =\n        originalProgress < 0\n          ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})`\n          : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;\n      const opacityString =\n        originalProgress < 0\n          ? 1 + (1 - data.opacity) * originalProgress * multiplier\n          : 1 - (1 - data.opacity) * originalProgress * multiplier;\n      const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;\n\n      // Set shadows\n      if ((custom && data.shadow) || !custom) {\n        let shadowEl = slideEl.querySelector('.swiper-slide-shadow');\n        if (!shadowEl && data.shadow) {\n          shadowEl = createShadow('creative', slideEl);\n        }\n        if (shadowEl) {\n          const shadowOpacity = params.shadowPerProgress\n            ? progress * (1 / params.limitProgress)\n            : progress;\n          shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);\n        }\n      }\n\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n      targetEl.style.opacity = opacityString;\n      if (data.origin) {\n        targetEl.style.transformOrigin = data.origin;\n      }\n    }\n  };\n\n  const setTransition = (duration) => {\n    const transformElements = swiper.slides.map((slideEl) => getSlideTransformEl(slideEl));\n\n    transformElements.forEach((el) => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll('.swiper-slide-shadow').forEach((shadowEl) => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n\n    effectVirtualTransitionEnd({ swiper, duration, transformElements, allSlides: true });\n  };\n\n  effectInit({\n    effect: 'creative',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    perspective: () => swiper.params.creativeEffect.perspective,\n    overwriteParams: () => ({\n      watchSlidesProgress: true,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-cube/effect-cube.css",
    "content": ".swiper.swiper-cube {\n  overflow: visible;\n}\n.swiper-cube {\n  .swiper-slide {\n    pointer-events: none;\n    backface-visibility: hidden;\n    z-index: 1;\n    visibility: hidden;\n    transform-origin: 0 0;\n    width: 100%;\n    height: 100%;\n    .swiper-slide {\n      pointer-events: none;\n    }\n  }\n  &.swiper-rtl .swiper-slide {\n    transform-origin: 100% 0;\n  }\n  .swiper-slide-active {\n    &,\n    & .swiper-slide-active {\n      pointer-events: auto;\n    }\n  }\n  .swiper-slide-active,\n  .swiper-slide-next,\n  .swiper-slide-prev {\n    pointer-events: auto;\n    visibility: visible;\n  }\n\n  .swiper-cube-shadow {\n    position: absolute;\n    left: 0;\n    bottom: 0px;\n    width: 100%;\n    height: 100%;\n    opacity: 0.6;\n    z-index: 0;\n\n    &:before {\n      content: '';\n      background: #000;\n      position: absolute;\n      left: 0;\n      top: 0;\n      bottom: 0;\n      right: 0;\n      -webkit-filter: blur(50px);\n      filter: blur(50px);\n    }\n  }\n}\n.swiper-cube {\n  .swiper-slide-next + .swiper-slide {\n    pointer-events: auto;\n    visibility: visible;\n  }\n}\n/* Cube slide shadows start */\n.swiper-cube {\n  .swiper-slide-shadow-cube.swiper-slide-shadow-top,\n  .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,\n  .swiper-slide-shadow-cube.swiper-slide-shadow-left,\n  .swiper-slide-shadow-cube.swiper-slide-shadow-right {\n    z-index: 0;\n    backface-visibility: hidden;\n  }\n}\n/* Cube slide shadows end */\n"
  },
  {
    "path": "src/modules/effect-cube/effect-cube.mjs",
    "content": "import effectInit from '../../shared/effect-init.mjs';\nimport { createElement, getRotateFix } from '../../shared/utils.mjs';\n\nexport default function EffectCube({ swiper, extendParams, on }) {\n  extendParams({\n    cubeEffect: {\n      slideShadows: true,\n      shadow: true,\n      shadowOffset: 20,\n      shadowScale: 0.94,\n    },\n  });\n\n  const createSlideShadows = (slideEl, progress, isHorizontal) => {\n    let shadowBefore = isHorizontal\n      ? slideEl.querySelector('.swiper-slide-shadow-left')\n      : slideEl.querySelector('.swiper-slide-shadow-top');\n    let shadowAfter = isHorizontal\n      ? slideEl.querySelector('.swiper-slide-shadow-right')\n      : slideEl.querySelector('.swiper-slide-shadow-bottom');\n    if (!shadowBefore) {\n      shadowBefore = createElement(\n        'div',\n        `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '),\n      );\n      slideEl.append(shadowBefore);\n    }\n    if (!shadowAfter) {\n      shadowAfter = createElement(\n        'div',\n        `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(\n          ' ',\n        ),\n      );\n      slideEl.append(shadowAfter);\n    }\n    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n  };\n\n  const recreateShadows = () => {\n    // create new ones\n    const isHorizontal = swiper.isHorizontal();\n    swiper.slides.forEach((slideEl) => {\n      const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      createSlideShadows(slideEl, progress, isHorizontal);\n    });\n  };\n\n  const setTranslate = () => {\n    const {\n      el,\n      wrapperEl,\n      slides,\n      width: swiperWidth,\n      height: swiperHeight,\n      rtlTranslate: rtl,\n      size: swiperSize,\n      browser,\n    } = swiper;\n    const r = getRotateFix(swiper);\n    const params = swiper.params.cubeEffect;\n    const isHorizontal = swiper.isHorizontal();\n    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n    let wrapperRotate = 0;\n    let cubeShadowEl;\n\n    if (params.shadow) {\n      if (isHorizontal) {\n        cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');\n        if (!cubeShadowEl) {\n          cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n          swiper.wrapperEl.append(cubeShadowEl);\n        }\n        cubeShadowEl.style.height = `${swiperWidth}px`;\n      } else {\n        cubeShadowEl = el.querySelector('.swiper-cube-shadow');\n        if (!cubeShadowEl) {\n          cubeShadowEl = createElement('div', 'swiper-cube-shadow');\n          el.append(cubeShadowEl);\n        }\n      }\n    }\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      let slideIndex = i;\n      if (isVirtual) {\n        slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);\n      }\n      let slideAngle = slideIndex * 90;\n      let round = Math.floor(slideAngle / 360);\n      if (rtl) {\n        slideAngle = -slideAngle;\n        round = Math.floor(-slideAngle / 360);\n      }\n      const progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      let tx = 0;\n      let ty = 0;\n      let tz = 0;\n      if (slideIndex % 4 === 0) {\n        tx = -round * 4 * swiperSize;\n        tz = 0;\n      } else if ((slideIndex - 1) % 4 === 0) {\n        tx = 0;\n        tz = -round * 4 * swiperSize;\n      } else if ((slideIndex - 2) % 4 === 0) {\n        tx = swiperSize + round * 4 * swiperSize;\n        tz = swiperSize;\n      } else if ((slideIndex - 3) % 4 === 0) {\n        tx = -swiperSize;\n        tz = 3 * swiperSize + swiperSize * 4 * round;\n      }\n      if (rtl) {\n        tx = -tx;\n      }\n\n      if (!isHorizontal) {\n        ty = tx;\n        tx = 0;\n      }\n\n      const transform = `rotateX(${r(isHorizontal ? 0 : -slideAngle)}deg) rotateY(${r(\n        isHorizontal ? slideAngle : 0,\n      )}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;\n      if (progress <= 1 && progress > -1) {\n        wrapperRotate = slideIndex * 90 + progress * 90;\n        if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;\n      }\n      slideEl.style.transform = transform;\n      if (params.slideShadows) {\n        createSlideShadows(slideEl, progress, isHorizontal);\n      }\n    }\n    wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;\n    wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;\n\n    if (params.shadow) {\n      if (isHorizontal) {\n        cubeShadowEl.style.transform = `translate3d(0px, ${\n          swiperWidth / 2 + params.shadowOffset\n        }px, ${-swiperWidth / 2}px) rotateX(89.99deg) rotateZ(0deg) scale(${params.shadowScale})`;\n      } else {\n        const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n        const multiplier =\n          1.5 -\n          (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 +\n            Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2);\n        const scale1 = params.shadowScale;\n        const scale2 = params.shadowScale / multiplier;\n        const offset = params.shadowOffset;\n        cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${\n          swiperHeight / 2 + offset\n        }px, ${-swiperHeight / 2 / scale2}px) rotateX(-89.99deg)`;\n      }\n    }\n    const zFactor =\n      (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;\n    wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${r(\n      swiper.isHorizontal() ? 0 : wrapperRotate,\n    )}deg) rotateY(${r(swiper.isHorizontal() ? -wrapperRotate : 0)}deg)`;\n\n    wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);\n  };\n  const setTransition = (duration) => {\n    const { el, slides } = swiper;\n    slides.forEach((slideEl) => {\n      slideEl.style.transitionDuration = `${duration}ms`;\n      slideEl\n        .querySelectorAll(\n          '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n        )\n        .forEach((subEl) => {\n          subEl.style.transitionDuration = `${duration}ms`;\n        });\n    });\n\n    if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {\n      const shadowEl = el.querySelector('.swiper-cube-shadow');\n      if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;\n    }\n  };\n\n  effectInit({\n    effect: 'cube',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.cubeEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      resistanceRatio: 0,\n      spaceBetween: 0,\n      centeredSlides: false,\n      virtualTranslate: true,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-fade/effect-fade.css",
    "content": ".swiper-fade {\n  &.swiper-free-mode {\n    .swiper-slide {\n      transition-timing-function: ease-out;\n    }\n  }\n  .swiper-slide {\n    pointer-events: none;\n    transition-property: opacity;\n    .swiper-slide {\n      pointer-events: none;\n    }\n  }\n  .swiper-slide-active {\n    pointer-events: auto;\n    & .swiper-slide-active {\n      pointer-events: auto;\n    }\n  }\n}\n"
  },
  {
    "path": "src/modules/effect-fade/effect-fade.mjs",
    "content": "import effectInit from '../../shared/effect-init.mjs';\nimport effectTarget from '../../shared/effect-target.mjs';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.mjs';\nimport { getSlideTransformEl } from '../../shared/utils.mjs';\n\nexport default function EffectFade({ swiper, extendParams, on }) {\n  extendParams({\n    fadeEffect: {\n      crossFade: false,\n    },\n  });\n\n  const setTranslate = () => {\n    const { slides } = swiper;\n    const params = swiper.params.fadeEffect;\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = swiper.slides[i];\n      const offset = slideEl.swiperSlideOffset;\n      let tx = -offset;\n      if (!swiper.params.virtualTranslate) tx -= swiper.translate;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n      }\n      const slideOpacity = swiper.params.fadeEffect.crossFade\n        ? Math.max(1 - Math.abs(slideEl.progress), 0)\n        : 1 + Math.min(Math.max(slideEl.progress, -1), 0);\n\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.opacity = slideOpacity;\n      targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;\n    }\n  };\n  const setTransition = (duration) => {\n    const transformElements = swiper.slides.map((slideEl) => getSlideTransformEl(slideEl));\n    transformElements.forEach((el) => {\n      el.style.transitionDuration = `${duration}ms`;\n    });\n\n    effectVirtualTransitionEnd({ swiper, duration, transformElements, allSlides: true });\n  };\n\n  effectInit({\n    effect: 'fade',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/effect-flip/effect-flip.css",
    "content": ".swiper.swiper-flip {\n  overflow: visible;\n}\n.swiper-flip {\n  .swiper-slide {\n    pointer-events: none;\n    backface-visibility: hidden;\n    z-index: 1;\n    .swiper-slide {\n      pointer-events: none;\n    }\n  }\n  .swiper-slide-active {\n    &,\n    & .swiper-slide-active {\n      pointer-events: auto;\n    }\n  }\n}\n/* Flip slide shadows start */\n.swiper-flip {\n  .swiper-slide-shadow-flip.swiper-slide-shadow-top,\n  .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,\n  .swiper-slide-shadow-flip.swiper-slide-shadow-left,\n  .swiper-slide-shadow-flip.swiper-slide-shadow-right {\n    z-index: 0;\n    backface-visibility: hidden;\n  }\n}\n/* Flip slide shadows end */\n"
  },
  {
    "path": "src/modules/effect-flip/effect-flip.mjs",
    "content": "import createShadow from '../../shared/create-shadow.mjs';\nimport effectInit from '../../shared/effect-init.mjs';\nimport effectTarget from '../../shared/effect-target.mjs';\nimport effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.mjs';\nimport { getRotateFix, getSlideTransformEl } from '../../shared/utils.mjs';\n\nexport default function EffectFlip({ swiper, extendParams, on }) {\n  extendParams({\n    flipEffect: {\n      slideShadows: true,\n      limitRotation: true,\n    },\n  });\n\n  const createSlideShadows = (slideEl, progress) => {\n    let shadowBefore = swiper.isHorizontal()\n      ? slideEl.querySelector('.swiper-slide-shadow-left')\n      : slideEl.querySelector('.swiper-slide-shadow-top');\n    let shadowAfter = swiper.isHorizontal()\n      ? slideEl.querySelector('.swiper-slide-shadow-right')\n      : slideEl.querySelector('.swiper-slide-shadow-bottom');\n    if (!shadowBefore) {\n      shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');\n    }\n    if (!shadowAfter) {\n      shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');\n    }\n    if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);\n    if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);\n  };\n\n  const recreateShadows = () => {\n    // Set shadows\n    const params = swiper.params.flipEffect;\n    swiper.slides.forEach((slideEl) => {\n      let progress = slideEl.progress;\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      }\n      createSlideShadows(slideEl, progress, params);\n    });\n  };\n\n  const setTranslate = () => {\n    const { slides, rtlTranslate: rtl } = swiper;\n    const params = swiper.params.flipEffect;\n    const rotateFix = getRotateFix(swiper);\n    for (let i = 0; i < slides.length; i += 1) {\n      const slideEl = slides[i];\n      let progress = slideEl.progress;\n      if (swiper.params.flipEffect.limitRotation) {\n        progress = Math.max(Math.min(slideEl.progress, 1), -1);\n      }\n      const offset = slideEl.swiperSlideOffset;\n      const rotate = -180 * progress;\n      let rotateY = rotate;\n      let rotateX = 0;\n      let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;\n      let ty = 0;\n      if (!swiper.isHorizontal()) {\n        ty = tx;\n        tx = 0;\n        rotateX = -rotateY;\n        rotateY = 0;\n      } else if (rtl) {\n        rotateY = -rotateY;\n      }\n\n      slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;\n\n      if (params.slideShadows) {\n        createSlideShadows(slideEl, progress, params);\n      }\n      const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateFix(\n        rotateX,\n      )}deg) rotateY(${rotateFix(rotateY)}deg)`;\n      const targetEl = effectTarget(params, slideEl);\n      targetEl.style.transform = transform;\n    }\n  };\n\n  const setTransition = (duration) => {\n    const transformElements = swiper.slides.map((slideEl) => getSlideTransformEl(slideEl));\n\n    transformElements.forEach((el) => {\n      el.style.transitionDuration = `${duration}ms`;\n      el.querySelectorAll(\n        '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n      ).forEach((shadowEl) => {\n        shadowEl.style.transitionDuration = `${duration}ms`;\n      });\n    });\n\n    effectVirtualTransitionEnd({ swiper, duration, transformElements });\n  };\n\n  effectInit({\n    effect: 'flip',\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    recreateShadows,\n    getEffectParams: () => swiper.params.flipEffect,\n    perspective: () => true,\n    overwriteParams: () => ({\n      slidesPerView: 1,\n      slidesPerGroup: 1,\n      watchSlidesProgress: true,\n      spaceBetween: 0,\n      virtualTranslate: !swiper.params.cssMode,\n    }),\n  });\n}\n"
  },
  {
    "path": "src/modules/free-mode/free-mode.css",
    "content": ".swiper-free-mode > .swiper-wrapper {\n  transition-timing-function: ease-out;\n  margin: 0 auto;\n}\n"
  },
  {
    "path": "src/modules/free-mode/free-mode.mjs",
    "content": "import { elementTransitionEnd, now } from '../../shared/utils.mjs';\n\nexport default function freeMode({ swiper, extendParams, emit, once }) {\n  extendParams({\n    freeMode: {\n      enabled: false,\n      momentum: true,\n      momentumRatio: 1,\n      momentumBounce: true,\n      momentumBounceRatio: 1,\n      momentumVelocityRatio: 1,\n      sticky: false,\n      minimumVelocity: 0.02,\n    },\n  });\n\n  function onTouchStart() {\n    if (swiper.params.cssMode) return;\n    const translate = swiper.getTranslate();\n    swiper.setTranslate(translate);\n    swiper.setTransition(0);\n    swiper.touchEventsData.velocities.length = 0;\n    swiper.freeMode.onTouchEnd({ currentPos: swiper.rtl ? swiper.translate : -swiper.translate });\n  }\n\n  function onTouchMove() {\n    if (swiper.params.cssMode) return;\n    const { touchEventsData: data, touches } = swiper;\n    // Velocity\n    if (data.velocities.length === 0) {\n      data.velocities.push({\n        position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],\n        time: data.touchStartTime,\n      });\n    }\n    data.velocities.push({\n      position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],\n      time: now(),\n    });\n  }\n\n  function onTouchEnd({ currentPos }) {\n    if (swiper.params.cssMode) return;\n    const { params, wrapperEl, rtlTranslate: rtl, snapGrid, touchEventsData: data } = swiper;\n    // Time diff\n    const touchEndTime = now();\n    const timeDiff = touchEndTime - data.touchStartTime;\n\n    if (currentPos < -swiper.minTranslate()) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n    if (currentPos > -swiper.maxTranslate()) {\n      if (swiper.slides.length < snapGrid.length) {\n        swiper.slideTo(snapGrid.length - 1);\n      } else {\n        swiper.slideTo(swiper.slides.length - 1);\n      }\n      return;\n    }\n\n    if (params.freeMode.momentum) {\n      if (data.velocities.length > 1) {\n        const lastMoveEvent = data.velocities.pop();\n        const velocityEvent = data.velocities.pop();\n\n        const distance = lastMoveEvent.position - velocityEvent.position;\n        const time = lastMoveEvent.time - velocityEvent.time;\n        swiper.velocity = distance / time;\n        swiper.velocity /= 2;\n        if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {\n          swiper.velocity = 0;\n        }\n        // this implies that the user stopped moving a finger then released.\n        // There would be no events with distance zero, so the last event is stale.\n        if (time > 150 || now() - lastMoveEvent.time > 300) {\n          swiper.velocity = 0;\n        }\n      } else {\n        swiper.velocity = 0;\n      }\n      swiper.velocity *= params.freeMode.momentumVelocityRatio;\n\n      data.velocities.length = 0;\n      let momentumDuration = 1000 * params.freeMode.momentumRatio;\n      const momentumDistance = swiper.velocity * momentumDuration;\n\n      let newPosition = swiper.translate + momentumDistance;\n      if (rtl) newPosition = -newPosition;\n\n      let doBounce = false;\n      let afterBouncePosition;\n      const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;\n      let needsLoopFix;\n      if (newPosition < swiper.maxTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition + swiper.maxTranslate() < -bounceAmount) {\n            newPosition = swiper.maxTranslate() - bounceAmount;\n          }\n          afterBouncePosition = swiper.maxTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.maxTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (newPosition > swiper.minTranslate()) {\n        if (params.freeMode.momentumBounce) {\n          if (newPosition - swiper.minTranslate() > bounceAmount) {\n            newPosition = swiper.minTranslate() + bounceAmount;\n          }\n          afterBouncePosition = swiper.minTranslate();\n          doBounce = true;\n          data.allowMomentumBounce = true;\n        } else {\n          newPosition = swiper.minTranslate();\n        }\n        if (params.loop && params.centeredSlides) needsLoopFix = true;\n      } else if (params.freeMode.sticky) {\n        let nextSlide;\n        for (let j = 0; j < snapGrid.length; j += 1) {\n          if (snapGrid[j] > -newPosition) {\n            nextSlide = j;\n            break;\n          }\n        }\n\n        if (\n          Math.abs(snapGrid[nextSlide] - newPosition) <\n            Math.abs(snapGrid[nextSlide - 1] - newPosition) ||\n          swiper.swipeDirection === 'next'\n        ) {\n          newPosition = snapGrid[nextSlide];\n        } else {\n          newPosition = snapGrid[nextSlide - 1];\n        }\n        newPosition = -newPosition;\n      }\n      if (needsLoopFix) {\n        once('transitionEnd', () => {\n          swiper.loopFix();\n        });\n      }\n      // Fix duration\n      if (swiper.velocity !== 0) {\n        if (rtl) {\n          momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);\n        } else {\n          momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);\n        }\n        if (params.freeMode.sticky) {\n          // If freeMode.sticky is active and the user ends a swipe with a slow-velocity\n          // event, then durations can be 20+ seconds to slide one (or zero!) slides.\n          // It's easy to see this when simulating touch with mouse events. To fix this,\n          // limit single-slide swipes to the default slide duration. This also has the\n          // nice side effect of matching slide speed if the user stopped moving before\n          // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.\n          // For faster swipes, also apply limits (albeit higher ones).\n          const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);\n          const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];\n          if (moveDistance < currentSlideSize) {\n            momentumDuration = params.speed;\n          } else if (moveDistance < 2 * currentSlideSize) {\n            momentumDuration = params.speed * 1.5;\n          } else {\n            momentumDuration = params.speed * 2.5;\n          }\n        }\n      } else if (params.freeMode.sticky) {\n        swiper.slideToClosest();\n        return;\n      }\n\n      if (params.freeMode.momentumBounce && doBounce) {\n        swiper.updateProgress(afterBouncePosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        swiper.animating = true;\n        elementTransitionEnd(wrapperEl, () => {\n          if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;\n          emit('momentumBounce');\n          swiper.setTransition(params.speed);\n          setTimeout(() => {\n            swiper.setTranslate(afterBouncePosition);\n            elementTransitionEnd(wrapperEl, () => {\n              if (!swiper || swiper.destroyed) return;\n              swiper.transitionEnd();\n            });\n          }, 0);\n        });\n      } else if (swiper.velocity) {\n        emit('_freeModeNoMomentumRelease');\n        swiper.updateProgress(newPosition);\n        swiper.setTransition(momentumDuration);\n        swiper.setTranslate(newPosition);\n        swiper.transitionStart(true, swiper.swipeDirection);\n        if (!swiper.animating) {\n          swiper.animating = true;\n          elementTransitionEnd(wrapperEl, () => {\n            if (!swiper || swiper.destroyed) return;\n            swiper.transitionEnd();\n          });\n        }\n      } else {\n        swiper.updateProgress(newPosition);\n      }\n\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    } else if (params.freeMode.sticky) {\n      swiper.slideToClosest();\n      return;\n    } else if (params.freeMode) {\n      emit('_freeModeNoMomentumRelease');\n    }\n\n    if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {\n      emit('_freeModeStaticRelease');\n      swiper.updateProgress();\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n  }\n\n  Object.assign(swiper, {\n    freeMode: {\n      onTouchStart,\n      onTouchMove,\n      onTouchEnd,\n    },\n  });\n}\n"
  },
  {
    "path": "src/modules/grid/grid.css",
    "content": ".swiper-grid > .swiper-wrapper {\n  flex-wrap: wrap;\n}\n.swiper-grid-column > .swiper-wrapper {\n  flex-wrap: wrap;\n  flex-direction: column;\n}\n"
  },
  {
    "path": "src/modules/grid/grid.mjs",
    "content": "export default function Grid({ swiper, extendParams, on }) {\n  extendParams({\n    grid: {\n      rows: 1,\n      fill: 'column',\n    },\n  });\n\n  let slidesNumberEvenToRows;\n  let slidesPerRow;\n  let numFullColumns;\n  let wasMultiRow;\n\n  const getSpaceBetween = () => {\n    let spaceBetween = swiper.params.spaceBetween;\n    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n      spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiper.size;\n    } else if (typeof spaceBetween === 'string') {\n      spaceBetween = parseFloat(spaceBetween);\n    }\n    return spaceBetween;\n  };\n\n  const initSlides = (slides) => {\n    const { slidesPerView } = swiper.params;\n    const { rows, fill } = swiper.params.grid;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : slides.length;\n    numFullColumns = Math.floor(slidesLength / rows);\n    if (Math.floor(slidesLength / rows) === slidesLength / rows) {\n      slidesNumberEvenToRows = slidesLength;\n    } else {\n      slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;\n    }\n    if (slidesPerView !== 'auto' && fill === 'row') {\n      slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);\n    }\n    slidesPerRow = slidesNumberEvenToRows / rows;\n  };\n\n  const unsetSlides = () => {\n    if (swiper.slides) {\n      swiper.slides.forEach((slide) => {\n        if (slide.swiperSlideGridSet) {\n          slide.style.height = '';\n          slide.style[swiper.getDirectionLabel('margin-top')] = '';\n        }\n      });\n    }\n  };\n\n  const updateSlide = (i, slide, slides) => {\n    const { slidesPerGroup } = swiper.params;\n    const spaceBetween = getSpaceBetween();\n    const { rows, fill } = swiper.params.grid;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : slides.length;\n    // Set slides order\n    let newSlideOrderIndex;\n    let column;\n    let row;\n    if (fill === 'row' && slidesPerGroup > 1) {\n      const groupIndex = Math.floor(i / (slidesPerGroup * rows));\n      const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;\n      const columnsInGroup =\n        groupIndex === 0\n          ? slidesPerGroup\n          : Math.min(\n              Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows),\n              slidesPerGroup,\n            );\n      row = Math.floor(slideIndexInGroup / columnsInGroup);\n      column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;\n\n      newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows;\n      slide.style.order = newSlideOrderIndex;\n    } else if (fill === 'column') {\n      column = Math.floor(i / rows);\n      row = i - column * rows;\n      if (column > numFullColumns || (column === numFullColumns && row === rows - 1)) {\n        row += 1;\n        if (row >= rows) {\n          row = 0;\n          column += 1;\n        }\n      }\n    } else {\n      row = Math.floor(i / slidesPerRow);\n      column = i - row * slidesPerRow;\n    }\n    slide.row = row;\n    slide.column = column;\n    slide.style.height = `calc((100% - ${(rows - 1) * spaceBetween}px) / ${rows})`;\n    slide.style[swiper.getDirectionLabel('margin-top')] =\n      row !== 0 ? spaceBetween && `${spaceBetween}px` : '';\n    slide.swiperSlideGridSet = true;\n  };\n\n  const updateWrapperSize = (slideSize, snapGrid) => {\n    const { centeredSlides, roundLengths } = swiper.params;\n    const spaceBetween = getSpaceBetween();\n    const { rows } = swiper.params.grid;\n    swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;\n    swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;\n    if (!swiper.params.cssMode) {\n      swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = `${\n        swiper.virtualSize + spaceBetween\n      }px`;\n    }\n    if (centeredSlides) {\n      const newSlidesGrid = [];\n      for (let i = 0; i < snapGrid.length; i += 1) {\n        let slidesGridItem = snapGrid[i];\n        if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n        if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);\n      }\n      snapGrid.splice(0, snapGrid.length);\n      snapGrid.push(...newSlidesGrid);\n    }\n  };\n  const onInit = () => {\n    wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;\n  };\n\n  const onUpdate = () => {\n    const { params, el } = swiper;\n    const isMultiRow = params.grid && params.grid.rows > 1;\n\n    if (wasMultiRow && !isMultiRow) {\n      el.classList.remove(\n        `${params.containerModifierClass}grid`,\n        `${params.containerModifierClass}grid-column`,\n      );\n      numFullColumns = 1;\n      swiper.emitContainerClasses();\n    } else if (!wasMultiRow && isMultiRow) {\n      el.classList.add(`${params.containerModifierClass}grid`);\n      if (params.grid.fill === 'column') {\n        el.classList.add(`${params.containerModifierClass}grid-column`);\n      }\n      swiper.emitContainerClasses();\n    }\n    wasMultiRow = isMultiRow;\n  };\n\n  on('init', onInit);\n  on('update', onUpdate);\n\n  swiper.grid = {\n    initSlides,\n    unsetSlides,\n    updateSlide,\n    updateWrapperSize,\n  };\n}\n"
  },
  {
    "path": "src/modules/hash-navigation/hash-navigation.css",
    "content": ""
  },
  {
    "path": "src/modules/hash-navigation/hash-navigation.mjs",
    "content": "import { getWindow, getDocument } from 'ssr-window';\nimport { elementChildren } from '../../shared/utils.mjs';\n\nexport default function HashNavigation({ swiper, extendParams, emit, on }) {\n  let initialized = false;\n  const document = getDocument();\n  const window = getWindow();\n  extendParams({\n    hashNavigation: {\n      enabled: false,\n      replaceState: false,\n      watchState: false,\n      getSlideIndex(_s, hash) {\n        if (swiper.virtual && swiper.params.virtual.enabled) {\n          const slideWithHash = swiper.slides.find(\n            (slideEl) => slideEl.getAttribute('data-hash') === hash,\n          );\n          if (!slideWithHash) return 0;\n          const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);\n          return index;\n        }\n        return swiper.getSlideIndex(\n          elementChildren(\n            swiper.slidesEl,\n            `.${swiper.params.slideClass}[data-hash=\"${hash}\"], swiper-slide[data-hash=\"${hash}\"]`,\n          )[0],\n        );\n      },\n    },\n  });\n  const onHashChange = () => {\n    emit('hashChange');\n    const newHash = document.location.hash.replace('#', '');\n    const activeSlideEl =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`)\n        : swiper.slides[swiper.activeIndex];\n    const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';\n    if (newHash !== activeSlideHash) {\n      const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);\n      if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;\n      swiper.slideTo(newIndex);\n    }\n  };\n  const setHash = () => {\n    if (!initialized || !swiper.params.hashNavigation.enabled) return;\n    const activeSlideEl =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${swiper.activeIndex}\"]`)\n        : swiper.slides[swiper.activeIndex];\n    const activeSlideHash = activeSlideEl\n      ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history')\n      : '';\n    if (\n      swiper.params.hashNavigation.replaceState &&\n      window.history &&\n      window.history.replaceState\n    ) {\n      window.history.replaceState(null, null, `#${activeSlideHash}` || '');\n      emit('hashSet');\n    } else {\n      document.location.hash = activeSlideHash || '';\n      emit('hashSet');\n    }\n  };\n  const init = () => {\n    if (\n      !swiper.params.hashNavigation.enabled ||\n      (swiper.params.history && swiper.params.history.enabled)\n    )\n      return;\n    initialized = true;\n    const hash = document.location.hash.replace('#', '');\n    if (hash) {\n      const speed = 0;\n      const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);\n      swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);\n    }\n    if (swiper.params.hashNavigation.watchState) {\n      window.addEventListener('hashchange', onHashChange);\n    }\n  };\n  const destroy = () => {\n    if (swiper.params.hashNavigation.watchState) {\n      window.removeEventListener('hashchange', onHashChange);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.hashNavigation.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHash();\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHash();\n    }\n  });\n}\n"
  },
  {
    "path": "src/modules/history/history.css",
    "content": ""
  },
  {
    "path": "src/modules/history/history.mjs",
    "content": "import { getWindow } from 'ssr-window';\n\nexport default function History({ swiper, extendParams, on }) {\n  extendParams({\n    history: {\n      enabled: false,\n      root: '',\n      replaceState: false,\n      key: 'slides',\n      keepQuery: false,\n    },\n  });\n\n  let initialized = false;\n  let paths = {};\n\n  const slugify = (text) => {\n    return text\n      .toString()\n      .replace(/\\s+/g, '-')\n      .replace(/[^\\w-]+/g, '')\n      .replace(/--+/g, '-')\n      .replace(/^-+/, '')\n      .replace(/-+$/, '');\n  };\n\n  const getPathValues = (urlOverride) => {\n    const window = getWindow();\n    let location;\n    if (urlOverride) {\n      location = new URL(urlOverride);\n    } else {\n      location = window.location;\n    }\n    const pathArray = location.pathname\n      .slice(1)\n      .split('/')\n      .filter((part) => part !== '');\n    const total = pathArray.length;\n    const key = pathArray[total - 2];\n    const value = pathArray[total - 1];\n    return { key, value };\n  };\n  const setHistory = (key, index) => {\n    const window = getWindow();\n    if (!initialized || !swiper.params.history.enabled) return;\n    let location;\n    if (swiper.params.url) {\n      location = new URL(swiper.params.url);\n    } else {\n      location = window.location;\n    }\n    const slide =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.slidesEl.querySelector(`[data-swiper-slide-index=\"${index}\"]`)\n        : swiper.slides[index];\n    let value = slugify(slide.getAttribute('data-history'));\n    if (swiper.params.history.root.length > 0) {\n      let root = swiper.params.history.root;\n      if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);\n      value = `${root}/${key ? `${key}/` : ''}${value}`;\n    } else if (!location.pathname.includes(key)) {\n      value = `${key ? `${key}/` : ''}${value}`;\n    }\n    if (swiper.params.history.keepQuery) {\n      value += location.search;\n    }\n    const currentState = window.history.state;\n    if (currentState && currentState.value === value) {\n      return;\n    }\n    if (swiper.params.history.replaceState) {\n      window.history.replaceState({ value }, null, value);\n    } else {\n      window.history.pushState({ value }, null, value);\n    }\n  };\n\n  const scrollToSlide = (speed, value, runCallbacks) => {\n    if (value) {\n      for (let i = 0, length = swiper.slides.length; i < length; i += 1) {\n        const slide = swiper.slides[i];\n        const slideHistory = slugify(slide.getAttribute('data-history'));\n        if (slideHistory === value) {\n          const index = swiper.getSlideIndex(slide);\n          swiper.slideTo(index, speed, runCallbacks);\n        }\n      }\n    } else {\n      swiper.slideTo(0, speed, runCallbacks);\n    }\n  };\n\n  const setHistoryPopState = () => {\n    paths = getPathValues(swiper.params.url);\n    scrollToSlide(swiper.params.speed, paths.value, false);\n  };\n\n  const init = () => {\n    const window = getWindow();\n    if (!swiper.params.history) return;\n    if (!window.history || !window.history.pushState) {\n      swiper.params.history.enabled = false;\n      swiper.params.hashNavigation.enabled = true;\n      return;\n    }\n    initialized = true;\n    paths = getPathValues(swiper.params.url);\n    if (!paths.key && !paths.value) {\n      if (!swiper.params.history.replaceState) {\n        window.addEventListener('popstate', setHistoryPopState);\n      }\n      return;\n    }\n    scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);\n    if (!swiper.params.history.replaceState) {\n      window.addEventListener('popstate', setHistoryPopState);\n    }\n  };\n  const destroy = () => {\n    const window = getWindow();\n    if (!swiper.params.history.replaceState) {\n      window.removeEventListener('popstate', setHistoryPopState);\n    }\n  };\n\n  on('init', () => {\n    if (swiper.params.history.enabled) {\n      init();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.params.history.enabled) {\n      destroy();\n    }\n  });\n  on('transitionEnd _freeModeNoMomentumRelease', () => {\n    if (initialized) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n  on('slideChange', () => {\n    if (initialized && swiper.params.cssMode) {\n      setHistory(swiper.params.history.key, swiper.activeIndex);\n    }\n  });\n}\n"
  },
  {
    "path": "src/modules/keyboard/keyboard.css",
    "content": ""
  },
  {
    "path": "src/modules/keyboard/keyboard.mjs",
    "content": "/* eslint-disable consistent-return */\nimport { getWindow, getDocument } from 'ssr-window';\nimport { elementOffset, elementParents } from '../../shared/utils.mjs';\n\nexport default function Keyboard({ swiper, extendParams, on, emit }) {\n  const document = getDocument();\n  const window = getWindow();\n  swiper.keyboard = {\n    enabled: false,\n  };\n  extendParams({\n    keyboard: {\n      enabled: false,\n      onlyInViewport: true,\n      pageUpDown: true,\n      speed: undefined,\n    },\n  });\n\n  function handle(event) {\n    if (!swiper.enabled) return;\n\n    const { rtlTranslate: rtl } = swiper;\n    let e = event;\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    const kc = e.keyCode || e.charCode;\n    const pageUpDown = swiper.params.keyboard.pageUpDown;\n    const isPageUp = pageUpDown && kc === 33;\n    const isPageDown = pageUpDown && kc === 34;\n    const isArrowLeft = kc === 37;\n    const isArrowRight = kc === 39;\n    const isArrowUp = kc === 38;\n    const isArrowDown = kc === 40;\n    // Directions locks\n    if (\n      !swiper.allowSlideNext &&\n      ((swiper.isHorizontal() && isArrowRight) ||\n        (swiper.isVertical() && isArrowDown) ||\n        isPageDown)\n    ) {\n      return false;\n    }\n    if (\n      !swiper.allowSlidePrev &&\n      ((swiper.isHorizontal() && isArrowLeft) || (swiper.isVertical() && isArrowUp) || isPageUp)\n    ) {\n      return false;\n    }\n    if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {\n      return undefined;\n    }\n    if (\n      document.activeElement &&\n      (document.activeElement.isContentEditable ||\n        (document.activeElement.nodeName &&\n          (document.activeElement.nodeName.toLowerCase() === 'input' ||\n            document.activeElement.nodeName.toLowerCase() === 'textarea')))\n    ) {\n      return undefined;\n    }\n    if (\n      swiper.params.keyboard.onlyInViewport &&\n      (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)\n    ) {\n      let inView = false;\n      // Check that swiper should be inside of visible area of window\n      if (\n        elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 &&\n        elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0\n      ) {\n        return undefined;\n      }\n\n      const el = swiper.el;\n      const swiperWidth = el.clientWidth;\n      const swiperHeight = el.clientHeight;\n      const windowWidth = window.innerWidth;\n      const windowHeight = window.innerHeight;\n      const swiperOffset = elementOffset(el);\n      if (rtl) swiperOffset.left -= el.scrollLeft;\n      const swiperCoord = [\n        [swiperOffset.left, swiperOffset.top],\n        [swiperOffset.left + swiperWidth, swiperOffset.top],\n        [swiperOffset.left, swiperOffset.top + swiperHeight],\n        [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight],\n      ];\n      for (let i = 0; i < swiperCoord.length; i += 1) {\n        const point = swiperCoord[i];\n        if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {\n          if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line\n          inView = true;\n        }\n      }\n      if (!inView) return undefined;\n    }\n    const speed = swiper.params.keyboard.speed;\n    if (swiper.isHorizontal()) {\n      if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {\n        if (e.preventDefault) e.preventDefault();\n        else e.returnValue = false;\n      }\n      if (((isPageDown || isArrowRight) && !rtl) || ((isPageUp || isArrowLeft) && rtl))\n        swiper.slideNext(speed);\n      if (((isPageUp || isArrowLeft) && !rtl) || ((isPageDown || isArrowRight) && rtl))\n        swiper.slidePrev(speed);\n    } else {\n      if (isPageUp || isPageDown || isArrowUp || isArrowDown) {\n        if (e.preventDefault) e.preventDefault();\n        else e.returnValue = false;\n      }\n      if (isPageDown || isArrowDown) swiper.slideNext(speed);\n      if (isPageUp || isArrowUp) swiper.slidePrev(speed);\n    }\n    emit('keyPress', kc);\n    return undefined;\n  }\n  function enable() {\n    if (swiper.keyboard.enabled) return;\n    document.addEventListener('keydown', handle);\n    swiper.keyboard.enabled = true;\n  }\n  function disable() {\n    if (!swiper.keyboard.enabled) return;\n    document.removeEventListener('keydown', handle);\n    swiper.keyboard.enabled = false;\n  }\n\n  on('init', () => {\n    if (swiper.params.keyboard.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    if (swiper.keyboard.enabled) {\n      disable();\n    }\n  });\n\n  Object.assign(swiper.keyboard, {\n    enable,\n    disable,\n  });\n}\n"
  },
  {
    "path": "src/modules/manipulation/manipulation.css",
    "content": ""
  },
  {
    "path": "src/modules/manipulation/manipulation.mjs",
    "content": "import appendSlide from './methods/appendSlide.mjs';\nimport prependSlide from './methods/prependSlide.mjs';\nimport addSlide from './methods/addSlide.mjs';\nimport removeSlide from './methods/removeSlide.mjs';\nimport removeAllSlides from './methods/removeAllSlides.mjs';\n\nexport default function Manipulation({ swiper }) {\n  Object.assign(swiper, {\n    appendSlide: appendSlide.bind(swiper),\n    prependSlide: prependSlide.bind(swiper),\n    addSlide: addSlide.bind(swiper),\n    removeSlide: removeSlide.bind(swiper),\n    removeAllSlides: removeAllSlides.bind(swiper),\n  });\n}\n"
  },
  {
    "path": "src/modules/manipulation/methods/addSlide.mjs",
    "content": "export default function addSlide(index, slides) {\n  const swiper = this;\n  const { params, activeIndex, slidesEl } = swiper;\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n    swiper.recalcSlides();\n  }\n  const baseLength = swiper.slides.length;\n  if (index <= 0) {\n    swiper.prependSlide(slides);\n    return;\n  }\n  if (index >= baseLength) {\n    swiper.appendSlide(slides);\n    return;\n  }\n  let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;\n\n  const slidesBuffer = [];\n  for (let i = baseLength - 1; i >= index; i -= 1) {\n    const currentSlide = swiper.slides[i];\n    currentSlide.remove();\n    slidesBuffer.unshift(currentSlide);\n  }\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) slidesEl.append(slides[i]);\n    }\n    newActiveIndex =\n      activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;\n  } else {\n    slidesEl.append(slides);\n  }\n\n  for (let i = 0; i < slidesBuffer.length; i += 1) {\n    slidesEl.append(slidesBuffer[i]);\n  }\n\n  swiper.recalcSlides();\n\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n"
  },
  {
    "path": "src/modules/manipulation/methods/appendSlide.mjs",
    "content": "import { setInnerHTML } from '../../../shared/utils.mjs';\n\nexport default function appendSlide(slides) {\n  const swiper = this;\n  const { params, slidesEl } = swiper;\n\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n\n  const appendElement = (slideEl) => {\n    if (typeof slideEl === 'string') {\n      const tempDOM = document.createElement('div');\n      setInnerHTML(tempDOM, slideEl);\n      slidesEl.append(tempDOM.children[0]);\n      setInnerHTML(tempDOM, '');\n    } else {\n      slidesEl.append(slideEl);\n    }\n  };\n\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) appendElement(slides[i]);\n    }\n  } else {\n    appendElement(slides);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n}\n"
  },
  {
    "path": "src/modules/manipulation/methods/prependSlide.mjs",
    "content": "import { setInnerHTML } from '../../../shared/utils.mjs';\n\nexport default function prependSlide(slides) {\n  const swiper = this;\n  const { params, activeIndex, slidesEl } = swiper;\n\n  if (params.loop) {\n    swiper.loopDestroy();\n  }\n  let newActiveIndex = activeIndex + 1;\n  const prependElement = (slideEl) => {\n    if (typeof slideEl === 'string') {\n      const tempDOM = document.createElement('div');\n      setInnerHTML(tempDOM, slideEl);\n      slidesEl.prepend(tempDOM.children[0]);\n      setInnerHTML(tempDOM, '');\n    } else {\n      slidesEl.prepend(slideEl);\n    }\n  };\n  if (typeof slides === 'object' && 'length' in slides) {\n    for (let i = 0; i < slides.length; i += 1) {\n      if (slides[i]) prependElement(slides[i]);\n    }\n    newActiveIndex = activeIndex + slides.length;\n  } else {\n    prependElement(slides);\n  }\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  swiper.slideTo(newActiveIndex, 0, false);\n}\n"
  },
  {
    "path": "src/modules/manipulation/methods/removeAllSlides.mjs",
    "content": "export default function removeAllSlides() {\n  const swiper = this;\n\n  const slidesIndexes = [];\n  for (let i = 0; i < swiper.slides.length; i += 1) {\n    slidesIndexes.push(i);\n  }\n  swiper.removeSlide(slidesIndexes);\n}\n"
  },
  {
    "path": "src/modules/manipulation/methods/removeSlide.mjs",
    "content": "export default function removeSlide(slidesIndexes) {\n  const swiper = this;\n  const { params, activeIndex } = swiper;\n\n  let activeIndexBuffer = activeIndex;\n  if (params.loop) {\n    activeIndexBuffer -= swiper.loopedSlides;\n    swiper.loopDestroy();\n  }\n  let newActiveIndex = activeIndexBuffer;\n  let indexToRemove;\n\n  if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {\n    for (let i = 0; i < slidesIndexes.length; i += 1) {\n      indexToRemove = slidesIndexes[i];\n      if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    }\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  } else {\n    indexToRemove = slidesIndexes;\n    if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();\n    if (indexToRemove < newActiveIndex) newActiveIndex -= 1;\n    newActiveIndex = Math.max(newActiveIndex, 0);\n  }\n\n  swiper.recalcSlides();\n  if (params.loop) {\n    swiper.loopCreate();\n  }\n\n  if (!params.observer || swiper.isElement) {\n    swiper.update();\n  }\n  if (params.loop) {\n    swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);\n  } else {\n    swiper.slideTo(newActiveIndex, 0, false);\n  }\n}\n"
  },
  {
    "path": "src/modules/mousewheel/mousewheel.css",
    "content": ""
  },
  {
    "path": "src/modules/mousewheel/mousewheel.mjs",
    "content": "/* eslint-disable consistent-return */\nimport { getWindow } from 'ssr-window';\nimport { now, nextTick } from '../../shared/utils.mjs';\n\nexport default function Mousewheel({ swiper, extendParams, on, emit }) {\n  const window = getWindow();\n\n  extendParams({\n    mousewheel: {\n      enabled: false,\n      releaseOnEdges: false,\n      invert: false,\n      forceToAxis: false,\n      sensitivity: 1,\n      eventsTarget: 'container',\n      thresholdDelta: null,\n      thresholdTime: null,\n      noMousewheelClass: 'swiper-no-mousewheel',\n    },\n  });\n\n  swiper.mousewheel = {\n    enabled: false,\n  };\n\n  let timeout;\n  let lastScrollTime = now();\n  let lastEventBeforeSnap;\n  const recentWheelEvents = [];\n\n  function normalize(e) {\n    // Reasonable defaults\n    const PIXEL_STEP = 10;\n    const LINE_HEIGHT = 40;\n    const PAGE_HEIGHT = 800;\n\n    let sX = 0;\n    let sY = 0; // spinX, spinY\n    let pX = 0;\n    let pY = 0; // pixelX, pixelY\n\n    // Legacy\n    if ('detail' in e) {\n      sY = e.detail;\n    }\n    if ('wheelDelta' in e) {\n      sY = -e.wheelDelta / 120;\n    }\n    if ('wheelDeltaY' in e) {\n      sY = -e.wheelDeltaY / 120;\n    }\n    if ('wheelDeltaX' in e) {\n      sX = -e.wheelDeltaX / 120;\n    }\n\n    // side scrolling on FF with DOMMouseScroll\n    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {\n      sX = sY;\n      sY = 0;\n    }\n\n    pX = sX * PIXEL_STEP;\n    pY = sY * PIXEL_STEP;\n\n    if ('deltaY' in e) {\n      pY = e.deltaY;\n    }\n    if ('deltaX' in e) {\n      pX = e.deltaX;\n    }\n\n    if (e.shiftKey && !pX) {\n      // if user scrolls with shift he wants horizontal scroll\n      pX = pY;\n      pY = 0;\n    }\n\n    if ((pX || pY) && e.deltaMode) {\n      if (e.deltaMode === 1) {\n        // delta in LINE units\n        pX *= LINE_HEIGHT;\n        pY *= LINE_HEIGHT;\n      } else {\n        // delta in PAGE units\n        pX *= PAGE_HEIGHT;\n        pY *= PAGE_HEIGHT;\n      }\n    }\n\n    // Fall-back if spin cannot be determined\n    if (pX && !sX) {\n      sX = pX < 1 ? -1 : 1;\n    }\n    if (pY && !sY) {\n      sY = pY < 1 ? -1 : 1;\n    }\n\n    return {\n      spinX: sX,\n      spinY: sY,\n      pixelX: pX,\n      pixelY: pY,\n    };\n  }\n  function handleMouseEnter() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = true;\n  }\n  function handleMouseLeave() {\n    if (!swiper.enabled) return;\n    swiper.mouseEntered = false;\n  }\n  function animateSlider(newEvent) {\n    if (\n      swiper.params.mousewheel.thresholdDelta &&\n      newEvent.delta < swiper.params.mousewheel.thresholdDelta\n    ) {\n      // Prevent if delta of wheel scroll delta is below configured threshold\n      return false;\n    }\n\n    if (\n      swiper.params.mousewheel.thresholdTime &&\n      now() - lastScrollTime < swiper.params.mousewheel.thresholdTime\n    ) {\n      // Prevent if time between scrolls is below configured threshold\n      return false;\n    }\n\n    // If the movement is NOT big enough and\n    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):\n    //   Don't go any further (avoid insignificant scroll movement).\n    if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {\n      // Return false as a default\n      return true;\n    }\n    // If user is scrolling towards the end:\n    //   If the slider hasn't hit the latest slide or\n    //   if the slider is a loop and\n    //   if the slider isn't moving right now:\n    //     Go to next slide and\n    //     emit a scroll event.\n    // Else (the user is scrolling towards the beginning) and\n    // if the slider hasn't hit the first slide or\n    // if the slider is a loop and\n    // if the slider isn't moving right now:\n    //   Go to prev slide and\n    //   emit a scroll event.\n    if (newEvent.direction < 0) {\n      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {\n        swiper.slideNext();\n        emit('scroll', newEvent.raw);\n      }\n    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {\n      swiper.slidePrev();\n      emit('scroll', newEvent.raw);\n    }\n    // If you got here is because an animation has been triggered so store the current time\n    lastScrollTime = new window.Date().getTime();\n    // Return false as a default\n    return false;\n  }\n  function releaseScroll(newEvent) {\n    const params = swiper.params.mousewheel;\n    if (newEvent.direction < 0) {\n      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {\n        // Return true to animate scroll on edges\n        return true;\n      }\n    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {\n      // Return true to animate scroll on edges\n      return true;\n    }\n    return false;\n  }\n  function handle(event) {\n    let e = event;\n    let disableParentSwiper = true;\n    if (!swiper.enabled) return;\n\n    // Ignore event if the target or its parents have the swiper-no-mousewheel class\n    if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;\n\n    const params = swiper.params.mousewheel;\n\n    if (swiper.params.cssMode) {\n      e.preventDefault();\n    }\n\n    let targetEl = swiper.el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n    }\n    const targetElContainsTarget = targetEl && targetEl.contains(e.target);\n    if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;\n\n    if (e.originalEvent) e = e.originalEvent; // jquery fix\n    let delta = 0;\n    const rtlFactor = swiper.rtlTranslate ? -1 : 1;\n\n    const data = normalize(e);\n\n    if (params.forceToAxis) {\n      if (swiper.isHorizontal()) {\n        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;\n        else return true;\n      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;\n      else return true;\n    } else {\n      delta =\n        Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;\n    }\n\n    if (delta === 0) return true;\n\n    if (params.invert) delta = -delta;\n\n    // Get the scroll positions\n    let positions = swiper.getTranslate() + delta * params.sensitivity;\n\n    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();\n    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();\n\n    // When loop is true:\n    //     the disableParentSwiper will be true.\n    // When loop is false:\n    //     if the scroll positions is not on edge,\n    //     then the disableParentSwiper will be true.\n    //     if the scroll on edge positions,\n    //     then the disableParentSwiper will be false.\n    disableParentSwiper = swiper.params.loop\n      ? true\n      : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());\n\n    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();\n\n    if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {\n      // Register the new event in a variable which stores the relevant data\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n        raw: event,\n      };\n\n      // Keep the most recent events\n      if (recentWheelEvents.length >= 2) {\n        recentWheelEvents.shift(); // only store the last N events\n      }\n      const prevEvent = recentWheelEvents.length\n        ? recentWheelEvents[recentWheelEvents.length - 1]\n        : undefined;\n      recentWheelEvents.push(newEvent);\n\n      // If there is at least one previous recorded event:\n      //   If direction has changed or\n      //   if the scroll is quicker than the previous one:\n      //     Animate the slider.\n      // Else (this is the first time the wheel is moved):\n      //     Animate the slider.\n      if (prevEvent) {\n        if (\n          newEvent.direction !== prevEvent.direction ||\n          newEvent.delta > prevEvent.delta ||\n          newEvent.time > prevEvent.time + 150\n        ) {\n          animateSlider(newEvent);\n        }\n      } else {\n        animateSlider(newEvent);\n      }\n\n      // If it's time to release the scroll:\n      //   Return now so you don't hit the preventDefault.\n      if (releaseScroll(newEvent)) {\n        return true;\n      }\n    } else {\n      // Freemode or scrollContainer:\n\n      // If we recently snapped after a momentum scroll, then ignore wheel events\n      // to give time for the deceleration to finish. Stop ignoring after 500 msecs\n      // or if it's a new scroll (larger delta or inverse sign as last event before\n      // an end-of-momentum snap).\n      const newEvent = {\n        time: now(),\n        delta: Math.abs(delta),\n        direction: Math.sign(delta),\n      };\n\n      const ignoreWheelEvents =\n        lastEventBeforeSnap &&\n        newEvent.time < lastEventBeforeSnap.time + 500 &&\n        newEvent.delta <= lastEventBeforeSnap.delta &&\n        newEvent.direction === lastEventBeforeSnap.direction;\n      if (!ignoreWheelEvents) {\n        lastEventBeforeSnap = undefined;\n\n        let position = swiper.getTranslate() + delta * params.sensitivity;\n        const wasBeginning = swiper.isBeginning;\n        const wasEnd = swiper.isEnd;\n\n        if (position >= swiper.minTranslate()) position = swiper.minTranslate();\n        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();\n\n        swiper.setTransition(0);\n        swiper.setTranslate(position);\n        swiper.updateProgress();\n        swiper.updateActiveIndex();\n        swiper.updateSlidesClasses();\n\n        if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {\n          swiper.updateSlidesClasses();\n        }\n        if (swiper.params.loop) {\n          swiper.loopFix({\n            direction: newEvent.direction < 0 ? 'next' : 'prev',\n            byMousewheel: true,\n          });\n        }\n\n        if (swiper.params.freeMode.sticky) {\n          // When wheel scrolling starts with sticky (aka snap) enabled, then detect\n          // the end of a momentum scroll by storing recent (N=15?) wheel events.\n          // 1. do all N events have decreasing or same (absolute value) delta?\n          // 2. did all N events arrive in the last M (M=500?) msecs?\n          // 3. does the earliest event have an (absolute value) delta that's\n          //    at least P (P=1?) larger than the most recent event's delta?\n          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?\n          // If 1-4 are \"yes\" then we're near the end of a momentum scroll deceleration.\n          // Snap immediately and ignore remaining wheel events in this scroll.\n          // See comment above for \"remaining wheel events in this scroll\" determination.\n          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.\n          clearTimeout(timeout);\n          timeout = undefined;\n          if (recentWheelEvents.length >= 15) {\n            recentWheelEvents.shift(); // only store the last N events\n          }\n          const prevEvent = recentWheelEvents.length\n            ? recentWheelEvents[recentWheelEvents.length - 1]\n            : undefined;\n          const firstEvent = recentWheelEvents[0];\n          recentWheelEvents.push(newEvent);\n          if (\n            prevEvent &&\n            (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)\n          ) {\n            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.\n            recentWheelEvents.splice(0);\n          } else if (\n            recentWheelEvents.length >= 15 &&\n            newEvent.time - firstEvent.time < 500 &&\n            firstEvent.delta - newEvent.delta >= 1 &&\n            newEvent.delta <= 6\n          ) {\n            // We're at the end of the deceleration of a momentum scroll, so there's no need\n            // to wait for more events. Snap ASAP on the next tick.\n            // Also, because there's some remaining momentum we'll bias the snap in the\n            // direction of the ongoing scroll because it's better UX for the scroll to snap\n            // in the same direction as the scroll instead of reversing to snap.  Therefore,\n            // if it's already scrolled more than 20% in the current direction, keep going.\n            const snapToThreshold = delta > 0 ? 0.8 : 0.2;\n            lastEventBeforeSnap = newEvent;\n            recentWheelEvents.splice(0);\n            timeout = nextTick(() => {\n              if (swiper.destroyed || !swiper.params) return;\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 0); // no delay; move on next tick\n          }\n          if (!timeout) {\n            // if we get here, then we haven't detected the end of a momentum scroll, so\n            // we'll consider a scroll \"complete\" when there haven't been any wheel events\n            // for 500ms.\n            timeout = nextTick(() => {\n              if (swiper.destroyed || !swiper.params) return;\n              const snapToThreshold = 0.5;\n              lastEventBeforeSnap = newEvent;\n              recentWheelEvents.splice(0);\n              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);\n            }, 500);\n          }\n        }\n\n        // Emit event\n        if (!ignoreWheelEvents) emit('scroll', e);\n\n        // Stop autoplay\n        if (swiper.params.autoplay && swiper.params.autoplay.disableOnInteraction)\n          swiper.autoplay.stop();\n        // Return page scroll on edge positions\n        if (\n          params.releaseOnEdges &&\n          (position === swiper.minTranslate() || position === swiper.maxTranslate())\n        ) {\n          return true;\n        }\n      }\n    }\n\n    if (e.preventDefault) e.preventDefault();\n    else e.returnValue = false;\n    return false;\n  }\n\n  function events(method) {\n    let targetEl = swiper.el;\n    if (swiper.params.mousewheel.eventsTarget !== 'container') {\n      targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);\n    }\n    targetEl[method]('mouseenter', handleMouseEnter);\n    targetEl[method]('mouseleave', handleMouseLeave);\n    targetEl[method]('wheel', handle);\n  }\n\n  function enable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.removeEventListener('wheel', handle);\n      return true;\n    }\n    if (swiper.mousewheel.enabled) return false;\n    events('addEventListener');\n    swiper.mousewheel.enabled = true;\n    return true;\n  }\n  function disable() {\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.addEventListener(event, handle);\n      return true;\n    }\n    if (!swiper.mousewheel.enabled) return false;\n    events('removeEventListener');\n    swiper.mousewheel.enabled = false;\n    return true;\n  }\n\n  on('init', () => {\n    if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {\n      disable();\n    }\n    if (swiper.params.mousewheel.enabled) enable();\n  });\n  on('destroy', () => {\n    if (swiper.params.cssMode) {\n      enable();\n    }\n    if (swiper.mousewheel.enabled) disable();\n  });\n\n  Object.assign(swiper.mousewheel, {\n    enable,\n    disable,\n  });\n}\n"
  },
  {
    "path": "src/modules/navigation/navigation.css",
    "content": ":root {\n  --swiper-navigation-size: 44px;\n  /*\n  --swiper-navigation-top-offset: 50%;\n  --swiper-navigation-sides-offset: 4px;\n  --swiper-navigation-color: var(--swiper-theme-color);\n  */\n}\n.swiper-button-prev,\n.swiper-button-next {\n  position: absolute;\n\n  width: var(--swiper-navigation-size);\n  height: var(--swiper-navigation-size);\n\n  z-index: 10;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: var(--swiper-navigation-color, var(--swiper-theme-color));\n  &.swiper-button-disabled {\n    opacity: 0.35;\n    cursor: auto;\n    pointer-events: none;\n  }\n  &.swiper-button-hidden {\n    opacity: 0;\n    cursor: auto;\n    pointer-events: none;\n  }\n  .swiper-navigation-disabled & {\n    display: none !important;\n  }\n  svg {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    transform-origin: center;\n    fill: currentColor;\n    pointer-events: none;\n  }\n}\n\n.swiper-button-lock {\n  display: none;\n}\n\n.swiper-button-prev,\n.swiper-button-next {\n  top: var(--swiper-navigation-top-offset, 50%);\n  margin-top: calc(0px - (var(--swiper-navigation-size) / 2));\n}\n.swiper-button-prev {\n  left: var(--swiper-navigation-sides-offset, 4px);\n  right: auto;\n  .swiper-navigation-icon {\n    transform: rotate(180deg);\n  }\n}\n.swiper-button-next {\n  right: var(--swiper-navigation-sides-offset, 4px);\n  left: auto;\n}\n.swiper-horizontal {\n  .swiper-button-prev,\n  .swiper-button-next,\n  ~ .swiper-button-prev,\n  ~ .swiper-button-next {\n    top: var(--swiper-navigation-top-offset, 50%);\n    margin-top: calc(0px - (var(--swiper-navigation-size) / 2));\n    margin-left: 0;\n  }\n  .swiper-button-prev,\n  & ~ .swiper-button-prev,\n  &.swiper-rtl .swiper-button-next,\n  &.swiper-rtl ~ .swiper-button-next {\n    left: var(--swiper-navigation-sides-offset, 4px);\n    right: auto;\n  }\n  .swiper-button-next,\n  & ~ .swiper-button-next,\n  &.swiper-rtl .swiper-button-prev,\n  &.swiper-rtl ~ .swiper-button-prev {\n    right: var(--swiper-navigation-sides-offset, 4px);\n    left: auto;\n  }\n  .swiper-button-prev,\n  & ~ .swiper-button-prev,\n  &.swiper-rtl .swiper-button-next,\n  &.swiper-rtl ~ .swiper-button-next {\n    .swiper-navigation-icon {\n      transform: rotate(180deg);\n    }\n  }\n  &.swiper-rtl .swiper-button-prev,\n  &.swiper-rtl ~ .swiper-button-prev {\n    .swiper-navigation-icon {\n      transform: rotate(0deg);\n    }\n  }\n}\n.swiper-vertical {\n  .swiper-button-prev,\n  .swiper-button-next,\n  ~ .swiper-button-prev,\n  ~ .swiper-button-next {\n    left: var(--swiper-navigation-top-offset, 50%);\n    right: auto;\n    margin-left: calc(0px - (var(--swiper-navigation-size) / 2));\n    margin-top: 0;\n  }\n  .swiper-button-prev,\n  ~ .swiper-button-prev {\n    top: var(--swiper-navigation-sides-offset, 4px);\n    bottom: auto;\n    .swiper-navigation-icon {\n      transform: rotate(-90deg);\n    }\n  }\n  .swiper-button-next,\n  ~ .swiper-button-next {\n    bottom: var(--swiper-navigation-sides-offset, 4px);\n    top: auto;\n    .swiper-navigation-icon {\n      transform: rotate(90deg);\n    }\n  }\n}\n"
  },
  {
    "path": "src/modules/navigation/navigation.mjs",
    "content": "import createElementIfNotDefined from '../../shared/create-element-if-not-defined.mjs';\nimport { makeElementsArray, setInnerHTML } from '../../shared/utils.mjs';\n\nconst arrowSvg = `<svg class=\"swiper-navigation-icon\" width=\"11\" height=\"20\" viewBox=\"0 0 11 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z\" fill=\"currentColor\"/></svg>`;\n\nexport default function Navigation({ swiper, extendParams, on, emit }) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      addIcons: true,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock',\n      navigationDisabledClass: 'swiper-navigation-disabled',\n    },\n  });\n\n  swiper.navigation = {\n    nextEl: null,\n    prevEl: null,\n    arrowSvg,\n  };\n\n  function getEl(el) {\n    let res;\n    if (el && typeof el === 'string' && swiper.isElement) {\n      res = swiper.el.querySelector(el) || swiper.hostEl.querySelector(el);\n      if (res) return res;\n    }\n    if (el) {\n      if (typeof el === 'string') res = [...document.querySelectorAll(el)];\n      if (\n        swiper.params.uniqueNavElements &&\n        typeof el === 'string' &&\n        res &&\n        res.length > 1 &&\n        swiper.el.querySelectorAll(el).length === 1\n      ) {\n        res = swiper.el.querySelector(el);\n      } else if (res && res.length === 1) {\n        res = res[0];\n      }\n    }\n    if (el && !res) return el;\n    // if (Array.isArray(res) && res.length === 1) res = res[0];\n    return res;\n  }\n\n  function toggleEl(el, disabled) {\n    const params = swiper.params.navigation;\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      if (subEl) {\n        subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));\n        if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;\n        if (swiper.params.watchOverflow && swiper.enabled) {\n          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n        }\n      }\n    });\n  }\n  function update() {\n    // Update Navigation Buttons\n    const { nextEl, prevEl } = swiper.navigation;\n    if (swiper.params.loop) {\n      toggleEl(prevEl, false);\n      toggleEl(nextEl, false);\n      return;\n    }\n\n    toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);\n    toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);\n  }\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slidePrev();\n    emit('navigationPrev');\n  }\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;\n    swiper.slideNext();\n    emit('navigationNext');\n  }\n  function init() {\n    const params = swiper.params.navigation;\n\n    swiper.params.navigation = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.navigation,\n      swiper.params.navigation,\n      {\n        nextEl: 'swiper-button-next',\n        prevEl: 'swiper-button-prev',\n      },\n    );\n    if (!(params.nextEl || params.prevEl)) return;\n\n    let nextEl = getEl(params.nextEl);\n    let prevEl = getEl(params.prevEl);\n    Object.assign(swiper.navigation, {\n      nextEl,\n      prevEl,\n    });\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n\n    const initButton = (el, dir) => {\n      if (el) {\n        if (\n          params.addIcons &&\n          el.matches('.swiper-button-next,.swiper-button-prev') &&\n          !el.querySelector('svg')\n        ) {\n          const tempEl = document.createElement('div');\n          setInnerHTML(tempEl, arrowSvg);\n          el.appendChild(tempEl.querySelector('svg'));\n          tempEl.remove();\n        }\n        el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      }\n      if (!swiper.enabled && el) {\n        el.classList.add(...params.lockClass.split(' '));\n      }\n    };\n\n    nextEl.forEach((el) => initButton(el, 'next'));\n    prevEl.forEach((el) => initButton(el, 'prev'));\n  }\n  function destroy() {\n    let { nextEl, prevEl } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const destroyButton = (el, dir) => {\n      el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);\n      el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));\n    };\n    nextEl.forEach((el) => destroyButton(el, 'next'));\n    prevEl.forEach((el) => destroyButton(el, 'prev'));\n  }\n\n  on('init', () => {\n    if (swiper.params.navigation.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      update();\n    }\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    let { nextEl, prevEl } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    if (swiper.enabled) {\n      update();\n      return;\n    }\n    [...nextEl, ...prevEl]\n      .filter((el) => !!el)\n      .forEach((el) => el.classList.add(swiper.params.navigation.lockClass));\n  });\n  on('click', (_s, e) => {\n    let { nextEl, prevEl } = swiper.navigation;\n    nextEl = makeElementsArray(nextEl);\n    prevEl = makeElementsArray(prevEl);\n    const targetEl = e.target;\n    let targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl);\n\n    if (swiper.isElement && !targetIsButton) {\n      const path = e.path || (e.composedPath && e.composedPath());\n      if (path) {\n        targetIsButton = path.find((pathEl) => nextEl.includes(pathEl) || prevEl.includes(pathEl));\n      }\n    }\n    if (swiper.params.navigation.hideOnClick && !targetIsButton) {\n      if (\n        swiper.pagination &&\n        swiper.params.pagination &&\n        swiper.params.pagination.clickable &&\n        (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))\n      )\n        return;\n      let isHidden;\n      if (nextEl.length) {\n        isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      } else if (prevEl.length) {\n        isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);\n      }\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n      [...nextEl, ...prevEl]\n        .filter((el) => !!el)\n        .forEach((el) => el.classList.toggle(swiper.params.navigation.hiddenClass));\n    }\n  });\n\n  const enable = () => {\n    swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    init();\n    update();\n  };\n\n  const disable = () => {\n    swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));\n    destroy();\n  };\n\n  Object.assign(swiper.navigation, {\n    enable,\n    disable,\n    update,\n    init,\n    destroy,\n  });\n}\n"
  },
  {
    "path": "src/modules/pagination/pagination.css",
    "content": ":root {\n  /*\n  --swiper-pagination-color: var(--swiper-theme-color);\n  --swiper-pagination-left: auto;\n  --swiper-pagination-right: 8px;\n  --swiper-pagination-bottom: 8px;\n  --swiper-pagination-top: auto;\n  --swiper-pagination-fraction-color: inherit;\n  --swiper-pagination-progressbar-bg-color: rgba(0,0,0,0.25);\n  --swiper-pagination-progressbar-size: 4px;\n  --swiper-pagination-bullet-size: 8px;\n  --swiper-pagination-bullet-width: 8px;\n  --swiper-pagination-bullet-height: 8px;\n  --swiper-pagination-bullet-border-radius: 50%;\n  --swiper-pagination-bullet-inactive-color: #000;\n  --swiper-pagination-bullet-inactive-opacity: 0.2;\n  --swiper-pagination-bullet-opacity: 1;\n  --swiper-pagination-bullet-horizontal-gap: 4px;\n  --swiper-pagination-bullet-vertical-gap: 6px;\n  */\n}\n.swiper-pagination {\n  position: absolute;\n  text-align: center;\n  transition: 300ms opacity;\n  transform: translate3d(0, 0, 0);\n  z-index: 10;\n  &.swiper-pagination-hidden {\n    opacity: 0;\n  }\n  .swiper-pagination-disabled > &,\n  &.swiper-pagination-disabled {\n    display: none !important;\n  }\n}\n/* Common Styles */\n.swiper-pagination-fraction,\n.swiper-pagination-custom,\n.swiper-horizontal > .swiper-pagination-bullets,\n.swiper-pagination-bullets.swiper-pagination-horizontal {\n  bottom: var(--swiper-pagination-bottom, 8px);\n  top: var(--swiper-pagination-top, auto);\n  left: 0;\n  width: 100%;\n}\n/* Bullets */\n.swiper-pagination-bullets-dynamic {\n  overflow: hidden;\n  font-size: 0;\n  .swiper-pagination-bullet {\n    transform: scale(0.33);\n    position: relative;\n  }\n  .swiper-pagination-bullet-active {\n    transform: scale(1);\n  }\n  .swiper-pagination-bullet-active-main {\n    transform: scale(1);\n  }\n  .swiper-pagination-bullet-active-prev {\n    transform: scale(0.66);\n  }\n  .swiper-pagination-bullet-active-prev-prev {\n    transform: scale(0.33);\n  }\n  .swiper-pagination-bullet-active-next {\n    transform: scale(0.66);\n  }\n  .swiper-pagination-bullet-active-next-next {\n    transform: scale(0.33);\n  }\n}\n.swiper-pagination-bullet {\n  width: var(--swiper-pagination-bullet-width, var(--swiper-pagination-bullet-size, 8px));\n  height: var(--swiper-pagination-bullet-height, var(--swiper-pagination-bullet-size, 8px));\n  display: inline-block;\n  border-radius: var(--swiper-pagination-bullet-border-radius, 50%);\n  background: var(--swiper-pagination-bullet-inactive-color, #000);\n  opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2);\n  button& {\n    border: none;\n    margin: 0;\n    padding: 0;\n    box-shadow: none;\n    appearance: none;\n  }\n  .swiper-pagination-clickable & {\n    cursor: pointer;\n  }\n\n  &:only-child {\n    display: none !important;\n  }\n}\n.swiper-pagination-bullet-active {\n  opacity: var(--swiper-pagination-bullet-opacity, 1);\n  background: var(--swiper-pagination-color, var(--swiper-theme-color));\n}\n\n.swiper-vertical > .swiper-pagination-bullets,\n.swiper-pagination-vertical.swiper-pagination-bullets {\n  right: var(--swiper-pagination-right, 8px);\n  left: var(--swiper-pagination-left, auto);\n  top: 50%;\n  transform: translate3d(0px, -50%, 0);\n  .swiper-pagination-bullet {\n    margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0;\n    display: block;\n  }\n  &.swiper-pagination-bullets-dynamic {\n    top: 50%;\n    transform: translateY(-50%);\n    width: 8px;\n    .swiper-pagination-bullet {\n      display: inline-block;\n      transition:\n        200ms transform,\n        200ms top;\n    }\n  }\n}\n.swiper-horizontal > .swiper-pagination-bullets,\n.swiper-pagination-horizontal.swiper-pagination-bullets {\n  .swiper-pagination-bullet {\n    margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px);\n  }\n  &.swiper-pagination-bullets-dynamic {\n    left: 50%;\n    transform: translateX(-50%);\n    white-space: nowrap;\n    .swiper-pagination-bullet {\n      transition:\n        200ms transform,\n        200ms left;\n    }\n  }\n}\n.swiper-horizontal.swiper-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet {\n  transition:\n    200ms transform,\n    200ms right;\n}\n/* Fraction */\n.swiper-pagination-fraction {\n  color: var(--swiper-pagination-fraction-color, inherit);\n}\n/* Progress */\n.swiper-pagination-progressbar {\n  background: var(--swiper-pagination-progressbar-bg-color, rgba(0, 0, 0, 0.25));\n  position: absolute;\n  .swiper-pagination-progressbar-fill {\n    background: var(--swiper-pagination-color, var(--swiper-theme-color));\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    transform: scale(0);\n    transform-origin: left top;\n  }\n  .swiper-rtl & .swiper-pagination-progressbar-fill {\n    transform-origin: right top;\n  }\n  .swiper-horizontal > &,\n  &.swiper-pagination-horizontal,\n  .swiper-vertical > &.swiper-pagination-progressbar-opposite,\n  &.swiper-pagination-vertical.swiper-pagination-progressbar-opposite {\n    width: 100%;\n    height: var(--swiper-pagination-progressbar-size, 4px);\n    left: 0;\n    top: 0;\n  }\n  .swiper-vertical > &,\n  &.swiper-pagination-vertical,\n  .swiper-horizontal > &.swiper-pagination-progressbar-opposite,\n  &.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite {\n    width: var(--swiper-pagination-progressbar-size, 4px);\n    height: 100%;\n    left: 0;\n    top: 0;\n  }\n}\n.swiper-pagination-lock {\n  display: none;\n}\n"
  },
  {
    "path": "src/modules/pagination/pagination.mjs",
    "content": "import classesToSelector from '../../shared/classes-to-selector.mjs';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.mjs';\nimport {\n  elementIndex,\n  elementOuterSize,\n  elementParents,\n  makeElementsArray,\n  setInnerHTML,\n} from '../../shared/utils.mjs';\n\nexport default function Pagination({ swiper, extendParams, on, emit }) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: (number) => number,\n      formatFractionTotal: (number) => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`,\n      paginationDisabledClass: `${pfx}-disabled`,\n    },\n  });\n\n  swiper.pagination = {\n    el: null,\n    bullets: [],\n  };\n\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return (\n      !swiper.params.pagination.el ||\n      !swiper.pagination.el ||\n      (Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0)\n    );\n  }\n\n  function setSideBullets(bulletEl, position) {\n    const { bulletActiveClass } = swiper.params.pagination;\n    if (!bulletEl) return;\n    bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n    if (bulletEl) {\n      bulletEl.classList.add(`${bulletActiveClass}-${position}`);\n      bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];\n      if (bulletEl) {\n        bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);\n      }\n    }\n  }\n\n  function getMoveDirection(prevIndex, nextIndex, length) {\n    prevIndex = prevIndex % length;\n    nextIndex = nextIndex % length;\n    if (nextIndex === prevIndex + 1) {\n      return 'next';\n    } else if (nextIndex === prevIndex - 1) {\n      return 'previous';\n    }\n    return;\n  }\n  function onBulletClick(e) {\n    const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));\n    if (!bulletEl) {\n      return;\n    }\n    e.preventDefault();\n    const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;\n    if (swiper.params.loop) {\n      if (swiper.realIndex === index) return;\n      const moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length);\n      if (moveDirection === 'next') {\n        swiper.slideNext();\n      } else if (moveDirection === 'previous') {\n        swiper.slidePrev();\n      } else {\n        swiper.slideToLoop(index);\n      }\n    } else {\n      swiper.slideTo(index);\n    }\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n\n    let el = swiper.pagination.el;\n    el = makeElementsArray(el);\n    // Current/Total\n    let current;\n    let previousIndex;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : swiper.slides.length;\n    const total = swiper.params.loop\n      ? Math.ceil(slidesLength / swiper.params.slidesPerGroup)\n      : swiper.snapGrid.length;\n    if (swiper.params.loop) {\n      previousIndex = swiper.previousRealIndex || 0;\n      current =\n        swiper.params.slidesPerGroup > 1\n          ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup)\n          : swiper.realIndex;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n      previousIndex = swiper.previousSnapIndex;\n    } else {\n      previousIndex = swiper.previousIndex || 0;\n      current = swiper.activeIndex || 0;\n    }\n    // Types\n    if (\n      params.type === 'bullets' &&\n      swiper.pagination.bullets &&\n      swiper.pagination.bullets.length > 0\n    ) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n      if (params.dynamicBullets) {\n        bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);\n        el.forEach((subEl) => {\n          subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${\n            bulletSize * (params.dynamicMainBullets + 4)\n          }px`;\n        });\n        if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {\n          dynamicBulletIndex += current - (previousIndex || 0);\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n        firstIndex = Math.max(current - dynamicBulletIndex, 0);\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n      bullets.forEach((bulletEl) => {\n        const classesToRemove = [\n          ...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(\n            (suffix) => `${params.bulletActiveClass}${suffix}`,\n          ),\n        ]\n          .map((s) => (typeof s === 'string' && s.includes(' ') ? s.split(' ') : s))\n          .flat();\n        bulletEl.classList.remove(...classesToRemove);\n      });\n\n      if (el.length > 1) {\n        bullets.forEach((bullet) => {\n          const bulletIndex = elementIndex(bullet);\n          if (bulletIndex === current) {\n            bullet.classList.add(...params.bulletActiveClass.split(' '));\n          } else if (swiper.isElement) {\n            bullet.setAttribute('part', 'bullet');\n          }\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n            }\n            if (bulletIndex === firstIndex) {\n              setSideBullets(bullet, 'prev');\n            }\n            if (bulletIndex === lastIndex) {\n              setSideBullets(bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const bullet = bullets[current];\n        if (bullet) {\n          bullet.classList.add(...params.bulletActiveClass.split(' '));\n        }\n        if (swiper.isElement) {\n          bullets.forEach((bulletEl, bulletIndex) => {\n            bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');\n          });\n        }\n        if (params.dynamicBullets) {\n          const firstDisplayedBullet = bullets[firstIndex];\n          const lastDisplayedBullet = bullets[lastIndex];\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            if (bullets[i]) {\n              bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));\n            }\n          }\n\n          setSideBullets(firstDisplayedBullet, 'prev');\n          setSideBullets(lastDisplayedBullet, 'next');\n        }\n      }\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset =\n          (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.forEach((bullet) => {\n          bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;\n        });\n      }\n    }\n    el.forEach((subEl, subElIndex) => {\n      if (params.type === 'fraction') {\n        subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach((fractionEl) => {\n          fractionEl.textContent = params.formatFractionCurrent(current + 1);\n        });\n        subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach((totalEl) => {\n          totalEl.textContent = params.formatFractionTotal(total);\n        });\n      }\n      if (params.type === 'progressbar') {\n        let progressbarDirection;\n        if (params.progressbarOpposite) {\n          progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n        } else {\n          progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n        }\n        const scale = (current + 1) / total;\n        let scaleX = 1;\n        let scaleY = 1;\n        if (progressbarDirection === 'horizontal') {\n          scaleX = scale;\n        } else {\n          scaleY = scale;\n        }\n        subEl\n          .querySelectorAll(classesToSelector(params.progressbarFillClass))\n          .forEach((progressEl) => {\n            progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;\n            progressEl.style.transitionDuration = `${swiper.params.speed}ms`;\n          });\n      }\n      if (params.type === 'custom' && params.renderCustom) {\n        setInnerHTML(subEl, params.renderCustom(swiper, current + 1, total));\n        if (subElIndex === 0) emit('paginationRender', subEl);\n      } else {\n        if (subElIndex === 0) emit('paginationRender', subEl);\n        emit('paginationUpdate', subEl);\n      }\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);\n      }\n    });\n  }\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength =\n      swiper.virtual && swiper.params.virtual.enabled\n        ? swiper.virtual.slides.length\n        : swiper.grid && swiper.params.grid.rows > 1\n        ? swiper.slides.length / Math.ceil(swiper.params.grid.rows)\n        : swiper.slides.length;\n\n    let el = swiper.pagination.el;\n    el = makeElementsArray(el);\n    let paginationHTML = '';\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop\n        ? Math.ceil(slidesLength / swiper.params.slidesPerGroup)\n        : swiper.snapGrid.length;\n      if (\n        swiper.params.freeMode &&\n        swiper.params.freeMode.enabled &&\n        numberOfBullets > slidesLength\n      ) {\n        numberOfBullets = slidesLength;\n      }\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          // prettier-ignore\n          paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part=\"bullet\"' : ''} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n    }\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML =\n          `<span class=\"${params.currentClass}\"></span>` +\n          ' / ' +\n          `<span class=\"${params.totalClass}\"></span>`;\n      }\n    }\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n    }\n    swiper.pagination.bullets = [];\n    el.forEach((subEl) => {\n      if (params.type !== 'custom') {\n        setInnerHTML(subEl, paginationHTML || '');\n      }\n      if (params.type === 'bullets') {\n        swiper.pagination.bullets.push(\n          ...subEl.querySelectorAll(classesToSelector(params.bulletClass)),\n        );\n      }\n    });\n    if (params.type !== 'custom') {\n      emit('paginationRender', el[0]);\n    }\n  }\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.pagination,\n      swiper.params.pagination,\n      { el: 'swiper-pagination' },\n    );\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let el;\n    if (typeof params.el === 'string' && swiper.isElement) {\n      el = swiper.el.querySelector(params.el);\n    }\n    if (!el && typeof params.el === 'string') {\n      el = [...document.querySelectorAll(params.el)];\n    }\n    if (!el) {\n      el = params.el;\n    }\n    if (!el || el.length === 0) return;\n\n    if (\n      swiper.params.uniqueNavElements &&\n      typeof params.el === 'string' &&\n      Array.isArray(el) &&\n      el.length > 1\n    ) {\n      el = [...swiper.el.querySelectorAll(params.el)];\n      // check if it belongs to another nested Swiper\n      if (el.length > 1) {\n        el = el.find((subEl) => {\n          if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n    if (Array.isArray(el) && el.length === 1) el = el[0];\n\n    Object.assign(swiper.pagination, {\n      el,\n    });\n\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      if (params.type === 'bullets' && params.clickable) {\n        subEl.classList.add(...(params.clickableClass || '').split(' '));\n      }\n\n      subEl.classList.add(params.modifierClass + params.type);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n\n      if (params.type === 'bullets' && params.dynamicBullets) {\n        subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);\n        dynamicBulletIndex = 0;\n        if (params.dynamicMainBullets < 1) {\n          params.dynamicMainBullets = 1;\n        }\n      }\n      if (params.type === 'progressbar' && params.progressbarOpposite) {\n        subEl.classList.add(params.progressbarOppositeClass);\n      }\n\n      if (params.clickable) {\n        subEl.addEventListener('click', onBulletClick);\n      }\n\n      if (!swiper.enabled) {\n        subEl.classList.add(params.lockClass);\n      }\n    });\n  }\n\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    let el = swiper.pagination.el;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach((subEl) => {\n        subEl.classList.remove(params.hiddenClass);\n        subEl.classList.remove(params.modifierClass + params.type);\n        subEl.classList.remove(\n          swiper.isHorizontal() ? params.horizontalClass : params.verticalClass,\n        );\n        if (params.clickable) {\n          subEl.classList.remove(...(params.clickableClass || '').split(' '));\n          subEl.removeEventListener('click', onBulletClick);\n        }\n      });\n    }\n\n    if (swiper.pagination.bullets)\n      swiper.pagination.bullets.forEach((subEl) =>\n        subEl.classList.remove(...params.bulletActiveClass.split(' ')),\n      );\n  }\n\n  on('changeDirection', () => {\n    if (!swiper.pagination || !swiper.pagination.el) return;\n    const params = swiper.params.pagination;\n    let { el } = swiper.pagination;\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.classList.remove(params.horizontalClass, params.verticalClass);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    });\n  });\n\n  on('init', () => {\n    if (swiper.params.pagination.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      render();\n      update();\n    }\n  });\n  on('activeIndexChange', () => {\n    if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    update();\n  });\n  on('snapGridLengthChange', () => {\n    render();\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    let { el } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach((subEl) =>\n        subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass),\n      );\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const el = makeElementsArray(swiper.pagination.el);\n    if (\n      swiper.params.pagination.el &&\n      swiper.params.pagination.hideOnClick &&\n      el &&\n      el.length > 0 &&\n      !targetEl.classList.contains(swiper.params.pagination.bulletClass)\n    ) {\n      if (\n        swiper.navigation &&\n        ((swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) ||\n          (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))\n      )\n        return;\n      const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n      el.forEach((subEl) => subEl.classList.toggle(swiper.params.pagination.hiddenClass));\n    }\n  });\n\n  const enable = () => {\n    swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);\n    let { el } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach((subEl) =>\n        subEl.classList.remove(swiper.params.pagination.paginationDisabledClass),\n      );\n    }\n    init();\n    render();\n    update();\n  };\n\n  const disable = () => {\n    swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);\n    let { el } = swiper.pagination;\n    if (el) {\n      el = makeElementsArray(el);\n      el.forEach((subEl) => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));\n    }\n    destroy();\n  };\n\n  Object.assign(swiper.pagination, {\n    enable,\n    disable,\n    render,\n    update,\n    init,\n    destroy,\n  });\n}\n"
  },
  {
    "path": "src/modules/parallax/parallax.css",
    "content": ""
  },
  {
    "path": "src/modules/parallax/parallax.mjs",
    "content": "import { elementChildren } from '../../shared/utils.mjs';\n\nexport default function Parallax({ swiper, extendParams, on }) {\n  extendParams({\n    parallax: {\n      enabled: false,\n    },\n  });\n  const elementsSelector =\n    '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';\n\n  const setTransform = (el, progress) => {\n    const { rtl } = swiper;\n\n    const rtlFactor = rtl ? -1 : 1;\n\n    const p = el.getAttribute('data-swiper-parallax') || '0';\n    let x = el.getAttribute('data-swiper-parallax-x');\n    let y = el.getAttribute('data-swiper-parallax-y');\n    const scale = el.getAttribute('data-swiper-parallax-scale');\n    const opacity = el.getAttribute('data-swiper-parallax-opacity');\n    const rotate = el.getAttribute('data-swiper-parallax-rotate');\n\n    if (x || y) {\n      x = x || '0';\n      y = y || '0';\n    } else if (swiper.isHorizontal()) {\n      x = p;\n      y = '0';\n    } else {\n      y = p;\n      x = '0';\n    }\n\n    if (x.indexOf('%') >= 0) {\n      x = `${parseInt(x, 10) * progress * rtlFactor}%`;\n    } else {\n      x = `${x * progress * rtlFactor}px`;\n    }\n    if (y.indexOf('%') >= 0) {\n      y = `${parseInt(y, 10) * progress}%`;\n    } else {\n      y = `${y * progress}px`;\n    }\n\n    if (typeof opacity !== 'undefined' && opacity !== null) {\n      const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));\n      el.style.opacity = currentOpacity;\n    }\n    let transform = `translate3d(${x}, ${y}, 0px)`;\n    if (typeof scale !== 'undefined' && scale !== null) {\n      const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));\n      transform += ` scale(${currentScale})`;\n    }\n    if (rotate && typeof rotate !== 'undefined' && rotate !== null) {\n      const currentRotate = rotate * progress * -1;\n      transform += ` rotate(${currentRotate}deg)`;\n    }\n    el.style.transform = transform;\n  };\n\n  const setTranslate = () => {\n    const { el, slides, progress, snapGrid, isElement } = swiper;\n    const elements = elementChildren(el, elementsSelector);\n    if (swiper.isElement) {\n      elements.push(...elementChildren(swiper.hostEl, elementsSelector));\n    }\n    elements.forEach((subEl) => {\n      setTransform(subEl, progress);\n    });\n\n    slides.forEach((slideEl, slideIndex) => {\n      let slideProgress = slideEl.progress;\n      if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {\n        slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);\n      }\n      slideProgress = Math.min(Math.max(slideProgress, -1), 1);\n      slideEl\n        .querySelectorAll(`${elementsSelector}, [data-swiper-parallax-rotate]`)\n        .forEach((subEl) => {\n          setTransform(subEl, slideProgress);\n        });\n    });\n  };\n\n  const setTransition = (duration = swiper.params.speed) => {\n    const { el, hostEl } = swiper;\n    const elements = [...el.querySelectorAll(elementsSelector)];\n    if (swiper.isElement) {\n      elements.push(...hostEl.querySelectorAll(elementsSelector));\n    }\n    elements.forEach((parallaxEl) => {\n      let parallaxDuration =\n        parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;\n      if (duration === 0) parallaxDuration = 0;\n      parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;\n    });\n  };\n\n  on('beforeInit', () => {\n    if (!swiper.params.parallax.enabled) return;\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n  });\n  on('init', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.parallax.enabled) return;\n    setTranslate();\n  });\n  on('setTransition', (_swiper, duration) => {\n    if (!swiper.params.parallax.enabled) return;\n    setTransition(duration);\n  });\n}\n"
  },
  {
    "path": "src/modules/scrollbar/scrollbar.css",
    "content": ":root {\n  /*\n  --swiper-scrollbar-border-radius: 10px;\n  --swiper-scrollbar-top: auto;\n  --swiper-scrollbar-bottom: 4px;\n  --swiper-scrollbar-left: auto;\n  --swiper-scrollbar-right: 4px;\n  --swiper-scrollbar-sides-offset: 1%;\n  --swiper-scrollbar-bg-color: rgba(0, 0, 0, 0.1);\n  --swiper-scrollbar-drag-bg-color: rgba(0, 0, 0, 0.5);\n  --swiper-scrollbar-size: 4px;\n  */\n}\n.swiper-scrollbar {\n  border-radius: var(--swiper-scrollbar-border-radius, 10px);\n  position: relative;\n  -ms-touch-action: none;\n  touch-action: none;\n  background: var(--swiper-scrollbar-bg-color, rgba(0, 0, 0, 0.1));\n  .swiper-scrollbar-disabled > &,\n  &.swiper-scrollbar-disabled {\n    display: none !important;\n  }\n  .swiper-horizontal > &,\n  &.swiper-scrollbar-horizontal {\n    position: absolute;\n    left: var(--swiper-scrollbar-sides-offset, 1%);\n    bottom: var(--swiper-scrollbar-bottom, 4px);\n    top: var(--swiper-scrollbar-top, auto);\n    z-index: 50;\n    height: var(--swiper-scrollbar-size, 4px);\n    width: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));\n  }\n  .swiper-vertical > &,\n  &.swiper-scrollbar-vertical {\n    position: absolute;\n    left: var(--swiper-scrollbar-left, auto);\n    right: var(--swiper-scrollbar-right, 4px);\n    top: var(--swiper-scrollbar-sides-offset, 1%);\n    z-index: 50;\n    width: var(--swiper-scrollbar-size, 4px);\n    height: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));\n  }\n}\n.swiper-scrollbar-drag {\n  height: 100%;\n  width: 100%;\n  position: relative;\n  background: var(--swiper-scrollbar-drag-bg-color, rgba(0, 0, 0, 0.5));\n  border-radius: var(--swiper-scrollbar-border-radius, 10px);\n  left: 0;\n  top: 0;\n}\n.swiper-scrollbar-cursor-drag {\n  cursor: move;\n}\n.swiper-scrollbar-lock {\n  display: none;\n}\n"
  },
  {
    "path": "src/modules/scrollbar/scrollbar.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport { createElement, elementOffset, makeElementsArray, nextTick } from '../../shared/utils.mjs';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.mjs';\nimport classesToSelector from '../../shared/classes-to-selector.mjs';\nimport classesToTokens from '../../shared/classes-to-tokens.mjs';\n\nexport default function Scrollbar({ swiper, extendParams, on, emit }) {\n  const document = getDocument();\n\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag',\n      scrollbarDisabledClass: 'swiper-scrollbar-disabled',\n      horizontalClass: `swiper-scrollbar-horizontal`,\n      verticalClass: `swiper-scrollbar-vertical`,\n    },\n  });\n\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null,\n  };\n\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const { scrollbar, rtlTranslate: rtl } = swiper;\n    const { dragEl, el } = scrollbar;\n    const params = swiper.params.scrollbar;\n    const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;\n\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n    if (rtl) {\n      newPos = -newPos;\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n    if (swiper.isHorizontal()) {\n      dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;\n      dragEl.style.width = `${newSize}px`;\n    } else {\n      dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;\n      dragEl.style.height = `${newSize}px`;\n    }\n    if (params.hide) {\n      clearTimeout(timeout);\n      el.style.opacity = 1;\n      timeout = setTimeout(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n  }\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;\n  }\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n\n    const { scrollbar } = swiper;\n    const { dragEl, el } = scrollbar;\n\n    dragEl.style.width = '';\n    dragEl.style.height = '';\n    trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;\n\n    divider =\n      swiper.size /\n      (swiper.virtualSize +\n        swiper.params.slidesOffsetBefore -\n        (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n\n    if (swiper.isHorizontal()) {\n      dragEl.style.width = `${dragSize}px`;\n    } else {\n      dragEl.style.height = `${dragSize}px`;\n    }\n\n    if (divider >= 1) {\n      el.style.display = 'none';\n    } else {\n      el.style.display = '';\n    }\n    if (swiper.params.scrollbar.hide) {\n      el.style.opacity = 0;\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);\n    }\n  }\n  function getPointerPosition(e) {\n    return swiper.isHorizontal() ? e.clientX : e.clientY;\n  }\n  function setDragPosition(e) {\n    const { scrollbar, rtlTranslate: rtl } = swiper;\n    const { el } = scrollbar;\n\n    let positionRatio;\n    positionRatio =\n      (getPointerPosition(e) -\n        elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] -\n        (dragStartPos !== null ? dragStartPos : dragSize / 2)) /\n      (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n\n    const position =\n      swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const { scrollbar, wrapperEl } = swiper;\n    const { el, dragEl } = scrollbar;\n    isTouched = true;\n    dragStartPos =\n      e.target === dragEl\n        ? getPointerPosition(e) -\n          e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top']\n        : null;\n    e.preventDefault();\n    e.stopPropagation();\n\n    wrapperEl.style.transitionDuration = '100ms';\n    dragEl.style.transitionDuration = '100ms';\n    setDragPosition(e);\n\n    clearTimeout(dragTimeout);\n\n    el.style.transitionDuration = '0ms';\n    if (params.hide) {\n      el.style.opacity = 1;\n    }\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = 'none';\n    }\n    emit('scrollbarDragStart', e);\n  }\n  function onDragMove(e) {\n    const { scrollbar, wrapperEl } = swiper;\n    const { el, dragEl } = scrollbar;\n\n    if (!isTouched) return;\n    if (e.preventDefault && e.cancelable) e.preventDefault();\n    else e.returnValue = false;\n    setDragPosition(e);\n    wrapperEl.style.transitionDuration = '0ms';\n    el.style.transitionDuration = '0ms';\n    dragEl.style.transitionDuration = '0ms';\n    emit('scrollbarDragMove', e);\n  }\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const { scrollbar, wrapperEl } = swiper;\n    const { el } = scrollbar;\n\n    if (!isTouched) return;\n    isTouched = false;\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style['scroll-snap-type'] = '';\n      wrapperEl.style.transitionDuration = '';\n    }\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        el.style.opacity = 0;\n        el.style.transitionDuration = '400ms';\n      }, 1000);\n    }\n    emit('scrollbarDragEnd', e);\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n\n  function events(method) {\n    const { scrollbar, params } = swiper;\n    const el = scrollbar.el;\n    if (!el) return;\n    const target = el;\n    const activeListener = params.passiveListeners ? { passive: false, capture: false } : false;\n    const passiveListener = params.passiveListeners ? { passive: true, capture: false } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n    target[eventMethod]('pointerdown', onDragStart, activeListener);\n    document[eventMethod]('pointermove', onDragMove, activeListener);\n    document[eventMethod]('pointerup', onDragEnd, passiveListener);\n  }\n\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('on');\n  }\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    events('off');\n  }\n  function init() {\n    const { scrollbar, el: swiperEl } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(\n      swiper,\n      swiper.originalParams.scrollbar,\n      swiper.params.scrollbar,\n      { el: 'swiper-scrollbar' },\n    );\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n\n    let el;\n    if (typeof params.el === 'string' && swiper.isElement) {\n      el = swiper.el.querySelector(params.el);\n    }\n    if (!el && typeof params.el === 'string') {\n      el = document.querySelectorAll(params.el);\n      if (!el.length) return;\n    } else if (!el) {\n      el = params.el;\n    }\n\n    if (\n      swiper.params.uniqueNavElements &&\n      typeof params.el === 'string' &&\n      el.length > 1 &&\n      swiperEl.querySelectorAll(params.el).length === 1\n    ) {\n      el = swiperEl.querySelector(params.el);\n    }\n    if (el.length > 0) el = el[0];\n\n    el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n\n    let dragEl;\n    if (el) {\n      dragEl = el.querySelector(classesToSelector(swiper.params.scrollbar.dragClass));\n      if (!dragEl) {\n        dragEl = createElement('div', swiper.params.scrollbar.dragClass);\n        el.append(dragEl);\n      }\n    }\n\n    Object.assign(scrollbar, {\n      el,\n      dragEl,\n    });\n\n    if (params.draggable) {\n      enableDraggable();\n    }\n\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](\n        ...classesToTokens(swiper.params.scrollbar.lockClass),\n      );\n    }\n  }\n  function destroy() {\n    const params = swiper.params.scrollbar;\n    const el = swiper.scrollbar.el;\n    if (el) {\n      el.classList.remove(\n        ...classesToTokens(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass),\n      );\n    }\n\n    disableDraggable();\n  }\n\n  on('changeDirection', () => {\n    if (!swiper.scrollbar || !swiper.scrollbar.el) return;\n    const params = swiper.params.scrollbar;\n    let { el } = swiper.scrollbar;\n    el = makeElementsArray(el);\n    el.forEach((subEl) => {\n      subEl.classList.remove(params.horizontalClass, params.verticalClass);\n      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);\n    });\n  });\n\n  on('init', () => {\n    if (swiper.params.scrollbar.enabled === false) {\n      // eslint-disable-next-line\n      disable();\n    } else {\n      init();\n      updateSize();\n      setTranslate();\n    }\n  });\n  on('update resize observerUpdate lock unlock changeDirection', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const { el } = swiper.scrollbar;\n    if (el) {\n      el.classList[swiper.enabled ? 'remove' : 'add'](\n        ...classesToTokens(swiper.params.scrollbar.lockClass),\n      );\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n\n  const enable = () => {\n    swiper.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.remove(\n        ...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass),\n      );\n    }\n    init();\n    updateSize();\n    setTranslate();\n  };\n\n  const disable = () => {\n    swiper.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));\n    if (swiper.scrollbar.el) {\n      swiper.scrollbar.el.classList.add(\n        ...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass),\n      );\n    }\n    destroy();\n  };\n\n  Object.assign(swiper.scrollbar, {\n    enable,\n    disable,\n    updateSize,\n    setTranslate,\n    init,\n    destroy,\n  });\n}\n"
  },
  {
    "path": "src/modules/thumbs/thumbs.css",
    "content": ".swiper-thumbs {\n  .swiper-slide-thumb-active {\n    /* Styles for active thumb slide */\n  }\n}\n"
  },
  {
    "path": "src/modules/thumbs/thumbs.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport { elementChildren, isObject } from '../../shared/utils.mjs';\n\nexport default function Thumb({ swiper, extendParams, on }) {\n  extendParams({\n    thumbs: {\n      swiper: null,\n      multipleActiveThumbs: true,\n      autoScrollOffset: 0,\n      slideThumbActiveClass: 'swiper-slide-thumb-active',\n      thumbsContainerClass: 'swiper-thumbs',\n    },\n  });\n\n  let initialized = false;\n  let swiperCreated = false;\n\n  swiper.thumbs = {\n    swiper: null,\n  };\n\n  function isVirtualEnabled() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return false;\n\n    return thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled;\n  }\n\n  function onThumbClick() {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n\n    const clickedIndex = thumbsSwiper.clickedIndex;\n    const clickedSlide = thumbsSwiper.clickedSlide;\n    if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass))\n      return;\n    if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;\n    let slideToIndex;\n    if (thumbsSwiper.params.loop) {\n      slideToIndex = parseInt(\n        thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'),\n        10,\n      );\n    } else {\n      slideToIndex = clickedIndex;\n    }\n    if (swiper.params.loop) {\n      swiper.slideToLoop(slideToIndex);\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  }\n\n  function init() {\n    const { thumbs: thumbsParams } = swiper.params;\n    if (initialized) return false;\n    initialized = true;\n    const SwiperClass = swiper.constructor;\n\n    if (thumbsParams.swiper instanceof SwiperClass) {\n      if (thumbsParams.swiper.destroyed) {\n        initialized = false;\n        return false;\n      }\n      swiper.thumbs.swiper = thumbsParams.swiper;\n      Object.assign(swiper.thumbs.swiper.originalParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false,\n      });\n      Object.assign(swiper.thumbs.swiper.params, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false,\n      });\n      swiper.thumbs.swiper.update();\n    } else if (isObject(thumbsParams.swiper)) {\n      const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);\n      Object.assign(thumbsSwiperParams, {\n        watchSlidesProgress: true,\n        slideToClickedSlide: false,\n      });\n      swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);\n      swiperCreated = true;\n    }\n    swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);\n    swiper.thumbs.swiper.on('tap', onThumbClick);\n\n    if (isVirtualEnabled()) {\n      swiper.thumbs.swiper.on('virtualUpdate', () => {\n        update(false, { autoScroll: false });\n      });\n    }\n\n    return true;\n  }\n\n  function update(initial, p) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n\n    // Activate thumbs\n    let thumbsToActivate = 1;\n    const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;\n\n    if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {\n      thumbsToActivate = swiper.params.slidesPerView;\n    }\n\n    if (!swiper.params.thumbs.multipleActiveThumbs) {\n      thumbsToActivate = 1;\n    }\n\n    thumbsToActivate = Math.floor(thumbsToActivate);\n\n    thumbsSwiper.slides.forEach((slideEl) => slideEl.classList.remove(thumbActiveClass));\n    if (thumbsSwiper.params.loop || isVirtualEnabled()) {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        elementChildren(\n          thumbsSwiper.slidesEl,\n          `[data-swiper-slide-index=\"${swiper.realIndex + i}\"]`,\n        ).forEach((slideEl) => {\n          slideEl.classList.add(thumbActiveClass);\n        });\n      }\n    } else {\n      for (let i = 0; i < thumbsToActivate; i += 1) {\n        if (thumbsSwiper.slides[swiper.realIndex + i]) {\n          thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);\n        }\n      }\n    }\n\n    if (p?.autoScroll ?? true) {\n      autoScroll(initial ? 0 : undefined);\n    }\n  }\n\n  function autoScroll(slideSpeed) {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n\n    const slidesPerView =\n      thumbsSwiper.params.slidesPerView === 'auto'\n        ? thumbsSwiper.slidesPerViewDynamic()\n        : thumbsSwiper.params.slidesPerView;\n\n    const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;\n    const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;\n    if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {\n      const currentThumbsIndex = thumbsSwiper.activeIndex;\n      let newThumbsIndex;\n      let direction;\n      if (thumbsSwiper.params.loop) {\n        const newThumbsSlide = thumbsSwiper.slides.find(\n          (slideEl) => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`,\n        );\n        newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);\n\n        direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';\n      } else {\n        newThumbsIndex = swiper.realIndex;\n        direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';\n      }\n      if (useOffset) {\n        newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;\n      }\n\n      if (\n        thumbsSwiper.visibleSlidesIndexes &&\n        thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0\n      ) {\n        if (thumbsSwiper.params.centeredSlides) {\n          if (newThumbsIndex > currentThumbsIndex) {\n            newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;\n          } else {\n            newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;\n          }\n        } else if (\n          newThumbsIndex > currentThumbsIndex &&\n          thumbsSwiper.params.slidesPerGroup === 1\n        ) {\n          // newThumbsIndex = newThumbsIndex - slidesPerView + 1;\n        }\n        thumbsSwiper.slideTo(newThumbsIndex, slideSpeed);\n      }\n    }\n  }\n\n  on('beforeInit', () => {\n    const { thumbs } = swiper.params;\n    if (!thumbs || !thumbs.swiper) return;\n    if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {\n      const document = getDocument();\n      const getThumbsElementAndInit = () => {\n        const thumbsElement =\n          typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;\n        if (thumbsElement && thumbsElement.swiper) {\n          thumbs.swiper = thumbsElement.swiper;\n          init();\n          update(true);\n        } else if (thumbsElement) {\n          const eventName = `${swiper.params.eventsPrefix}init`;\n          const onThumbsSwiper = (e) => {\n            thumbs.swiper = e.detail[0];\n            thumbsElement.removeEventListener(eventName, onThumbsSwiper);\n            init();\n            update(true);\n            thumbs.swiper.update();\n            swiper.update();\n          };\n          thumbsElement.addEventListener(eventName, onThumbsSwiper);\n        }\n        return thumbsElement;\n      };\n\n      const watchForThumbsToAppear = () => {\n        if (swiper.destroyed) return;\n        const thumbsElement = getThumbsElementAndInit();\n        if (!thumbsElement) {\n          requestAnimationFrame(watchForThumbsToAppear);\n        }\n      };\n      requestAnimationFrame(watchForThumbsToAppear);\n    } else {\n      init();\n      update(true);\n    }\n  });\n  on('slideChange update resize observerUpdate', () => {\n    update();\n  });\n  on('setTransition', (_s, duration) => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    thumbsSwiper.setTransition(duration);\n  });\n  on('beforeDestroy', () => {\n    const thumbsSwiper = swiper.thumbs.swiper;\n    if (!thumbsSwiper || thumbsSwiper.destroyed) return;\n    if (swiperCreated) {\n      thumbsSwiper.destroy();\n    }\n  });\n\n  Object.assign(swiper.thumbs, {\n    init,\n    update,\n  });\n}\n"
  },
  {
    "path": "src/modules/virtual/virtual.css",
    "content": ".swiper-virtual .swiper-slide {\n  -webkit-backface-visibility: hidden;\n  transform: translateZ(0);\n}\n.swiper-virtual.swiper-css-mode {\n  .swiper-wrapper::after {\n    content: '';\n    position: absolute;\n    left: 0;\n    top: 0;\n    pointer-events: none;\n  }\n}\n.swiper-virtual.swiper-css-mode.swiper-horizontal {\n  .swiper-wrapper::after {\n    height: 1px;\n    width: var(--swiper-virtual-size);\n  }\n}\n\n.swiper-virtual.swiper-css-mode.swiper-vertical {\n  .swiper-wrapper::after {\n    width: 1px;\n    height: var(--swiper-virtual-size);\n  }\n}\n"
  },
  {
    "path": "src/modules/virtual/virtual.mjs",
    "content": "import { getDocument } from 'ssr-window';\nimport {\n  createElement,\n  elementChildren,\n  setCSSProperty,\n  setInnerHTML,\n} from '../../shared/utils.mjs';\n\nexport default function Virtual({ swiper, extendParams, on, emit }) {\n  extendParams({\n    virtual: {\n      enabled: false,\n      slides: [],\n      cache: true,\n      slidesPerViewAutoSlideSize: 320,\n      renderSlide: null,\n      renderExternal: null,\n      renderExternalUpdate: true,\n      addSlidesBefore: 0,\n      addSlidesAfter: 0,\n    },\n  });\n\n  let cssModeTimeout;\n  const document = getDocument();\n\n  swiper.virtual = {\n    cache: {},\n    from: undefined,\n    to: undefined,\n    slides: [],\n    offset: 0,\n    slidesGrid: [],\n  };\n\n  const tempDOM = document.createElement('div');\n\n  function renderSlide(slide, index) {\n    const params = swiper.params.virtual;\n    if (params.cache && swiper.virtual.cache[index]) {\n      return swiper.virtual.cache[index];\n    }\n    // eslint-disable-next-line\n    let slideEl;\n    if (params.renderSlide) {\n      slideEl = params.renderSlide.call(swiper, slide, index);\n      if (typeof slideEl === 'string') {\n        setInnerHTML(tempDOM, slideEl);\n        slideEl = tempDOM.children[0];\n      }\n    } else if (swiper.isElement) {\n      slideEl = createElement('swiper-slide');\n    } else {\n      slideEl = createElement('div', swiper.params.slideClass);\n    }\n    slideEl.setAttribute('data-swiper-slide-index', index);\n    if (!params.renderSlide) {\n      setInnerHTML(slideEl, slide);\n    }\n\n    if (params.cache) {\n      swiper.virtual.cache[index] = slideEl;\n    }\n    return slideEl;\n  }\n\n  function update(force, beforeInit, forceActiveIndex) {\n    const {\n      slidesPerGroup,\n      centeredSlides,\n      slidesPerView,\n      loop: isLoop,\n      initialSlide,\n    } = swiper.params;\n    if (beforeInit && !isLoop && initialSlide > 0) {\n      return;\n    }\n    const { addSlidesBefore, addSlidesAfter, slidesPerViewAutoSlideSize } = swiper.params.virtual;\n    const {\n      from: previousFrom,\n      to: previousTo,\n      slides,\n      slidesGrid: previousSlidesGrid,\n      offset: previousOffset,\n    } = swiper.virtual;\n    if (!swiper.params.cssMode) {\n      swiper.updateActiveIndex();\n    }\n\n    const activeIndex =\n      typeof forceActiveIndex === 'undefined' ? swiper.activeIndex || 0 : forceActiveIndex;\n\n    let offsetProp;\n    if (swiper.rtlTranslate) offsetProp = 'right';\n    else offsetProp = swiper.isHorizontal() ? 'left' : 'top';\n\n    let slidesPerViewNumeric;\n    if (slidesPerView === 'auto') {\n      if (slidesPerViewAutoSlideSize) {\n        let swiperSize = swiper.size;\n        if (!swiperSize) {\n          swiperSize = swiper.isHorizontal()\n            ? swiper.el.getBoundingClientRect().width\n            : swiper.el.getBoundingClientRect().height;\n        }\n        slidesPerViewNumeric = Math.max(1, Math.ceil(swiperSize / slidesPerViewAutoSlideSize));\n      } else {\n        slidesPerViewNumeric = 1;\n      }\n    } else {\n      slidesPerViewNumeric = slidesPerView;\n    }\n\n    let slidesAfter;\n    let slidesBefore;\n    if (centeredSlides) {\n      slidesAfter = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesAfter;\n      slidesBefore = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesBefore;\n    } else {\n      slidesAfter = slidesPerViewNumeric + (slidesPerGroup - 1) + addSlidesAfter;\n      slidesBefore = (isLoop ? slidesPerViewNumeric : slidesPerGroup) + addSlidesBefore;\n    }\n    let from = activeIndex - slidesBefore;\n    let to = activeIndex + slidesAfter;\n    if (!isLoop) {\n      from = Math.max(from, 0);\n      to = Math.min(to, slides.length - 1);\n    }\n    let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);\n    if (isLoop && activeIndex >= slidesBefore) {\n      from -= slidesBefore;\n      if (!centeredSlides) offset += swiper.slidesGrid[0];\n    } else if (isLoop && activeIndex < slidesBefore) {\n      from = -slidesBefore;\n      if (centeredSlides) offset += swiper.slidesGrid[0];\n    }\n\n    Object.assign(swiper.virtual, {\n      from,\n      to,\n      offset,\n      slidesGrid: swiper.slidesGrid,\n      slidesBefore,\n      slidesAfter,\n    });\n\n    function onRendered() {\n      swiper.updateSlides();\n      swiper.updateProgress();\n      swiper.updateSlidesClasses();\n      emit('virtualUpdate');\n    }\n\n    if (previousFrom === from && previousTo === to && !force) {\n      if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {\n        swiper.slides.forEach((slideEl) => {\n          slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n        });\n      }\n      swiper.updateProgress();\n      emit('virtualUpdate');\n      return;\n    }\n    if (swiper.params.virtual.renderExternal) {\n      swiper.params.virtual.renderExternal.call(swiper, {\n        offset,\n        from,\n        to,\n        slides: (function getSlides() {\n          const slidesToRender = [];\n          for (let i = from; i <= to; i += 1) {\n            slidesToRender.push(slides[i]);\n          }\n          return slidesToRender;\n        })(),\n      });\n      if (swiper.params.virtual.renderExternalUpdate) {\n        onRendered();\n      } else {\n        emit('virtualUpdate');\n      }\n      return;\n    }\n    const prependIndexes = [];\n    const appendIndexes = [];\n\n    const getSlideIndex = (index) => {\n      let slideIndex = index;\n      if (index < 0) {\n        slideIndex = slides.length + index;\n      } else if (slideIndex >= slides.length) {\n        // eslint-disable-next-line\n        slideIndex = slideIndex - slides.length;\n      }\n      return slideIndex;\n    };\n\n    if (force) {\n      swiper.slides\n        .filter((el) => el.matches(`.${swiper.params.slideClass}, swiper-slide`))\n        .forEach((slideEl) => {\n          slideEl.remove();\n        });\n    } else {\n      for (let i = previousFrom; i <= previousTo; i += 1) {\n        if (i < from || i > to) {\n          const slideIndex = getSlideIndex(i);\n          swiper.slides\n            .filter((el) =>\n              el.matches(\n                `.${swiper.params.slideClass}[data-swiper-slide-index=\"${slideIndex}\"], swiper-slide[data-swiper-slide-index=\"${slideIndex}\"]`,\n              ),\n            )\n            .forEach((slideEl) => {\n              slideEl.remove();\n            });\n        }\n      }\n    }\n\n    const loopFrom = isLoop ? -slides.length : 0;\n    const loopTo = isLoop ? slides.length * 2 : slides.length;\n    for (let i = loopFrom; i < loopTo; i += 1) {\n      if (i >= from && i <= to) {\n        const slideIndex = getSlideIndex(i);\n        if (typeof previousTo === 'undefined' || force) {\n          appendIndexes.push(slideIndex);\n        } else {\n          if (i > previousTo) appendIndexes.push(slideIndex);\n          if (i < previousFrom) prependIndexes.push(slideIndex);\n        }\n      }\n    }\n    appendIndexes.forEach((index) => {\n      swiper.slidesEl.append(renderSlide(slides[index], index));\n    });\n    if (isLoop) {\n      for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {\n        const index = prependIndexes[i];\n        swiper.slidesEl.prepend(renderSlide(slides[index], index));\n      }\n    } else {\n      prependIndexes.sort((a, b) => b - a);\n      prependIndexes.forEach((index) => {\n        swiper.slidesEl.prepend(renderSlide(slides[index], index));\n      });\n    }\n    elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach((slideEl) => {\n      slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;\n    });\n    onRendered();\n  }\n\n  function appendSlide(slides) {\n    if (typeof slides === 'object' && 'length' in slides) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.push(slides[i]);\n      }\n    } else {\n      swiper.virtual.slides.push(slides);\n    }\n    update(true);\n  }\n  function prependSlide(slides) {\n    const activeIndex = swiper.activeIndex;\n    let newActiveIndex = activeIndex + 1;\n    let numberOfNewSlides = 1;\n\n    if (Array.isArray(slides)) {\n      for (let i = 0; i < slides.length; i += 1) {\n        if (slides[i]) swiper.virtual.slides.unshift(slides[i]);\n      }\n      newActiveIndex = activeIndex + slides.length;\n      numberOfNewSlides = slides.length;\n    } else {\n      swiper.virtual.slides.unshift(slides);\n    }\n    if (swiper.params.virtual.cache) {\n      const cache = swiper.virtual.cache;\n      const newCache = {};\n      Object.keys(cache).forEach((cachedIndex) => {\n        const cachedEl = cache[cachedIndex];\n        const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');\n        if (cachedElIndex) {\n          cachedEl.setAttribute(\n            'data-swiper-slide-index',\n            parseInt(cachedElIndex, 10) + numberOfNewSlides,\n          );\n        }\n        newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;\n      });\n      swiper.virtual.cache = newCache;\n    }\n    update(true);\n    swiper.slideTo(newActiveIndex, 0);\n  }\n  function removeSlide(slidesIndexes) {\n    if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;\n    let activeIndex = swiper.activeIndex;\n    if (Array.isArray(slidesIndexes)) {\n      for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {\n        if (swiper.params.virtual.cache) {\n          delete swiper.virtual.cache[slidesIndexes[i]];\n          // shift cache indexes\n          Object.keys(swiper.virtual.cache).forEach((key) => {\n            if (key > slidesIndexes) {\n              swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n              swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n              delete swiper.virtual.cache[key];\n            }\n          });\n        }\n        swiper.virtual.slides.splice(slidesIndexes[i], 1);\n\n        if (slidesIndexes[i] < activeIndex) activeIndex -= 1;\n        activeIndex = Math.max(activeIndex, 0);\n      }\n    } else {\n      if (swiper.params.virtual.cache) {\n        delete swiper.virtual.cache[slidesIndexes];\n        // shift cache indexes\n        Object.keys(swiper.virtual.cache).forEach((key) => {\n          if (key > slidesIndexes) {\n            swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];\n            swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);\n            delete swiper.virtual.cache[key];\n          }\n        });\n      }\n      swiper.virtual.slides.splice(slidesIndexes, 1);\n\n      if (slidesIndexes < activeIndex) activeIndex -= 1;\n      activeIndex = Math.max(activeIndex, 0);\n    }\n    update(true);\n    swiper.slideTo(activeIndex, 0);\n  }\n  function removeAllSlides() {\n    swiper.virtual.slides = [];\n    if (swiper.params.virtual.cache) {\n      swiper.virtual.cache = {};\n    }\n    update(true);\n    swiper.slideTo(0, 0);\n  }\n\n  on('beforeInit', () => {\n    if (!swiper.params.virtual.enabled) return;\n    let domSlidesAssigned;\n    if (typeof swiper.passedParams.virtual.slides === 'undefined') {\n      const slides = [...swiper.slidesEl.children].filter((el) =>\n        el.matches(`.${swiper.params.slideClass}, swiper-slide`),\n      );\n      if (slides && slides.length) {\n        swiper.virtual.slides = [...slides];\n        domSlidesAssigned = true;\n        slides.forEach((slideEl, slideIndex) => {\n          slideEl.setAttribute('data-swiper-slide-index', slideIndex);\n          swiper.virtual.cache[slideIndex] = slideEl;\n          slideEl.remove();\n        });\n      }\n    }\n    if (!domSlidesAssigned) {\n      swiper.virtual.slides = swiper.params.virtual.slides;\n    }\n\n    swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);\n\n    swiper.params.watchSlidesProgress = true;\n    swiper.originalParams.watchSlidesProgress = true;\n\n    update(false, true);\n  });\n  on('setTranslate', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode && !swiper._immediateVirtual) {\n      clearTimeout(cssModeTimeout);\n      cssModeTimeout = setTimeout(() => {\n        update();\n      }, 100);\n    } else {\n      update();\n    }\n  });\n  on('init update resize', () => {\n    if (!swiper.params.virtual.enabled) return;\n    if (swiper.params.cssMode) {\n      setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);\n    }\n  });\n\n  Object.assign(swiper.virtual, {\n    appendSlide,\n    prependSlide,\n    removeSlide,\n    removeAllSlides,\n    update,\n  });\n}\n"
  },
  {
    "path": "src/modules/zoom/zoom.css",
    "content": "/* Zoom container styles start */\n.swiper-zoom-container {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  text-align: center;\n\n  > img,\n  > svg,\n  > canvas {\n    max-width: 100%;\n    max-height: 100%;\n    object-fit: contain;\n  }\n}\n/* Zoom container styles end */\n\n.swiper-slide-zoomed {\n  cursor: move;\n  touch-action: none;\n}\n"
  },
  {
    "path": "src/modules/zoom/zoom.mjs",
    "content": "import { getWindow } from 'ssr-window';\nimport {\n  elementChildren,\n  elementOffset,\n  elementParents,\n  getTranslate,\n} from '../../shared/utils.mjs';\n\nexport default function Zoom({ swiper, extendParams, on, emit }) {\n  const window = getWindow();\n  extendParams({\n    zoom: {\n      enabled: false,\n      limitToOriginalSize: false,\n      maxRatio: 3,\n      minRatio: 1,\n      panOnMouseMove: false,\n      toggle: true,\n      containerClass: 'swiper-zoom-container',\n      zoomedSlideClass: 'swiper-slide-zoomed',\n    },\n  });\n\n  swiper.zoom = {\n    enabled: false,\n  };\n\n  let currentScale = 1;\n  let isScaling = false;\n  let isPanningWithMouse = false;\n  let mousePanStart = { x: 0, y: 0 };\n  const mousePanSensitivity = -3; // Negative to invert pan direction\n  let fakeGestureTouched;\n  let fakeGestureMoved;\n  const evCache = [];\n  const gesture = {\n    originX: 0,\n    originY: 0,\n    slideEl: undefined,\n    slideWidth: undefined,\n    slideHeight: undefined,\n    imageEl: undefined,\n    imageWrapEl: undefined,\n    maxRatio: 3,\n  };\n  const image = {\n    isTouched: undefined,\n    isMoved: undefined,\n    currentX: undefined,\n    currentY: undefined,\n    minX: undefined,\n    minY: undefined,\n    maxX: undefined,\n    maxY: undefined,\n    width: undefined,\n    height: undefined,\n    startX: undefined,\n    startY: undefined,\n    touchesStart: {},\n    touchesCurrent: {},\n  };\n  const velocity = {\n    x: undefined,\n    y: undefined,\n    prevPositionX: undefined,\n    prevPositionY: undefined,\n    prevTime: undefined,\n  };\n\n  let scale = 1;\n  Object.defineProperty(swiper.zoom, 'scale', {\n    get() {\n      return scale;\n    },\n    set(value) {\n      if (scale !== value) {\n        const imageEl = gesture.imageEl;\n        const slideEl = gesture.slideEl;\n        emit('zoomChange', value, imageEl, slideEl);\n      }\n      scale = value;\n    },\n  });\n\n  function getDistanceBetweenTouches() {\n    if (evCache.length < 2) return 1;\n    const x1 = evCache[0].pageX;\n    const y1 = evCache[0].pageY;\n    const x2 = evCache[1].pageX;\n    const y2 = evCache[1].pageY;\n    const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);\n    return distance;\n  }\n\n  function getMaxRatio() {\n    const params = swiper.params.zoom;\n    const maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;\n    if (params.limitToOriginalSize && gesture.imageEl && gesture.imageEl.naturalWidth) {\n      const imageMaxRatio = gesture.imageEl.naturalWidth / gesture.imageEl.offsetWidth;\n      return Math.min(imageMaxRatio, maxRatio);\n    }\n    return maxRatio;\n  }\n\n  function getScaleOrigin() {\n    if (evCache.length < 2) return { x: null, y: null };\n    const box = gesture.imageEl.getBoundingClientRect();\n    return [\n      (evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) /\n        currentScale,\n\n      (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) /\n        currentScale,\n    ];\n  }\n\n  function getSlideSelector() {\n    return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;\n  }\n\n  function eventWithinSlide(e) {\n    const slideSelector = getSlideSelector();\n    if (e.target.matches(slideSelector)) return true;\n    if (swiper.slides.filter((slideEl) => slideEl.contains(e.target)).length > 0) return true;\n    return false;\n  }\n\n  function eventWithinZoomContainer(e) {\n    const selector = `.${swiper.params.zoom.containerClass}`;\n    if (e.target.matches(selector)) return true;\n    if (\n      [...swiper.hostEl.querySelectorAll(selector)].filter((containerEl) =>\n        containerEl.contains(e.target),\n      ).length > 0\n    )\n      return true;\n    return false;\n  }\n\n  // Events\n  function onGestureStart(e) {\n    if (e.pointerType === 'mouse') {\n      evCache.splice(0, evCache.length);\n    }\n    if (!eventWithinSlide(e)) return;\n    const params = swiper.params.zoom;\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n    evCache.push(e);\n    if (evCache.length < 2) {\n      return;\n    }\n    fakeGestureTouched = true;\n    gesture.scaleStart = getDistanceBetweenTouches();\n\n    if (!gesture.slideEl) {\n      gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n      if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];\n\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n\n      if (!gesture.imageWrapEl) {\n        gesture.imageEl = undefined;\n        return;\n      }\n\n      gesture.maxRatio = getMaxRatio();\n    }\n    if (gesture.imageEl) {\n      const [originX, originY] = getScaleOrigin();\n      gesture.originX = originX;\n      gesture.originY = originY;\n      gesture.imageEl.style.transitionDuration = '0ms';\n    }\n    isScaling = true;\n  }\n  function onGestureChange(e) {\n    if (!eventWithinSlide(e)) return;\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    const pointerIndex = evCache.findIndex((cachedEv) => cachedEv.pointerId === e.pointerId);\n    if (pointerIndex >= 0) evCache[pointerIndex] = e;\n\n    if (evCache.length < 2) {\n      return;\n    }\n    fakeGestureMoved = true;\n    gesture.scaleMove = getDistanceBetweenTouches();\n\n    if (!gesture.imageEl) {\n      return;\n    }\n\n    zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale;\n    if (zoom.scale > gesture.maxRatio) {\n      zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;\n    }\n    if (zoom.scale < params.minRatio) {\n      zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;\n    }\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n  }\n  function onGestureEnd(e) {\n    if (!eventWithinSlide(e)) return;\n    if (e.pointerType === 'mouse' && e.type === 'pointerout') return;\n\n    const params = swiper.params.zoom;\n    const zoom = swiper.zoom;\n    const pointerIndex = evCache.findIndex((cachedEv) => cachedEv.pointerId === e.pointerId);\n    if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);\n\n    if (!fakeGestureTouched || !fakeGestureMoved) {\n      return;\n    }\n\n    fakeGestureTouched = false;\n    fakeGestureMoved = false;\n    if (!gesture.imageEl) return;\n\n    zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);\n    gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n    currentScale = zoom.scale;\n    isScaling = false;\n    if (zoom.scale > 1 && gesture.slideEl) {\n      gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n    } else if (zoom.scale <= 1 && gesture.slideEl) {\n      gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n    }\n    if (zoom.scale === 1) {\n      gesture.originX = 0;\n      gesture.originY = 0;\n      gesture.slideEl = undefined;\n    }\n  }\n  let allowTouchMoveTimeout;\n  function allowTouchMove() {\n    swiper.touchEventsData.preventTouchMoveFromPointerMove = false;\n  }\n  function preventTouchMove() {\n    clearTimeout(allowTouchMoveTimeout);\n    swiper.touchEventsData.preventTouchMoveFromPointerMove = true;\n    allowTouchMoveTimeout = setTimeout(() => {\n      if (swiper.destroyed) return;\n      allowTouchMove();\n    });\n  }\n  function onTouchStart(e) {\n    const device = swiper.device;\n    if (!gesture.imageEl) return;\n    if (image.isTouched) return;\n    if (device.android && e.cancelable) e.preventDefault();\n    image.isTouched = true;\n    const event = evCache.length > 0 ? evCache[0] : e;\n    image.touchesStart.x = event.pageX;\n    image.touchesStart.y = event.pageY;\n  }\n  function onTouchMove(e) {\n    const isMouseEvent = e.pointerType === 'mouse';\n    const isMousePan = isMouseEvent && swiper.params.zoom.panOnMouseMove;\n\n    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) {\n      return;\n    }\n    const zoom = swiper.zoom;\n    if (!gesture.imageEl) {\n      return;\n    }\n    if (!image.isTouched || !gesture.slideEl) {\n      if (isMousePan) onMouseMove(e);\n      return;\n    }\n    if (isMousePan) {\n      onMouseMove(e);\n      return;\n    }\n\n    if (!image.isMoved) {\n      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n      image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;\n      image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;\n      gesture.slideWidth = gesture.slideEl.offsetWidth;\n      gesture.slideHeight = gesture.slideEl.offsetHeight;\n      gesture.imageWrapEl.style.transitionDuration = '0ms';\n    }\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n\n    image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;\n    image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;\n    const touchesDiff = Math.max(\n      Math.abs(image.touchesCurrent.x - image.touchesStart.x),\n      Math.abs(image.touchesCurrent.y - image.touchesStart.y),\n    );\n    if (touchesDiff > 5) {\n      swiper.allowClick = false;\n    }\n\n    if (!image.isMoved && !isScaling) {\n      if (\n        swiper.isHorizontal() &&\n        ((Math.floor(image.minX) === Math.floor(image.startX) &&\n          image.touchesCurrent.x < image.touchesStart.x) ||\n          (Math.floor(image.maxX) === Math.floor(image.startX) &&\n            image.touchesCurrent.x > image.touchesStart.x))\n      ) {\n        image.isTouched = false;\n        allowTouchMove();\n        return;\n      }\n      if (\n        !swiper.isHorizontal() &&\n        ((Math.floor(image.minY) === Math.floor(image.startY) &&\n          image.touchesCurrent.y < image.touchesStart.y) ||\n          (Math.floor(image.maxY) === Math.floor(image.startY) &&\n            image.touchesCurrent.y > image.touchesStart.y))\n      ) {\n        image.isTouched = false;\n        allowTouchMove();\n        return;\n      }\n    }\n    if (e.cancelable) {\n      e.preventDefault();\n    }\n    e.stopPropagation();\n    preventTouchMove();\n\n    image.isMoved = true;\n    const scaleRatio =\n      (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);\n    const { originX, originY } = gesture;\n\n    image.currentX =\n      image.touchesCurrent.x -\n      image.touchesStart.x +\n      image.startX +\n      scaleRatio * (image.width - originX * 2);\n    image.currentY =\n      image.touchesCurrent.y -\n      image.touchesStart.y +\n      image.startY +\n      scaleRatio * (image.height - originY * 2);\n\n    if (image.currentX < image.minX) {\n      image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;\n    }\n    if (image.currentX > image.maxX) {\n      image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;\n    }\n\n    if (image.currentY < image.minY) {\n      image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;\n    }\n    if (image.currentY > image.maxY) {\n      image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;\n    }\n\n    // Velocity\n    if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;\n    if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;\n    if (!velocity.prevTime) velocity.prevTime = Date.now();\n    velocity.x =\n      (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;\n    velocity.y =\n      (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;\n    if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;\n    if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;\n    velocity.prevPositionX = image.touchesCurrent.x;\n    velocity.prevPositionY = image.touchesCurrent.y;\n    velocity.prevTime = Date.now();\n\n    gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n  }\n  function onTouchEnd() {\n    const zoom = swiper.zoom;\n    evCache.length = 0;\n    if (!gesture.imageEl) return;\n    if (!image.isTouched || !image.isMoved) {\n      image.isTouched = false;\n      image.isMoved = false;\n      return;\n    }\n    image.isTouched = false;\n    image.isMoved = false;\n    let momentumDurationX = 300;\n    let momentumDurationY = 300;\n    const momentumDistanceX = velocity.x * momentumDurationX;\n    const newPositionX = image.currentX + momentumDistanceX;\n    const momentumDistanceY = velocity.y * momentumDurationY;\n    const newPositionY = image.currentY + momentumDistanceY;\n\n    // Fix duration\n    if (velocity.x !== 0)\n      momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);\n    if (velocity.y !== 0)\n      momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);\n    const momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n\n    image.currentX = newPositionX;\n    image.currentY = newPositionY;\n    // Define if we need image drag\n    const scaledWidth = image.width * zoom.scale;\n    const scaledHeight = image.height * zoom.scale;\n    image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);\n    image.maxX = -image.minX;\n    image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);\n    image.maxY = -image.minY;\n    image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);\n    image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);\n\n    gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;\n    gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;\n  }\n  function onTransitionEnd() {\n    const zoom = swiper.zoom;\n    if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {\n      if (gesture.imageEl) {\n        gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n      }\n      if (gesture.imageWrapEl) {\n        gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n      }\n      gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);\n\n      zoom.scale = 1;\n      currentScale = 1;\n      gesture.slideEl = undefined;\n      gesture.imageEl = undefined;\n      gesture.imageWrapEl = undefined;\n      gesture.originX = 0;\n      gesture.originY = 0;\n    }\n  }\n  function onMouseMove(e) {\n    // Only pan if zoomed in and mouse panning is enabled\n    if (currentScale <= 1 || !gesture.imageWrapEl) return;\n    if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;\n\n    const currentTransform = window.getComputedStyle(gesture.imageWrapEl).transform;\n    const matrix = new window.DOMMatrix(currentTransform);\n\n    if (!isPanningWithMouse) {\n      isPanningWithMouse = true;\n      mousePanStart.x = e.clientX;\n      mousePanStart.y = e.clientY;\n\n      image.startX = matrix.e;\n      image.startY = matrix.f;\n      image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n\n      gesture.slideWidth = gesture.slideEl.offsetWidth;\n      gesture.slideHeight = gesture.slideEl.offsetHeight;\n      return;\n    }\n\n    const deltaX = (e.clientX - mousePanStart.x) * mousePanSensitivity;\n    const deltaY = (e.clientY - mousePanStart.y) * mousePanSensitivity;\n\n    const scaledWidth = image.width * currentScale;\n    const scaledHeight = image.height * currentScale;\n    const slideWidth = gesture.slideWidth;\n    const slideHeight = gesture.slideHeight;\n\n    const minX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n    const maxX = -minX;\n    const minY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n    const maxY = -minY;\n\n    const newX = Math.max(Math.min(image.startX + deltaX, maxX), minX);\n    const newY = Math.max(Math.min(image.startY + deltaY, maxY), minY);\n\n    gesture.imageWrapEl.style.transitionDuration = '0ms';\n    gesture.imageWrapEl.style.transform = `translate3d(${newX}px, ${newY}px, 0)`;\n\n    mousePanStart.x = e.clientX;\n    mousePanStart.y = e.clientY;\n    image.startX = newX;\n    image.startY = newY;\n    image.currentX = newX;\n    image.currentY = newY;\n  }\n\n  function zoomIn(e) {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.slideEl) {\n      if (e && e.target) {\n        gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);\n      }\n      if (!gesture.slideEl) {\n        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n          gesture.slideEl = elementChildren(\n            swiper.slidesEl,\n            `.${swiper.params.slideActiveClass}`,\n          )[0];\n        } else {\n          gesture.slideEl = swiper.slides[swiper.activeIndex];\n        }\n      }\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n    }\n    if (!gesture.imageEl || !gesture.imageWrapEl) return;\n    gesture.maxRatio = getMaxRatio();\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.touchAction = 'none';\n    }\n\n    gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);\n\n    let touchX;\n    let touchY;\n    let offsetX;\n    let offsetY;\n    let diffX;\n    let diffY;\n    let translateX;\n    let translateY;\n    let imageWidth;\n    let imageHeight;\n    let scaledWidth;\n    let scaledHeight;\n    let translateMinX;\n    let translateMinY;\n    let translateMaxX;\n    let translateMaxY;\n    let slideWidth;\n    let slideHeight;\n\n    if (typeof image.touchesStart.x === 'undefined' && e) {\n      touchX = e.pageX;\n      touchY = e.pageY;\n    } else {\n      touchX = image.touchesStart.x;\n      touchY = image.touchesStart.y;\n    }\n\n    const prevScale = currentScale;\n\n    const forceZoomRatio = typeof e === 'number' ? e : null;\n    if (currentScale === 1 && forceZoomRatio) {\n      touchX = undefined;\n      touchY = undefined;\n      image.touchesStart.x = undefined;\n      image.touchesStart.y = undefined;\n    }\n\n    const maxRatio = getMaxRatio();\n    zoom.scale = forceZoomRatio || maxRatio;\n    currentScale = forceZoomRatio || maxRatio;\n\n    if (e && !(currentScale === 1 && forceZoomRatio)) {\n      slideWidth = gesture.slideEl.offsetWidth;\n      slideHeight = gesture.slideEl.offsetHeight;\n      offsetX = elementOffset(gesture.slideEl).left + window.scrollX;\n      offsetY = elementOffset(gesture.slideEl).top + window.scrollY;\n      diffX = offsetX + slideWidth / 2 - touchX;\n      diffY = offsetY + slideHeight / 2 - touchY;\n\n      imageWidth = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;\n      imageHeight = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;\n      scaledWidth = imageWidth * zoom.scale;\n      scaledHeight = imageHeight * zoom.scale;\n\n      translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);\n      translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);\n      translateMaxX = -translateMinX;\n      translateMaxY = -translateMinY;\n\n      if (\n        prevScale > 0 &&\n        forceZoomRatio &&\n        typeof image.currentX === 'number' &&\n        typeof image.currentY === 'number'\n      ) {\n        translateX = (image.currentX * zoom.scale) / prevScale;\n        translateY = (image.currentY * zoom.scale) / prevScale;\n      } else {\n        translateX = diffX * zoom.scale;\n        translateY = diffY * zoom.scale;\n      }\n\n      if (translateX < translateMinX) {\n        translateX = translateMinX;\n      }\n      if (translateX > translateMaxX) {\n        translateX = translateMaxX;\n      }\n\n      if (translateY < translateMinY) {\n        translateY = translateMinY;\n      }\n      if (translateY > translateMaxY) {\n        translateY = translateMaxY;\n      }\n    } else {\n      translateX = 0;\n      translateY = 0;\n    }\n    if (forceZoomRatio && zoom.scale === 1) {\n      gesture.originX = 0;\n      gesture.originY = 0;\n    }\n\n    image.currentX = translateX;\n    image.currentY = translateY;\n    gesture.imageWrapEl.style.transitionDuration = '300ms';\n    gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;\n    gesture.imageEl.style.transitionDuration = '300ms';\n    gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;\n  }\n  function zoomOut() {\n    const zoom = swiper.zoom;\n    const params = swiper.params.zoom;\n\n    if (!gesture.slideEl) {\n      if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {\n        gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];\n      } else {\n        gesture.slideEl = swiper.slides[swiper.activeIndex];\n      }\n      let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);\n      if (imageEl) {\n        imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];\n      }\n      gesture.imageEl = imageEl;\n      if (imageEl) {\n        gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];\n      } else {\n        gesture.imageWrapEl = undefined;\n      }\n    }\n    if (!gesture.imageEl || !gesture.imageWrapEl) return;\n    gesture.maxRatio = getMaxRatio();\n    if (swiper.params.cssMode) {\n      swiper.wrapperEl.style.overflow = '';\n      swiper.wrapperEl.style.touchAction = '';\n    }\n    zoom.scale = 1;\n    currentScale = 1;\n    image.currentX = undefined;\n    image.currentY = undefined;\n    image.touchesStart.x = undefined;\n    image.touchesStart.y = undefined;\n    gesture.imageWrapEl.style.transitionDuration = '300ms';\n    gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';\n    gesture.imageEl.style.transitionDuration = '300ms';\n    gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';\n\n    gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);\n    gesture.slideEl = undefined;\n    gesture.originX = 0;\n    gesture.originY = 0;\n\n    if (swiper.params.zoom.panOnMouseMove) {\n      mousePanStart = { x: 0, y: 0 };\n      if (isPanningWithMouse) {\n        isPanningWithMouse = false;\n        image.startX = 0;\n        image.startY = 0;\n      }\n    }\n  }\n\n  // Toggle Zoom\n  function zoomToggle(e) {\n    const zoom = swiper.zoom;\n\n    if (zoom.scale && zoom.scale !== 1) {\n      // Zoom Out\n      zoomOut();\n    } else {\n      // Zoom In\n      zoomIn(e);\n    }\n  }\n\n  function getListeners() {\n    const passiveListener = swiper.params.passiveListeners\n      ? { passive: true, capture: false }\n      : false;\n    const activeListenerWithCapture = swiper.params.passiveListeners\n      ? { passive: false, capture: true }\n      : true;\n    return { passiveListener, activeListenerWithCapture };\n  }\n\n  // Attach/Detach Events\n  function enable() {\n    const zoom = swiper.zoom;\n    if (zoom.enabled) return;\n    zoom.enabled = true;\n    const { passiveListener, activeListenerWithCapture } = getListeners();\n\n    // Scale image\n    swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);\n    swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n    ['pointerup', 'pointercancel', 'pointerout'].forEach((eventName) => {\n      swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);\n    });\n\n    // Move image\n    swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n  }\n  function disable() {\n    const zoom = swiper.zoom;\n    if (!zoom.enabled) return;\n    zoom.enabled = false;\n\n    const { passiveListener, activeListenerWithCapture } = getListeners();\n\n    // Scale image\n    swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);\n    swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);\n    ['pointerup', 'pointercancel', 'pointerout'].forEach((eventName) => {\n      swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);\n    });\n\n    // Move image\n    swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);\n  }\n\n  on('init', () => {\n    if (swiper.params.zoom.enabled) {\n      enable();\n    }\n  });\n  on('destroy', () => {\n    disable();\n  });\n  on('touchStart', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchStart(e);\n  });\n  on('touchEnd', (_s, e) => {\n    if (!swiper.zoom.enabled) return;\n    onTouchEnd(e);\n  });\n  on('doubleTap', (_s, e) => {\n    if (\n      !swiper.animating &&\n      swiper.params.zoom.enabled &&\n      swiper.zoom.enabled &&\n      swiper.params.zoom.toggle\n    ) {\n      zoomToggle(e);\n    }\n  });\n  on('transitionEnd', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled) {\n      onTransitionEnd();\n    }\n  });\n  on('slideChange', () => {\n    if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {\n      onTransitionEnd();\n    }\n  });\n\n  Object.assign(swiper.zoom, {\n    enable,\n    disable,\n    in: zoomIn,\n    out: zoomOut,\n    toggle: zoomToggle,\n  });\n}\n"
  },
  {
    "path": "src/react/context.mjs",
    "content": "import { createContext, useContext } from 'react';\n\nexport const SwiperSlideContext = createContext(null);\n\nexport const useSwiperSlide = () => {\n  return useContext(SwiperSlideContext);\n};\n\nexport const SwiperContext = createContext(null);\n\nexport const useSwiper = () => {\n  return useContext(SwiperContext);\n};\n"
  },
  {
    "path": "src/react/get-children.mjs",
    "content": "import React from 'react';\n\nfunction isChildSwiperSlide(child) {\n  return child.type && child.type.displayName && child.type.displayName.includes('SwiperSlide');\n}\n\nfunction processChildren(c) {\n  const slides = [];\n  React.Children.toArray(c).forEach((child) => {\n    if (isChildSwiperSlide(child)) {\n      slides.push(child);\n    } else if (child.props && child.props.children) {\n      processChildren(child.props.children).forEach((slide) => slides.push(slide));\n    }\n  });\n  return slides;\n}\n\nfunction getChildren(c) {\n  const slides = [];\n\n  const slots = {\n    'container-start': [],\n    'container-end': [],\n    'wrapper-start': [],\n    'wrapper-end': [],\n  };\n\n  React.Children.toArray(c).forEach((child) => {\n    if (isChildSwiperSlide(child)) {\n      slides.push(child);\n    } else if (child.props && child.props.slot && slots[child.props.slot]) {\n      slots[child.props.slot].push(child);\n    } else if (child.props && child.props.children) {\n      const foundSlides = processChildren(child.props.children);\n      if (foundSlides.length > 0) {\n        foundSlides.forEach((slide) => slides.push(slide));\n      } else {\n        slots['container-end'].push(child);\n      }\n    } else {\n      slots['container-end'].push(child);\n    }\n  });\n\n  return { slides, slots };\n}\n\nexport { getChildren };\n"
  },
  {
    "path": "src/react/swiper-slide.mjs",
    "content": "import React, { useRef, useState, forwardRef } from 'react';\nimport { uniqueClasses } from '../components-shared/utils.mjs';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.mjs';\nimport { SwiperSlideContext } from './context.mjs';\n\nconst SwiperSlide = forwardRef(\n  (\n    {\n      tag: Tag = 'div',\n      children,\n      className = '',\n      swiper,\n      zoom,\n      lazy,\n      virtualIndex,\n      swiperSlideIndex,\n      ...rest\n    } = {},\n    externalRef,\n  ) => {\n    const slideElRef = useRef(null);\n    const [slideClasses, setSlideClasses] = useState('swiper-slide');\n    const [lazyLoaded, setLazyLoaded] = useState(false);\n    function updateClasses(_s, el, classNames) {\n      if (el === slideElRef.current) {\n        setSlideClasses(classNames);\n      }\n    }\n    useIsomorphicLayoutEffect(() => {\n      if (typeof swiperSlideIndex !== 'undefined') {\n        slideElRef.current.swiperSlideIndex = swiperSlideIndex;\n      }\n      if (externalRef) {\n        externalRef.current = slideElRef.current;\n      }\n      if (!slideElRef.current || !swiper) {\n        return;\n      }\n      if (swiper.destroyed) {\n        if (slideClasses !== 'swiper-slide') {\n          setSlideClasses('swiper-slide');\n        }\n        return;\n      }\n      swiper.on('_slideClass', updateClasses);\n      // eslint-disable-next-line\n      return () => {\n        if (!swiper) return;\n        swiper.off('_slideClass', updateClasses);\n      };\n    });\n    useIsomorphicLayoutEffect(() => {\n      if (swiper && slideElRef.current && !swiper.destroyed) {\n        setSlideClasses(swiper.getSlideClasses(slideElRef.current));\n      }\n    }, [swiper]);\n\n    const slideData = {\n      isActive: slideClasses.indexOf('swiper-slide-active') >= 0,\n      isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0,\n      isPrev: slideClasses.indexOf('swiper-slide-prev') >= 0,\n      isNext: slideClasses.indexOf('swiper-slide-next') >= 0,\n    };\n\n    const renderChildren = () => {\n      return typeof children === 'function' ? children(slideData) : children;\n    };\n\n    const onLoad = () => {\n      setLazyLoaded(true);\n    };\n\n    return (\n      <Tag\n        ref={slideElRef}\n        className={uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`)}\n        data-swiper-slide-index={virtualIndex}\n        onLoad={onLoad}\n        {...rest}\n      >\n        {zoom && (\n          <SwiperSlideContext.Provider value={slideData}>\n            <div\n              className=\"swiper-zoom-container\"\n              data-swiper-zoom={typeof zoom === 'number' ? zoom : undefined}\n            >\n              {renderChildren()}\n              {lazy && !lazyLoaded && (\n                <div\n                  className=\"swiper-lazy-preloader\"\n                  ref={(node) => {\n                    if (node) node.lazyPreloaderManaged = true;\n                  }}\n                />\n              )}\n            </div>\n          </SwiperSlideContext.Provider>\n        )}\n        {!zoom && (\n          <SwiperSlideContext.Provider value={slideData}>\n            {renderChildren()}\n            {lazy && !lazyLoaded && (\n              <div\n                className=\"swiper-lazy-preloader\"\n                ref={(node) => {\n                  if (node) node.lazyPreloaderManaged = true;\n                }}\n              />\n            )}\n          </SwiperSlideContext.Provider>\n        )}\n      </Tag>\n    );\n  },\n);\n\nSwiperSlide.displayName = 'SwiperSlide';\n\nexport { SwiperSlide };\n"
  },
  {
    "path": "src/react/swiper.mjs",
    "content": "import React, { useRef, useState, useEffect, forwardRef } from 'react';\nimport SwiperCore from '../swiper.mjs';\nimport { getParams } from '../components-shared/get-params.mjs';\nimport { mountSwiper } from '../components-shared/mount-swiper.mjs';\nimport {\n  needsScrollbar,\n  needsNavigation,\n  needsPagination,\n  uniqueClasses,\n  extend,\n  wrapperClass,\n} from '../components-shared/utils.mjs';\nimport { getChangedParams } from '../components-shared/get-changed-params.mjs';\nimport { getChildren } from './get-children.mjs';\nimport { updateSwiper } from '../components-shared/update-swiper.mjs';\nimport { renderVirtual } from './virtual.mjs';\nimport { updateOnVirtualData } from '../components-shared/update-on-virtual-data.mjs';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect.mjs';\nimport { SwiperContext } from './context.mjs';\n\nconst Swiper = forwardRef(\n  (\n    {\n      className,\n      tag: Tag = 'div',\n      wrapperTag: WrapperTag = 'div',\n      children,\n      onSwiper,\n      ...rest\n    } = {},\n    externalElRef,\n  ) => {\n    let eventsAssigned = false;\n    const [containerClasses, setContainerClasses] = useState('swiper');\n    const [virtualData, setVirtualData] = useState(null);\n    const [breakpointChanged, setBreakpointChanged] = useState(false);\n    const initializedRef = useRef(false);\n    const swiperElRef = useRef(null);\n    const swiperRef = useRef(null);\n    const oldPassedParamsRef = useRef(null);\n    const oldSlides = useRef(null);\n\n    const nextElRef = useRef(null);\n    const prevElRef = useRef(null);\n    const paginationElRef = useRef(null);\n    const scrollbarElRef = useRef(null);\n\n    const { params: swiperParams, passedParams, rest: restProps, events } = getParams(rest);\n\n    const { slides, slots } = getChildren(children);\n\n    const onBeforeBreakpoint = () => {\n      setBreakpointChanged(!breakpointChanged);\n    };\n\n    Object.assign(swiperParams.on, {\n      _containerClasses(swiper, classes) {\n        setContainerClasses(classes);\n      },\n    });\n\n    const initSwiper = () => {\n      // init swiper\n      Object.assign(swiperParams.on, events);\n      eventsAssigned = true;\n      const passParams = { ...swiperParams };\n      delete passParams.wrapperClass;\n      swiperRef.current = new SwiperCore(passParams);\n      if (swiperRef.current.virtual && swiperRef.current.params.virtual.enabled) {\n        swiperRef.current.virtual.slides = slides;\n        const extendWith = {\n          cache: false,\n          slides,\n          renderExternal: setVirtualData,\n          renderExternalUpdate: false,\n        };\n        extend(swiperRef.current.params.virtual, extendWith);\n        extend(swiperRef.current.originalParams.virtual, extendWith);\n      }\n    };\n\n    if (!swiperElRef.current) {\n      initSwiper();\n    }\n\n    // Listen for breakpoints change\n    if (swiperRef.current) {\n      swiperRef.current.on('_beforeBreakpoint', onBeforeBreakpoint);\n    }\n\n    const attachEvents = () => {\n      if (eventsAssigned || !events || !swiperRef.current) return;\n      Object.keys(events).forEach((eventName) => {\n        swiperRef.current.on(eventName, events[eventName]);\n      });\n    };\n\n    const detachEvents = () => {\n      if (!events || !swiperRef.current) return;\n      Object.keys(events).forEach((eventName) => {\n        swiperRef.current.off(eventName, events[eventName]);\n      });\n    };\n\n    useEffect(() => {\n      return () => {\n        if (swiperRef.current) swiperRef.current.off('_beforeBreakpoint', onBeforeBreakpoint);\n      };\n    });\n\n    // set initialized flag\n    useEffect(() => {\n      if (!initializedRef.current && swiperRef.current) {\n        swiperRef.current.emitSlidesClasses();\n        initializedRef.current = true;\n      }\n    });\n\n    // mount swiper\n    useIsomorphicLayoutEffect(() => {\n      if (externalElRef) {\n        externalElRef.current = swiperElRef.current;\n      }\n      if (!swiperElRef.current) return;\n      if (swiperRef.current.destroyed) {\n        initSwiper();\n      }\n\n      mountSwiper(\n        {\n          el: swiperElRef.current,\n          nextEl: nextElRef.current,\n          prevEl: prevElRef.current,\n          paginationEl: paginationElRef.current,\n          scrollbarEl: scrollbarElRef.current,\n          swiper: swiperRef.current,\n        },\n        swiperParams,\n      );\n\n      if (onSwiper && !swiperRef.current.destroyed) onSwiper(swiperRef.current);\n      // eslint-disable-next-line\n      return () => {\n        if (swiperRef.current && !swiperRef.current.destroyed) {\n          swiperRef.current.destroy(true, false);\n        }\n      };\n    }, []);\n\n    // watch for params change\n    useIsomorphicLayoutEffect(() => {\n      attachEvents();\n      const changedParams = getChangedParams(\n        passedParams,\n        oldPassedParamsRef.current,\n        slides,\n        oldSlides.current,\n        (c) => c.key,\n      );\n      oldPassedParamsRef.current = passedParams;\n      oldSlides.current = slides;\n      if (changedParams.length && swiperRef.current && !swiperRef.current.destroyed) {\n        updateSwiper({\n          swiper: swiperRef.current,\n          slides,\n          passedParams,\n          changedParams,\n          nextEl: nextElRef.current,\n          prevEl: prevElRef.current,\n          scrollbarEl: scrollbarElRef.current,\n          paginationEl: paginationElRef.current,\n        });\n      }\n      return () => {\n        detachEvents();\n      };\n    });\n\n    // update on virtual update\n    useIsomorphicLayoutEffect(() => {\n      updateOnVirtualData(swiperRef.current);\n    }, [virtualData]);\n\n    // bypass swiper instance to slides\n    function renderSlides() {\n      if (swiperParams.virtual) {\n        return renderVirtual(swiperRef.current, slides, virtualData);\n      }\n      return slides.map((child, index) => {\n        return React.cloneElement(child, { swiper: swiperRef.current, swiperSlideIndex: index });\n      });\n    }\n\n    return (\n      <Tag\n        ref={swiperElRef}\n        className={uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)}\n        {...restProps}\n      >\n        <SwiperContext.Provider value={swiperRef.current}>\n          {slots['container-start']}\n          <WrapperTag className={wrapperClass(swiperParams.wrapperClass)}>\n            {slots['wrapper-start']}\n            {renderSlides()}\n            {slots['wrapper-end']}\n          </WrapperTag>\n          {needsNavigation(swiperParams) && (\n            <>\n              <div ref={prevElRef} className=\"swiper-button-prev\" />\n              <div ref={nextElRef} className=\"swiper-button-next\" />\n            </>\n          )}\n          {needsScrollbar(swiperParams) && (\n            <div ref={scrollbarElRef} className=\"swiper-scrollbar\" />\n          )}\n          {needsPagination(swiperParams) && (\n            <div ref={paginationElRef} className=\"swiper-pagination\" />\n          )}\n          {slots['container-end']}\n        </SwiperContext.Provider>\n      </Tag>\n    );\n  },\n);\n\nSwiper.displayName = 'Swiper';\n\nexport { Swiper };\n"
  },
  {
    "path": "src/react/use-isomorphic-layout-effect.mjs",
    "content": "import { useEffect, useLayoutEffect } from 'react';\n\nfunction useIsomorphicLayoutEffect(callback, deps) {\n  // eslint-disable-next-line\n  if (typeof window === 'undefined') return useEffect(callback, deps);\n  return useLayoutEffect(callback, deps);\n}\n\nexport { useIsomorphicLayoutEffect };\n"
  },
  {
    "path": "src/react/virtual.mjs",
    "content": "import React from 'react';\n\nfunction renderVirtual(swiper, slides, virtualData) {\n  if (!virtualData) return null;\n\n  const getSlideIndex = (index) => {\n    let slideIndex = index;\n    if (index < 0) {\n      slideIndex = slides.length + index;\n    } else if (slideIndex >= slides.length) {\n      // eslint-disable-next-line\n      slideIndex = slideIndex - slides.length;\n    }\n    return slideIndex;\n  };\n\n  const style = swiper.isHorizontal()\n    ? {\n        [swiper.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`,\n      }\n    : {\n        top: `${virtualData.offset}px`,\n      };\n  const { from, to } = virtualData;\n  const loopFrom = swiper.params.loop ? -slides.length : 0;\n  const loopTo = swiper.params.loop ? slides.length * 2 : slides.length;\n  const slidesToRender = [];\n  for (let i = loopFrom; i < loopTo; i += 1) {\n    if (i >= from && i <= to) {\n      slidesToRender.push(slides[getSlideIndex(i)]);\n    }\n  }\n  return slidesToRender.map((child, index) => {\n    return React.cloneElement(child, {\n      swiper,\n      style,\n      key: child.props.virtualIndex || child.key || `slide-${index}`,\n    });\n  });\n}\n\nexport { renderVirtual };\n"
  },
  {
    "path": "src/shared/classes-to-selector.mjs",
    "content": "export default function classesToSelector(classes = '') {\n  // Escape all CSS selector special characters\n  return `.${classes\n    .trim()\n    .replace(/([\\.:!+\\/()[\\]#>~*^$|=,'\"@{}\\\\])/g, '\\\\$1') // eslint-disable-line\n    .replace(/ /g, '.')}`;\n}\n"
  },
  {
    "path": "src/shared/classes-to-tokens.mjs",
    "content": "export default function classesToTokens(classes = '') {\n  return classes\n    .trim()\n    .split(' ')\n    .filter((c) => !!c.trim());\n}\n"
  },
  {
    "path": "src/shared/create-element-if-not-defined.mjs",
    "content": "import { createElement, elementChildren } from './utils.mjs';\n\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach((key) => {\n      if (!params[key] && params.auto === true) {\n        let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];\n        if (!element) {\n          element = createElement('div', checkProps[key]);\n          element.className = checkProps[key];\n          swiper.el.append(element);\n        }\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n  return params;\n}\n"
  },
  {
    "path": "src/shared/create-shadow.mjs",
    "content": "import { createElement, getSlideTransformEl } from './utils.mjs';\n\nexport default function createShadow(suffix, slideEl, side) {\n  const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}${\n    suffix ? ` swiper-slide-shadow-${suffix}` : ''\n  }`;\n  const shadowContainer = getSlideTransformEl(slideEl);\n  let shadowEl = shadowContainer.querySelector(`.${shadowClass.split(' ').join('.')}`);\n\n  if (!shadowEl) {\n    shadowEl = createElement('div', shadowClass.split(' '));\n    shadowContainer.append(shadowEl);\n  }\n  return shadowEl;\n}\n"
  },
  {
    "path": "src/shared/effect-init.mjs",
    "content": "export default function effectInit(params) {\n  const {\n    effect,\n    swiper,\n    on,\n    setTranslate,\n    setTransition,\n    overwriteParams,\n    perspective,\n    recreateShadows,\n    getEffectParams,\n  } = params;\n\n  on('beforeInit', () => {\n    if (swiper.params.effect !== effect) return;\n    swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);\n    if (perspective && perspective()) {\n      swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);\n    }\n\n    const overwriteParamsResult = overwriteParams ? overwriteParams() : {};\n\n    Object.assign(swiper.params, overwriteParamsResult);\n    Object.assign(swiper.originalParams, overwriteParamsResult);\n  });\n  on('setTranslate _virtualUpdated', () => {\n    if (swiper.params.effect !== effect) return;\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    if (swiper.params.effect !== effect) return;\n    setTransition(duration);\n  });\n\n  on('transitionEnd', () => {\n    if (swiper.params.effect !== effect) return;\n    if (recreateShadows) {\n      if (!getEffectParams || !getEffectParams().slideShadows) return;\n      // remove shadows\n      swiper.slides.forEach((slideEl) => {\n        slideEl\n          .querySelectorAll(\n            '.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left',\n          )\n          .forEach((shadowEl) => shadowEl.remove());\n      });\n      // create new one\n      recreateShadows();\n    }\n  });\n\n  let requireUpdateOnVirtual;\n  on('virtualUpdate', () => {\n    if (swiper.params.effect !== effect) return;\n    if (!swiper.slides.length) {\n      requireUpdateOnVirtual = true;\n    }\n    requestAnimationFrame(() => {\n      if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {\n        setTranslate();\n        requireUpdateOnVirtual = false;\n      }\n    });\n  });\n}\n"
  },
  {
    "path": "src/shared/effect-target.mjs",
    "content": "import { getSlideTransformEl } from './utils.mjs';\n\nexport default function effectTarget(effectParams, slideEl) {\n  const transformEl = getSlideTransformEl(slideEl);\n  if (transformEl !== slideEl) {\n    transformEl.style.backfaceVisibility = 'hidden';\n    transformEl.style['-webkit-backface-visibility'] = 'hidden';\n  }\n  return transformEl;\n}\n"
  },
  {
    "path": "src/shared/effect-virtual-transition-end.mjs",
    "content": "import { elementTransitionEnd } from './utils.mjs';\n\nexport default function effectVirtualTransitionEnd({\n  swiper,\n  duration,\n  transformElements,\n  allSlides,\n}) {\n  const { activeIndex } = swiper;\n  const getSlide = (el) => {\n    if (!el.parentElement) {\n      // assume shadow root\n      const slide = swiper.slides.find(\n        (slideEl) => slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode,\n      );\n      return slide;\n    }\n    return el.parentElement;\n  };\n  if (swiper.params.virtualTranslate && duration !== 0) {\n    let eventTriggered = false;\n    let transitionEndTarget;\n    if (allSlides) {\n      transitionEndTarget = transformElements;\n    } else {\n      transitionEndTarget = transformElements.filter((transformEl) => {\n        const el = transformEl.classList.contains('swiper-slide-transform')\n          ? getSlide(transformEl)\n          : transformEl;\n        return swiper.getSlideIndex(el) === activeIndex;\n      });\n    }\n    transitionEndTarget.forEach((el) => {\n      elementTransitionEnd(el, () => {\n        if (eventTriggered) return;\n        if (!swiper || swiper.destroyed) return;\n        eventTriggered = true;\n        swiper.animating = false;\n        const evt = new window.CustomEvent('transitionend', {\n          bubbles: true,\n          cancelable: true,\n        });\n        swiper.wrapperEl.dispatchEvent(evt);\n      });\n    });\n  }\n}\n"
  },
  {
    "path": "src/shared/get-browser.mjs",
    "content": "import { getWindow } from 'ssr-window';\nimport { getDevice } from './get-device.mjs';\n\nlet browser;\n\nfunction calcBrowser() {\n  const window = getWindow();\n  const device = getDevice();\n  let needPerspectiveFix = false;\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n  if (isSafari()) {\n    const ua = String(window.navigator.userAgent);\n    if (ua.includes('Version/')) {\n      const [major, minor] = ua\n        .split('Version/')[1]\n        .split(' ')[0]\n        .split('.')\n        .map((num) => Number(num));\n      needPerspectiveFix = major < 16 || (major === 16 && minor < 2);\n    }\n  }\n  const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);\n  const isSafariBrowser = isSafari();\n  const need3dFix = isSafariBrowser || (isWebView && device.ios);\n\n  return {\n    isSafari: needPerspectiveFix || isSafariBrowser,\n    needPerspectiveFix,\n    need3dFix,\n    isWebView,\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n  return browser;\n}\n\nexport { getBrowser };\n"
  },
  {
    "path": "src/shared/get-device.mjs",
    "content": "import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.mjs';\n\nlet deviceCached;\n\nfunction calcDevice({ userAgent } = {}) {\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n\n  const device = {\n    ios: false,\n    android: false,\n  };\n\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n  let ipad = ua.match(/(iPad)(?!\\1).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel';\n\n  // iPadOs 13 fix\n  const iPadScreens = [\n    '1024x1366',\n    '1366x1024',\n    '834x1194',\n    '1194x834',\n    '834x1112',\n    '1112x834',\n    '768x1024',\n    '1024x768',\n    '820x1180',\n    '1180x820',\n    '810x1080',\n    '1080x810',\n  ];\n  if (\n    !ipad &&\n    macos &&\n    support.touch &&\n    iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0\n  ) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  }\n\n  // Android\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  }\n\n  // Export object\n  return device;\n}\n\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n  return deviceCached;\n}\n\nexport { getDevice };\n"
  },
  {
    "path": "src/shared/get-support.mjs",
    "content": "import { getWindow, getDocument } from 'ssr-window';\n\nlet support;\n\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n\n  return {\n    smoothScroll:\n      document.documentElement &&\n      document.documentElement.style &&\n      'scrollBehavior' in document.documentElement.style,\n\n    touch: !!(\n      'ontouchstart' in window ||\n      (window.DocumentTouch && document instanceof window.DocumentTouch)\n    ),\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n  return support;\n}\n\nexport { getSupport };\n"
  },
  {
    "path": "src/shared/process-lazy-preloader.mjs",
    "content": "export const processLazyPreloader = (swiper, imageEl) => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  const slideSelector = () => (swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`);\n  const slideEl = imageEl.closest(slideSelector());\n  if (slideEl) {\n    let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n    if (!lazyEl && swiper.isElement) {\n      if (slideEl.shadowRoot) {\n        lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n      } else {\n        // init later\n        requestAnimationFrame(() => {\n          if (slideEl.shadowRoot) {\n            lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);\n            if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();\n          }\n        });\n      }\n    }\n    // Skip removal if managed by React/Vue component\n    if (lazyEl && !lazyEl.lazyPreloaderManaged) lazyEl.remove();\n  }\n};\n\nconst unlazy = (swiper, index) => {\n  if (!swiper.slides[index]) return;\n  const imageEl = swiper.slides[index].querySelector('[loading=\"lazy\"]');\n  if (imageEl) imageEl.removeAttribute('loading');\n};\n\nexport const preload = (swiper) => {\n  if (!swiper || swiper.destroyed || !swiper.params) return;\n  let amount = swiper.params.lazyPreloadPrevNext;\n  const len = swiper.slides.length;\n  if (!len || !amount || amount < 0) return;\n  amount = Math.min(amount, len);\n  const slidesPerView =\n    swiper.params.slidesPerView === 'auto'\n      ? swiper.slidesPerViewDynamic()\n      : Math.ceil(swiper.params.slidesPerView);\n  const activeIndex = swiper.activeIndex;\n  if (swiper.params.grid && swiper.params.grid.rows > 1) {\n    const activeColumn = activeIndex;\n    const preloadColumns = [activeColumn - amount];\n    preloadColumns.push(\n      ...Array.from({ length: amount }).map((_, i) => {\n        return activeColumn + slidesPerView + i;\n      }),\n    );\n    swiper.slides.forEach((slideEl, i) => {\n      if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);\n    });\n    return;\n  }\n  const slideIndexLastInView = activeIndex + slidesPerView - 1;\n  if (swiper.params.rewind || swiper.params.loop) {\n    for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {\n      const realIndex = ((i % len) + len) % len;\n      if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);\n    }\n  } else {\n    for (\n      let i = Math.max(activeIndex - amount, 0);\n      i <= Math.min(slideIndexLastInView + amount, len - 1);\n      i += 1\n    ) {\n      if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {\n        unlazy(swiper, i);\n      }\n    }\n  }\n};\n"
  },
  {
    "path": "src/shared/utils.mjs",
    "content": "import { getWindow, getDocument } from 'ssr-window';\nimport classesToTokens from './classes-to-tokens.mjs';\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach((key) => {\n    try {\n      object[key] = null;\n    } catch (e) {\n      // no getter for object\n    }\n    try {\n      delete object[key];\n    } catch (e) {\n      // something got wrong\n    }\n  });\n}\nfunction nextTick(callback, delay = 0) {\n  return setTimeout(callback, delay);\n}\nfunction now() {\n  return Date.now();\n}\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n  if (!style) {\n    style = el.style;\n  }\n\n  return style;\n}\nfunction getTranslate(el, axis = 'x') {\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform\n        .split(', ')\n        .map((a) => a.replace(',', '.'))\n        .join(', ');\n    }\n    // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix =\n      curStyle.MozTransform ||\n      curStyle.OTransform ||\n      curStyle.MsTransform ||\n      curStyle.msTransform ||\n      curStyle.transform ||\n      curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;\n    // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);\n    // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n  return curTransform || 0;\n}\nfunction isObject(o) {\n  return (\n    typeof o === 'object' &&\n    o !== null &&\n    o.constructor &&\n    Object.prototype.toString.call(o).slice(8, -1) === 'Object'\n  );\n}\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\nfunction extend(...args) {\n  const to = Object(args[0]);\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[i];\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(\n        (key) => key !== '__proto__' && key !== 'constructor' && key !== 'prototype',\n      );\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n  return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({ swiper, targetPosition, side }) {\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return (dir === 'next' && current >= target) || (dir === 'prev' && current <= target);\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n    if (startTime === null) {\n      startTime = time;\n    }\n\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition,\n    });\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition,\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n  animate();\n}\n\nfunction getSlideTransformEl(slideEl) {\n  return (\n    slideEl.querySelector('.swiper-slide-transform') ||\n    (slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform')) ||\n    slideEl\n  );\n}\n\nfunction findElementsInElements(elements = [], selector = '') {\n  const found = [];\n  elements.forEach((el) => {\n    found.push(...el.querySelectorAll(selector));\n  });\n  return found;\n}\nfunction elementChildren(element, selector = '') {\n  const window = getWindow();\n  const children = [...element.children];\n  if (window.HTMLSlotElement && element instanceof HTMLSlotElement) {\n    children.push(...element.assignedElements());\n  }\n\n  if (!selector) {\n    return children;\n  }\n  return children.filter((el) => el.matches(selector));\n}\nfunction elementIsChildOfSlot(el, slot) {\n  // Breadth-first search through all parent's children and assigned elements\n  const elementsQueue = [slot];\n  while (elementsQueue.length > 0) {\n    const elementToCheck = elementsQueue.shift();\n    if (el === elementToCheck) {\n      return true;\n    }\n    elementsQueue.push(\n      ...elementToCheck.children,\n      ...(elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : []),\n      ...(elementToCheck.assignedElements ? elementToCheck.assignedElements() : []),\n    );\n  }\n}\nfunction elementIsChildOf(el, parent) {\n  const window = getWindow();\n  let isChild = parent.contains(el);\n  if (!isChild && window.HTMLSlotElement && parent instanceof HTMLSlotElement) {\n    const children = [...parent.assignedElements()];\n    isChild = children.includes(el);\n    if (!isChild) {\n      isChild = elementIsChildOfSlot(el, parent);\n    }\n  }\n\n  return isChild;\n}\nfunction showWarning(text) {\n  try {\n    console.warn(text);\n    return;\n  } catch (err) {\n    // err\n  }\n}\nfunction createElement(tag, classes = []) {\n  const el = document.createElement(tag);\n  el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));\n  return el;\n}\nfunction elementOffset(el) {\n  const window = getWindow();\n  const document = getDocument();\n  const box = el.getBoundingClientRect();\n  const body = document.body;\n  const clientTop = el.clientTop || body.clientTop || 0;\n  const clientLeft = el.clientLeft || body.clientLeft || 0;\n  const scrollTop = el === window ? window.scrollY : el.scrollTop;\n  const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n  return {\n    top: box.top + scrollTop - clientTop,\n    left: box.left + scrollLeft - clientLeft,\n  };\n}\nfunction elementPrevAll(el, selector) {\n  const prevEls = [];\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n    if (selector) {\n      if (prev.matches(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n    el = prev;\n  }\n  return prevEls;\n}\nfunction elementNextAll(el, selector) {\n  const nextEls = [];\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n    if (selector) {\n      if (next.matches(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n    el = next;\n  }\n  return nextEls;\n}\nfunction elementStyle(el, prop) {\n  const window = getWindow();\n  return window.getComputedStyle(el, null).getPropertyValue(prop);\n}\nfunction elementIndex(el) {\n  let child = el;\n  let i;\n  if (child) {\n    i = 0;\n    // eslint-disable-next-line\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n    return i;\n  }\n  return undefined;\n}\n\nfunction elementParents(el, selector) {\n  const parents = []; // eslint-disable-line\n  let parent = el.parentElement; // eslint-disable-line\n  while (parent) {\n    if (selector) {\n      if (parent.matches(selector)) parents.push(parent);\n    } else {\n      parents.push(parent);\n    }\n    parent = parent.parentElement;\n  }\n  return parents;\n}\n\nfunction elementTransitionEnd(el, callback) {\n  function fireCallBack(e) {\n    if (e.target !== el) return;\n    callback.call(el, e);\n    el.removeEventListener('transitionend', fireCallBack);\n  }\n  if (callback) {\n    el.addEventListener('transitionend', fireCallBack);\n  }\n}\n\nfunction elementOuterSize(el, size, includeMargins) {\n  const window = getWindow();\n  if (includeMargins) {\n    return (\n      el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] +\n      parseFloat(\n        window\n          .getComputedStyle(el, null)\n          .getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top'),\n      ) +\n      parseFloat(\n        window\n          .getComputedStyle(el, null)\n          .getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'),\n      )\n    );\n  }\n  return el.offsetWidth;\n}\nfunction makeElementsArray(el) {\n  return (Array.isArray(el) ? el : [el]).filter((e) => !!e);\n}\nfunction getRotateFix(swiper) {\n  return (v) => {\n    if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) {\n      return v + 0.001;\n    }\n    return v;\n  };\n}\n\nfunction setInnerHTML(el, html = '') {\n  if (typeof trustedTypes !== 'undefined') {\n    el.innerHTML = trustedTypes\n      .createPolicy('html', {\n        createHTML: (s) => s,\n      })\n      .createHTML(html);\n  } else {\n    el.innerHTML = html;\n  }\n}\nexport {\n  animateCSSModeScroll,\n  deleteProps,\n  nextTick,\n  now,\n  getTranslate,\n  isObject,\n  extend,\n  getComputedStyle,\n  setCSSProperty,\n  getSlideTransformEl,\n  showWarning,\n  // dom\n  findElementsInElements,\n  createElement,\n  elementChildren,\n  elementIsChildOf,\n  elementOffset,\n  elementPrevAll,\n  elementNextAll,\n  elementStyle,\n  elementIndex,\n  elementParents,\n  elementTransitionEnd,\n  elementOuterSize,\n  makeElementsArray,\n  getRotateFix,\n  setInnerHTML,\n};\n"
  },
  {
    "path": "src/swiper-bundle.mjs",
    "content": "import Swiper from './core/core.mjs';\n//IMPORT_MODULES\n\n// eslint-disable-next-line\nexport { default as Swiper, default } from './core/core.mjs';\n\n// Swiper Class\nconst modules = [\n  //INSTALL_MODULES\n];\nSwiper.use(modules);\n"
  },
  {
    "path": "src/swiper-effect-utils.d.ts",
    "content": "import type { Swiper, SwiperOptions } from './types/index.d.ts';\n\ndeclare const createShadow: (suffix: string, slideEl: HTMLElement, side?: string) => HTMLElement;\n\ndeclare const effectInit: (params: {\n  effect: string;\n  swiper: Swiper;\n  on: () => void;\n  setTranslate: () => void;\n  setTransition: (duration: number) => void;\n  overwriteParams?: () => SwiperOptions;\n  perspective?: () => boolean;\n  recreateShadows?: () => void;\n  getEffectParams?: () => { slideShadows?: boolean };\n}) => void;\n\ndeclare const effectTarget: (effectParams: any, slideEl: HTMLElement) => void;\n\ndeclare const effectVirtualTransitionEnd: (params: {\n  swiper: Swiper;\n  duration: number;\n  transformElements: HTMLElement[];\n  allSlides?: boolean;\n}) => void;\n\ndeclare const getSlideTransformEl: (slideEl: HTMLElement) => HTMLElement;\n\nexport { createShadow, effectInit, effectTarget, effectVirtualTransitionEnd, getSlideTransformEl };\n"
  },
  {
    "path": "src/swiper-effect-utils.mjs",
    "content": "import createShadow from './shared/create-shadow.mjs';\nimport effectInit from './shared/effect-init.mjs';\nimport effectTarget from './shared/effect-target.mjs';\nimport effectVirtualTransitionEnd from './shared/effect-virtual-transition-end.mjs';\nimport { getSlideTransformEl, getRotateFix } from './shared/utils.mjs';\n\nexport {\n  effectInit,\n  effectTarget,\n  effectVirtualTransitionEnd,\n  getSlideTransformEl,\n  createShadow,\n  getRotateFix,\n};\n"
  },
  {
    "path": "src/swiper-element.d.ts",
    "content": "// @ts-ignore\nimport { Swiper, SwiperOptions } from './types/index.d.ts';\n\ndeclare const register: () => void;\n\n// prettier-ignore\ninterface SwiperContainerEventMap extends Omit<HTMLElementEventMap, 'click' | 'progress' | 'keypress' | 'resize' | 'touchstart' | 'touchmove' | 'touchend' | 'transitionend' | 'transitionstart'> {\n  // CORE_EVENTS\n\n  // MODULES_EVENTS\n}\n\ninterface SwiperContainer extends HTMLElement {}\ninterface SwiperContainer extends SwiperOptions {\n  swiper: Swiper;\n  initialize: () => void;\n  injectStyles: string[];\n  injectStylesUrls: string[];\n  eventsPrefix: string;\n  addEventListener<K extends keyof SwiperContainerEventMap>(\n    type: K,\n    listener: (this: SwiperContainer, ev: SwiperContainerEventMap[K]) => any,\n    options?: boolean | AddEventListenerOptions,\n  ): void;\n  addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | AddEventListenerOptions,\n  ): void;\n  removeEventListener<K extends keyof SwiperContainerEventMap>(\n    type: K,\n    listener: (this: SwiperContainer, ev: SwiperContainerEventMap[K]) => any,\n    options?: boolean | EventListenerOptions,\n  ): void;\n  removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | EventListenerOptions,\n  ): void;\n}\n\ninterface SwiperSlide extends HTMLElement {\n  lazy: string | boolean;\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'swiper-container': SwiperContainer;\n    'swiper-slide': SwiperSlide;\n  }\n}\n\nexport { SwiperContainer, SwiperSlide, register };\n"
  },
  {
    "path": "src/swiper-element.mjs",
    "content": "/* eslint-disable spaced-comment */\nimport Swiper from './swiper.mjs';\nimport { paramsList } from './components-shared/params-list.mjs';\nimport { getParams } from './components-shared/get-element-params.mjs';\nimport {\n  needsScrollbar,\n  needsNavigation,\n  needsPagination,\n  attrToProp,\n} from './components-shared/utils.mjs';\nimport { updateSwiper } from './components-shared/update-swiper.mjs';\nimport { setInnerHTML } from './shared/utils.mjs';\n\n//SWIPER_STYLES\n//SWIPER_SLIDE_STYLES\n\nclass DummyHTMLElement {}\n\nconst ClassToExtend =\n  typeof window === 'undefined' || typeof HTMLElement === 'undefined'\n    ? DummyHTMLElement\n    : HTMLElement;\n\nconst addStyle = (shadowRoot, styles) => {\n  if (typeof CSSStyleSheet !== 'undefined' && shadowRoot.adoptedStyleSheets) {\n    const styleSheet = new CSSStyleSheet();\n    styleSheet.replaceSync(styles);\n    shadowRoot.adoptedStyleSheets = [styleSheet];\n  } else {\n    const style = document.createElement('style');\n    style.rel = 'stylesheet';\n    style.textContent = styles;\n    shadowRoot.appendChild(style);\n  }\n};\n\nclass SwiperContainer extends ClassToExtend {\n  constructor() {\n    super();\n\n    this.attachShadow({ mode: 'open' });\n  }\n\n  cssStyles() {\n    return [\n      SwiperCSS, // eslint-disable-line\n      ...(this.injectStyles && Array.isArray(this.injectStyles) ? this.injectStyles : []),\n    ].join('\\n');\n  }\n\n  cssLinks() {\n    return this.injectStylesUrls || [];\n  }\n\n  calcSlideSlots() {\n    const currentSideSlots = this.slideSlots || 0;\n    // slide slots\n    const slideSlotChildren = [...this.querySelectorAll(`[slot^=slide-]`)].map((child) => {\n      return parseInt(child.getAttribute('slot').split('slide-')[1], 10);\n    });\n    this.slideSlots = slideSlotChildren.length ? Math.max(...slideSlotChildren) + 1 : 0;\n    if (!this.rendered) return;\n    if (this.slideSlots > currentSideSlots) {\n      for (let i = currentSideSlots; i < this.slideSlots; i += 1) {\n        const slideEl = document.createElement('swiper-slide');\n        slideEl.setAttribute('part', `slide slide-${i + 1}`);\n        const slotEl = document.createElement('slot');\n        slotEl.setAttribute('name', `slide-${i + 1}`);\n        slideEl.appendChild(slotEl);\n        this.shadowRoot.querySelector('.swiper-wrapper').appendChild(slideEl);\n      }\n    } else if (this.slideSlots < currentSideSlots) {\n      const slides = this.swiper.slides;\n      for (let i = slides.length - 1; i >= 0; i -= 1) {\n        if (i > this.slideSlots) {\n          slides[i].remove();\n        }\n      }\n    }\n  }\n\n  render() {\n    if (this.rendered) return;\n\n    this.calcSlideSlots();\n\n    // local styles\n    let localStyles = this.cssStyles();\n    if (this.slideSlots > 0) {\n      localStyles = localStyles.replace(/::slotted\\(([a-z-0-9.]*)\\)/g, '$1');\n    }\n    if (localStyles.length) {\n      addStyle(this.shadowRoot, localStyles);\n    }\n\n    this.cssLinks().forEach((url) => {\n      const linkExists = this.shadowRoot.querySelector(`link[href=\"${url}\"]`);\n      if (linkExists) return;\n      const linkEl = document.createElement('link');\n      linkEl.rel = 'stylesheet';\n      linkEl.href = url;\n      this.shadowRoot.appendChild(linkEl);\n    });\n    // prettier-ignore\n    const el = document.createElement('div');\n    el.classList.add('swiper');\n    el.part = 'container';\n\n    // prettier-ignore\n    setInnerHTML(el, `\n      <slot name=\"container-start\"></slot>\n      <div class=\"swiper-wrapper\" part=\"wrapper\">\n        <slot></slot>\n        ${Array.from({length: this.slideSlots}).map((_, index) => `\n        <swiper-slide part=\"slide slide-${index}\">\n          <slot name=\"slide-${index}\"></slot>\n        </swiper-slide>\n        `).join('')}\n      </div>\n      <slot name=\"container-end\"></slot>\n      ${needsNavigation(this.passedParams) ? `\n        <div part=\"button-prev\" class=\"swiper-button-prev\"></div>\n        <div part=\"button-next\" class=\"swiper-button-next\"></div>\n      ` : ''}\n      ${needsPagination(this.passedParams) ? `\n        <div part=\"pagination\" class=\"swiper-pagination\"></div>\n      ` : ''}\n      ${needsScrollbar(this.passedParams) ? `\n        <div part=\"scrollbar\" class=\"swiper-scrollbar\"></div>\n      ` : ''}\n    `);\n    this.shadowRoot.appendChild(el);\n    this.rendered = true;\n  }\n\n  initialize() {\n    if (this.swiper && this.swiper.initialized) return;\n    const { params: swiperParams, passedParams } = getParams(this);\n    this.swiperParams = swiperParams;\n    this.passedParams = passedParams;\n    delete this.swiperParams.init;\n\n    this.render();\n\n    // eslint-disable-next-line\n    this.swiper = new Swiper(this.shadowRoot.querySelector('.swiper'), {\n      ...(swiperParams.virtual ? {} : { observer: true }),\n      ...swiperParams,\n      touchEventsTarget: 'container',\n      onAny: (name, ...args) => {\n        if (name === 'observerUpdate') {\n          this.calcSlideSlots();\n        }\n        const eventName = swiperParams.eventsPrefix\n          ? `${swiperParams.eventsPrefix}${name.toLowerCase()}`\n          : name.toLowerCase();\n        const event = new CustomEvent(eventName, {\n          detail: args,\n          bubbles: name !== 'hashChange',\n          cancelable: true,\n        });\n        this.dispatchEvent(event);\n      },\n    });\n  }\n\n  connectedCallback() {\n    if (\n      this.swiper &&\n      this.swiper.initialized &&\n      this.nested &&\n      this.closest('swiper-slide') &&\n      this.closest('swiper-slide').swiperLoopMoveDOM\n    ) {\n      return;\n    }\n    if (this.init === false || this.getAttribute('init') === 'false') {\n      return;\n    }\n    this.initialize();\n  }\n\n  disconnectedCallback() {\n    if (\n      this.nested &&\n      this.closest('swiper-slide') &&\n      this.closest('swiper-slide').swiperLoopMoveDOM\n    ) {\n      return;\n    }\n    if (this.swiper && this.swiper.destroy) {\n      this.swiper.destroy();\n    }\n  }\n\n  updateSwiperOnPropChange(propName, propValue) {\n    const { params: swiperParams, passedParams } = getParams(this, propName, propValue);\n    this.passedParams = passedParams;\n    this.swiperParams = swiperParams;\n    if (this.swiper && this.swiper.params[propName] === propValue) {\n      return;\n    }\n    updateSwiper({\n      swiper: this.swiper,\n      passedParams: this.passedParams,\n      changedParams: [attrToProp(propName)],\n      ...(propName === 'navigation' && passedParams[propName]\n        ? {\n            prevEl: '.swiper-button-prev',\n            nextEl: '.swiper-button-next',\n          }\n        : {}),\n      ...(propName === 'pagination' && passedParams[propName]\n        ? {\n            paginationEl: '.swiper-pagination',\n          }\n        : {}),\n      ...(propName === 'scrollbar' && passedParams[propName]\n        ? {\n            scrollbarEl: '.swiper-scrollbar',\n          }\n        : {}),\n    });\n  }\n\n  attributeChangedCallback(attr, prevValue, newValue) {\n    if (!(this.swiper && this.swiper.initialized)) return;\n    if (prevValue === 'true' && newValue === null) {\n      newValue = false;\n    }\n    this.updateSwiperOnPropChange(attr, newValue);\n  }\n\n  static get observedAttributes() {\n    const attrs = paramsList\n      .filter((param) => param.includes('_'))\n      .map((param) =>\n        param\n          .replace(/[A-Z]/g, (v) => `-${v}`)\n          .replace('_', '')\n          .toLowerCase(),\n      );\n    return attrs;\n  }\n}\n\nparamsList.forEach((paramName) => {\n  if (paramName === 'init') return;\n  paramName = paramName.replace('_', '');\n  Object.defineProperty(SwiperContainer.prototype, paramName, {\n    configurable: true,\n    get() {\n      return (this.passedParams || {})[paramName];\n    },\n    set(value) {\n      if (!this.passedParams) this.passedParams = {};\n      this.passedParams[paramName] = value;\n      if (!(this.swiper && this.swiper.initialized)) return;\n      this.updateSwiperOnPropChange(paramName, value);\n    },\n  });\n});\n\nclass SwiperSlide extends ClassToExtend {\n  constructor() {\n    super();\n    this.attachShadow({ mode: 'open' });\n  }\n\n  render() {\n    const lazy =\n      this.lazy || this.getAttribute('lazy') === '' || this.getAttribute('lazy') === 'true';\n    addStyle(this.shadowRoot, SwiperSlideCSS);\n    this.shadowRoot.appendChild(document.createElement('slot'));\n    if (lazy) {\n      const lazyDiv = document.createElement('div');\n      lazyDiv.classList.add('swiper-lazy-preloader');\n      lazyDiv.part.add('preloader');\n      this.shadowRoot.appendChild(lazyDiv);\n    }\n  }\n\n  initialize() {\n    this.render();\n  }\n\n  connectedCallback() {\n    if (this.swiperLoopMoveDOM) {\n      return;\n    }\n\n    this.initialize();\n  }\n}\n\n// eslint-disable-next-line\nconst register = () => {\n  if (typeof window === 'undefined') return;\n  if (!window.customElements.get('swiper-container'))\n    window.customElements.define('swiper-container', SwiperContainer);\n  if (!window.customElements.get('swiper-slide'))\n    window.customElements.define('swiper-slide', SwiperSlide);\n};\n\nif (typeof window !== 'undefined') {\n  window.SwiperElementRegisterParams = (params) => {\n    paramsList.push(...params);\n  };\n}\n\n//BROWSER_REGISTER\n\nexport { SwiperContainer, SwiperSlide, register };\n"
  },
  {
    "path": "src/swiper-react.d.ts",
    "content": "import * as React from 'react';\n\nimport type { SwiperOptions, Swiper as SwiperClass } from './types/index.d.ts';\n\ntype SwiperProps = Omit<\n  React.HTMLAttributes<HTMLElement>,\n  | 'onProgress'\n  | 'onClick'\n  | 'onTouchEnd'\n  | 'onTouchMove'\n  | 'onTouchStart'\n  | 'onTransitionEnd'\n  | 'onKeyPress'\n  | 'onDoubleClick'\n  | 'onScroll'\n  | 'onResize'\n> &\n  SwiperOptions & {\n    /**\n     * Swiper container tag\n     *\n     * @default 'div'\n     */\n    tag?: string;\n\n    /**\n     * Swiper wrapper tag\n     *\n     * @default 'div'\n     */\n    wrapperTag?: string;\n\n    /**\n     * Get Swiper instance\n     */\n    onSwiper?: (swiper: SwiperClass) => void;\n\n    // CORE_EVENTS\n    // MODULES_EVENTS\n  };\n\ninterface SlideData {\n  isActive: boolean;\n  isVisible: boolean;\n  isPrev: boolean;\n  isNext: boolean;\n}\n\ntype SwiperSlideProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {\n  /**\n   * Slide tag\n   *\n   * @default 'div'\n   */\n  tag?: string;\n\n  /**\n   * Enables additional wrapper required for zoom mode\n   *\n   * @default false\n   */\n  zoom?: boolean;\n\n  /**\n   * Adds lazy preloader to the slide\n   *\n   * @default false\n   */\n  lazy?: boolean;\n\n  /**\n   * Slide's index in slides array/collection\n   *\n   * @default false\n   */\n  virtualIndex?: number;\n\n  /**\n   * Slide's child element or render function\n   *\n   * @default undefined\n   */\n  children?: React.ReactNode | ((slideData: SlideData) => React.ReactNode);\n};\n\ninterface SwiperRef extends React.HTMLAttributes<HTMLElement> {\n  swiper: SwiperClass;\n}\n\ndeclare const Swiper: React.FunctionComponent<\n  React.RefAttributes<SwiperRef> & React.PropsWithChildren<SwiperProps>\n>;\ndeclare const SwiperSlide: React.FunctionComponent<SwiperSlideProps>;\n\ndeclare const useSwiper: () => SwiperClass;\ndeclare const useSwiperSlide: () => SlideData;\n\nexport {\n  Swiper,\n  SwiperSlide,\n  SwiperProps,\n  SwiperSlideProps,\n  SwiperRef,\n  useSwiper,\n  useSwiperSlide,\n  SwiperClass,\n};\n"
  },
  {
    "path": "src/swiper-react.mjs",
    "content": "import { Swiper } from './react/swiper.mjs';\nimport { SwiperSlide } from './react/swiper-slide.mjs';\n\nexport { useSwiperSlide, useSwiper } from './react/context.mjs';\n\nexport { Swiper, SwiperSlide };\n"
  },
  {
    "path": "src/swiper-vars.less",
    "content": "@themeColor: #007aff;\n"
  },
  {
    "path": "src/swiper-vue.d.ts",
    "content": "import type {\n  A11yOptions,\n  AutoplayOptions,\n  ControllerOptions,\n  CoverflowEffectOptions,\n  CubeEffectOptions,\n  FadeEffectOptions,\n  FlipEffectOptions,\n  CreativeEffectOptions,\n  CardsEffectOptions,\n  HashNavigationOptions,\n  HistoryOptions,\n  KeyboardOptions,\n  MousewheelOptions,\n  NavigationOptions,\n  PaginationOptions,\n  ParallaxOptions,\n  ScrollbarOptions,\n  ThumbsOptions,\n  VirtualOptions,\n  ZoomOptions,\n  FreeModeOptions,\n  GridOptions,\n} from './types/index.d.ts';\nimport { ComponentOptionsMixin, DefineComponent, PropType, Ref } from 'vue';\nimport type { SwiperOptions, Swiper as SwiperClass } from './types/index.d.ts';\n\ndeclare const Swiper: DefineComponent<\n  {\n    tag: {\n      type: StringConstructor;\n      default: string;\n    };\n    wrapperTag: {\n      type: StringConstructor;\n      default: string;\n    };\n    modules: {\n      type: ArrayConstructor;\n      default: undefined;\n    };\n    init: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    direction: {\n      type: PropType<SwiperOptions['direction']>;\n      default: SwiperOptions['direction'];\n    };\n    oneWayMovement: {\n      type: PropType<SwiperOptions['oneWayMovement']>;\n      default: SwiperOptions['oneWayMovement'];\n    };\n    swiperElementNodeName: {\n      type: PropType<SwiperOptions['swiperElementNodeName']>;\n      default: SwiperOptions['swiperElementNodeName'];\n    };\n    touchEventsTarget: {\n      type: PropType<SwiperOptions['touchEventsTarget']>;\n      default: undefined;\n    };\n    initialSlide: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    speed: { type: NumberConstructor; default: undefined };\n    cssMode: { type: BooleanConstructor; default: undefined };\n    updateOnWindowResize: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    resizeObserver: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    nested: { type: BooleanConstructor; default: undefined };\n    focusableElements: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    width: { type: NumberConstructor; default: undefined };\n    height: { type: NumberConstructor; default: undefined };\n    preventInteractionOnTransition: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    userAgent: { type: StringConstructor; default: undefined };\n    url: { type: StringConstructor; default: undefined };\n    edgeSwipeDetection: {\n      type: BooleanConstructor | StringConstructor;\n      default: undefined;\n    };\n    edgeSwipeThreshold: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    autoHeight: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    setWrapperSize: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    virtualTranslate: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    effect: {\n      type: PropType<SwiperOptions['effect']>;\n      default: undefined;\n    };\n    breakpoints: {\n      type: PropType<SwiperOptions['breakpoints']>;\n      default: undefined;\n    };\n    spaceBetween: {\n      type: PropType<SwiperOptions['spaceBetween']>;\n      default: undefined;\n    };\n    slidesPerView: {\n      type: PropType<SwiperOptions['slidesPerView']>;\n      default: undefined;\n    };\n    maxBackfaceHiddenSlides: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    slidesPerGroup: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    slidesPerGroupSkip: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    slidesPerGroupAuto: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    centeredSlides: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    centeredSlidesBounds: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    slidesOffsetBefore: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    slidesOffsetAfter: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    normalizeSlideIndex: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    centerInsufficientSlides: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    snapToSlideEdge: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    watchOverflow: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    roundLengths: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    touchRatio: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    touchAngle: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    simulateTouch: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    shortSwipes: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    longSwipes: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    longSwipesRatio: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    longSwipesMs: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    followFinger: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    allowTouchMove: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    threshold: { type: NumberConstructor; default: undefined };\n    touchMoveStopPropagation: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    touchStartPreventDefault: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    touchStartForcePreventDefault: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    touchReleaseOnEdges: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    uniqueNavElements: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    resistance: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    resistanceRatio: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    watchSlidesProgress: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    grabCursor: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    preventClicks: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    preventClicksPropagation: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    slideToClickedSlide: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    loop: { type: BooleanConstructor; default: undefined };\n    loopAddBlankSlides: { type: BooleanConstructor; default: undefined };\n    loopAdditionalSlides: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    loopPreventsSliding: { type: BooleanConstructor; default: undefined };\n    rewind: { type: BooleanConstructor; default: undefined };\n    allowSlidePrev: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    allowSlideNext: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    swipeHandler: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    noSwiping: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    noSwipingClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    noSwipingSelector: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    passiveListeners: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    containerModifierClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideActiveClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideVisibleClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideFullyVisibleClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideBlankClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slideNextClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    slidePrevClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    wrapperClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    lazyPreloaderClass: {\n      type: StringConstructor;\n      default: undefined;\n    };\n    lazyPreloadPrevNext: {\n      type: NumberConstructor;\n      default: undefined;\n    };\n    runCallbacksOnInit: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    observer: { type: BooleanConstructor; default: undefined };\n    observeParents: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    observeSlideChildren: {\n      type: BooleanConstructor;\n      default: undefined;\n    };\n    a11y: {\n      type: PropType<A11yOptions | boolean>;\n      default: undefined;\n    };\n    autoplay: {\n      type: PropType<AutoplayOptions | boolean>;\n      default: undefined;\n    };\n    controller: {\n      type: PropType<ControllerOptions>;\n      default: undefined;\n    };\n    coverflowEffect: {\n      type: PropType<CoverflowEffectOptions>;\n      default: undefined;\n    };\n    cubeEffect: {\n      type: PropType<CubeEffectOptions>;\n      default: undefined;\n    };\n    fadeEffect: {\n      type: PropType<FadeEffectOptions>;\n      default: undefined;\n    };\n    flipEffect: {\n      type: PropType<FlipEffectOptions>;\n      default: undefined;\n    };\n    creativeEffect: {\n      type: PropType<CreativeEffectOptions>;\n      default: undefined;\n    };\n    cardsEffect: {\n      type: PropType<CardsEffectOptions>;\n      default: undefined;\n    };\n    hashNavigation: {\n      type: PropType<HashNavigationOptions | boolean>;\n      default: undefined;\n    };\n    history: {\n      type: PropType<HistoryOptions | boolean>;\n      default: undefined;\n    };\n    keyboard: {\n      type: PropType<KeyboardOptions | boolean>;\n      default: undefined;\n    };\n    mousewheel: {\n      type: PropType<MousewheelOptions | boolean>;\n      default: undefined;\n    };\n    navigation: {\n      type: PropType<NavigationOptions | boolean>;\n      default: undefined;\n    };\n    pagination: {\n      type: PropType<PaginationOptions | boolean>;\n      default: undefined;\n    };\n    parallax: {\n      type: PropType<ParallaxOptions | boolean>;\n      default: undefined;\n    };\n    scrollbar: {\n      type: PropType<ScrollbarOptions | boolean>;\n      default: undefined;\n    };\n    thumbs: { type: PropType<ThumbsOptions>; default: undefined };\n    virtual: {\n      type: PropType<VirtualOptions | boolean>;\n      default: undefined;\n    };\n    zoom: {\n      type: PropType<ZoomOptions | boolean>;\n      default: undefined;\n    };\n    freeMode: {\n      type: PropType<FreeModeOptions | boolean>;\n      default: undefined;\n    };\n    grid: {\n      type: PropType<GridOptions>;\n      default: undefined;\n    };\n  },\n  () => JSX.Element,\n  unknown,\n  {},\n  {},\n  ComponentOptionsMixin,\n  ComponentOptionsMixin,\n  {\n    swiper: (swiper: SwiperClass) => void;\n    // CORE_EVENTS\n    // MODULES_EVENTS\n  }\n>;\n\ndeclare const SwiperSlide: DefineComponent<{\n  tag: {\n    type: StringConstructor;\n    default: string;\n  };\n  swiperRef: { type: PropType<SwiperClass>; required: false };\n  lazy: { type: BooleanConstructor; default: false };\n  zoom: { type: BooleanConstructor; default: undefined };\n  virtualIndex: {\n    type: StringConstructor | NumberConstructor;\n    default: undefined;\n  };\n}>;\n\ndeclare const useSwiper: () => Ref<SwiperClass>;\ndeclare const useSwiperSlide: () => Ref<{\n  isActive: boolean;\n  isVisible: boolean;\n  isPrev: boolean;\n  isNext: boolean;\n}>;\n\nexport { Swiper, SwiperSlide, useSwiper, useSwiperSlide };\n"
  },
  {
    "path": "src/swiper-vue.mjs",
    "content": "import { Swiper } from './vue/swiper.mjs';\nimport { SwiperSlide } from './vue/swiper-slide.mjs';\n\nexport { useSwiperSlide, useSwiper } from './vue/context.mjs';\n\nexport { Swiper, SwiperSlide };\n"
  },
  {
    "path": "src/swiper.css",
    "content": ":root {\n  --swiper-theme-color: #007aff;\n  /*\n  --swiper-preloader-color: var(--swiper-theme-color);\n  --swiper-wrapper-transition-timing-function: initial;\n  */\n}\n:host {\n  position: relative;\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n  z-index: 1;\n}\n.swiper {\n  margin-left: auto;\n  margin-right: auto;\n  position: relative;\n  overflow: hidden;\n  list-style: none;\n  padding: 0;\n  /* Fix of Webkit flickering */\n  z-index: 1;\n  display: block;\n}\n.swiper-vertical > .swiper-wrapper {\n  flex-direction: column;\n}\n.swiper-wrapper {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  z-index: 1;\n  display: flex;\n  transition-property: transform;\n  transition-timing-function: var(--swiper-wrapper-transition-timing-function, initial);\n  box-sizing: content-box;\n}\n.swiper-android .swiper-slide,\n.swiper-ios .swiper-slide,\n.swiper-wrapper {\n  transform: translate3d(0px, 0, 0);\n}\n.swiper-horizontal {\n  touch-action: pan-y;\n}\n.swiper-vertical {\n  touch-action: pan-x;\n}\n.swiper-slide {\n  flex-shrink: 0;\n  width: 100%;\n  height: 100%;\n  position: relative;\n  transition-property: transform;\n  display: block;\n}\n.swiper-slide-invisible-blank {\n  visibility: hidden;\n}\n/* Auto Height */\n.swiper-autoheight,\n.swiper-autoheight .swiper-slide {\n  height: auto;\n}\n.swiper-autoheight .swiper-wrapper {\n  align-items: flex-start;\n  transition-property: transform, height;\n}\n.swiper-backface-hidden .swiper-slide {\n  transform: translateZ(0);\n  backface-visibility: hidden;\n}\n/* 3D Effects */\n.swiper-3d.swiper-css-mode .swiper-wrapper {\n  perspective: 1200px;\n}\n.swiper-3d .swiper-wrapper {\n  transform-style: preserve-3d;\n}\n.swiper-3d {\n  perspective: 1200px;\n  .swiper-slide,\n  .swiper-cube-shadow {\n    transform-style: preserve-3d;\n  }\n}\n\n/* CSS Mode */\n.swiper-css-mode {\n  > .swiper-wrapper {\n    overflow: auto;\n    scrollbar-width: none; /* For Firefox */\n    -ms-overflow-style: none; /* For Internet Explorer and Edge */\n    &::-webkit-scrollbar {\n      display: none;\n    }\n  }\n  > .swiper-wrapper > .swiper-slide {\n    scroll-snap-align: start start;\n  }\n  &.swiper-horizontal {\n    > .swiper-wrapper {\n      scroll-snap-type: x mandatory;\n    }\n    > .swiper-wrapper > .swiper-slide:first-child {\n      margin-inline-start: var(--swiper-slides-offset-before);\n      scroll-margin-inline-start: var(--swiper-slides-offset-before);\n    }\n    > .swiper-wrapper > .swiper-slide:last-child {\n      margin-inline-end: var(--swiper-slides-offset-after);\n    }\n  }\n  &.swiper-vertical {\n    > .swiper-wrapper {\n      scroll-snap-type: y mandatory;\n    }\n    > .swiper-wrapper > .swiper-slide:first-child {\n      margin-block-start: var(--swiper-slides-offset-before);\n      scroll-margin-block-start: var(--swiper-slides-offset-before);\n    }\n    > .swiper-wrapper > .swiper-slide:last-child {\n      margin-block-end: var(--swiper-slides-offset-after);\n    }\n  }\n  &.swiper-free-mode {\n    > .swiper-wrapper {\n      scroll-snap-type: none;\n    }\n    > .swiper-wrapper > .swiper-slide {\n      scroll-snap-align: none;\n    }\n  }\n  &.swiper-centered {\n    > .swiper-wrapper::before {\n      content: '';\n      flex-shrink: 0;\n      order: 9999;\n    }\n    > .swiper-wrapper > .swiper-slide {\n      scroll-snap-align: center center;\n      scroll-snap-stop: always;\n    }\n  }\n  &.swiper-centered.swiper-horizontal {\n    > .swiper-wrapper > .swiper-slide:first-child {\n      margin-inline-start: var(--swiper-centered-offset-before);\n    }\n    > .swiper-wrapper::before {\n      height: 100%;\n      min-height: 1px;\n      width: var(--swiper-centered-offset-after);\n    }\n  }\n  &.swiper-centered.swiper-vertical {\n    > .swiper-wrapper > .swiper-slide:first-child {\n      margin-block-start: var(--swiper-centered-offset-before);\n    }\n    > .swiper-wrapper::before {\n      width: 100%;\n      min-width: 1px;\n      height: var(--swiper-centered-offset-after);\n    }\n  }\n}\n\n/* Slide styles start */\n/* 3D Shadows */\n.swiper-3d {\n  .swiper-slide-shadow,\n  .swiper-slide-shadow-left,\n  .swiper-slide-shadow-right,\n  .swiper-slide-shadow-top,\n  .swiper-slide-shadow-bottom,\n  .swiper-slide-shadow,\n  .swiper-slide-shadow-left,\n  .swiper-slide-shadow-right,\n  .swiper-slide-shadow-top,\n  .swiper-slide-shadow-bottom {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    pointer-events: none;\n    z-index: 10;\n  }\n  .swiper-slide-shadow {\n    background: rgba(0, 0, 0, 0.15);\n  }\n  .swiper-slide-shadow-left {\n    background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\n  }\n  .swiper-slide-shadow-right {\n    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\n  }\n  .swiper-slide-shadow-top {\n    background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\n  }\n  .swiper-slide-shadow-bottom {\n    background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));\n  }\n}\n.swiper-lazy-preloader {\n  width: 42px;\n  height: 42px;\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  margin-left: -21px;\n  margin-top: -21px;\n  z-index: 10;\n  transform-origin: 50%;\n  box-sizing: border-box;\n  border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color));\n  border-radius: 50%;\n  border-top-color: transparent;\n}\n.swiper:not(.swiper-watch-progress),\n.swiper-watch-progress .swiper-slide-visible {\n  .swiper-lazy-preloader {\n    animation: swiper-preloader-spin 1s infinite linear;\n  }\n}\n.swiper-lazy-preloader-white {\n  --swiper-preloader-color: #fff;\n}\n.swiper-lazy-preloader-black {\n  --swiper-preloader-color: #000;\n}\n@keyframes swiper-preloader-spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n/* Slide styles end */\n"
  },
  {
    "path": "src/swiper.d.ts",
    "content": "// @ts-ignore\nimport Swiper from './types/swiper-class.d.ts';\n\nexport default Swiper;\nexport { Swiper };\n"
  },
  {
    "path": "src/swiper.mjs",
    "content": "export { default as Swiper, default } from './core/core.mjs';\n"
  },
  {
    "path": "src/types/index.d.ts",
    "content": "// @ts-nocheck\nexport * from './shared.d.ts';\nexport { default as Swiper } from './swiper-class.d.ts';\nexport * from './swiper-events.d.ts';\nexport * from './swiper-options.d.ts';\nexport * from './modules/public-api.d.ts';\n"
  },
  {
    "path": "src/types/modules/a11y.d.ts",
    "content": "export interface A11yMethods {}\n\nexport interface A11yEvents {}\n\nexport interface A11yOptions {\n  /**\n   * Enables A11y\n   *\n   * @default true\n   */\n  enabled?: boolean;\n\n  /**\n   * Message for screen readers for previous button\n   *\n   * @default 'Previous slide'\n   */\n  prevSlideMessage?: string;\n\n  /**\n   * Message for screen readers for next button\n   *\n   * @default 'Next slide'\n   */\n  nextSlideMessage?: string;\n\n  /**\n   * Message for screen readers for previous button when swiper is on first slide\n   *\n   * @default 'This is the first slide'\n   */\n  firstSlideMessage?: string;\n\n  /**\n   * Message for screen readers for next button when swiper is on last slide\n   *\n   * @default 'This is the last slide'\n   */\n  lastSlideMessage?: string;\n\n  /**\n   * Message for screen readers for single pagination bullet\n   *\n   * @default 'Go to slide {{index}}'\n   */\n  paginationBulletMessage?: string;\n\n  /**\n   * CSS class name of A11y notification\n   *\n   * @default 'swiper-notification'\n   */\n  notificationClass?: string;\n\n  /**\n   * Message for screen readers for outer swiper container\n   *\n   * @default null\n   */\n  containerMessage?: string | null;\n\n  /**\n   * Message for screen readers describing the role of outer swiper container\n   *\n   * @default null\n   */\n  containerRoleDescriptionMessage?: string | null;\n\n  /**\n   * Value of the \"role\" attribute to be set on the swiper container\n   *\n   * @default null\n   */\n  containerRole?: string | null;\n\n  /**\n   * Message for screen readers describing the role of slide element\n   *\n   * @default null\n   */\n  itemRoleDescriptionMessage?: string | null;\n\n  /**\n   * Message for screen readers describing the label of slide element\n   *\n   * @default '{{index}} / {{slidesLength}}'\n   */\n  slideLabelMessage?: string;\n\n  /**\n   * Value of swiper slide `role` attribute\n   *\n   * @default 'group'\n   */\n  slideRole?: string;\n\n  /**\n   * Value of `id` attribute to be set on swiper-wrapper. If `null` will be generated automatically\n   *\n   * @default null\n   */\n  id?: string | number | null;\n\n  /**\n   * Enables scrolling to the slide that has been focused\n   *\n   * @default true\n   */\n  scrollOnFocus?: boolean;\n  /**\n   * Whether or not the swiper-wrapper should have the `aria-live` attribute applied to it.\n   * If true, the value will be `off` when autoplay is enabled, otherwise it will be `polite`\n   *\n   * @default true\n   */\n  wrapperLiveRegion?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/autoplay.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface AutoplayMethods {\n  /**\n   * Whether autoplay enabled and running\n   */\n  running: boolean;\n\n  /**\n   * Whether autoplay is paused\n   */\n  paused: boolean;\n\n  /**\n   * If autoplay is paused, it contains time left (in ms) before transition to next slide\n   */\n  timeLeft: number;\n\n  /**\n   * Pause autoplay\n   */\n  pause(): void;\n\n  /**\n   * Resume autoplay\n   */\n  resume(): void;\n\n  /**\n   * Start autoplay\n   */\n  start(): boolean;\n\n  /**\n   * Stop autoplay\n   */\n  stop(): boolean;\n}\n\nexport interface AutoplayEvents {\n  /**\n   * Event will be fired in when autoplay started\n   */\n  autoplayStart: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when autoplay stopped\n   */\n  autoplayStop: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on autoplay pause\n   */\n  autoplayPause: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on autoplay resume\n   */\n  autoplayResume: (swiper: Swiper) => void;\n  /**\n   * Event triggers continuously while autoplay is enabled. It contains time left (in ms) before transition to next slide and percentage of that time related to autoplay delay\n   */\n  autoplayTimeLeft: (swiper: Swiper, timeLeft: number, percentage: number) => void;\n  /**\n   * Event will be fired when slide changed with autoplay\n   */\n  autoplay: (swiper: Swiper) => void;\n}\n\n/**\n * Object with autoplay parameters or boolean `true` to enable with default settings.\n *\n * @example\n * ```js\n * const swiper = new Swiper('.swiper', {\n *   autoplay: {\n *     delay: 5000,\n *   },\n * });\n * ```\n */\nexport interface AutoplayOptions {\n  /**\n   * Delay between transitions (in ms). If this parameter is not specified, auto play will be disabled\n   *\n   * If you need to specify different delay for specific slides you can do it by using\n   * `data-swiper-autoplay` (in ms) attribute on slide.\n   *\n   * @example\n   * ```html\n   * <!-- hold this slide for 2 seconds -->\n   * <div class=\"swiper-slide\" data-swiper-autoplay=\"2000\">\n   * ```\n   *\n   * @default 3000\n   */\n  delay?: number;\n\n  /**\n   * Enable this parameter and autoplay will be stopped when it reaches last slide (has no effect in loop mode)\n   *\n   * @default false\n   */\n  stopOnLastSlide?: boolean;\n\n  /**\n   * Set to `false` and autoplay will not be disabled after user interactions (swipes),\n   * it will be restarted every time after interaction\n   *\n   * @default true\n   */\n  disableOnInteraction?: boolean;\n\n  /**\n   * Enables autoplay in reverse direction\n   *\n   * @default false\n   */\n  reverseDirection?: boolean;\n\n  /**\n   * When enabled autoplay will wait for wrapper transition to continue.\n   * Can be disabled in case of using Virtual Translate when your\n   * slider may not have transition\n   *\n   * @default true\n   */\n  waitForTransition?: boolean;\n\n  /**\n   * When enabled autoplay will be paused on pointer (mouse) enter over Swiper container.\n   *\n   * @default false\n   */\n  pauseOnMouseEnter?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/controller.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface ControllerMethods {\n  /**\n   * Pass here another Swiper instance or array with Swiper instances that should be controlled\n   * by this Swiper\n   */\n  control?: Swiper | Swiper[];\n}\n\nexport interface ControllerEvents {}\n\nexport interface ControllerOptions {\n  /**\n   * Pass here another Swiper instance or array with Swiper instances that should be controlled\n   * by this Swiper. Also accepts string with CSS selector of Swiper element, or HTMLElement of Swiper element\n   */\n  control?: Swiper | Swiper[] | string | HTMLElement | null;\n\n  /**\n   * Set to `true` and controlling will be in inverse direction\n   *\n   * @default false\n   */\n  inverse?: boolean;\n\n  /**\n   * Defines a way how to control another slider: slide by slide\n   * (with respect to other slider's grid) or depending on all slides/container\n   * (depending on total slider percentage).\n   *\n   * @default 'slide'\n   */\n  by?: 'slide' | 'container';\n}\n"
  },
  {
    "path": "src/types/modules/effect-cards.d.ts",
    "content": "export interface CardsEffectMethods {}\n\nexport interface CardsEffectEvents {}\n\nexport interface CardsEffectOptions {\n  /**\n   * Enables slides shadows\n   *\n   * @default true\n   */\n  slideShadows?: boolean;\n\n  /**\n   * Enables cards rotation\n   *\n   * @default true\n   */\n  rotate?: boolean;\n\n  /**\n   * Rotate angle per slide (in degrees)\n   *\n   * @default 2\n   */\n  perSlideRotate?: number;\n\n  /**\n   * Offset distance per slide (in px)\n   *\n   * @default 8\n   */\n  perSlideOffset?: number;\n}\n"
  },
  {
    "path": "src/types/modules/effect-coverflow.d.ts",
    "content": "export interface CoverflowEffectMethods {}\n\nexport interface CoverflowEffectEvents {}\n\nexport interface CoverflowEffectOptions {\n  /**\n   * Enables slides shadows\n   *\n   * @default true\n   */\n  slideShadows?: boolean;\n  /**\n   * Slide rotate in degrees\n   *\n   * @default 50\n   */\n  rotate?: number;\n  /**\n   * Stretch space between slides\n   *\n   * - a number is interpreted as pixels (e.g., `20` for 20px).\n   * - a string with a percentage (e.g., `\"50%\"`).\n   *\n   * @default 0\n   */\n  stretch?: number | `${number}%`;\n  /**\n   * Depth offset in px (slides translate in Z axis)\n   *\n   * @default 100\n   */\n  depth?: number;\n  /**\n   * Slide scale effect\n   *\n   * @default 1\n   */\n  scale?: number;\n  /**\n   * Effect multiplier\n   *\n   * @default 1\n   */\n  modifier?: number;\n}\n"
  },
  {
    "path": "src/types/modules/effect-creative.d.ts",
    "content": "interface CreativeEffectTransform {\n  translate?: (string | number)[];\n  rotate?: number[];\n  opacity?: number;\n  scale?: number;\n  shadow?: boolean;\n  origin?: string;\n}\n\nexport interface CreativeEffectMethods {}\n\nexport interface CreativeEffectEvents {}\n\nexport interface CreativeEffectOptions {\n  /**\n   * Previous slide transformations. Accepts object of the following type:\n   *\n   * @example\n   * ```js\n   * {\n   *   // Array with translate X, Y and Z values\n   *   translate: (string | number)[];\n   *   // Array with rotate X, Y and Z values (in deg)\n   *   rotate?: number[];\n   *   // Slide opacity\n   *   opacity?: number;\n   *   // Slide scale\n   *   scale?: number;\n   *   // Enables slide shadow\n   *   shadow?: boolean;\n   *   // Transform origin, e.g. `left bottom`\n   *   origin?: string;\n   * }\n   * ```\n   *\n   */\n  prev?: CreativeEffectTransform;\n  /**\n   * Next slide transformations.\n   *\n   * @example\n   * ```js\n   * {\n   *   // Array with translate X, Y and Z values\n   *   translate: (string | number)[];\n   *   // Array with rotate X, Y and Z values (in deg)\n   *   rotate?: number[];\n   *   // Slide opacity\n   *   opacity?: number;\n   *   // Slide scale\n   *   scale?: number;\n   *   // Enables slide shadow\n   *   shadow?: boolean;\n   *   // Transform origin, e.g. `left bottom`\n   *   origin?: string;\n   * }\n   * ```\n   *\n   */\n  next?: CreativeEffectTransform;\n\n  /**\n   * Limit progress/offset to amount of side slides. If `1`, then slides all slides after prev/next will have same state. If `2`, then all slides after 2nd before/after active will have same state, etc.\n   *\n   * @default 1\n   */\n  limitProgress?: number;\n  /**\n   * Splits shadow \"opacity\" per slide based on `limitProgress` (only if transformation shadows enabled). E.g. setting `limitProgress: 2` and enabling `shadowPerProgress`, will set shadow opacity to `0.5` and `1` on two slides next to active. With this parameter disabled, all slides beside active will have shadow with `1` opacity\n   *\n   * @default false\n   */\n  shadowPerProgress?: boolean;\n  /**\n   * Allows to multiply slides transformations and opacity.\n   *\n   * @default 1\n   */\n  progressMultiplier?: number;\n  /**\n   * Enable this parameter if your custom transforms require 3D transformations (`translateZ`, `rotateX`, `rotateY` )\n   *\n   * @default true\n   */\n  perspective?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/effect-cube.d.ts",
    "content": "export interface CubeEffectMethods {}\n\nexport interface CubeEffectEvents {}\n\nexport interface CubeEffectOptions {\n  /**\n   * Enables slides shadows\n   *\n   * @default true\n   */\n  slideShadows?: boolean;\n  /**\n   * Enables main slider shadow\n   *\n   * @default true\n   */\n  shadow?: boolean;\n  /**\n   * Main shadow offset in px\n   *\n   * @default 20\n   */\n  shadowOffset?: number;\n  /**\n   * Main shadow scale ratio\n   *\n   * @default 0.94\n   */\n  shadowScale?: number;\n}\n"
  },
  {
    "path": "src/types/modules/effect-fade.d.ts",
    "content": "export interface FadeEffectMethods {}\n\nexport interface FadeEffectEvents {}\n\nexport interface FadeEffectOptions {\n  /**\n   * Enables slides cross fade\n   *\n   * @default false\n   */\n  crossFade?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/effect-flip.d.ts",
    "content": "export interface FlipEffectMethods {}\n\nexport interface FlipEffectEvents {}\n\nexport interface FlipEffectOptions {\n  /**\n   * Enables slides shadows\n   *\n   * @default true\n   */\n  slideShadows?: boolean;\n  /**\n   * Limit edge slides rotation\n   *\n   * @default true\n   */\n  limitRotation?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/free-mode.d.ts",
    "content": "export interface FreeModeMethods {\n  onTouchMove(): void;\n  onTouchEnd(): void;\n}\n\nexport interface FreeModeEvents {}\n\nexport interface FreeModeOptions {\n  /**\n   * Whether the free mode is enabled\n   *\n   * @default false\n   */\n  enabled?: boolean;\n\n  /**\n   * If enabled, then slide will keep moving for a while after you release it\n   *\n   * @default true\n   */\n  momentum?: boolean;\n\n  /**\n   * Higher value produces larger momentum distance after you release slider\n   *\n   * @default 1\n   */\n  momentumRatio?: number;\n\n  /**\n   * Higher value produces larger momentum velocity after you release slider\n   *\n   * @default 1\n   */\n  momentumVelocityRatio?: number;\n\n  /**\n   * Set to `false` if you want to disable momentum bounce in free mode\n   *\n   * @default true\n   */\n  momentumBounce?: boolean;\n\n  /**\n   * Higher value produces larger momentum bounce effect\n   *\n   * @default 1\n   */\n  momentumBounceRatio?: number;\n\n  /**\n   * Minimum touchmove-velocity required to trigger free mode momentum\n   *\n   * @default 0.02\n   */\n  minimumVelocity?: number;\n\n  /**\n   * Set to enabled to enable snap to slides positions in free mode\n   *\n   * @default false\n   */\n  sticky?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/grid.d.ts",
    "content": "export interface GridMethods {}\n\nexport interface GridEvents {}\n\nexport interface GridOptions {\n  /**\n   * Number of slides rows, for multirow layout\n   *\n   * @default 1\n   */\n  rows?: number;\n\n  /**\n   * Can be `'column'` or `'row'`. Defines how slides should fill rows, by column or by row\n   *\n   * @note if used with loop mode make sure number of slides is even specified in loop mode requirements, or enable `loopAddBlankSlides` parameter\n   *\n   * @default 'column'\n   */\n  fill?: 'row' | 'column';\n}\n"
  },
  {
    "path": "src/types/modules/hash-navigation.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface HashNavigationMethods {}\n\nexport interface HashNavigationEvents {\n  /**\n   * Event will be fired on window hash change\n   */\n  hashChange: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when swiper updates the hash\n   */\n  hashSet: (swiper: Swiper) => void;\n}\n\nexport interface HashNavigationOptions {\n  /**\n   * Set to `true` to enable also navigation through slides (when hashnav\n   * is enabled) by browser history or by setting directly hash on document location\n   *\n   * @default false\n   */\n  watchState?: boolean;\n\n  /**\n   * Works in addition to hashnav to replace current url state with the\n   * new one instead of adding it to history\n   *\n   * @default     false\n   */\n  replaceState?: boolean;\n\n  /**\n   * Designed to be used with Virtual slides when it is impossible to find slide in DOM by hash (e.g. not yet rendered)\n   *\n   */\n  getSlideIndex?: (swiper: Swiper, hash: string) => number;\n}\n"
  },
  {
    "path": "src/types/modules/history.d.ts",
    "content": "export interface HistoryMethods {}\n\nexport interface HistoryEvents {}\n\nexport interface HistoryOptions {\n  /**\n   * Enables History Plugin.\n   *\n   * @default false\n   */\n  enabled?: boolean;\n\n  /**\n   * Swiper page root, useful to specify when you use Swiper history mode not on root website page.\n   * For example can be `https://my-website.com/` or `https://my-website.com/subpage/` or `/subpage/`\n   *\n   *\n   * @default ''\n   */\n  root?: string;\n\n  /**\n   * Works in addition to hashnav or history to replace current url state with the\n   * new one instead of adding it to history\n   *\n   * @default false\n   */\n  replaceState?: boolean;\n\n  /**\n   * Url key for slides\n   *\n   * @default 'slides'\n   */\n  key?: string;\n\n  /**\n   * Keep query parameters when changing browser url.\n   *\n   * @default false\n   */\n  keepQuery?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/index.d.ts",
    "content": "import type { SwiperModule } from '../shared.d.ts';\n\ndeclare const A11y: SwiperModule;\ndeclare const Autoplay: SwiperModule;\ndeclare const Controller: SwiperModule;\ndeclare const EffectCoverflow: SwiperModule;\ndeclare const EffectCube: SwiperModule;\ndeclare const EffectFade: SwiperModule;\ndeclare const EffectFlip: SwiperModule;\ndeclare const EffectCreative: SwiperModule;\ndeclare const EffectCards: SwiperModule;\ndeclare const HashNavigation: SwiperModule;\ndeclare const History: SwiperModule;\ndeclare const Keyboard: SwiperModule;\ndeclare const Mousewheel: SwiperModule;\ndeclare const Navigation: SwiperModule;\ndeclare const Pagination: SwiperModule;\ndeclare const Parallax: SwiperModule;\ndeclare const Scrollbar: SwiperModule;\ndeclare const Thumbs: SwiperModule;\ndeclare const Virtual: SwiperModule;\ndeclare const Zoom: SwiperModule;\ndeclare const FreeMode: SwiperModule;\ndeclare const Grid: SwiperModule;\ndeclare const Manipulation: SwiperModule;\n\nexport {\n  A11y,\n  Autoplay,\n  Controller,\n  EffectCoverflow,\n  EffectCube,\n  EffectFade,\n  EffectFlip,\n  EffectCreative,\n  EffectCards,\n  HashNavigation,\n  History,\n  Keyboard,\n  Mousewheel,\n  Navigation,\n  Pagination,\n  Parallax,\n  Scrollbar,\n  Thumbs,\n  Virtual,\n  Zoom,\n  FreeMode,\n  Grid,\n  Manipulation,\n};\n"
  },
  {
    "path": "src/types/modules/keyboard.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface KeyboardMethods {\n  /**\n   * Whether the keyboard control is enabled\n   */\n  enabled: boolean;\n\n  /**\n   * Enable keyboard control\n   */\n  enable(): void;\n\n  /**\n   * Disable keyboard control\n   */\n  disable(): void;\n}\n\nexport interface KeyboardEvents {\n  /**\n   * Event will be fired on key press\n   */\n  keyPress: (swiper: Swiper, keyCode: string) => void;\n}\n\nexport interface KeyboardOptions {\n  /**\n   * Set to `true` to enable keyboard control\n   *\n   * @default false\n   */\n  enabled?: boolean;\n  /**\n   * When enabled it will control sliders that are currently in viewport\n   *\n   * @default true\n   */\n  onlyInViewport?: boolean;\n  /**\n   * When enabled it will enable keyboard navigation by Page Up and Page Down keys\n   *\n   * @default true\n   */\n  pageUpDown?: boolean;\n  /**\n   * Set the speed of keyboard navigation transitions (in ms)\n   *\n   * @default undefined\n   */\n  speed?: number;\n}\n"
  },
  {
    "path": "src/types/modules/manipulation.d.ts",
    "content": "export interface ManipulationMethods {\n  /**\n   * Add new slides to the end. slides could be\n   * HTMLElement or HTML string with new slide or\n   * array with such slides, for example:\n   *\n   * @example\n   * ```js\n   * appendSlide('<div class=\"swiper-slide\">Slide 10\"</div>')\n   *\n   * appendSlide([\n   *  '<div class=\"swiper-slide\">Slide 10\"</div>',\n   *  '<div class=\"swiper-slide\">Slide 11\"</div>'\n   * ]);\n   * ```\n   */\n  appendSlide(slides: HTMLElement | string | string[] | HTMLElement[]): void;\n\n  /**\n   * Add new slides to the beginning. slides could be\n   * HTMLElement or HTML string with new slide or array with such slides, for example:\n   *\n   * @example\n   * ```js\n   * prependSlide('<div class=\"swiper-slide\">Slide 0\"</div>')\n   *\n   * prependSlide([\n   *  '<div class=\"swiper-slide\">Slide 1\"</div>',\n   *  '<div class=\"swiper-slide\">Slide 2\"</div>'\n   * ]);\n   * ```\n   */\n  prependSlide(slides: HTMLElement | string | string[] | HTMLElement[]): void;\n\n  /**\n   * Add new slides to the required index. slides could be HTMLElement or HTML string with new slide or array with such slides, for example:\n   *\n   * @example\n   * ```js\n   * addSlide(1, '<div class=\"swiper-slide\">Slide 10\"</div>')\n   *\n   * addSlide(1, [\n   *  '<div class=\"swiper-slide\">Slide 10\"</div>',\n   *  '<div class=\"swiper-slide\">Slide 11\"</div>'\n   * ]);\n   * ```\n   */\n  addSlide(index: number, slides: HTMLElement | string | string[] | HTMLElement[]): void;\n\n  /**\n   * Remove selected slides. slideIndex could be a number with slide index to remove or array with indexes.\n   *\n   * @example\n   * ```js\n   * removeSlide(0); // remove first slide\n   * removeSlide([0, 1]); // remove first and second slides\n   * removeAllSlides();    // Remove all slides\n   * ```\n   */\n  removeSlide(slideIndex: number | number[]): void;\n\n  /**\n   * Remove all slides\n   */\n  removeAllSlides(): void;\n}\n\nexport interface ManipulationEvents {}\n\nexport interface ManipulationOptions {}\n"
  },
  {
    "path": "src/types/modules/mousewheel.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\nimport type { CSSSelector } from '../shared.d.ts';\n\nexport interface MousewheelMethods {\n  /**\n   * Whether the mousewheel control is enabled\n   */\n  enabled: boolean;\n\n  /**\n   * Enable mousewheel control\n   */\n  enable(): void;\n\n  /**\n   * Disable mousewheel control\n   */\n  disable(): void;\n}\n\nexport interface MousewheelEvents {\n  /**\n   * Event will be fired on mousewheel scroll\n   */\n  scroll: (swiper: Swiper, event: WheelEvent) => void;\n}\n\nexport interface MousewheelOptions {\n  /**\n   * Set to `true` to enable mousewheel control\n   *\n   * @default false\n   */\n  enabled?: boolean;\n  /**\n   * Set to `true` to force mousewheel swipes to axis. So in horizontal mode mousewheel will work only with horizontal mousewheel scrolling, and only with vertical scrolling in vertical mode.\n   *\n   * @default false\n   */\n  forceToAxis?: boolean;\n  /**\n   * Set to `true` and swiper will release mousewheel event and allow page scrolling when swiper is on edge positions (in the beginning or in the end)\n   *\n   * @default false\n   */\n  releaseOnEdges?: boolean;\n  /**\n   * Set to `true` to invert sliding direction\n   *\n   * @default false\n   */\n  invert?: boolean;\n  /**\n   * Multiplier of mousewheel data, allows to tweak mouse wheel sensitivity\n   *\n   * @default 1\n   */\n  sensitivity?: number;\n  /**\n   * String with CSS selector or HTML element of the container accepting mousewheel events. By default it is swiper\n   *\n   * @default 'container'\n   */\n  eventsTarget?: 'container' | 'wrapper' | CSSSelector | HTMLElement;\n\n  /**\n   * Minimum mousewheel scroll delta to trigger swiper slide change\n   *\n   * @default null\n   */\n  thresholdDelta?: number | null;\n\n  /**\n   * Minimum mousewheel scroll time delta (in ms) to trigger swiper slide change\n   *\n   * @default null\n   */\n  thresholdTime?: number | null;\n\n  /**\n   * Scrolling on elements with this class will be ignored\n   *\n   * @default 'swiper-no-mousewheel'\n   */\n  noMousewheelClass?: string;\n}\n"
  },
  {
    "path": "src/types/modules/navigation.d.ts",
    "content": "import type { CSSSelector } from '../shared.d.ts';\nimport type Swiper from '../swiper-class.d.ts';\n\nexport interface NavigationMethods {\n  /**\n   * HTMLElement of \"next\" navigation button\n   */\n  nextEl: HTMLElement;\n\n  /**\n   * HTMLElement of \"previous\" navigation button\n   */\n  prevEl: HTMLElement;\n\n  /**\n   * Update navigation buttons state (enabled/disabled)\n   */\n  update(): void;\n\n  /**\n   * Initialize navigation\n   */\n  init(): void;\n\n  /**\n   * Destroy navigation\n   */\n  destroy(): void;\n}\n\nexport interface NavigationEvents {\n  /**\n   * Event will be fired on navigation hide\n   */\n  navigationHide: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on navigation show\n   */\n  navigationShow: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on navigation prev button click\n   */\n  navigationPrev: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on navigation next button click\n   */\n  navigationNext: (swiper: Swiper) => void;\n}\n\nexport interface NavigationOptions {\n  /**\n   * Boolean property to use with breakpoints to enable/disable navigation on certain breakpoints\n   */\n  enabled?: boolean;\n  /**\n   * String with CSS selector or HTML element of the element that will work\n   * like \"next\" button after click on it\n   *\n   * @default null\n   */\n  nextEl?: CSSSelector | HTMLElement | null;\n\n  /**\n   * String with CSS selector or HTML element of the element that will work\n   * like \"prev\" button after click on it\n   *\n   * @default null\n   */\n  prevEl?: CSSSelector | HTMLElement | null;\n\n  /**\n   * Boolean property to add SVG icons to navigation buttons\n   *\n   * @default true\n   */\n  addIcons?: boolean;\n\n  /**\n   * Toggle navigation buttons visibility after click on Slider's container\n   *\n   * @default false\n   */\n  hideOnClick?: boolean;\n\n  /**\n   * CSS class name added to navigation button when it becomes disabled\n   *\n   * @default 'swiper-button-disabled'\n   */\n  disabledClass?: string;\n\n  /**\n   * CSS class name added to navigation button when it becomes hidden\n   *\n   * @default 'swiper-button-hidden'\n   */\n  hiddenClass?: string;\n\n  /**\n   * CSS class name added to navigation button when it is disabled\n   *\n   * @default 'swiper-button-lock'\n   */\n  lockClass?: string;\n\n  /**\n   * CSS class name added on swiper container when navigation is disabled by breakpoint\n   *\n   * @default 'swiper-navigation-disabled'\n   */\n  navigationDisabledClass?: string;\n}\n"
  },
  {
    "path": "src/types/modules/pagination.d.ts",
    "content": "import type { CSSSelector } from '../shared.d.ts';\nimport type Swiper from '../swiper-class.d.ts';\n\nexport interface PaginationMethods {\n  /**\n   * HTMLElement of pagination container element\n   */\n  el: HTMLElement;\n\n  /**\n   * Array of pagination bullets\n   * HTML elements. To get specific slide HTMLElement\n   * use `swiper.pagination.bullets[1]`.\n   */\n  bullets: HTMLElement[];\n\n  /**\n   * Render pagination layout\n   */\n  render(): void;\n\n  /**\n   * Update pagination state (enabled/disabled/active)\n   */\n  update(): void;\n\n  /**\n   * Initialize pagination\n   */\n  init(): void;\n\n  /**\n   * Destroy pagination\n   */\n  destroy(): void;\n}\n\nexport interface PaginationEvents {\n  /**\n   * Event will be fired after pagination rendered\n   */\n  paginationRender: (swiper: Swiper, paginationEl: HTMLElement) => void;\n\n  /**\n   * Event will be fired when pagination updated\n   */\n  paginationUpdate: (swiper: Swiper, paginationEl: HTMLElement) => void;\n\n  /**\n   * Event will be fired on pagination hide\n   */\n  paginationHide: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired on pagination show\n   */\n  paginationShow: (swiper: Swiper) => void;\n}\n\nexport interface PaginationOptions {\n  /**\n   * Boolean property to use with breakpoints to enable/disable pagination on certain breakpoints\n   */\n  enabled?: boolean;\n  /**\n   * String with CSS selector or HTML element of the container with pagination\n   *\n   * @default null\n   */\n  el?: CSSSelector | HTMLElement | null;\n\n  /**\n   * String with type of pagination. Can be `'bullets'`, `'fraction'`, `'progressbar'` or `'custom'`\n   *\n   * @default 'bullets'\n   */\n  type?: 'bullets' | 'fraction' | 'progressbar' | 'custom';\n\n  /**\n   * Defines which HTML tag will be used to represent single pagination bullet. Only for `'bullets'` pagination type.\n   *\n   * @default 'span'\n   */\n  bulletElement?: string;\n\n  /**\n   * Good to enable if you use bullets pagination with a lot of slides. So it will keep only few bullets visible at the same time.\n   *\n   * @default false\n   */\n  dynamicBullets?: boolean;\n\n  /**\n   * The number of main bullets visible when `dynamicBullets` enabled.\n   *\n   * @default 1\n   */\n  dynamicMainBullets?: number;\n\n  /**\n   * Toggle (hide/show) pagination container visibility after click on Slider's container\n   *\n   * @default true\n   */\n  hideOnClick?: boolean;\n\n  /**\n   * If `true` then clicking on pagination button will cause transition to appropriate slide. Only for bullets pagination type\n   *\n   * @default false\n   */\n  clickable?: boolean;\n\n  /**\n   * Makes pagination progressbar opposite to Swiper's `direction` parameter, means vertical progressbar for horizontal swiper\n   * direction and horizontal progressbar for vertical swiper direction\n   *\n   * @default false\n   */\n  progressbarOpposite?: boolean;\n\n  /**\n   * format fraction pagination current number. Function receives current number,\n   * and you need to return formatted value\n   */\n  formatFractionCurrent?: (number: number) => number | string;\n\n  /**\n   * format fraction pagination total number. Function receives total number, and you\n   * need to return formatted value\n   */\n  formatFractionTotal?: (number: number) => number | string;\n\n  /**\n   * This parameter allows totally customize pagination bullets, you need to pass here a function that accepts `index` number of\n   * pagination bullet and required element class name (`className`). Only for `'bullets'` pagination type\n   *\n   * @default null\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   //...\n   *   pagination: {\n   *     //...\n   *     renderBullet: function (index, className) {\n   *       return '<span class=\"' + className + '\">' + (index + 1) + '</span>';\n   *     },\n   *   },\n   * });\n   * ```\n   */\n  renderBullet?: (index: number, className: string) => string;\n\n  /**\n   * This parameter allows to customize \"fraction\" pagination html. Only for `'fraction'` pagination type\n   *\n   * @default null\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   //...\n   *   pagination: {\n   *     //...\n   *     renderFraction: function (currentClass, totalClass) {\n   *       return '<span class=\"' + currentClass + '\"></span>' +\n   *               ' of ' +\n   *               '<span class=\"' + totalClass + '\"></span>';\n   *     },\n   *   },\n   * });\n   * ```\n   */\n  renderFraction?: (currentClass: string, totalClass: string) => string;\n\n  /**\n   * This parameter allows to customize \"progress\" pagination. Only for `'progress'` pagination type\n   *\n   * @default null\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   //...\n   *   pagination: {\n   *     //...\n   *     renderProgressbar: function (progressbarFillClass) {\n   *       return '<span class=\"' + progressbarFillClass + '\"></span>';\n   *     },\n   *   },\n   * });\n   * ```\n   */\n  renderProgressbar?: (progressbarFillClass: string) => string;\n\n  /**\n   * This parameter is required for `'custom'` pagination type where you have to specify\n   * how it should be rendered.\n   *\n   * @default null\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   //...\n   *   pagination: {\n   *     //...\n   *     renderCustom: function (swiper, current, total) {\n   *       return current + ' of ' + total;\n   *     },\n   *   },\n   * });\n   * ```\n   */\n  renderCustom?: (swiper: Swiper, current: number, total: number) => string;\n\n  /**\n   * CSS class name of single pagination bullet\n   *\n   * @default 'swiper-pagination-bullet'\n   */\n  bulletClass?: string;\n\n  /**\n   * CSS class name of currently active pagination bullet\n   *\n   * @default 'swiper-pagination-bullet-active'\n   */\n  bulletActiveClass?: string;\n\n  /**\n   * The beginning of the modifier CSS class name that will be added to pagination depending on parameters\n   *\n   * @default 'swiper-pagination-'\n   */\n  modifierClass?: string;\n\n  /**\n   * CSS class name of the element with currently active index in \"fraction\" pagination\n   *\n   * @default 'swiper-pagination-current'\n   */\n  currentClass?: string;\n\n  /**\n   * CSS class name of the element with total number of \"snaps\" in \"fraction\" pagination\n   *\n   * @default 'swiper-pagination-total'\n   */\n  totalClass?: string;\n\n  /**\n   * CSS class name of pagination when it becomes inactive\n   *\n   * @default 'swiper-pagination-hidden'\n   */\n  hiddenClass?: string;\n\n  /**\n   * CSS class name of pagination progressbar fill element\n   *\n   * @default 'swiper-pagination-progressbar-fill'\n   */\n  progressbarFillClass?: string;\n\n  /**\n   * CSS class name of pagination progressbar opposite\n   *\n   * @default 'swiper-pagination-progressbar-opposite'\n   */\n  progressbarOppositeClass?: string;\n  /**\n   * CSS class name set to pagination when it is clickable\n   *\n   * @default 'swiper-pagination-clickable'\n   */\n  clickableClass?: string;\n\n  /**\n   * CSS class name set to pagination when it is disabled\n   *\n   * @default 'swiper-pagination-lock'\n   */\n  lockClass?: string;\n\n  /**\n   * CSS class name set to pagination in horizontal Swiper\n   *\n   * @default 'swiper-pagination-horizontal'\n   */\n  horizontalClass?: string;\n\n  /**\n   * CSS class name set to pagination in vertical Swiper\n   *\n   * @default 'swiper-pagination-vertical'\n   */\n  verticalClass?: string;\n\n  /**\n   * CSS class name added on swiper container and pagination element when pagination is disabled by breakpoint\n   *\n   * @default 'swiper-pagination-disabled'\n   */\n  paginationDisabledClass?: string;\n}\n"
  },
  {
    "path": "src/types/modules/parallax.d.ts",
    "content": "export interface ParallaxMethods {}\n\nexport interface ParallaxEvents {}\n\nexport interface ParallaxOptions {\n  /**\n   * Enable, if you want to use \"parallaxed\" elements inside of slider\n   *\n   * @default false\n   */\n  enabled?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/public-api.d.ts",
    "content": "export type * from './a11y.d.ts';\nexport type * from './autoplay.d.ts';\nexport type * from './controller.d.ts';\nexport type * from './effect-coverflow.d.ts';\nexport type * from './effect-cube.d.ts';\nexport type * from './effect-fade.d.ts';\nexport type * from './effect-flip.d.ts';\nexport type * from './effect-creative.d.ts';\nexport type * from './effect-cards.d.ts';\nexport type * from './hash-navigation.d.ts';\nexport type * from './history.d.ts';\nexport type * from './keyboard.d.ts';\nexport type * from './mousewheel.d.ts';\nexport type * from './navigation.d.ts';\nexport type * from './pagination.d.ts';\nexport type * from './parallax.d.ts';\nexport type * from './scrollbar.d.ts';\nexport type * from './thumbs.d.ts';\nexport type * from './virtual.d.ts';\nexport type * from './zoom.d.ts';\nexport type * from './free-mode.d.ts';\nexport type * from './grid.d.ts';\nexport type * from './manipulation.d.ts';\n"
  },
  {
    "path": "src/types/modules/scrollbar.d.ts",
    "content": "import type { CSSSelector } from '../shared.d.ts';\nimport type Swiper from '../swiper-class.d.ts';\n\nexport interface ScrollbarMethods {\n  /**\n   * HTMLElement of Scrollbar container element\n   */\n  el: HTMLElement;\n\n  /**\n   * HTMLElement of Scrollbar draggable handler element\n   */\n  dragEl: HTMLElement;\n\n  /**\n   * Updates scrollbar track and handler sizes\n   */\n  updateSize(): void;\n\n  /**\n   * Updates scrollbar translate\n   */\n  setTranslate(): void;\n\n  /**\n   * Initialize scrollbar\n   */\n  init(): void;\n\n  /**\n   * Destroy scrollbar\n   */\n  destroy(): void;\n}\n\nexport interface ScrollbarEvents {\n  /**\n   * Event will be fired on draggable scrollbar drag start\n   */\n  scrollbarDragStart: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired on draggable scrollbar drag move\n   */\n  scrollbarDragMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired on draggable scrollbar drag end\n   */\n  scrollbarDragEnd: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n}\n\n/**\n * Object with scrollbar parameters.\n *\n * @example\n * ```js\n * const swiper = new Swiper('.swiper', {\n *   scrollbar: {\n *     el: '.swiper-scrollbar',\n *     draggable: true,\n *   },\n * });\n * ```\n */\nexport interface ScrollbarOptions {\n  /**\n   * Boolean property to use with breakpoints to enable/disable scrollbar on certain breakpoints\n   */\n  enabled?: boolean;\n  /**\n   * String with CSS selector or HTML element of the container with scrollbar.\n   *\n   * @default null\n   */\n  el?: CSSSelector | HTMLElement | null;\n\n  /**\n   * Hide scrollbar automatically after user interaction\n   *\n   * @default true\n   */\n  hide?: boolean;\n\n  /**\n   * Set to `true` to enable make scrollbar draggable that allows you to control slider position\n   *\n   * @default false\n   */\n  draggable?: boolean;\n\n  /**\n   * Set to `true` to snap slider position to slides when you release scrollbar\n   *\n   * @default false\n   */\n  snapOnRelease?: boolean;\n\n  /**\n   * Size of scrollbar draggable element in px\n   *\n   * @default 'auto'\n   */\n  dragSize?: 'auto' | number;\n\n  /**\n   * Scrollbar element additional CSS class when it is disabled\n   *\n   * @default 'swiper-scrollbar-lock'\n   */\n  lockClass?: string;\n\n  /**\n   * Scrollbar draggable element CSS class\n   *\n   * @default 'swiper-scrollbar-drag'\n   */\n  dragClass?: string;\n\n  /**\n   * CSS class name added on swiper container and scrollbar element when scrollbar is disabled by breakpoint\n   *\n   * @default 'swiper-scrollbar-disabled'\n   */\n  scrollbarDisabledClass?: string;\n\n  /**\n   * CSS class name set to scrollbar in horizontal Swiper\n   *\n   * @default 'swiper-scrollbar-horizontal'\n   */\n  horizontalClass?: string;\n\n  /**\n   * CSS class name set to scrollbar in vertical Swiper\n   *\n   * @default 'swiper-scrollbar-vertical'\n   */\n  verticalClass?: string;\n}\n"
  },
  {
    "path": "src/types/modules/thumbs.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface ThumbsMethods {\n  /**\n   * Swiper instance of thumbs swiper\n   */\n  swiper: Swiper;\n\n  /**\n   * Update thumbs\n   */\n  update(initial: boolean, p?: { autoScroll?: boolean }): void;\n\n  /**\n   * Initialize thumbs\n   */\n  init(): boolean;\n}\n\nexport interface ThumbsEvents {}\n\nexport interface ThumbsOptions {\n  /**\n   * Swiper instance of swiper used as thumbs or object with Swiper parameters to initialize thumbs swiper\n   *\n   * @default null\n   */\n  swiper?: Swiper | string | null;\n  /**\n   * Additional class that will be added to activated thumbs swiper slide\n   *\n   * @default 'swiper-slide-thumb-active'\n   */\n  slideThumbActiveClass?: string;\n  /**\n   * Additional class that will be added to thumbs swiper\n   *\n   * @default 'swiper-thumbs'\n   */\n  thumbsContainerClass?: string;\n  /**\n   * When enabled multiple thumbnail slides may get activated\n   *\n   * @default true\n   */\n  multipleActiveThumbs?: boolean;\n  /**\n   * Allows to set on which thumbs active slide from edge it should automatically move scroll thumbs. For example, if set to 1 and last visible thumb will be activated (1 from edge) it will auto scroll thumbs\n\n   *\n   * @default 0\n   */\n  autoScrollOffset?: number;\n}\n"
  },
  {
    "path": "src/types/modules/virtual.d.ts",
    "content": "export interface VirtualMethods<T = any> {\n  /**\n   * Object with cached slides HTML elements\n   */\n  cache: object;\n\n  /**\n   * Index of first rendered slide\n   */\n  from: number;\n\n  /**\n   * Index of last rendered slide\n   */\n  to: number;\n\n  /**\n   * Array with slide items passed by `virtual.slides` parameter\n   */\n  slides: T[];\n\n  /*\n   * Methods\n   */\n\n  /**\n   * Append slide. `slides` can be a single slide item or array with such slides.\n   *\n   * @note Only for Core version (in React & Vue it should be done by modifying slides array/data/source)\n   */\n  appendSlide(slide: HTMLElement | string | HTMLElement[] | string[]): void;\n\n  /**\n   * Prepend slide. `slides` can be a single slide item or array with such slides.\n   *\n   * @note Only for Core version (in React & Vue it should be done by modifying slides array/data/source)\n   */\n  prependSlide(slide: HTMLElement | string | HTMLElement[] | string[]): void;\n\n  /**\n   * Remove specific slide or slides. `slideIndexes` can be a number with slide index to remove or array with indexes.\n   *\n   * @note Only for Core version (in React & Vue it should be done by modifying slides array/data/source)\n   */\n  removeSlide(slideIndexes: number[]): void;\n\n  /**\n   * Remove all slides\n   *\n   * @note Only for Core version (in React & Vue it should be done by modifying slides array/data/source)\n   */\n  removeAllSlides(): void;\n\n  /**\n   * Update virtual slides state\n   */\n  update(force: boolean): void;\n}\n\nexport interface VirtualEvents {}\n\nexport interface VirtualData<T> {\n  /**\n   * slides left/top offset in px\n   */\n  offset: number;\n  /**\n   * index of first slide required to be rendered\n   */\n  from: number;\n  /**\n   * index of last slide required to be rendered\n   */\n  to: number;\n  /**\n   * array with slide items to be rendered\n   */\n  slides: T[];\n}\n\nexport interface VirtualOptions<T = any> {\n  /**\n   * Whether the virtual slides are enabled\n   *\n   * @default false\n   */\n  enabled?: boolean;\n  /**\n   * Array with slides\n   *\n   * @default []\n   */\n  slides?: T[];\n\n  /**\n   * Slide size for slidesPerView: `auto` (in px)\n   *\n   * @default 320\n   */\n  slidesPerViewAutoSlideSize?: number;\n\n  /**\n   * Enables DOM cache of rendering slides html elements. Once they are rendered they will be saved to cache and reused from it.\n   *\n   * @default true\n   */\n  cache?: boolean;\n  /**\n   * Increases amount of pre-rendered slides before active slide\n   *\n   * @default 0\n   */\n  addSlidesBefore?: number;\n  /**\n   * Increases amount of pre-rendered slides after active slide\n   *\n   * @default 0\n   */\n  addSlidesAfter?: number;\n  /**\n   * Function to render slide. As an argument it accepts current slide item for `slides` array and index number of the current slide. Function must return an outer HTML of the swiper slide or slide HTML element.\n   *\n   * @default null\n   */\n  renderSlide?: (slide: T, index: any) => any | null;\n  /**\n   * Function for external rendering (e.g. using some other library to handle DOM manipulations and state like React.js or Vue.js). As an argument it accepts `data` object with the following properties:\n   *\n   * - `offset` - slides left/top offset in px\n   * - `from` - index of first slide required to be rendered\n   * - `to` - index of last slide required to be rendered\n   * - `slides` - array with slide items to be rendered\n   *\n   * @default null\n   */\n  renderExternal?: (data: VirtualData<T>) => any | null;\n  /**\n   * When enabled (by default) it will update Swiper layout right after renderExternal called. Useful to disable and update swiper manually when used with render libraries that renders asynchronously\n   *\n   * @default true\n   */\n  renderExternalUpdate?: boolean;\n}\n"
  },
  {
    "path": "src/types/modules/zoom.d.ts",
    "content": "import type Swiper from '../swiper-class.d.ts';\n\nexport interface ZoomMethods {\n  /**\n   * Whether the zoom module is enabled\n   */\n  enabled: boolean;\n\n  /**\n   * Current image scale ratio\n   */\n  scale: number;\n\n  /**\n   * Enable zoom module\n   */\n  enable(): void;\n\n  /**\n   * Disable zoom module\n   */\n  disable(): void;\n\n  /**\n   * Zoom in image of the currently active slide. Optionally accepts custom zoom ratio\n   */\n  in(ratio?: number): void;\n\n  /**\n   * Zoom out image of the currently active slide\n   */\n  out(): void;\n\n  /**\n   * Toggle image zoom of the currently active slide\n   */\n  toggle(event?: MouseEvent | TouchEvent | PointerEvent): void;\n}\n\nexport interface ZoomEvents {\n  /**\n   * Event will be fired on zoom change\n   */\n  zoomChange: (swiper: Swiper, scale: number, imageEl: HTMLElement, slideEl: HTMLElement) => void;\n}\n\nexport interface ZoomOptions {\n  /**\n   * When set to true, the image will not be scaled past 100% of its original size\n   *\n   * @default false\n   */\n  limitToOriginalSize?: boolean;\n  /**\n   * Maximum image zoom multiplier\n   *\n   * @default 3\n   */\n  maxRatio?: number;\n  /**\n   * Minimal image zoom multiplier\n   *\n   * @default 1\n   */\n  minRatio?: number;\n  /**\n   * When set to true, a zoomed in image will automatically pan while moving the mouse over the image\n   *\n   * @default false\n   */\n  panOnMouseMove?: boolean;\n  /**\n   * Enable/disable zoom-in by slide's double tap\n   *\n   * @default true\n   */\n  toggle?: boolean;\n  /**\n   * CSS class name of zoom container\n   *\n   * @default 'swiper-zoom-container'\n   */\n  containerClass?: string;\n  /**\n   * CSS class name of zoomed in container\n   *\n   * @default 'swiper-slide-zoomed'\n\n   */\n  zoomedSlideClass?: string;\n}\n"
  },
  {
    "path": "src/types/shared.d.ts",
    "content": "import type { Swiper } from './index.d.ts';\n\nexport interface CSSSelector extends String {}\n\nexport type SwiperModule = (options: {\n  params: Swiper['params'];\n  swiper: Swiper;\n  extendParams: (obj: { [name: string]: any }) => void;\n  on: Swiper['on'];\n  once: Swiper['once'];\n  off: Swiper['off'];\n  emit: Swiper['emit'];\n}) => void;\n"
  },
  {
    "path": "src/types/swiper-class.d.ts",
    "content": "import type { SwiperOptions } from './swiper-options.d.ts';\nimport type { CSSSelector, SwiperModule } from './shared.d.ts';\nimport type { SwiperEvents } from './swiper-events.d.ts';\n\nimport type { A11yMethods } from './modules/a11y.d.ts';\nimport type { AutoplayMethods } from './modules/autoplay.d.ts';\nimport type { ControllerMethods } from './modules/controller.d.ts';\nimport type { CoverflowEffectMethods } from './modules/effect-coverflow.d.ts';\nimport type { CubeEffectMethods } from './modules/effect-cube.d.ts';\nimport type { FadeEffectMethods } from './modules/effect-fade.d.ts';\nimport type { FlipEffectMethods } from './modules/effect-flip.d.ts';\nimport type { CreativeEffectMethods } from './modules/effect-creative.d.ts';\nimport type { CardsEffectMethods } from './modules/effect-cards.d.ts';\nimport type { HashNavigationMethods } from './modules/hash-navigation.d.ts';\nimport type { HistoryMethods } from './modules/history.d.ts';\nimport type { KeyboardMethods } from './modules/keyboard.d.ts';\nimport type { MousewheelMethods } from './modules/mousewheel.d.ts';\nimport type { NavigationMethods } from './modules/navigation.d.ts';\nimport type { PaginationMethods } from './modules/pagination.d.ts';\nimport type { ParallaxMethods } from './modules/parallax.d.ts';\nimport type { ScrollbarMethods } from './modules/scrollbar.d.ts';\nimport type { ThumbsMethods } from './modules/thumbs.d.ts';\nimport type { VirtualMethods } from './modules/virtual.d.ts';\nimport type { ZoomMethods } from './modules/zoom.d.ts';\nimport type { FreeModeMethods } from './modules/free-mode.d.ts';\nimport type { ManipulationMethods } from './modules/manipulation.d.ts';\n\ninterface SwiperClass<Events> {\n  /** Add event handler */\n  on<E extends keyof Events>(event: E, handler: Events[E]): void;\n  /** Add event handler that will be removed after it was fired */\n  once<E extends keyof Events>(event: E, handler: Events[E]): void;\n  /** Remove event handler */\n  off<E extends keyof Events>(event: E, handler: Events[E]): void;\n  /** Remove all handlers for specified event */\n  off<E extends keyof Events>(event: E): void;\n  /** Fire event on instance */\n  emit<E extends keyof Events>(event: E, ...args: any[]): void;\n}\n\ninterface Swiper extends SwiperClass<SwiperEvents> {\n  /**\n   * Object with passed initialization parameters\n   */\n  params: SwiperOptions;\n\n  /**\n   * Object with original initialization parameters\n   */\n  originalParams: SwiperOptions;\n\n  /**\n   * Slider container HTML element\n   */\n  el: HTMLElement;\n\n  /**\n   * Wrapper HTML element\n   */\n  wrapperEl: HTMLElement;\n\n  /**\n   * Wrapper HTML element\n   */\n  slidesEl: HTMLElement;\n\n  /**\n   * Array of slides HTML elements. To get specific slide HTMLElement use `swiper.slides[1]`\n   */\n  slides: HTMLElement[];\n\n  /**\n   * !INTERNAL\n   */\n  loopedSlides: number | null;\n\n  /**\n   * Width of container\n   */\n  width: number;\n\n  /**\n   * Height of container\n   */\n  height: number;\n\n  /**\n   * Current value of wrapper translate\n   */\n  translate: number;\n\n  /**\n   * Current progress of wrapper translate (from 0 to 1)\n   */\n  progress: number;\n\n  /**\n   * Index number of currently active slide\n   *\n   * @note Note, that in loop mode active index value will be always shifted on a number of looped slides\n   */\n  activeIndex: number;\n\n  /**\n   * Index number of currently active slide considering rearranged slides in loop mode\n   */\n  realIndex: number;\n\n  /**\n   * Index number of previously active slide\n   */\n  previousIndex: number;\n\n  /**\n   * Index number of current snap in `snapGrid`\n   */\n  snapIndex: number;\n\n  /**\n   * Slides snap grid\n   */\n  snapGrid: number[];\n\n  /**\n   * Slides grid\n   */\n  slidesGrid: number[];\n\n  /**\n   * Array of widths for slides\n   */\n  slidesSizesGrid: number[];\n\n  /**\n   * `true` if slider on most \"left\"/\"top\" position\n   */\n  isBeginning: boolean;\n\n  /**\n   * `true` if slider on most \"right\"/\"bottom\" position\n   */\n  isEnd: boolean;\n\n  /**\n   * `true` if slide is \"locked\" (by `watchOverflow`) and slides can not be, e.g. when amount of slides is less that slides per view\n   */\n  isLocked: boolean;\n\n  /**\n   * `true` if swiper is in transition\n   */\n  animating: boolean;\n\n  /**\n   * Object with the following touch event properties:\n   *\n   * - `swiper.touches.startX`\n   * - `swiper.touches.startY`\n   * - `swiper.touches.currentX`\n   * - `swiper.touches.currentY`\n   * - `swiper.touches.diff`\n   */\n  touches: {\n    startX: number;\n    startY: number;\n    currentX: number;\n    currentY: number;\n    diff: number;\n  };\n\n  /**\n   * Index number of last clicked slide\n   */\n  clickedIndex: number;\n\n  /**\n   * Link to last clicked slide (HTMLElement)\n   */\n  clickedSlide: HTMLElement;\n\n  /**\n   * Disable / enable ability to slide to the next slides by assigning `false` / `true` to this property\n   */\n  allowSlideNext: boolean;\n\n  /**\n   * Disable / enable ability to slide to the previous slides by assigning `false` / `true` to this property\n   */\n  allowSlidePrev: boolean;\n\n  /**\n   * Disable / enable ability move slider by grabbing it with mouse or by touching it with finger (on touch screens) by assigning `false` / `true` to this property\n   */\n  allowTouchMove: boolean;\n\n  /**\n   * Direction of sliding\n   */\n  swipeDirection: 'prev' | 'next';\n\n  /**\n   * !INTERNAL\n   */\n  rtlTranslate: boolean;\n\n  /**\n   * `true` if Swiper is enabled, `false` otherwise\n   */\n  enabled: boolean;\n\n  /**\n   * Disable Swiper (if it was enabled). When Swiper is disabled, it will hide all navigation elements and won't respond to any events and interactions\n   *\n   */\n  disable(): void;\n\n  /**\n   * Enable Swiper (if it was disabled)\n   *\n   */\n  enable(): void;\n\n  /**\n   * Set Swiper translate progress (from 0 to 1). Where 0 - its initial position (offset) on first slide, and 1 - its maximum position (offset) on last slide\n   *\n   * @param progress Swiper translate progress (from 0 to 1).\n   * @param speed Transition duration (in ms).\n   */\n  setProgress(progress: number, speed?: number): void;\n\n  /**\n   * Run transition to next slide.\n   *\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slideNext(speed?: number, runCallbacks?: boolean): boolean;\n\n  /**\n   * Run transition to previous slide.\n   *\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slidePrev(speed?: number, runCallbacks?: boolean): boolean;\n\n  /**\n   * Run transition to the slide with index number equal to 'index' parameter for the\n   *  duration equal to 'speed' parameter.\n   *\n   * @param index Index number of slide.\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slideTo(index: number, speed?: number, runCallbacks?: boolean): boolean;\n\n  /**\n   * Does the same as .slideTo but for the case when used with enabled loop. So this\n   * method will slide to slides with realIndex matching to passed index\n   *\n   * @param index Index number of slide.\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slideToLoop(index: number, speed?: number, runCallbacks?: boolean): Swiper;\n\n  /**\n   * Reset swiper position to currently active slide for the duration equal to 'speed'\n   * parameter.\n   *\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slideReset(speed?: number, runCallbacks?: boolean): boolean;\n\n  /**\n   * Reset swiper position to closest slide/snap point for the duration equal to 'speed' parameter.\n   *\n   * @param speed Transition duration (in ms).\n   * @param runCallbacks Set it to false (by default it is true) and transition will\n   *  not produce transition events.\n   */\n  slideToClosest(speed?: number, runCallbacks?: boolean): boolean;\n\n  /**\n   * Get dynamically calculated amount of slides per view, useful only when slidesPerView set to `auto`\n   *\n   */\n  slidesPerViewDynamic(): number;\n\n  /**\n   * Force swiper to update its height (when autoHeight enabled) for the duration equal to\n   * 'speed' parameter\n   *\n   * @param speed Transition duration (in ms).\n   */\n  updateAutoHeight(speed?: number): void;\n\n  /**\n   * You should call it after you add/remove slides\n   * manually, or after you hide/show it, or do any\n   * custom DOM modifications with Swiper\n   * This method also includes subcall of the following\n   * methods which you can use separately:\n   */\n  update(): void;\n\n  /**\n   * recalculate size of swiper container\n   */\n  updateSize(): void;\n\n  /**\n   * recalculate number of slides and their offsets. Useful after you add/remove slides with JavaScript\n   */\n  updateSlides(): void;\n\n  /**\n   * recalculate swiper progress\n   */\n  updateProgress(): void;\n\n  /**\n   * update active/prev/next classes on slides and bullets\n   */\n  updateSlidesClasses(): void;\n\n  /**\n   * Changes slider direction from horizontal to vertical and back.\n   *\n   * @param direction New direction. If not specified, then will automatically changed to opposite direction\n   * @param needUpdate Will call swiper.update(). Default true\n   */\n  changeDirection(direction?: 'horizontal' | 'vertical', needUpdate?: boolean): void;\n\n  /**\n   * Changes slider language\n   *\n   * @param direction New direction. Should be `rtl` or `ltr`\n   */\n  changeLanguageDirection(direction: 'rtl' | 'ltr'): void;\n\n  /**\n   * Detach all events listeners\n   */\n  detachEvents(): void;\n\n  /**\n   * Attach all events listeners again\n   */\n  attachEvents(): void;\n\n  /**\n   * !INTERNAL\n   */\n  loopCreate(): void;\n\n  /**\n   * !INTERNAL\n   */\n  loopDestroy(): void;\n\n  /**\n   * Initialize slider\n   */\n  init(el?: HTMLElement): Swiper;\n\n  /**\n   * Destroy slider instance and detach all events listeners\n   *\n   * @param deleteInstance Set it to false (by default it is true) to not to delete Swiper instance\n   * @param cleanStyles Set it to true (by default it is true) and all custom styles will be removed from slides, wrapper and container.\n   * Useful if you need to destroy Swiper and to init again with new options or in different direction\n   */\n  destroy(deleteInstance?: boolean, cleanStyles?: boolean): void;\n\n  /**\n   * Set custom css3 transform's translate value for swiper wrapper\n   */\n  setTranslate(translate: any): void;\n\n  /**\n   * Get current value of swiper wrapper css3 transform translate\n   */\n  getTranslate(): any;\n\n  /**\n   * Animate custom css3 transform's translate value for swiper wrapper\n   *\n   * @param translate Translate value (in px)\n   * @param speed Transition duration (in ms)\n   * @param runCallbacks Set it to false (by default it is true) and transition will not produce  transition events\n   * @param translateBounds Set it to false (by default it is true) and transition value can extend beyond min and max translate\n   *\n   */\n  translateTo(\n    translate: number,\n    speed: number,\n    runCallbacks?: boolean,\n    translateBounds?: boolean,\n  ): any;\n\n  /**\n   * Get current minimal translate value\n   */\n  minTranslate(): number;\n\n  /**\n   * Get current maximal translate value\n   */\n  maxTranslate(): number;\n\n  /**\n   * Unset grab cursor\n   */\n  unsetGrabCursor(): void;\n\n  /**\n   * Set grab cursor\n   */\n  setGrabCursor(): void;\n\n  /**\n   * Add event listener that will be fired on all events\n   */\n  onAny(handler: (eventName: string, ...args: any[]) => void): void;\n\n  /**\n   * Remove event listener that will be fired on all events\n   */\n  offAny(handler: (eventName: string, ...args: any[]) => void): void;\n\n  /**\n   * !INTERNAL\n   */\n  isHorizontal(): boolean;\n\n  /**\n   * !INTERNAL\n   */\n  getBreakpoint(breakpoints: SwiperOptions['breakpoints']): string;\n\n  /**\n   * !INTERNAL\n   */\n  setBreakpoint(): void;\n\n  /**\n   * !INTERNAL\n   */\n  currentBreakpoint: any;\n\n  /**\n   * !INTERNAL\n   */\n  destroyed: boolean;\n\n  /**\n   * !INTERNAL\n   */\n  modules: Array<SwiperModule>;\n\n  a11y: A11yMethods;\n  autoplay: AutoplayMethods;\n  controller: ControllerMethods;\n  coverflowEffect: CoverflowEffectMethods;\n  cubeEffect: CubeEffectMethods;\n  fadeEffect: FadeEffectMethods;\n  flipEffect: FlipEffectMethods;\n  creativeEffect: CreativeEffectMethods;\n  cardsEffect: CardsEffectMethods;\n  hashNavigation: HashNavigationMethods;\n  history: HistoryMethods;\n  keyboard: KeyboardMethods;\n  mousewheel: MousewheelMethods;\n  navigation: NavigationMethods;\n  pagination: PaginationMethods;\n  parallax: ParallaxMethods;\n  scrollbar: ScrollbarMethods;\n  thumbs: ThumbsMethods;\n  virtual: VirtualMethods;\n  zoom: ZoomMethods;\n  freeMode: FreeModeMethods;\n}\n\ninterface Swiper extends ManipulationMethods {}\n\ndeclare class Swiper implements Swiper {\n  /**\n   * Constructs a new Swiper instance.\n   *\n   * @param container Where Swiper applies to.\n   * @param options   Instance options.\n   */\n  constructor(container: CSSSelector | HTMLElement, options?: SwiperOptions);\n  /**\n   * Installs modules on Swiper in runtime.\n   */\n  static use(modules: SwiperModule[]): void;\n\n  /**\n   * Swiper default options\n   */\n  static defaults: SwiperOptions;\n\n  /**\n   * Extend global Swiper defaults\n   */\n  static extendDefaults(options: SwiperOptions): void;\n\n  /**\n   * Object with global Swiper extended options\n   */\n  static extendedDefaults: SwiperOptions;\n}\n\nexport default Swiper;\n"
  },
  {
    "path": "src/types/swiper-events.d.ts",
    "content": "import type { SwiperOptions } from './swiper-options.d.ts';\nimport type Swiper from './swiper-class.d.ts';\n\nimport type { A11yEvents } from './modules/a11y.d.ts';\nimport type { AutoplayEvents } from './modules/autoplay.d.ts';\nimport type { ControllerEvents } from './modules/controller.d.ts';\nimport type { CoverflowEffectEvents } from './modules/effect-coverflow.d.ts';\nimport type { CubeEffectEvents } from './modules/effect-cube.d.ts';\nimport type { FadeEffectEvents } from './modules/effect-fade.d.ts';\nimport type { FlipEffectEvents } from './modules/effect-flip.d.ts';\nimport type { CreativeEffectEvents } from './modules/effect-creative.d.ts';\nimport type { CardsEffectEvents } from './modules/effect-cards.d.ts';\nimport type { HashNavigationEvents } from './modules/hash-navigation.d.ts';\nimport type { HistoryEvents } from './modules/history.d.ts';\nimport type { KeyboardEvents } from './modules/keyboard.d.ts';\nimport type { MousewheelEvents } from './modules/mousewheel.d.ts';\nimport type { NavigationEvents } from './modules/navigation.d.ts';\nimport type { PaginationEvents } from './modules/pagination.d.ts';\nimport type { ParallaxEvents } from './modules/parallax.d.ts';\nimport type { ScrollbarEvents } from './modules/scrollbar.d.ts';\nimport type { ThumbsEvents } from './modules/thumbs.d.ts';\nimport type { VirtualEvents } from './modules/virtual.d.ts';\nimport type { ZoomEvents } from './modules/zoom.d.ts';\nimport type { FreeModeEvents } from './modules/free-mode.d.ts';\n\nexport interface SwiperEvents {\n  // CORE_EVENTS_START\n  /**\n   * Fired right after Swiper initialization.\n   * @note Note that with `swiper.on('init')` syntax it will\n   * work only in case you set `init: false` parameter.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   init: false,\n   *   // other parameters\n   * });\n   * swiper.on('init', function() {\n   *  // do something\n   * });\n   * // init Swiper\n   * swiper.init();\n   * ```\n   *\n   * @example\n   * ```js\n   * // Otherwise use it as the parameter:\n   * const swiper = new Swiper('.swiper', {\n   *   // other parameters\n   *   on: {\n   *     init: function () {\n   *       // do something\n   *     },\n   *   }\n   * });\n   * ```\n   */\n  init: (swiper: Swiper) => any;\n\n  /**\n   * Event will be fired right before Swiper destroyed\n   */\n  beforeDestroy: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired after slides and their sizes are calculated and updated\n   */\n  slidesUpdated: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when currently active slide is changed\n   */\n  slideChange: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired in the beginning of animation to other slide (next or previous).\n   */\n  slideChangeTransitionStart: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired after animation to other slide (next or previous).\n   */\n  slideChangeTransitionEnd: (swiper: Swiper) => void;\n\n  /**\n   * Same as \"slideChangeTransitionStart\" but for \"forward\" direction only\n   */\n  slideNextTransitionStart: (swiper: Swiper) => void;\n\n  /**\n   * Same as \"slideChangeTransitionEnd\" but for \"forward\" direction only\n   */\n  slideNextTransitionEnd: (swiper: Swiper) => void;\n\n  /**\n   * Same as \"slideChangeTransitionStart\" but for \"backward\" direction only\n   */\n  slidePrevTransitionStart: (swiper: Swiper) => void;\n\n  /**\n   * Same as \"slideChangeTransitionEnd\" but for \"backward\" direction only\n   */\n  slidePrevTransitionEnd: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired in the beginning of transition.\n   */\n  transitionStart: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired after transition.\n   */\n  transitionEnd: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired when user touch Swiper. Receives `pointerdown` event as an arguments.\n   */\n  touchStart: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user touch and move finger over Swiper. Receives `pointermove` event as an arguments.\n   */\n  touchMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user touch and move finger over Swiper in direction opposite to direction parameter. Receives `pointermove` event as an arguments.\n   */\n  touchMoveOpposite: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user touch and move finger over Swiper and move it. Receives `pointermove` event as an arguments.\n   */\n  sliderMove: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user release Swiper. Receives `pointerup` event as an arguments.\n   */\n  touchEnd: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user click/tap on Swiper. Receives `pointerup` event as an arguments.\n   */\n  click: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user click/tap on Swiper. Receives `pointerup` event as an arguments.\n   */\n  tap: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when user double tap on Swiper's container. Receives `pointerup` event as an arguments\n   */\n  doubleTap: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n\n  /**\n   * Event will be fired when Swiper progress is changed, as an arguments it receives progress that is always from 0 to 1\n   */\n  progress: (swiper: Swiper, progress: number) => void;\n\n  /**\n   * Event will be fired when Swiper reach its beginning (initial position)\n   */\n  reachBeginning: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired when Swiper reach last slide\n   */\n  reachEnd: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired when Swiper goes to beginning or end position\n   */\n  toEdge: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired when Swiper goes from beginning or end position\n   */\n  fromEdge: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired when swiper's wrapper change its position. Receives current translate value as an arguments\n   */\n  setTranslate: (swiper: Swiper, translate: number) => void;\n\n  /**\n   * Event will be fired everytime when swiper starts animation. Receives current transition duration (in ms) as an arguments\n   */\n  setTransition: (swiper: Swiper, transition: number) => void;\n\n  /**\n   * Event will be fired on window resize right before swiper's onresize manipulation\n   */\n  resize: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired if observer is enabled and it detects DOM mutations\n   */\n  observerUpdate: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired right before \"loop fix\"\n   */\n  beforeLoopFix: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired after \"loop fix\"\n   */\n  loopFix: (swiper: Swiper) => void;\n\n  /**\n   * Event will be fired on breakpoint change\n   */\n  breakpoint: (swiper: Swiper, breakpointParams: SwiperOptions) => void;\n\n  /**\n   * !INTERNAL: Event will fired right before breakpoint change\n   */\n  _beforeBreakpoint?: (swiper: Swiper, breakpointParams: SwiperOptions) => void;\n\n  /**\n   * !INTERNAL: Event will fired after setting CSS classes on swiper container element\n   */\n  _containerClasses?: (swiper: Swiper, classNames: string) => void;\n\n  /**\n   * !INTERNAL: Event will fired after setting CSS classes on swiper slide element\n   */\n  _slideClass?: (swiper: Swiper, slideEl: HTMLElement, classNames: string) => void;\n\n  /**\n   * !INTERNAL: Event will fired after setting CSS classes on all swiper slides\n   */\n  _slideClasses?: (\n    swiper: Swiper,\n    slides: { slideEl: HTMLElement; classNames: string; index: number }[],\n  ) => void;\n\n  /**\n   * !INTERNAL: Event will fired as soon as swiper instance available (before init)\n   */\n  _swiper?: (swiper: Swiper) => void;\n\n  /**\n   * !INTERNAL: Event will be fired on free mode touch end (release) and there will no be momentum\n   */\n  _freeModeNoMomentumRelease?: (swiper: Swiper) => void;\n\n  /**\n   * Event will fired on active index change\n   */\n  activeIndexChange: (swiper: Swiper) => void;\n  /**\n   * Event will fired on snap index change\n   */\n  snapIndexChange: (swiper: Swiper) => void;\n  /**\n   * Event will fired on real index change\n   */\n  realIndexChange: (swiper: Swiper) => void;\n  /**\n   * Event will fired right after initialization\n   */\n  afterInit: (swiper: Swiper) => void;\n  /**\n   * Event will fired right before initialization\n   */\n  beforeInit: (swiper: Swiper) => void;\n  /**\n   * Event will fired before resize handler\n   */\n  beforeResize: (swiper: Swiper) => void;\n  /**\n   * Event will fired before slide change transition start\n   */\n  beforeSlideChangeStart: (swiper: Swiper) => void;\n  /**\n   * Event will fired before transition start\n   */\n  beforeTransitionStart: (swiper: Swiper, speed: number, internal: any) => void; // what is internal?\n  /**\n   * Event will fired on direction change\n   */\n  changeDirection: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when user double click/tap on Swiper\n   */\n  doubleClick: (swiper: Swiper, event: MouseEvent | TouchEvent | PointerEvent) => void;\n  /**\n   * Event will be fired on swiper destroy\n   */\n  destroy: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on momentum bounce\n   */\n  momentumBounce: (swiper: Swiper) => void;\n  /**\n   * Event will be fired on orientation change (e.g. landscape -> portrait)\n   */\n  orientationchange: (swiper: Swiper) => void;\n  /**\n   * Event will be fired in the beginning of animation of resetting slide to current one\n   */\n  slideResetTransitionStart: (swiper: Swiper) => void;\n  /**\n   * Event will be fired in the end of animation of resetting slide to current one\n   */\n  slideResetTransitionEnd: (swiper: Swiper) => void;\n  /**\n   * Event will be fired with first touch/drag move\n   */\n  sliderFirstMove: (swiper: Swiper, event: TouchEvent) => void;\n  /**\n   * Event will be fired when number of slides has changed\n   */\n  slidesLengthChange: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when slides grid has changed\n   */\n  slidesGridLengthChange: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when snap grid has changed\n   */\n  snapGridLengthChange: (swiper: Swiper) => void;\n  /**\n   * Event will be fired after swiper.update() call\n   */\n  update: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when swiper is locked (when `watchOverflow` enabled)\n   */\n  lock: (swiper: Swiper) => void;\n  /**\n   * Event will be fired when swiper is unlocked (when `watchOverflow` enabled)\n   */\n  unlock: (swiper: Swiper) => void;\n  // CORE_EVENTS_END\n}\n\ninterface SwiperEvents extends A11yEvents {}\ninterface SwiperEvents extends AutoplayEvents {}\ninterface SwiperEvents extends ControllerEvents {}\ninterface SwiperEvents extends CoverflowEffectEvents {}\ninterface SwiperEvents extends CubeEffectEvents {}\ninterface SwiperEvents extends FadeEffectEvents {}\ninterface SwiperEvents extends FlipEffectEvents {}\ninterface SwiperEvents extends CreativeEffectEvents {}\ninterface SwiperEvents extends CardsEffectEvents {}\ninterface SwiperEvents extends HashNavigationEvents {}\ninterface SwiperEvents extends HistoryEvents {}\ninterface SwiperEvents extends KeyboardEvents {}\ninterface SwiperEvents extends MousewheelEvents {}\ninterface SwiperEvents extends NavigationEvents {}\ninterface SwiperEvents extends PaginationEvents {}\ninterface SwiperEvents extends ParallaxEvents {}\ninterface SwiperEvents extends ScrollbarEvents {}\ninterface SwiperEvents extends ThumbsEvents {}\ninterface SwiperEvents extends VirtualEvents {}\ninterface SwiperEvents extends ZoomEvents {}\ninterface SwiperEvents extends FreeModeEvents {}\n"
  },
  {
    "path": "src/types/swiper-options.d.ts",
    "content": "import type { A11yOptions } from './modules/a11y.d.ts';\nimport type { AutoplayOptions } from './modules/autoplay.d.ts';\nimport type { ControllerOptions } from './modules/controller.d.ts';\nimport type { CoverflowEffectOptions } from './modules/effect-coverflow.d.ts';\nimport type { CubeEffectOptions } from './modules/effect-cube.d.ts';\nimport type { FadeEffectOptions } from './modules/effect-fade.d.ts';\nimport type { FlipEffectOptions } from './modules/effect-flip.d.ts';\nimport type { CreativeEffectOptions } from './modules/effect-creative.d.ts';\nimport type { CardsEffectOptions } from './modules/effect-cards.d.ts';\nimport type { HashNavigationOptions } from './modules/hash-navigation.d.ts';\nimport type { HistoryOptions } from './modules/history.d.ts';\nimport type { KeyboardOptions } from './modules/keyboard.d.ts';\nimport type { MousewheelOptions } from './modules/mousewheel.d.ts';\nimport type { NavigationOptions } from './modules/navigation.d.ts';\nimport type { PaginationOptions } from './modules/pagination.d.ts';\nimport type { ParallaxOptions } from './modules/parallax.d.ts';\nimport type { ScrollbarOptions } from './modules/scrollbar.d.ts';\nimport type { ThumbsOptions } from './modules/thumbs.d.ts';\nimport type { VirtualOptions } from './modules/virtual.d.ts';\nimport type { ZoomOptions } from './modules/zoom.d.ts';\nimport type { FreeModeOptions } from './modules/free-mode.d.ts';\nimport type { GridOptions } from './modules/grid.d.ts';\n\nimport type { CSSSelector, SwiperModule } from './shared.d.ts';\nimport type { SwiperEvents } from './swiper-events.d.ts';\n\nexport interface SwiperOptions {\n  /**\n   * Array with Swiper modules\n   *\n   * @example\n   * ```js\n   * import Swiper from 'swiper';\n   * import { Navigation, Pagination } from 'swiper/modules';\n   *\n   * const swiper = new Swiper('.swiper', {\n   *    modules: [ Navigation, Pagination ],\n   *  });\n   * ```\n   */\n  modules?: SwiperModule[];\n  /**\n   * Inject text styles to the shadow DOM. Only for usage with Swiper Element\n   *\n   */\n  injectStyles?: string[];\n  /**\n   * Inject styles `<link>`s to the shadow DOM. Only for usage with Swiper Element\n   *\n   */\n  injectStylesUrls?: string[];\n  /**\n   * Whether Swiper should be initialised automatically when you create an instance.\n   * If disabled, then you need to init it manually by calling `swiper.init()`\n   *\n   * @default true\n   */\n  init?: boolean;\n\n  /**\n   * Whether Swiper initially enabled. When Swiper is disabled, it will hide all navigation elements and won't respond to any events and interactions\n   *\n   * @default true\n   */\n  enabled?: boolean;\n\n  /**\n   * Swiper will recalculate slides position on window resize (orientationchange)\n   *\n   * @default true\n   */\n  updateOnWindowResize?: boolean;\n\n  /**\n   * When enabled it will use ResizeObserver (if supported by browser) on swiper container to detect container resize (instead of watching for window resize)\n   *\n   * @default true\n   */\n  resizeObserver?: boolean;\n\n  /**\n   * Index number of initial slide.\n   *\n   * @default 0\n   */\n  initialSlide?: number;\n\n  /**\n   * Can be `'horizontal'` or `'vertical'` (for vertical slider).\n   *\n   * @default 'horizontal'\n   */\n  direction?: 'horizontal' | 'vertical';\n\n  /**\n   * When enabled, will swipe slides only forward (one-way) regardless of swipe direction\n   *\n   * @default false\n   */\n\n  oneWayMovement?: boolean;\n\n  /**\n   * The name of the swiper element node name; used for detecting web component rendering\n   *\n   * @default 'SWIPER-CONTAINER'\n   */\n  swiperElementNodeName?: string;\n\n  /**\n   * Duration of transition between slides (in ms)\n   *\n   * @default 300\n   */\n  speed?: number;\n\n  /**\n   * Enabled this option and plugin will set width/height on swiper wrapper equal to total size of all slides.\n   * Mostly should be used as compatibility fallback option for browser that don't support flexbox layout well\n   *\n   * @default false\n   */\n  setWrapperSize?: boolean;\n\n  /**\n   * Enabled this option and swiper will be operated as usual except it will not move, real translate values on wrapper will not be set.\n   * Useful when you may need to create custom slide transition\n   *\n   * @default false\n   */\n  virtualTranslate?: boolean;\n\n  /**\n   * Swiper width (in px). Parameter allows to force Swiper width.\n   * Useful only if you initialize Swiper when it is hidden and in SSR and Test environments for correct Swiper initialization\n   *\n   * @default null\n   *\n   * @note Setting this parameter will make Swiper not responsive\n   */\n  width?: number | null;\n\n  /**\n   * Swiper height (in px). Parameter allows to force Swiper height.\n   * Useful only if you initialize Swiper when it is hidden and in SSR and Test environments for correct Swiper initialization\n   *\n   * @default null\n   *\n   * @note Setting this parameter will make Swiper not responsive\n   */\n  height?: number | null;\n\n  /**\n   * Set to `true` and slider wrapper will adapt its height to the height of the currently active slide\n   *\n   * @default false\n   */\n  autoHeight?: boolean;\n\n  /**\n   * Set to `true` to round values of slides width and height to prevent blurry texts on usual\n   * resolution screens (if you have such)\n   *\n   * @default false\n   */\n  roundLengths?: boolean;\n\n  /**\n   * Set to `true` on  Swiper for correct touch events interception. Use only on\n   * swipers that use same direction as the parent one\n   *\n   * @default false\n   */\n  nested?: boolean;\n\n  /**\n   * When enabled Swiper will automatically wrap slides with swiper-wrapper element,\n   * and will create required elements for navigation, pagination and scrollbar\n   * they are enabled (with their respective params object or with boolean `true`))\n   *\n   * @default false\n   */\n  createElements?: boolean;\n\n  /**\n   * Event name prefix for all DOM events emitted by Swiper Element (web component)\n   *\n   * @default `swiper`\n   */\n  eventsPrefix?: string;\n\n  /**\n   * CSS selector for focusable elements. Swiping will be disabled on such elements if they are \"focused\"\n   *\n   * @default 'input, select, option, textarea, button, video, label'\n   */\n  focusableElements?: string;\n\n  /**\n   * If enabled (by default) and navigation elements' parameters passed as a string (like `\".pagination\"`)\n   * then Swiper will look for such elements through child elements first.\n   * Applies for pagination, prev/next buttons and scrollbar elements\n   *\n   * @default true\n   */\n  uniqueNavElements?: boolean;\n\n  /**\n   * Transition effect. Can be `'slide'`, `'fade'`, `'cube'`, `'coverflow'`, `'flip'`, `'creative'` or `'cards'`\n   *\n   * @default 'slide'\n   */\n  effect?: 'slide' | 'fade' | 'cube' | 'coverflow' | 'flip' | 'creative' | 'cards' | (string & {});\n\n  /**\n   * Fire Transition/SlideChange/Start/End events on swiper initialization.\n   * Such events will be fired on initialization in case of your initialSlide is not 0, or you use loop mode\n   *\n   * @default true\n   */\n  runCallbacksOnInit?: boolean;\n\n  /**\n   * When enabled Swiper will be disabled and hide navigation buttons on\n   * case there are not enough slides for sliding.\n   *\n   * @default true\n   */\n  watchOverflow?: boolean;\n\n  /**\n   * userAgent string. Required for browser/device detection when rendered on server-side\n   *\n   * @default null\n   */\n  userAgent?: string | null;\n\n  /**\n   * Required for active slide detection when rendered on server-side and enabled history\n   *\n   * @default null\n   */\n  url?: string | null;\n\n  /**\n   * Register event handlers\n   */\n  on?: {\n    [event in keyof SwiperEvents]?: SwiperEvents[event];\n  };\n\n  /**\n   * Add event listener that will be fired on all events\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *    onAny(eventName, ...args) {\n   *      console.log('Event: ', eventName);\n   *      console.log('Event data: ', args);\n   *    }\n   *  });\n   * ```\n   */\n  onAny?(handler: (eventName: string, ...args: any[]) => void): void;\n\n  /**\n   * When enabled it will use modern CSS Scroll Snap API.\n   * It doesn't support all of Swiper's features, but potentially should bring a much better performance in simple configurations.\n   *\n   * This is what is not supported when it is enabled:\n   *\n   * - Cube effect\n   * - `speed` parameter may not have no effect\n   * - All transition start/end related events (use `slideChange` instead)\n   * - `slidesPerGroup` has limited support\n   * - `simulateTouch` doesn't have effect and \"dragging\" with mouse doesn't work\n   * - `resistance` doesn't have any effect\n   * - `allowSlidePrev/Next`\n   * - `swipeHandler`\n   *\n   * In case if you use it with other effects, especially 3D effects, it is required to wrap slide's content with `<div class=\"swiper-slide-transform\">` element. And if you use any custom styles on slides (like background colors, border radius, border, etc.), they should be set on `swiper-slide-transform` element instead.\n   *\n   * @example\n   * ```html\n   * <div class=\"swiper\">\n   *   <div class=\"swiper-wrapper\">\n   *     <div class=\"swiper-slide\">\n   *       <!-- wrap slide content with transform element -->\n   *       <div class=\"swiper-slide-transform\">\n   *         ... slide content ...\n   *       </div>\n   *     </div>\n   *     ...\n   *   </div>\n   * </div>\n   * <script>\n   * const swiper = new Swiper('.swiper', {\n   *    effect: 'flip',\n   *    cssMode: true,\n   *  });\n   * </script>\n   * ```\n   *\n   * @default false\n   */\n  cssMode?: boolean;\n\n  // Slides grid\n\n  /**\n   * Distance between slides in px.\n   *\n   * @default 0\n   *\n   * @note If you use \"margin\" css property to the elements which go into Swiper in which you pass \"spaceBetween\" into, navigation might not work properly.\n   */\n  spaceBetween?: number | string;\n\n  /**\n   * Number of slides per view (slides visible at the same time on slider's container).\n   * @note `slidesPerView: 'auto'` is currently not compatible with multirow mode, when `grid.rows` > 1\n   *\n   * @default 1\n   */\n  slidesPerView?: number | 'auto';\n\n  /**\n   * If total number of slides less than specified here value, then Swiper will enable `backface-visibility: hidden` on slide elements to reduce visual \"flicker\" in Safari.\n   *\n   * @note It is not recommended to enable it on large amount of slides as it will reduce performance\n   *\n   * @default 10\n   */\n  maxBackfaceHiddenSlides?: number;\n\n  /**\n   * Set numbers of slides to define and enable group sliding. Useful to use with slidesPerView > 1\n   *\n   * @default 1\n   */\n  slidesPerGroup?: number;\n\n  /**\n   * The parameter works in the following way: If `slidesPerGroupSkip` equals `0` (default), no slides are excluded from grouping, and the resulting behaviour is the same as without this change.\n   *\n   * If `slidesPerGroupSkip` is equal or greater than `1` the first X slides are treated as single groups, whereas all following slides are grouped by the `slidesPerGroup` value.\n   *\n   * @default 0\n   */\n  slidesPerGroupSkip?: number;\n\n  /**\n   * This param intended to be used only with `slidesPerView: 'auto'` and `slidesPerGroup: 1`. When enabled, it will skip all slides in view on `.slideNext()` & `.slidePrev()` methods calls, on Navigation \"buttons\" clicks and in autoplay.\n   *\n   * @default false\n   */\n  slidesPerGroupAuto?: boolean;\n\n  /**\n   * If `true`, then active slide will be centered, not always on the left side.\n   *\n   * @default false\n   */\n  centeredSlides?: boolean;\n\n  /**\n   * If `true`, then active slide will be centered without adding gaps at the beginning and end of slider.\n   * Required `centeredSlides: true`. Not intended to be used with `loop` or `pagination`\n   *\n   * @default false\n   */\n  centeredSlidesBounds?: boolean;\n\n  /**\n   * Add (in px) additional slide offset in the beginning of the container (before all slides)\n   *\n   * @default 0\n   */\n  slidesOffsetBefore?: number;\n\n  /**\n   * Add (in px) additional slide offset in the end of the container (after all slides)\n   *\n   * @default 0\n   */\n  slidesOffsetAfter?: number;\n\n  /**\n   * Normalize slide index.\n   *\n   * @default true\n   */\n  normalizeSlideIndex?: boolean;\n\n  /**\n   * When enabled it center slides if the amount of slides less than `slidesPerView`. Not intended to be used `loop` mode and `grid.rows`\n   *\n   * @default false\n   */\n  centerInsufficientSlides?: boolean;\n\n  /**\n   * When enabled, the swiper will always snap to slide edges rather than arbitrary positions.\n   * This prevents partial slides from appearing misaligned at the end of the swiper.\n   * Only applies when `slidesPerView` is fractional or `'auto'`, and is ignored in `loop` and `centeredSlides` modes.\n   *\n   * @default false\n   */\n  snapToSlideEdge?: boolean;\n\n  /**\n   * This option may a little improve desktop usability. If `true`, user will see the \"grab\" cursor when hover on Swiper\n   *\n   * @default false\n   */\n  grabCursor?: boolean;\n\n  /**\n   * Target element to listen touch events on. Can be `'container'` (to listen for touch events on swiper) or `'wrapper'`\n   * (to listen for touch events on swiper-wrapper)\n   *\n   * @default 'wrapper'\n   */\n  touchEventsTarget?: 'container' | 'wrapper';\n\n  /**\n   * Touch ratio\n   *\n   * @default 1\n   */\n  touchRatio?: number;\n\n  /**\n   * Allowable angle (in degrees) to trigger touch move\n   *\n   * @default 45\n   */\n  touchAngle?: number;\n\n  /**\n   * If `true`, Swiper will accept mouse events like touch events (click and drag to change slides)\n   *\n   * @default true\n   */\n  simulateTouch?: boolean;\n\n  /**\n   * Set to `false` if you want to disable short swipes\n   *\n   * @default true\n   */\n  shortSwipes?: boolean;\n\n  /**\n   * Set to `false` if you want to disable long swipes\n   *\n   * @default true\n   */\n  longSwipes?: boolean;\n\n  /**\n   * Ratio to trigger swipe to next/previous slide during long swipes\n   *\n   * @default 0.5\n   */\n  longSwipesRatio?: number;\n\n  /**\n   * Minimal duration (in ms) to trigger swipe to next/previous slide during long swipes\n   *\n   * @default 300\n   */\n  longSwipesMs?: number;\n\n  /**\n   * If disabled, then slider will be animated only when you release it, it will not move while you hold your finger on it\n   *\n   * @default true\n   */\n  followFinger?: boolean;\n\n  /**\n   * If `false`, then the only way to switch the slide is use of external API functions like slidePrev or slideNext\n   *\n   * @default true\n   */\n  allowTouchMove?: boolean;\n\n  /**\n   * Threshold value in px. If \"touch distance\" will be lower than this value then swiper will not move\n   *\n   * @default 5\n   */\n  threshold?: number;\n\n  /**\n   * If disabled, `pointerdown` event won't be prevented\n   *\n   * @default true\n   */\n  touchStartPreventDefault?: boolean;\n\n  /**\n   * Force to always prevent default for `touchstart` (`pointerdown`) event\n   *\n   * @default false\n   */\n  touchStartForcePreventDefault?: boolean;\n\n  /**\n   * If enabled, then propagation of \"touchmove\" will be stopped\n   *\n   * @default false\n   */\n  touchMoveStopPropagation?: boolean;\n\n  /**\n   * Enable to release Swiper events for swipe-back work in app. If set to `'prevent'` then it will prevent system swipe-back navigation instead. This feature works only with \"touch\" events (and not pointer events), so it will work on iOS/Android devices and won't work on Windows devices with pointer (touch) events.\n   *\n   * @default false\n   */\n  edgeSwipeDetection?: boolean | string;\n\n  /**\n   * Area (in px) from left edge of the screen to release touch events for swipe-back in app\n   *\n   * @default 20\n   */\n  edgeSwipeThreshold?: number;\n\n  /**\n   * Enable to release touch events on slider edge position (beginning, end) to allow for further page scrolling. This feature works only with \"touch\" events (and not pointer events), so it will work on iOS/Android devices and won't work on Windows devices with pointer events. Also `threshold` parameter must be set to `0`\n   *\n   * @default false\n   */\n  touchReleaseOnEdges?: boolean;\n\n  /**\n   * Passive event listeners will be used by default where possible to improve scrolling performance on mobile devices.\n   * But if you need to use `e.preventDefault` and you have conflict with it, then you should disable this parameter\n   *\n   * @default true\n   */\n  passiveListeners?: boolean;\n\n  // Touch Resistance\n\n  /**\n   * Set to `false` if you want to disable resistant bounds\n   *\n   * @default true\n   */\n  resistance?: boolean;\n\n  /**\n   * This option allows you to control resistance ratio\n   *\n   * @default 0.85\n   */\n  resistanceRatio?: number;\n\n  // Swiping / No swiping\n  /**\n   * When enabled it won't allow to change slides by swiping or navigation/pagination buttons during transition\n   *\n   * @default false\n   */\n  preventInteractionOnTransition?: boolean;\n\n  /**\n   * Set to `false` to disable swiping to previous slide direction (to left or top)\n   *\n   * @default true\n   */\n  allowSlidePrev?: boolean;\n\n  /**\n   * Set to `false` to disable swiping to next slide direction (to right or bottom)\n   *\n   * @default true\n   */\n  allowSlideNext?: boolean;\n\n  /**\n   * Enable/disable swiping on elements matched to class specified in `noSwipingClass`\n   *\n   * @default true\n   */\n  noSwiping?: boolean;\n\n  /**\n   * Specify `noSwiping`'s element css class\n   *\n   * @default 'swiper-no-swiping'\n   */\n  noSwipingClass?: string;\n\n  /**\n   * Can be used instead of `noSwipingClass` to specify elements to disable swiping on.\n   * For example `'input'` will disable swiping on all inputs\n   *\n   * @default\n   */\n  noSwipingSelector?: string;\n\n  /**\n   * String with CSS selector or HTML element of the container with pagination that will work as only available handler for swiping\n   *\n   * @default null\n   */\n  swipeHandler?: CSSSelector | HTMLElement | null;\n\n  // Clicks\n  /**\n   * Set to `true` to prevent accidental unwanted clicks on links during swiping\n   *\n   * @default true\n   */\n  preventClicks?: boolean;\n\n  /**\n   * Set to `true` to stop clicks event propagation on links during swiping\n   *\n   * @default true\n   */\n  preventClicksPropagation?: boolean;\n\n  /**\n   * Set to `true` and click on any slide will produce transition to this slide\n   *\n   * @default false\n   */\n  slideToClickedSlide?: boolean;\n\n  // Progress\n  /**\n   * Enable this feature to calculate each slides progress and visibility (slides in viewport will have additional visible class)\n   *\n   * @default false\n   */\n  watchSlidesProgress?: boolean;\n\n  /**\n   * Set to `true` to enable continuous loop mode\n   *\n   * Because of nature of how the loop mode works (it will rearrange slides), total number of slides must be:\n   *\n   * - more than or equal to `slidesPerView` + `slidesPerGroup` (and `+ 1` in case of `centeredSlides`)\n   * - even to `slidesPerGroup` (or use `loopAddBlankSlides` parameter)\n   * - even to `grid.rows` (or use `loopAddBlankSlides` parameter)\n   *\n   * @default false\n   *\n   */\n  loop?: boolean;\n\n  /**\n   * Automatically adds blank slides if you use Grid or `slidesPerGroup` and the total amount of slides is not even to `slidesPerGroup` or to `grid.rows`\n   *\n   *\n   * @default true\n   *\n   */\n  loopAddBlankSlides?: boolean;\n\n  /**\n   * Allows to increase amount of looped slides\n   *\n   * @default 0\n   */\n  loopAdditionalSlides?: number;\n\n  /**\n   * If enabled then slideNext/Prev will do nothing while slider is animating in loop mode\n   *\n   * @default true\n   */\n  loopPreventsSliding?: boolean;\n\n  /**\n   * Set to `true` to enable \"rewind\" mode. When enabled, clicking \"next\" navigation button (or calling `.slideNext()`) when on last slide will slide back to the first slide. Clicking \"prev\" navigation button (or calling `.slidePrev()`) when on first slide will slide forward to the last slide.\n   *\n   * @default false\n   *\n   * @note Should not be used together with `loop` mode\n   */\n  rewind?: boolean;\n\n  /**\n   * Allows to set different parameter for different responsive breakpoints (screen sizes). Not all parameters can be changed in breakpoints, only those which do not require different layout and logic, like `slidesPerView`, `slidesPerGroup`, `spaceBetween`, `grid.rows`. Such parameters like `loop` and `effect` won't work\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   // Default parameters\n   *   slidesPerView: 1,\n   *   spaceBetween: 10,\n   *   // Responsive breakpoints\n   *   breakpoints: {\n   *     // when window width is >= 320px\n   *     320: {\n   *       slidesPerView: 2,\n   *       spaceBetween: 20\n   *     },\n   *     // when window width is >= 480px\n   *     480: {\n   *       slidesPerView: 3,\n   *       spaceBetween: 30\n   *     },\n   *     // when window width is >= 640px\n   *     640: {\n   *       slidesPerView: 4,\n   *       spaceBetween: 40\n   *     }\n   *   }\n   * })\n   * ```\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   slidesPerView: 1,\n   *   spaceBetween: 10,\n   *   // using \"ratio\" endpoints\n   *   breakpoints: {\n   *     '@0.75': {\n   *       slidesPerView: 2,\n   *       spaceBetween: 20,\n   *     },\n   *     '@1.00': {\n   *       slidesPerView: 3,\n   *       spaceBetween: 40,\n   *     },\n   *     '@1.50': {\n   *       slidesPerView: 4,\n   *       spaceBetween: 50,\n   *     },\n   *   }\n   * });\n   * ```\n   */\n  breakpoints?: {\n    [width: number]: SwiperOptions;\n    [ratio: string]: SwiperOptions;\n  };\n\n  /**\n   * Base for breakpoints (beta). Can be `window` or `container`. If set to `window` (by default) then breakpoint keys mean window width. If set to `container` then breakpoint keys treated as swiper container width\n   *\n   * @default 'window'\n   */\n  breakpointsBase?: 'window' | 'container' | CSSSelector;\n\n  // Observer\n  /**\n   * Set to `true` to enable Mutation Observer on Swiper and its elements. In this case Swiper will be updated (reinitialized) each time if you change its style (like hide/show) or modify its child elements (like adding/removing slides)\n   *\n   * @default false\n   */\n  observer?: boolean;\n  /**\n   * Set to `true` if you also need to watch Mutations for Swiper slide children elements\n   *\n   * @default false\n   */\n  observeSlideChildren?: boolean;\n  /**\n   * Set to `true` if you also need to watch Mutations for Swiper parent elements\n   *\n   * @default false\n   */\n  observeParents?: boolean;\n\n  // Namespace\n  /**\n   * The beginning of the modifier CSS class that can be added to swiper container depending on different parameters\n   *\n   * @default 'swiper-'\n   */\n  containerModifierClass?: string;\n\n  /**\n   * CSS class name of slide\n   *\n   * @default 'swiper-slide'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue components\n   */\n  slideClass?: string;\n\n  /**\n   * CSS class name of currently active slide\n   *\n   * @default 'swiper-slide-active'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue components\n   */\n  slideActiveClass?: string;\n\n  /**\n   * CSS class name of currently/partially visible slide\n   *\n   * @default 'swiper-slide-visible'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue\n   */\n  slideVisibleClass?: string;\n\n  /**\n   * CSS class name of fully (when whole slide is in the viewport) visible slide\n   *\n   * @default 'swiper-slide-fully-visible'\n   *\n   * @note Not supported in Swiper React/Vue\n   */\n  slideFullyVisibleClass?: string;\n\n  /**\n   * CSS class name of the blank slide added by the loop mode (when `loopAddBlankSlides` is enabled)\n   *\n   * @default 'swiper-slide-blank'\n   *\n   * @note Not supported in Swiper React/Vue\n   */\n  slideBlankClass?: string;\n\n  /**\n   * CSS class name of slide which is right after currently active slide\n   *\n   * @default 'swiper-slide-next'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue\n   */\n  slideNextClass?: string;\n\n  /**\n   * CSS class name of slide which is right before currently active slide\n   *\n   * @default 'swiper-slide-prev'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue\n   */\n  slidePrevClass?: string;\n\n  /**\n   * CSS class name of slides' wrapper\n   *\n   * @default 'swiper-wrapper'\n   *\n   * @note By changing classes you will also need to change Swiper's CSS to reflect changed classes\n   *\n   * @note Not supported in Swiper React/Vue\n   *\n   */\n  wrapperClass?: string;\n\n  /**\n   * CSS class name of lazy preloader\n   *\n   * @default 'swiper-lazy-preloader'\n   */\n  lazyPreloaderClass?: string;\n\n  /**\n   * Number of next and previous slides to preload. Only applicable if using lazy loading.\n   *\n   * @default 0\n   */\n  lazyPreloadPrevNext?: number;\n\n  /**\n   * Object with a11y parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   a11y: {\n   *     prevSlideMessage: 'Previous slide',\n   *     nextSlideMessage: 'Next slide',\n   *   },\n   * });\n   * ```\n   */\n  a11y?: A11yOptions | boolean;\n\n  /**\n   * Object with autoplay parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *  autoplay: {\n   *    delay: 5000,\n   *  },\n   *});\n   * ```\n   */\n  autoplay?: AutoplayOptions | boolean;\n\n  /**\n   * Object with controller parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   controller: {\n   *     inverse: true,\n   *   },\n   * });\n   * ```\n   */\n  controller?: ControllerOptions;\n\n  /**\n   * Object with Coverflow-effect parameters.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'coverflow',\n   *   coverflowEffect: {\n   *     rotate: 30,\n   *     slideShadows: false,\n   *   },\n   * });\n   * ```\n   */\n  coverflowEffect?: CoverflowEffectOptions;\n\n  /**\n   * Object with Cube-effect parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'cube',\n   *   cubeEffect: {\n   *     slideShadows: false,\n   *   },\n   * });\n   * ```\n   */\n  cubeEffect?: CubeEffectOptions;\n\n  /**\n   * Object with Fade-effect parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'fade',\n   *   fadeEffect: {\n   *     crossFade: true\n   *   },\n   * });\n   * ```\n   */\n  fadeEffect?: FadeEffectOptions;\n\n  /**\n   * Object with Flip-effect parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'flip',\n   *   flipEffect: {\n   *     slideShadows: false,\n   *   },\n   * });\n   * ```\n   */\n  flipEffect?: FlipEffectOptions;\n\n  /**\n   * Object with Creative-effect parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'creative',\n   *   creativeEffect: {\n   *     prev: {\n   *       // will set `translateZ(-400px)` on previous slides\n   *       translate: [0, 0, -400],\n   *     },\n   *     next: {\n   *       // will set `translateX(100%)` on next slides\n   *       translate: ['100%', 0, 0],\n   *     },\n   *   },\n   * });\n   * ```\n   */\n  creativeEffect?: CreativeEffectOptions;\n\n  /**\n   * Object with Cards-effect parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   effect: 'cards',\n   *   cardsEffect: {\n   *     // ...\n   *   },\n   * });\n   * ```\n   */\n  cardsEffect?: CardsEffectOptions;\n\n  /**\n   * Enables hash url navigation to for slides.\n   * Object with hash navigation parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   hashNavigation: {\n   *     replaceState: true,\n   *   },\n   * });\n   * ```\n   */\n  hashNavigation?: HashNavigationOptions | boolean;\n\n  /**\n   * Enables history push state where every slide will have its own url. In this parameter you have to specify main slides url like `\"slides\"` and specify every slide url using `data-history` attribute.\n   *\n   * Object with history navigation parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   history: {\n   *     replaceState: true,\n   *   },\n   * });\n   * ```\n   *\n   * @example\n   * ```html\n   * <!-- will produce \"slides/slide1\" url in browser history -->\n   * <div class=\"swiper-slide\" data-history=\"slide1\"></div>\n   * ```\n   */\n  history?: HistoryOptions | boolean;\n\n  /**\n   * Enables navigation through slides using keyboard. Object with keyboard parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   keyboard: {\n   *     enabled: true,\n   *     onlyInViewport: false,\n   *   },\n   * });\n   * ```\n   */\n  keyboard?: KeyboardOptions | boolean;\n\n  /**\n   * Enables navigation through slides using mouse wheel. Object with mousewheel parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   mousewheel: {\n   *     invert: true,\n   *   },\n   * });\n   * ```\n   */\n  mousewheel?: MousewheelOptions | boolean;\n\n  /**\n   * Object with navigation parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   navigation: {\n   *     nextEl: '.swiper-button-next',\n   *     prevEl: '.swiper-button-prev',\n   *   },\n   * });\n   * ```\n   */\n  navigation?: NavigationOptions | boolean;\n\n  /**\n   * Object with pagination parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   pagination: {\n   *     el: '.swiper-pagination',\n   *     type: 'bullets',\n   *   },\n   * });\n   * ```\n   */\n  pagination?: PaginationOptions | boolean;\n\n  /**\n   * Object with parallax parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   parallax: true,\n   * });\n   * ```\n   */\n  parallax?: ParallaxOptions | boolean;\n\n  /**\n   * Object with scrollbar parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   scrollbar: {\n   *     el: '.swiper-scrollbar',\n   *     draggable: true,\n   *   },\n   * });\n   * ```\n   */\n  scrollbar?: ScrollbarOptions | boolean;\n\n  /**\n   * Object with thumbs component parameters\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   ...\n   *   thumbs: {\n   *     swiper: thumbsSwiper\n   *   }\n   * });\n   * ```\n   */\n  thumbs?: ThumbsOptions;\n\n  /**\n   * Enables virtual slides functionality. Object with virtual slides parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   virtual: {\n   *     slides: ['Slide 1', 'Slide 2', 'Slide 3', 'Slide 4', 'Slide 5'],\n   *   },\n   * });\n   * ```\n   */\n  virtual?: VirtualOptions | boolean;\n\n  /**\n   * Enables zooming functionality. Object with zoom parameters or boolean `true` to enable with default settings\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   zoom: {\n   *     maxRatio: 5,\n   *   },\n   * });\n   * ```\n   */\n  zoom?: ZoomOptions | boolean;\n\n  /**\n   * Enables free mode functionality. Object with free mode parameters or boolean `true` to enable with default settings.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   freeMode: true,\n   * });\n   *\n   * const swiper = new Swiper('.swiper', {\n   *   freeMode: {\n   *     enabled: true,\n   *     sticky: true,\n   *   },\n   * });\n   * ```\n   */\n  freeMode?: FreeModeOptions | boolean;\n\n  /**\n   * Object with grid parameters to enable \"multirow\" slider.\n   *\n   * @example\n   * ```js\n   * const swiper = new Swiper('.swiper', {\n   *   grid: {\n   *     rows: 2,\n   *   },\n   * });\n   * ```\n   */\n  grid?: GridOptions;\n\n  /**\n   * !INTERNAL When enabled will emit \"_containerClasses\" and \"_slideClass\" events\n   */\n  _emitClasses?: boolean;\n}\n"
  },
  {
    "path": "src/vue/context.mjs",
    "content": "import { inject } from 'vue';\n\nexport const useSwiperSlide = () => {\n  return inject('swiperSlide');\n};\n\nexport const useSwiper = () => {\n  return inject('swiper');\n};\n"
  },
  {
    "path": "src/vue/get-children.mjs",
    "content": "function getChildren(originalSlots = {}, slidesRef, oldSlidesRef) {\n  const slides = [];\n\n  const slots = {\n    'container-start': [],\n    'container-end': [],\n    'wrapper-start': [],\n    'wrapper-end': [],\n  };\n\n  const getSlidesFromElements = (els, slotName) => {\n    if (!Array.isArray(els)) {\n      return;\n    }\n    els.forEach((vnode) => {\n      const isFragment = typeof vnode.type === 'symbol';\n      if (slotName === 'default') slotName = 'container-end';\n      if (isFragment && vnode.children) {\n        getSlidesFromElements(vnode.children, slotName);\n      } else if (\n        (vnode.type &&\n          (vnode.type.name === 'SwiperSlide' || vnode.type.name === 'AsyncComponentWrapper')) ||\n        (vnode.componentOptions && vnode.componentOptions.tag === 'SwiperSlide')\n      ) {\n        slides.push(vnode);\n      } else if (slots[slotName]) {\n        slots[slotName].push(vnode);\n      }\n    });\n  };\n\n  Object.keys(originalSlots).forEach((slotName) => {\n    if (typeof originalSlots[slotName] !== 'function') return;\n    const els = originalSlots[slotName]();\n    getSlidesFromElements(els, slotName);\n  });\n  oldSlidesRef.value = slidesRef.value;\n  slidesRef.value = slides;\n\n  return { slides, slots };\n}\n\nexport { getChildren };\n"
  },
  {
    "path": "src/vue/swiper-slide.mjs",
    "content": "import {\n  h,\n  ref,\n  onMounted,\n  onUpdated,\n  onBeforeUpdate,\n  computed,\n  onBeforeUnmount,\n  provide,\n} from 'vue';\nimport { uniqueClasses } from '../components-shared/utils.mjs';\n\nconst SwiperSlide = {\n  name: 'SwiperSlide',\n  props: {\n    tag: {\n      type: String,\n      default: 'div',\n    },\n    swiperRef: { type: Object, required: false },\n    swiperSlideIndex: { type: Number, default: undefined, required: false },\n    zoom: { type: Boolean, default: undefined, required: false },\n    lazy: { type: Boolean, default: false, required: false },\n    virtualIndex: {\n      type: [String, Number],\n      default: undefined,\n    },\n  },\n  setup(props, { slots }) {\n    let eventAttached = false;\n    const { swiperRef } = props;\n    const slideElRef = ref(null);\n    const slideClasses = ref('swiper-slide');\n    const lazyLoaded = ref(false);\n\n    function updateClasses(swiper, el, classNames) {\n      if (el === slideElRef.value) {\n        slideClasses.value = classNames;\n      }\n    }\n\n    onMounted(() => {\n      if (!swiperRef || !swiperRef.value) return;\n      swiperRef.value.on('_slideClass', updateClasses);\n      eventAttached = true;\n    });\n\n    onBeforeUpdate(() => {\n      if (eventAttached || !swiperRef || !swiperRef.value) return;\n      swiperRef.value.on('_slideClass', updateClasses);\n      eventAttached = true;\n    });\n\n    onUpdated(() => {\n      if (!slideElRef.value || !swiperRef || !swiperRef.value) return;\n      if (typeof props.swiperSlideIndex !== 'undefined') {\n        slideElRef.value.swiperSlideIndex = props.swiperSlideIndex;\n      }\n      if (swiperRef.value.destroyed) {\n        if (slideClasses.value !== 'swiper-slide') {\n          slideClasses.value = 'swiper-slide';\n        }\n      }\n    });\n\n    onBeforeUnmount(() => {\n      if (!swiperRef || !swiperRef.value) return;\n      swiperRef.value.off('_slideClass', updateClasses);\n    });\n\n    const slideData = computed(() => ({\n      isActive: slideClasses.value.indexOf('swiper-slide-active') >= 0,\n      isVisible: slideClasses.value.indexOf('swiper-slide-visible') >= 0,\n      isPrev: slideClasses.value.indexOf('swiper-slide-prev') >= 0,\n      isNext: slideClasses.value.indexOf('swiper-slide-next') >= 0,\n    }));\n    provide('swiperSlide', slideData);\n\n    const onLoad = () => {\n      lazyLoaded.value = true;\n    };\n\n    return () => {\n      return h(\n        props.tag,\n        {\n          class: uniqueClasses(`${slideClasses.value}`),\n          ref: slideElRef,\n          'data-swiper-slide-index':\n            typeof props.virtualIndex === 'undefined' &&\n            swiperRef &&\n            swiperRef.value &&\n            swiperRef.value.params.loop\n              ? props.swiperSlideIndex\n              : props.virtualIndex,\n          onLoadCapture: onLoad,\n        },\n        props.zoom\n          ? h(\n              'div',\n              {\n                class: 'swiper-zoom-container',\n                'data-swiper-zoom': typeof props.zoom === 'number' ? props.zoom : undefined,\n              },\n              [\n                slots.default && slots.default(slideData.value),\n                props.lazy &&\n                  !lazyLoaded.value &&\n                  h('div', {\n                    class: 'swiper-lazy-preloader',\n                    onVnodeMounted: (vnode) => {\n                      if (vnode.el) vnode.el.lazyPreloaderManaged = true;\n                    },\n                  }),\n              ],\n            )\n          : [\n              slots.default && slots.default(slideData.value),\n              props.lazy &&\n                !lazyLoaded.value &&\n                h('div', {\n                  class: 'swiper-lazy-preloader',\n                  onVnodeMounted: (vnode) => {\n                    if (vnode.el) vnode.el.lazyPreloaderManaged = true;\n                  },\n                }),\n            ],\n      );\n    };\n  },\n};\n\nexport { SwiperSlide };\n"
  },
  {
    "path": "src/vue/swiper.mjs",
    "content": "import { h, ref, onMounted, onUpdated, onBeforeUnmount, watch, nextTick, provide } from 'vue';\nimport SwiperCore from '../swiper.mjs';\nimport { getParams } from '../components-shared/get-params.mjs';\nimport { mountSwiper } from '../components-shared/mount-swiper.mjs';\nimport {\n  needsScrollbar,\n  needsNavigation,\n  needsPagination,\n  uniqueClasses,\n  extend,\n  wrapperClass,\n} from '../components-shared/utils.mjs';\nimport { getChangedParams } from '../components-shared/get-changed-params.mjs';\nimport { getChildren } from './get-children.mjs';\nimport { updateSwiper } from '../components-shared/update-swiper.mjs';\nimport { renderVirtual } from './virtual.mjs';\nimport { updateOnVirtualData } from '../components-shared/update-on-virtual-data.mjs';\n\nconst Swiper = {\n  name: 'Swiper',\n  props: {\n    tag: {\n      type: String,\n      default: 'div',\n    },\n    wrapperTag: {\n      type: String,\n      default: 'div',\n    },\n    modules: { type: Array, default: undefined },\n    init: { type: Boolean, default: undefined },\n    direction: { type: String, default: undefined },\n    oneWayMovement: { type: Boolean, default: undefined },\n    swiperElementNodeName: { type: String, default: 'SWIPER-CONTAINER' },\n    touchEventsTarget: { type: String, default: undefined },\n    initialSlide: { type: Number, default: undefined },\n    speed: { type: Number, default: undefined },\n    cssMode: { type: Boolean, default: undefined },\n    updateOnWindowResize: { type: Boolean, default: undefined },\n    resizeObserver: { type: Boolean, default: undefined },\n    nested: { type: Boolean, default: undefined },\n    focusableElements: { type: String, default: undefined },\n    width: { type: Number, default: undefined },\n    height: { type: Number, default: undefined },\n    preventInteractionOnTransition: { type: Boolean, default: undefined },\n    userAgent: { type: String, default: undefined },\n    url: { type: String, default: undefined },\n    edgeSwipeDetection: { type: [Boolean, String], default: undefined },\n    edgeSwipeThreshold: { type: Number, default: undefined },\n    autoHeight: { type: Boolean, default: undefined },\n    setWrapperSize: { type: Boolean, default: undefined },\n    virtualTranslate: { type: Boolean, default: undefined },\n    effect: { type: String, default: undefined },\n    breakpoints: { type: Object, default: undefined },\n    breakpointsBase: { type: String, default: undefined },\n    spaceBetween: { type: [Number, String], default: undefined },\n    slidesPerView: { type: [Number, String], default: undefined },\n    maxBackfaceHiddenSlides: { type: Number, default: undefined },\n    slidesPerGroup: { type: Number, default: undefined },\n    slidesPerGroupSkip: { type: Number, default: undefined },\n    slidesPerGroupAuto: { type: Boolean, default: undefined },\n    centeredSlides: { type: Boolean, default: undefined },\n    centeredSlidesBounds: { type: Boolean, default: undefined },\n    slidesOffsetBefore: { type: Number, default: undefined },\n    slidesOffsetAfter: { type: Number, default: undefined },\n    normalizeSlideIndex: { type: Boolean, default: undefined },\n    centerInsufficientSlides: { type: Boolean, default: undefined },\n    watchOverflow: { type: Boolean, default: undefined },\n    roundLengths: { type: Boolean, default: undefined },\n    touchRatio: { type: Number, default: undefined },\n    touchAngle: { type: Number, default: undefined },\n    simulateTouch: { type: Boolean, default: undefined },\n    shortSwipes: { type: Boolean, default: undefined },\n    longSwipes: { type: Boolean, default: undefined },\n    longSwipesRatio: { type: Number, default: undefined },\n    longSwipesMs: { type: Number, default: undefined },\n    followFinger: { type: Boolean, default: undefined },\n    allowTouchMove: { type: Boolean, default: undefined },\n    threshold: { type: Number, default: undefined },\n    touchMoveStopPropagation: { type: Boolean, default: undefined },\n    touchStartPreventDefault: { type: Boolean, default: undefined },\n    touchStartForcePreventDefault: { type: Boolean, default: undefined },\n    touchReleaseOnEdges: { type: Boolean, default: undefined },\n    uniqueNavElements: { type: Boolean, default: undefined },\n    resistance: { type: Boolean, default: undefined },\n    resistanceRatio: { type: Number, default: undefined },\n    watchSlidesProgress: { type: Boolean, default: undefined },\n    grabCursor: { type: Boolean, default: undefined },\n    preventClicks: { type: Boolean, default: undefined },\n    preventClicksPropagation: { type: Boolean, default: undefined },\n    slideToClickedSlide: { type: Boolean, default: undefined },\n    loop: { type: Boolean, default: undefined },\n    loopedSlides: { type: Number, default: undefined },\n    loopPreventsSliding: { type: Boolean, default: undefined },\n    loopAdditionalSlides: { type: Number, default: undefined },\n    loopAddBlankSlides: { type: Boolean, default: undefined },\n    rewind: { type: Boolean, default: undefined },\n    allowSlidePrev: { type: Boolean, default: undefined },\n    allowSlideNext: { type: Boolean, default: undefined },\n    swipeHandler: { type: Boolean, default: undefined },\n    noSwiping: { type: Boolean, default: undefined },\n    noSwipingClass: { type: String, default: undefined },\n    noSwipingSelector: { type: String, default: undefined },\n    passiveListeners: { type: Boolean, default: undefined },\n    containerModifierClass: { type: String, default: undefined },\n    slideClass: { type: String, default: undefined },\n    slideActiveClass: { type: String, default: undefined },\n    slideVisibleClass: { type: String, default: undefined },\n    slideFullyVisibleClass: { type: String, default: undefined },\n    slideBlankClass: { type: String, default: undefined },\n    slideNextClass: { type: String, default: undefined },\n    slidePrevClass: { type: String, default: undefined },\n    wrapperClass: { type: String, default: undefined },\n    lazyPreloaderClass: { type: String, default: undefined },\n    lazyPreloadPrevNext: { type: Number, default: undefined },\n    runCallbacksOnInit: { type: Boolean, default: undefined },\n    observer: { type: Boolean, default: undefined },\n    observeParents: { type: Boolean, default: undefined },\n    observeSlideChildren: { type: Boolean, default: undefined },\n    a11y: { type: [Boolean, Object], default: undefined },\n    autoplay: { type: [Boolean, Object], default: undefined },\n    controller: { type: Object, default: undefined },\n    coverflowEffect: { type: Object, default: undefined },\n    cubeEffect: { type: Object, default: undefined },\n    fadeEffect: { type: Object, default: undefined },\n    flipEffect: { type: Object, default: undefined },\n    creativeEffect: { type: Object, default: undefined },\n    cardsEffect: { type: Object, default: undefined },\n    hashNavigation: { type: [Boolean, Object], default: undefined },\n    history: { type: [Boolean, Object], default: undefined },\n    keyboard: { type: [Boolean, Object], default: undefined },\n    mousewheel: { type: [Boolean, Object], default: undefined },\n    navigation: { type: [Boolean, Object], default: undefined },\n    pagination: { type: [Boolean, Object], default: undefined },\n    parallax: { type: [Boolean, Object], default: undefined },\n    scrollbar: { type: [Boolean, Object], default: undefined },\n    thumbs: { type: Object, default: undefined },\n    virtual: { type: [Boolean, Object], default: undefined },\n    zoom: { type: [Boolean, Object], default: undefined },\n    grid: { type: [Object], default: undefined },\n    freeMode: { type: [Boolean, Object], default: undefined },\n    enabled: { type: Boolean, default: undefined },\n  },\n  emits: [\n    '_beforeBreakpoint',\n    '_containerClasses',\n    '_slideClass',\n    '_slideClasses',\n    '_swiper',\n    '_freeModeNoMomentumRelease',\n    '_virtualUpdated',\n    'activeIndexChange',\n    'afterInit',\n    'autoplay',\n    'autoplayStart',\n    'autoplayStop',\n    'autoplayPause',\n    'autoplayResume',\n    'autoplayTimeLeft',\n    'beforeDestroy',\n    'beforeInit',\n    'beforeLoopFix',\n    'beforeResize',\n    'beforeSlideChangeStart',\n    'beforeTransitionStart',\n    'breakpoint',\n    'changeDirection',\n    'click',\n    'disable',\n    'doubleTap',\n    'doubleClick',\n    'destroy',\n    'enable',\n    'fromEdge',\n    'hashChange',\n    'hashSet',\n    'init',\n    'keyPress',\n    'lock',\n    'loopFix',\n    'momentumBounce',\n    'navigationHide',\n    'navigationShow',\n    'navigationPrev',\n    'navigationNext',\n    'observerUpdate',\n    'orientationchange',\n    'paginationHide',\n    'paginationRender',\n    'paginationShow',\n    'paginationUpdate',\n    'progress',\n    'reachBeginning',\n    'reachEnd',\n    'realIndexChange',\n    'resize',\n    'scroll',\n    'scrollbarDragEnd',\n    'scrollbarDragMove',\n    'scrollbarDragStart',\n    'setTransition',\n    'setTranslate',\n    'slidesUpdated',\n    'slideChange',\n    'slideChangeTransitionEnd',\n    'slideChangeTransitionStart',\n    'slideNextTransitionEnd',\n    'slideNextTransitionStart',\n    'slidePrevTransitionEnd',\n    'slidePrevTransitionStart',\n    'slideResetTransitionStart',\n    'slideResetTransitionEnd',\n    'sliderMove',\n    'sliderFirstMove',\n    'slidesLengthChange',\n    'slidesGridLengthChange',\n    'snapGridLengthChange',\n    'snapIndexChange',\n    'swiper',\n    'tap',\n    'toEdge',\n    'touchEnd',\n    'touchMove',\n    'touchMoveOpposite',\n    'touchStart',\n    'transitionEnd',\n    'transitionStart',\n    'unlock',\n    'update',\n    'virtualUpdate',\n    'zoomChange',\n  ],\n  setup(props, { slots: originalSlots, emit }) {\n    const { tag: Tag, wrapperTag: WrapperTag } = props;\n\n    const containerClasses = ref('swiper');\n    const virtualData = ref(null);\n    const breakpointChanged = ref(false);\n    const initializedRef = ref(false);\n    const swiperElRef = ref(null);\n    const swiperRef = ref(null);\n    const oldPassedParamsRef = ref(null);\n    const slidesRef = { value: [] };\n    const oldSlidesRef = { value: [] };\n\n    const nextElRef = ref(null);\n    const prevElRef = ref(null);\n    const paginationElRef = ref(null);\n    const scrollbarElRef = ref(null);\n\n    const { params: swiperParams, passedParams } = getParams(props, false);\n\n    getChildren(originalSlots, slidesRef, oldSlidesRef);\n\n    oldPassedParamsRef.value = passedParams;\n    oldSlidesRef.value = slidesRef.value;\n\n    const onBeforeBreakpoint = () => {\n      getChildren(originalSlots, slidesRef, oldSlidesRef);\n      breakpointChanged.value = true;\n    };\n\n    swiperParams.onAny = (event, ...args) => {\n      emit(event, ...args);\n    };\n\n    Object.assign(swiperParams.on, {\n      _beforeBreakpoint: onBeforeBreakpoint,\n      _containerClasses(swiper, classes) {\n        containerClasses.value = classes;\n      },\n    });\n\n    // init Swiper\n    const passParams = { ...swiperParams };\n    delete passParams.wrapperClass;\n    swiperRef.value = new SwiperCore(passParams);\n    if (swiperRef.value.virtual && swiperRef.value.params.virtual.enabled) {\n      swiperRef.value.virtual.slides = slidesRef.value;\n      const extendWith = {\n        cache: false,\n        slides: slidesRef.value,\n        renderExternal: (data) => {\n          virtualData.value = data;\n        },\n        renderExternalUpdate: false,\n      };\n      extend(swiperRef.value.params.virtual, extendWith);\n      extend(swiperRef.value.originalParams.virtual, extendWith);\n    }\n\n    onUpdated(() => {\n      // set initialized flag\n      if (!initializedRef.value && swiperRef.value) {\n        swiperRef.value.emitSlidesClasses();\n        initializedRef.value = true;\n      }\n      // watch for params change\n      const { passedParams: newPassedParams } = getParams(props, false);\n\n      const changedParams = getChangedParams(\n        newPassedParams,\n        oldPassedParamsRef.value,\n        slidesRef.value,\n        oldSlidesRef.value,\n        (c) => c.props && c.props.key,\n      );\n      oldPassedParamsRef.value = newPassedParams;\n\n      if (\n        (changedParams.length || breakpointChanged.value) &&\n        swiperRef.value &&\n        !swiperRef.value.destroyed\n      ) {\n        updateSwiper({\n          swiper: swiperRef.value,\n          slides: slidesRef.value,\n          passedParams: newPassedParams,\n          changedParams,\n          nextEl: nextElRef.value,\n          prevEl: prevElRef.value,\n          scrollbarEl: scrollbarElRef.value,\n          paginationEl: paginationElRef.value,\n        });\n      }\n      breakpointChanged.value = false;\n    });\n\n    provide('swiper', swiperRef);\n\n    // update on virtual update\n    watch(virtualData, () => {\n      nextTick(() => {\n        updateOnVirtualData(swiperRef.value);\n      });\n    });\n\n    // mount swiper\n    onMounted(() => {\n      if (!swiperElRef.value) return;\n      mountSwiper(\n        {\n          el: swiperElRef.value,\n          nextEl: nextElRef.value,\n          prevEl: prevElRef.value,\n          paginationEl: paginationElRef.value,\n          scrollbarEl: scrollbarElRef.value,\n          swiper: swiperRef.value,\n        },\n        swiperParams,\n      );\n\n      emit('swiper', swiperRef.value);\n    });\n    onBeforeUnmount(() => {\n      if (swiperRef.value && !swiperRef.value.destroyed) {\n        swiperRef.value.destroy(true, false);\n      }\n    });\n\n    // bypass swiper instance to slides\n    function renderSlides(slides) {\n      if (swiperParams.virtual) {\n        return renderVirtual(swiperRef, slides, virtualData.value);\n      }\n      slides.forEach((slide, index) => {\n        if (!slide.props) slide.props = {};\n        slide.props.swiperRef = swiperRef;\n        slide.props.swiperSlideIndex = index;\n      });\n      return slides;\n    }\n\n    return () => {\n      const { slides, slots } = getChildren(originalSlots, slidesRef, oldSlidesRef);\n      return h(\n        Tag,\n        {\n          ref: swiperElRef,\n          class: uniqueClasses(containerClasses.value),\n        },\n        [\n          slots['container-start'],\n          h(WrapperTag, { class: wrapperClass(swiperParams.wrapperClass) }, [\n            slots['wrapper-start'],\n            renderSlides(slides),\n            slots['wrapper-end'],\n          ]),\n          needsNavigation(props) && [\n            h('div', { ref: prevElRef, class: 'swiper-button-prev' }),\n            h('div', { ref: nextElRef, class: 'swiper-button-next' }),\n          ],\n          needsScrollbar(props) && h('div', { ref: scrollbarElRef, class: 'swiper-scrollbar' }),\n          needsPagination(props) && h('div', { ref: paginationElRef, class: 'swiper-pagination' }),\n          slots['container-end'],\n        ],\n      );\n    };\n  },\n};\n\nexport { Swiper };\n"
  },
  {
    "path": "src/vue/virtual.mjs",
    "content": "import { h } from 'vue';\n\nfunction renderVirtual(swiperRef, slides, virtualData) {\n  if (!virtualData) return null;\n  const getSlideIndex = (index) => {\n    let slideIndex = index;\n    if (index < 0) {\n      slideIndex = slides.length + index;\n    } else if (slideIndex >= slides.length) {\n      // eslint-disable-next-line\n      slideIndex = slideIndex - slides.length;\n    }\n    return slideIndex;\n  };\n  const style = swiperRef.value.isHorizontal()\n    ? {\n        [swiperRef.value.rtlTranslate ? 'right' : 'left']: `${virtualData.offset}px`,\n      }\n    : {\n        top: `${virtualData.offset}px`,\n      };\n  const { from, to } = virtualData;\n  const loopFrom = swiperRef.value.params.loop ? -slides.length : 0;\n  const loopTo = swiperRef.value.params.loop ? slides.length * 2 : slides.length;\n  const slidesToRender = [];\n  for (let i = loopFrom; i < loopTo; i += 1) {\n    if (i >= from && i <= to && slidesToRender.length < slides.length) {\n      slidesToRender.push(slides[getSlideIndex(i)]);\n    }\n  }\n  return slidesToRender.map((slide) => {\n    if (!slide.props) slide.props = {};\n    if (!slide.props.style) slide.props.style = {};\n    slide.props.swiperRef = swiperRef;\n    slide.props.style = style;\n    if (slide.type) {\n      return h(slide.type, { ...slide.props }, slide.children);\n    } else if (slide.componentOptions) {\n      return h(slide.componentOptions.Ctor, { ...slide.props }, slide.componentOptions.children);\n    }\n  });\n}\n\nexport { renderVirtual };\n"
  }
]