swiper-element-bundle.js 367 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666
  1. /**
  2. * Swiper Custom Element 9.4.1
  3. * Most modern mobile touch slider and framework with hardware accelerated transitions
  4. * https://swiperjs.com
  5. *
  6. * Copyright 2014-2023 Vladimir Kharlampidi
  7. *
  8. * Released under the MIT License
  9. *
  10. * Released on: June 13, 2023
  11. */
  12. (function () {
  13. 'use strict';
  14. /**
  15. * SSR Window 4.0.2
  16. * Better handling for window object in SSR environment
  17. * https://github.com/nolimits4web/ssr-window
  18. *
  19. * Copyright 2021, Vladimir Kharlampidi
  20. *
  21. * Licensed under MIT
  22. *
  23. * Released on: December 13, 2021
  24. */
  25. /* eslint-disable no-param-reassign */
  26. function isObject$2(obj) {
  27. return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
  28. }
  29. function extend$2(target, src) {
  30. if (target === void 0) {
  31. target = {};
  32. }
  33. if (src === void 0) {
  34. src = {};
  35. }
  36. Object.keys(src).forEach(key => {
  37. if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$2(src[key]) && isObject$2(target[key]) && Object.keys(src[key]).length > 0) {
  38. extend$2(target[key], src[key]);
  39. }
  40. });
  41. }
  42. const ssrDocument = {
  43. body: {},
  44. addEventListener() {},
  45. removeEventListener() {},
  46. activeElement: {
  47. blur() {},
  48. nodeName: ''
  49. },
  50. querySelector() {
  51. return null;
  52. },
  53. querySelectorAll() {
  54. return [];
  55. },
  56. getElementById() {
  57. return null;
  58. },
  59. createEvent() {
  60. return {
  61. initEvent() {}
  62. };
  63. },
  64. createElement() {
  65. return {
  66. children: [],
  67. childNodes: [],
  68. style: {},
  69. setAttribute() {},
  70. getElementsByTagName() {
  71. return [];
  72. }
  73. };
  74. },
  75. createElementNS() {
  76. return {};
  77. },
  78. importNode() {
  79. return null;
  80. },
  81. location: {
  82. hash: '',
  83. host: '',
  84. hostname: '',
  85. href: '',
  86. origin: '',
  87. pathname: '',
  88. protocol: '',
  89. search: ''
  90. }
  91. };
  92. function getDocument() {
  93. const doc = typeof document !== 'undefined' ? document : {};
  94. extend$2(doc, ssrDocument);
  95. return doc;
  96. }
  97. const ssrWindow = {
  98. document: ssrDocument,
  99. navigator: {
  100. userAgent: ''
  101. },
  102. location: {
  103. hash: '',
  104. host: '',
  105. hostname: '',
  106. href: '',
  107. origin: '',
  108. pathname: '',
  109. protocol: '',
  110. search: ''
  111. },
  112. history: {
  113. replaceState() {},
  114. pushState() {},
  115. go() {},
  116. back() {}
  117. },
  118. CustomEvent: function CustomEvent() {
  119. return this;
  120. },
  121. addEventListener() {},
  122. removeEventListener() {},
  123. getComputedStyle() {
  124. return {
  125. getPropertyValue() {
  126. return '';
  127. }
  128. };
  129. },
  130. Image() {},
  131. Date() {},
  132. screen: {},
  133. setTimeout() {},
  134. clearTimeout() {},
  135. matchMedia() {
  136. return {};
  137. },
  138. requestAnimationFrame(callback) {
  139. if (typeof setTimeout === 'undefined') {
  140. callback();
  141. return null;
  142. }
  143. return setTimeout(callback, 0);
  144. },
  145. cancelAnimationFrame(id) {
  146. if (typeof setTimeout === 'undefined') {
  147. return;
  148. }
  149. clearTimeout(id);
  150. }
  151. };
  152. function getWindow() {
  153. const win = typeof window !== 'undefined' ? window : {};
  154. extend$2(win, ssrWindow);
  155. return win;
  156. }
  157. function deleteProps(obj) {
  158. const object = obj;
  159. Object.keys(object).forEach(key => {
  160. try {
  161. object[key] = null;
  162. } catch (e) {
  163. // no getter for object
  164. }
  165. try {
  166. delete object[key];
  167. } catch (e) {
  168. // something got wrong
  169. }
  170. });
  171. }
  172. function nextTick(callback, delay) {
  173. if (delay === void 0) {
  174. delay = 0;
  175. }
  176. return setTimeout(callback, delay);
  177. }
  178. function now() {
  179. return Date.now();
  180. }
  181. function getComputedStyle$1(el) {
  182. const window = getWindow();
  183. let style;
  184. if (window.getComputedStyle) {
  185. style = window.getComputedStyle(el, null);
  186. }
  187. if (!style && el.currentStyle) {
  188. style = el.currentStyle;
  189. }
  190. if (!style) {
  191. style = el.style;
  192. }
  193. return style;
  194. }
  195. function getTranslate(el, axis) {
  196. if (axis === void 0) {
  197. axis = 'x';
  198. }
  199. const window = getWindow();
  200. let matrix;
  201. let curTransform;
  202. let transformMatrix;
  203. const curStyle = getComputedStyle$1(el);
  204. if (window.WebKitCSSMatrix) {
  205. curTransform = curStyle.transform || curStyle.webkitTransform;
  206. if (curTransform.split(',').length > 6) {
  207. curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
  208. }
  209. // Some old versions of Webkit choke when 'none' is passed; pass
  210. // empty string instead in this case
  211. transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
  212. } else {
  213. transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
  214. matrix = transformMatrix.toString().split(',');
  215. }
  216. if (axis === 'x') {
  217. // Latest Chrome and webkits Fix
  218. if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
  219. // Crazy IE10 Matrix
  220. else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
  221. // Normal Browsers
  222. else curTransform = parseFloat(matrix[4]);
  223. }
  224. if (axis === 'y') {
  225. // Latest Chrome and webkits Fix
  226. if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
  227. // Crazy IE10 Matrix
  228. else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
  229. // Normal Browsers
  230. else curTransform = parseFloat(matrix[5]);
  231. }
  232. return curTransform || 0;
  233. }
  234. function isObject$1(o) {
  235. return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
  236. }
  237. function isNode(node) {
  238. // eslint-disable-next-line
  239. if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
  240. return node instanceof HTMLElement;
  241. }
  242. return node && (node.nodeType === 1 || node.nodeType === 11);
  243. }
  244. function extend$1() {
  245. const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
  246. const noExtend = ['__proto__', 'constructor', 'prototype'];
  247. for (let i = 1; i < arguments.length; i += 1) {
  248. const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
  249. if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
  250. const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
  251. for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
  252. const nextKey = keysArray[nextIndex];
  253. const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
  254. if (desc !== undefined && desc.enumerable) {
  255. if (isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
  256. if (nextSource[nextKey].__swiper__) {
  257. to[nextKey] = nextSource[nextKey];
  258. } else {
  259. extend$1(to[nextKey], nextSource[nextKey]);
  260. }
  261. } else if (!isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
  262. to[nextKey] = {};
  263. if (nextSource[nextKey].__swiper__) {
  264. to[nextKey] = nextSource[nextKey];
  265. } else {
  266. extend$1(to[nextKey], nextSource[nextKey]);
  267. }
  268. } else {
  269. to[nextKey] = nextSource[nextKey];
  270. }
  271. }
  272. }
  273. }
  274. }
  275. return to;
  276. }
  277. function setCSSProperty(el, varName, varValue) {
  278. el.style.setProperty(varName, varValue);
  279. }
  280. function animateCSSModeScroll(_ref) {
  281. let {
  282. swiper,
  283. targetPosition,
  284. side
  285. } = _ref;
  286. const window = getWindow();
  287. const startPosition = -swiper.translate;
  288. let startTime = null;
  289. let time;
  290. const duration = swiper.params.speed;
  291. swiper.wrapperEl.style.scrollSnapType = 'none';
  292. window.cancelAnimationFrame(swiper.cssModeFrameID);
  293. const dir = targetPosition > startPosition ? 'next' : 'prev';
  294. const isOutOfBound = (current, target) => {
  295. return dir === 'next' && current >= target || dir === 'prev' && current <= target;
  296. };
  297. const animate = () => {
  298. time = new Date().getTime();
  299. if (startTime === null) {
  300. startTime = time;
  301. }
  302. const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
  303. const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
  304. let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
  305. if (isOutOfBound(currentPosition, targetPosition)) {
  306. currentPosition = targetPosition;
  307. }
  308. swiper.wrapperEl.scrollTo({
  309. [side]: currentPosition
  310. });
  311. if (isOutOfBound(currentPosition, targetPosition)) {
  312. swiper.wrapperEl.style.overflow = 'hidden';
  313. swiper.wrapperEl.style.scrollSnapType = '';
  314. setTimeout(() => {
  315. swiper.wrapperEl.style.overflow = '';
  316. swiper.wrapperEl.scrollTo({
  317. [side]: currentPosition
  318. });
  319. });
  320. window.cancelAnimationFrame(swiper.cssModeFrameID);
  321. return;
  322. }
  323. swiper.cssModeFrameID = window.requestAnimationFrame(animate);
  324. };
  325. animate();
  326. }
  327. function getSlideTransformEl(slideEl) {
  328. return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowEl && slideEl.shadowEl.querySelector('.swiper-slide-transform') || slideEl;
  329. }
  330. function elementChildren(element, selector) {
  331. if (selector === void 0) {
  332. selector = '';
  333. }
  334. return [...element.children].filter(el => el.matches(selector));
  335. }
  336. function createElement(tag, classes) {
  337. if (classes === void 0) {
  338. classes = [];
  339. }
  340. const el = document.createElement(tag);
  341. el.classList.add(...(Array.isArray(classes) ? classes : [classes]));
  342. return el;
  343. }
  344. function elementOffset(el) {
  345. const window = getWindow();
  346. const document = getDocument();
  347. const box = el.getBoundingClientRect();
  348. const body = document.body;
  349. const clientTop = el.clientTop || body.clientTop || 0;
  350. const clientLeft = el.clientLeft || body.clientLeft || 0;
  351. const scrollTop = el === window ? window.scrollY : el.scrollTop;
  352. const scrollLeft = el === window ? window.scrollX : el.scrollLeft;
  353. return {
  354. top: box.top + scrollTop - clientTop,
  355. left: box.left + scrollLeft - clientLeft
  356. };
  357. }
  358. function elementPrevAll(el, selector) {
  359. const prevEls = [];
  360. while (el.previousElementSibling) {
  361. const prev = el.previousElementSibling; // eslint-disable-line
  362. if (selector) {
  363. if (prev.matches(selector)) prevEls.push(prev);
  364. } else prevEls.push(prev);
  365. el = prev;
  366. }
  367. return prevEls;
  368. }
  369. function elementNextAll(el, selector) {
  370. const nextEls = [];
  371. while (el.nextElementSibling) {
  372. const next = el.nextElementSibling; // eslint-disable-line
  373. if (selector) {
  374. if (next.matches(selector)) nextEls.push(next);
  375. } else nextEls.push(next);
  376. el = next;
  377. }
  378. return nextEls;
  379. }
  380. function elementStyle(el, prop) {
  381. const window = getWindow();
  382. return window.getComputedStyle(el, null).getPropertyValue(prop);
  383. }
  384. function elementIndex(el) {
  385. let child = el;
  386. let i;
  387. if (child) {
  388. i = 0;
  389. // eslint-disable-next-line
  390. while ((child = child.previousSibling) !== null) {
  391. if (child.nodeType === 1) i += 1;
  392. }
  393. return i;
  394. }
  395. return undefined;
  396. }
  397. function elementParents(el, selector) {
  398. const parents = []; // eslint-disable-line
  399. let parent = el.parentElement; // eslint-disable-line
  400. while (parent) {
  401. if (selector) {
  402. if (parent.matches(selector)) parents.push(parent);
  403. } else {
  404. parents.push(parent);
  405. }
  406. parent = parent.parentElement;
  407. }
  408. return parents;
  409. }
  410. function elementTransitionEnd(el, callback) {
  411. function fireCallBack(e) {
  412. if (e.target !== el) return;
  413. callback.call(el, e);
  414. el.removeEventListener('transitionend', fireCallBack);
  415. }
  416. if (callback) {
  417. el.addEventListener('transitionend', fireCallBack);
  418. }
  419. }
  420. function elementOuterSize(el, size, includeMargins) {
  421. const window = getWindow();
  422. if (includeMargins) {
  423. return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
  424. }
  425. return el.offsetWidth;
  426. }
  427. let support;
  428. function calcSupport() {
  429. const window = getWindow();
  430. const document = getDocument();
  431. return {
  432. smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
  433. touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
  434. };
  435. }
  436. function getSupport() {
  437. if (!support) {
  438. support = calcSupport();
  439. }
  440. return support;
  441. }
  442. let deviceCached;
  443. function calcDevice(_temp) {
  444. let {
  445. userAgent
  446. } = _temp === void 0 ? {} : _temp;
  447. const support = getSupport();
  448. const window = getWindow();
  449. const platform = window.navigator.platform;
  450. const ua = userAgent || window.navigator.userAgent;
  451. const device = {
  452. ios: false,
  453. android: false
  454. };
  455. const screenWidth = window.screen.width;
  456. const screenHeight = window.screen.height;
  457. const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
  458. let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
  459. const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
  460. const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
  461. const windows = platform === 'Win32';
  462. let macos = platform === 'MacIntel';
  463. // iPadOs 13 fix
  464. const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
  465. if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
  466. ipad = ua.match(/(Version)\/([\d.]+)/);
  467. if (!ipad) ipad = [0, 1, '13_0_0'];
  468. macos = false;
  469. }
  470. // Android
  471. if (android && !windows) {
  472. device.os = 'android';
  473. device.android = true;
  474. }
  475. if (ipad || iphone || ipod) {
  476. device.os = 'ios';
  477. device.ios = true;
  478. }
  479. // Export object
  480. return device;
  481. }
  482. function getDevice(overrides) {
  483. if (overrides === void 0) {
  484. overrides = {};
  485. }
  486. if (!deviceCached) {
  487. deviceCached = calcDevice(overrides);
  488. }
  489. return deviceCached;
  490. }
  491. let browser;
  492. function calcBrowser() {
  493. const window = getWindow();
  494. let needPerspectiveFix = false;
  495. function isSafari() {
  496. const ua = window.navigator.userAgent.toLowerCase();
  497. return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
  498. }
  499. if (isSafari()) {
  500. const ua = String(window.navigator.userAgent);
  501. if (ua.includes('Version/')) {
  502. const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));
  503. needPerspectiveFix = major < 16 || major === 16 && minor < 2;
  504. }
  505. }
  506. return {
  507. isSafari: needPerspectiveFix || isSafari(),
  508. needPerspectiveFix,
  509. isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)
  510. };
  511. }
  512. function getBrowser() {
  513. if (!browser) {
  514. browser = calcBrowser();
  515. }
  516. return browser;
  517. }
  518. function Resize(_ref) {
  519. let {
  520. swiper,
  521. on,
  522. emit
  523. } = _ref;
  524. const window = getWindow();
  525. let observer = null;
  526. let animationFrame = null;
  527. const resizeHandler = () => {
  528. if (!swiper || swiper.destroyed || !swiper.initialized) return;
  529. emit('beforeResize');
  530. emit('resize');
  531. };
  532. const createObserver = () => {
  533. if (!swiper || swiper.destroyed || !swiper.initialized) return;
  534. observer = new ResizeObserver(entries => {
  535. animationFrame = window.requestAnimationFrame(() => {
  536. const {
  537. width,
  538. height
  539. } = swiper;
  540. let newWidth = width;
  541. let newHeight = height;
  542. entries.forEach(_ref2 => {
  543. let {
  544. contentBoxSize,
  545. contentRect,
  546. target
  547. } = _ref2;
  548. if (target && target !== swiper.el) return;
  549. newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
  550. newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
  551. });
  552. if (newWidth !== width || newHeight !== height) {
  553. resizeHandler();
  554. }
  555. });
  556. });
  557. observer.observe(swiper.el);
  558. };
  559. const removeObserver = () => {
  560. if (animationFrame) {
  561. window.cancelAnimationFrame(animationFrame);
  562. }
  563. if (observer && observer.unobserve && swiper.el) {
  564. observer.unobserve(swiper.el);
  565. observer = null;
  566. }
  567. };
  568. const orientationChangeHandler = () => {
  569. if (!swiper || swiper.destroyed || !swiper.initialized) return;
  570. emit('orientationchange');
  571. };
  572. on('init', () => {
  573. if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
  574. createObserver();
  575. return;
  576. }
  577. window.addEventListener('resize', resizeHandler);
  578. window.addEventListener('orientationchange', orientationChangeHandler);
  579. });
  580. on('destroy', () => {
  581. removeObserver();
  582. window.removeEventListener('resize', resizeHandler);
  583. window.removeEventListener('orientationchange', orientationChangeHandler);
  584. });
  585. }
  586. function Observer(_ref) {
  587. let {
  588. swiper,
  589. extendParams,
  590. on,
  591. emit
  592. } = _ref;
  593. const observers = [];
  594. const window = getWindow();
  595. const attach = function (target, options) {
  596. if (options === void 0) {
  597. options = {};
  598. }
  599. const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
  600. const observer = new ObserverFunc(mutations => {
  601. // The observerUpdate event should only be triggered
  602. // once despite the number of mutations. Additional
  603. // triggers are redundant and are very costly
  604. if (swiper.__preventObserver__) return;
  605. if (mutations.length === 1) {
  606. emit('observerUpdate', mutations[0]);
  607. return;
  608. }
  609. const observerUpdate = function observerUpdate() {
  610. emit('observerUpdate', mutations[0]);
  611. };
  612. if (window.requestAnimationFrame) {
  613. window.requestAnimationFrame(observerUpdate);
  614. } else {
  615. window.setTimeout(observerUpdate, 0);
  616. }
  617. });
  618. observer.observe(target, {
  619. attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
  620. childList: typeof options.childList === 'undefined' ? true : options.childList,
  621. characterData: typeof options.characterData === 'undefined' ? true : options.characterData
  622. });
  623. observers.push(observer);
  624. };
  625. const init = () => {
  626. if (!swiper.params.observer) return;
  627. if (swiper.params.observeParents) {
  628. const containerParents = elementParents(swiper.el);
  629. for (let i = 0; i < containerParents.length; i += 1) {
  630. attach(containerParents[i]);
  631. }
  632. }
  633. // Observe container
  634. attach(swiper.el, {
  635. childList: swiper.params.observeSlideChildren
  636. });
  637. // Observe wrapper
  638. attach(swiper.wrapperEl, {
  639. attributes: false
  640. });
  641. };
  642. const destroy = () => {
  643. observers.forEach(observer => {
  644. observer.disconnect();
  645. });
  646. observers.splice(0, observers.length);
  647. };
  648. extendParams({
  649. observer: false,
  650. observeParents: false,
  651. observeSlideChildren: false
  652. });
  653. on('init', init);
  654. on('destroy', destroy);
  655. }
  656. /* eslint-disable no-underscore-dangle */
  657. var eventsEmitter = {
  658. on(events, handler, priority) {
  659. const self = this;
  660. if (!self.eventsListeners || self.destroyed) return self;
  661. if (typeof handler !== 'function') return self;
  662. const method = priority ? 'unshift' : 'push';
  663. events.split(' ').forEach(event => {
  664. if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
  665. self.eventsListeners[event][method](handler);
  666. });
  667. return self;
  668. },
  669. once(events, handler, priority) {
  670. const self = this;
  671. if (!self.eventsListeners || self.destroyed) return self;
  672. if (typeof handler !== 'function') return self;
  673. function onceHandler() {
  674. self.off(events, onceHandler);
  675. if (onceHandler.__emitterProxy) {
  676. delete onceHandler.__emitterProxy;
  677. }
  678. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  679. args[_key] = arguments[_key];
  680. }
  681. handler.apply(self, args);
  682. }
  683. onceHandler.__emitterProxy = handler;
  684. return self.on(events, onceHandler, priority);
  685. },
  686. onAny(handler, priority) {
  687. const self = this;
  688. if (!self.eventsListeners || self.destroyed) return self;
  689. if (typeof handler !== 'function') return self;
  690. const method = priority ? 'unshift' : 'push';
  691. if (self.eventsAnyListeners.indexOf(handler) < 0) {
  692. self.eventsAnyListeners[method](handler);
  693. }
  694. return self;
  695. },
  696. offAny(handler) {
  697. const self = this;
  698. if (!self.eventsListeners || self.destroyed) return self;
  699. if (!self.eventsAnyListeners) return self;
  700. const index = self.eventsAnyListeners.indexOf(handler);
  701. if (index >= 0) {
  702. self.eventsAnyListeners.splice(index, 1);
  703. }
  704. return self;
  705. },
  706. off(events, handler) {
  707. const self = this;
  708. if (!self.eventsListeners || self.destroyed) return self;
  709. if (!self.eventsListeners) return self;
  710. events.split(' ').forEach(event => {
  711. if (typeof handler === 'undefined') {
  712. self.eventsListeners[event] = [];
  713. } else if (self.eventsListeners[event]) {
  714. self.eventsListeners[event].forEach((eventHandler, index) => {
  715. if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
  716. self.eventsListeners[event].splice(index, 1);
  717. }
  718. });
  719. }
  720. });
  721. return self;
  722. },
  723. emit() {
  724. const self = this;
  725. if (!self.eventsListeners || self.destroyed) return self;
  726. if (!self.eventsListeners) return self;
  727. let events;
  728. let data;
  729. let context;
  730. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  731. args[_key2] = arguments[_key2];
  732. }
  733. if (typeof args[0] === 'string' || Array.isArray(args[0])) {
  734. events = args[0];
  735. data = args.slice(1, args.length);
  736. context = self;
  737. } else {
  738. events = args[0].events;
  739. data = args[0].data;
  740. context = args[0].context || self;
  741. }
  742. data.unshift(context);
  743. const eventsArray = Array.isArray(events) ? events : events.split(' ');
  744. eventsArray.forEach(event => {
  745. if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
  746. self.eventsAnyListeners.forEach(eventHandler => {
  747. eventHandler.apply(context, [event, ...data]);
  748. });
  749. }
  750. if (self.eventsListeners && self.eventsListeners[event]) {
  751. self.eventsListeners[event].forEach(eventHandler => {
  752. eventHandler.apply(context, data);
  753. });
  754. }
  755. });
  756. return self;
  757. }
  758. };
  759. function updateSize() {
  760. const swiper = this;
  761. let width;
  762. let height;
  763. const el = swiper.el;
  764. if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
  765. width = swiper.params.width;
  766. } else {
  767. width = el.clientWidth;
  768. }
  769. if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
  770. height = swiper.params.height;
  771. } else {
  772. height = el.clientHeight;
  773. }
  774. if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
  775. return;
  776. }
  777. // Subtract paddings
  778. width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);
  779. height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);
  780. if (Number.isNaN(width)) width = 0;
  781. if (Number.isNaN(height)) height = 0;
  782. Object.assign(swiper, {
  783. width,
  784. height,
  785. size: swiper.isHorizontal() ? width : height
  786. });
  787. }
  788. function updateSlides() {
  789. const swiper = this;
  790. function getDirectionLabel(property) {
  791. if (swiper.isHorizontal()) {
  792. return property;
  793. }
  794. // prettier-ignore
  795. return {
  796. 'width': 'height',
  797. 'margin-top': 'margin-left',
  798. 'margin-bottom ': 'margin-right',
  799. 'margin-left': 'margin-top',
  800. 'margin-right': 'margin-bottom',
  801. 'padding-left': 'padding-top',
  802. 'padding-right': 'padding-bottom',
  803. 'marginRight': 'marginBottom'
  804. }[property];
  805. }
  806. function getDirectionPropertyValue(node, label) {
  807. return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);
  808. }
  809. const params = swiper.params;
  810. const {
  811. wrapperEl,
  812. slidesEl,
  813. size: swiperSize,
  814. rtlTranslate: rtl,
  815. wrongRTL
  816. } = swiper;
  817. const isVirtual = swiper.virtual && params.virtual.enabled;
  818. const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
  819. const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
  820. const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
  821. let snapGrid = [];
  822. const slidesGrid = [];
  823. const slidesSizesGrid = [];
  824. let offsetBefore = params.slidesOffsetBefore;
  825. if (typeof offsetBefore === 'function') {
  826. offsetBefore = params.slidesOffsetBefore.call(swiper);
  827. }
  828. let offsetAfter = params.slidesOffsetAfter;
  829. if (typeof offsetAfter === 'function') {
  830. offsetAfter = params.slidesOffsetAfter.call(swiper);
  831. }
  832. const previousSnapGridLength = swiper.snapGrid.length;
  833. const previousSlidesGridLength = swiper.slidesGrid.length;
  834. let spaceBetween = params.spaceBetween;
  835. let slidePosition = -offsetBefore;
  836. let prevSlideSize = 0;
  837. let index = 0;
  838. if (typeof swiperSize === 'undefined') {
  839. return;
  840. }
  841. if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
  842. spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
  843. } else if (typeof spaceBetween === 'string') {
  844. spaceBetween = parseFloat(spaceBetween);
  845. }
  846. swiper.virtualSize = -spaceBetween;
  847. // reset margins
  848. slides.forEach(slideEl => {
  849. if (rtl) {
  850. slideEl.style.marginLeft = '';
  851. } else {
  852. slideEl.style.marginRight = '';
  853. }
  854. slideEl.style.marginBottom = '';
  855. slideEl.style.marginTop = '';
  856. });
  857. // reset cssMode offsets
  858. if (params.centeredSlides && params.cssMode) {
  859. setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');
  860. setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');
  861. }
  862. const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
  863. if (gridEnabled) {
  864. swiper.grid.initSlides(slidesLength);
  865. }
  866. // Calc slides
  867. let slideSize;
  868. const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {
  869. return typeof params.breakpoints[key].slidesPerView !== 'undefined';
  870. }).length > 0;
  871. for (let i = 0; i < slidesLength; i += 1) {
  872. slideSize = 0;
  873. let slide;
  874. if (slides[i]) slide = slides[i];
  875. if (gridEnabled) {
  876. swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);
  877. }
  878. if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
  879. if (params.slidesPerView === 'auto') {
  880. if (shouldResetSlideSize) {
  881. slides[i].style[getDirectionLabel('width')] = ``;
  882. }
  883. const slideStyles = getComputedStyle(slide);
  884. const currentTransform = slide.style.transform;
  885. const currentWebKitTransform = slide.style.webkitTransform;
  886. if (currentTransform) {
  887. slide.style.transform = 'none';
  888. }
  889. if (currentWebKitTransform) {
  890. slide.style.webkitTransform = 'none';
  891. }
  892. if (params.roundLengths) {
  893. slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);
  894. } else {
  895. // eslint-disable-next-line
  896. const width = getDirectionPropertyValue(slideStyles, 'width');
  897. const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
  898. const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
  899. const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
  900. const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
  901. const boxSizing = slideStyles.getPropertyValue('box-sizing');
  902. if (boxSizing && boxSizing === 'border-box') {
  903. slideSize = width + marginLeft + marginRight;
  904. } else {
  905. const {
  906. clientWidth,
  907. offsetWidth
  908. } = slide;
  909. slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
  910. }
  911. }
  912. if (currentTransform) {
  913. slide.style.transform = currentTransform;
  914. }
  915. if (currentWebKitTransform) {
  916. slide.style.webkitTransform = currentWebKitTransform;
  917. }
  918. if (params.roundLengths) slideSize = Math.floor(slideSize);
  919. } else {
  920. slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
  921. if (params.roundLengths) slideSize = Math.floor(slideSize);
  922. if (slides[i]) {
  923. slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;
  924. }
  925. }
  926. if (slides[i]) {
  927. slides[i].swiperSlideSize = slideSize;
  928. }
  929. slidesSizesGrid.push(slideSize);
  930. if (params.centeredSlides) {
  931. slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
  932. if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
  933. if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
  934. if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
  935. if (params.roundLengths) slidePosition = Math.floor(slidePosition);
  936. if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
  937. slidesGrid.push(slidePosition);
  938. } else {
  939. if (params.roundLengths) slidePosition = Math.floor(slidePosition);
  940. if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
  941. slidesGrid.push(slidePosition);
  942. slidePosition = slidePosition + slideSize + spaceBetween;
  943. }
  944. swiper.virtualSize += slideSize + spaceBetween;
  945. prevSlideSize = slideSize;
  946. index += 1;
  947. }
  948. swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
  949. if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
  950. wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
  951. }
  952. if (params.setWrapperSize) {
  953. wrapperEl.style[getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
  954. }
  955. if (gridEnabled) {
  956. swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);
  957. }
  958. // Remove last grid elements depending on width
  959. if (!params.centeredSlides) {
  960. const newSlidesGrid = [];
  961. for (let i = 0; i < snapGrid.length; i += 1) {
  962. let slidesGridItem = snapGrid[i];
  963. if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
  964. if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
  965. newSlidesGrid.push(slidesGridItem);
  966. }
  967. }
  968. snapGrid = newSlidesGrid;
  969. if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
  970. snapGrid.push(swiper.virtualSize - swiperSize);
  971. }
  972. }
  973. if (isVirtual && params.loop) {
  974. const size = slidesSizesGrid[0] + spaceBetween;
  975. if (params.slidesPerGroup > 1) {
  976. const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
  977. const groupSize = size * params.slidesPerGroup;
  978. for (let i = 0; i < groups; i += 1) {
  979. snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
  980. }
  981. }
  982. for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
  983. if (params.slidesPerGroup === 1) {
  984. snapGrid.push(snapGrid[snapGrid.length - 1] + size);
  985. }
  986. slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
  987. swiper.virtualSize += size;
  988. }
  989. }
  990. if (snapGrid.length === 0) snapGrid = [0];
  991. if (spaceBetween !== 0) {
  992. const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');
  993. slides.filter((_, slideIndex) => {
  994. if (!params.cssMode || params.loop) return true;
  995. if (slideIndex === slides.length - 1) {
  996. return false;
  997. }
  998. return true;
  999. }).forEach(slideEl => {
  1000. slideEl.style[key] = `${spaceBetween}px`;
  1001. });
  1002. }
  1003. if (params.centeredSlides && params.centeredSlidesBounds) {
  1004. let allSlidesSize = 0;
  1005. slidesSizesGrid.forEach(slideSizeValue => {
  1006. allSlidesSize += slideSizeValue + (spaceBetween || 0);
  1007. });
  1008. allSlidesSize -= spaceBetween;
  1009. const maxSnap = allSlidesSize - swiperSize;
  1010. snapGrid = snapGrid.map(snap => {
  1011. if (snap <= 0) return -offsetBefore;
  1012. if (snap > maxSnap) return maxSnap + offsetAfter;
  1013. return snap;
  1014. });
  1015. }
  1016. if (params.centerInsufficientSlides) {
  1017. let allSlidesSize = 0;
  1018. slidesSizesGrid.forEach(slideSizeValue => {
  1019. allSlidesSize += slideSizeValue + (spaceBetween || 0);
  1020. });
  1021. allSlidesSize -= spaceBetween;
  1022. if (allSlidesSize < swiperSize) {
  1023. const allSlidesOffset = (swiperSize - allSlidesSize) / 2;
  1024. snapGrid.forEach((snap, snapIndex) => {
  1025. snapGrid[snapIndex] = snap - allSlidesOffset;
  1026. });
  1027. slidesGrid.forEach((snap, snapIndex) => {
  1028. slidesGrid[snapIndex] = snap + allSlidesOffset;
  1029. });
  1030. }
  1031. }
  1032. Object.assign(swiper, {
  1033. slides,
  1034. snapGrid,
  1035. slidesGrid,
  1036. slidesSizesGrid
  1037. });
  1038. if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
  1039. setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);
  1040. setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
  1041. const addToSnapGrid = -swiper.snapGrid[0];
  1042. const addToSlidesGrid = -swiper.slidesGrid[0];
  1043. swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);
  1044. swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);
  1045. }
  1046. if (slidesLength !== previousSlidesLength) {
  1047. swiper.emit('slidesLengthChange');
  1048. }
  1049. if (snapGrid.length !== previousSnapGridLength) {
  1050. if (swiper.params.watchOverflow) swiper.checkOverflow();
  1051. swiper.emit('snapGridLengthChange');
  1052. }
  1053. if (slidesGrid.length !== previousSlidesGridLength) {
  1054. swiper.emit('slidesGridLengthChange');
  1055. }
  1056. if (params.watchSlidesProgress) {
  1057. swiper.updateSlidesOffset();
  1058. }
  1059. if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
  1060. const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
  1061. const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
  1062. if (slidesLength <= params.maxBackfaceHiddenSlides) {
  1063. if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
  1064. } else if (hasClassBackfaceClassAdded) {
  1065. swiper.el.classList.remove(backFaceHiddenClass);
  1066. }
  1067. }
  1068. }
  1069. function updateAutoHeight(speed) {
  1070. const swiper = this;
  1071. const activeSlides = [];
  1072. const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  1073. let newHeight = 0;
  1074. let i;
  1075. if (typeof speed === 'number') {
  1076. swiper.setTransition(speed);
  1077. } else if (speed === true) {
  1078. swiper.setTransition(swiper.params.speed);
  1079. }
  1080. const getSlideByIndex = index => {
  1081. if (isVirtual) {
  1082. return swiper.slides[swiper.getSlideIndexByData(index)];
  1083. }
  1084. return swiper.slides[index];
  1085. };
  1086. // Find slides currently in view
  1087. if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
  1088. if (swiper.params.centeredSlides) {
  1089. (swiper.visibleSlides || []).forEach(slide => {
  1090. activeSlides.push(slide);
  1091. });
  1092. } else {
  1093. for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
  1094. const index = swiper.activeIndex + i;
  1095. if (index > swiper.slides.length && !isVirtual) break;
  1096. activeSlides.push(getSlideByIndex(index));
  1097. }
  1098. }
  1099. } else {
  1100. activeSlides.push(getSlideByIndex(swiper.activeIndex));
  1101. }
  1102. // Find new height from highest slide in view
  1103. for (i = 0; i < activeSlides.length; i += 1) {
  1104. if (typeof activeSlides[i] !== 'undefined') {
  1105. const height = activeSlides[i].offsetHeight;
  1106. newHeight = height > newHeight ? height : newHeight;
  1107. }
  1108. }
  1109. // Update Height
  1110. if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
  1111. }
  1112. function updateSlidesOffset() {
  1113. const swiper = this;
  1114. const slides = swiper.slides;
  1115. // eslint-disable-next-line
  1116. const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
  1117. for (let i = 0; i < slides.length; i += 1) {
  1118. slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
  1119. }
  1120. }
  1121. function updateSlidesProgress(translate) {
  1122. if (translate === void 0) {
  1123. translate = this && this.translate || 0;
  1124. }
  1125. const swiper = this;
  1126. const params = swiper.params;
  1127. const {
  1128. slides,
  1129. rtlTranslate: rtl,
  1130. snapGrid
  1131. } = swiper;
  1132. if (slides.length === 0) return;
  1133. if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
  1134. let offsetCenter = -translate;
  1135. if (rtl) offsetCenter = translate;
  1136. // Visible Slides
  1137. slides.forEach(slideEl => {
  1138. slideEl.classList.remove(params.slideVisibleClass);
  1139. });
  1140. swiper.visibleSlidesIndexes = [];
  1141. swiper.visibleSlides = [];
  1142. let spaceBetween = params.spaceBetween;
  1143. if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
  1144. spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
  1145. } else if (typeof spaceBetween === 'string') {
  1146. spaceBetween = parseFloat(spaceBetween);
  1147. }
  1148. for (let i = 0; i < slides.length; i += 1) {
  1149. const slide = slides[i];
  1150. let slideOffset = slide.swiperSlideOffset;
  1151. if (params.cssMode && params.centeredSlides) {
  1152. slideOffset -= slides[0].swiperSlideOffset;
  1153. }
  1154. const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
  1155. const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
  1156. const slideBefore = -(offsetCenter - slideOffset);
  1157. const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
  1158. const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
  1159. if (isVisible) {
  1160. swiper.visibleSlides.push(slide);
  1161. swiper.visibleSlidesIndexes.push(i);
  1162. slides[i].classList.add(params.slideVisibleClass);
  1163. }
  1164. slide.progress = rtl ? -slideProgress : slideProgress;
  1165. slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
  1166. }
  1167. }
  1168. function updateProgress(translate) {
  1169. const swiper = this;
  1170. if (typeof translate === 'undefined') {
  1171. const multiplier = swiper.rtlTranslate ? -1 : 1;
  1172. // eslint-disable-next-line
  1173. translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
  1174. }
  1175. const params = swiper.params;
  1176. const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  1177. let {
  1178. progress,
  1179. isBeginning,
  1180. isEnd,
  1181. progressLoop
  1182. } = swiper;
  1183. const wasBeginning = isBeginning;
  1184. const wasEnd = isEnd;
  1185. if (translatesDiff === 0) {
  1186. progress = 0;
  1187. isBeginning = true;
  1188. isEnd = true;
  1189. } else {
  1190. progress = (translate - swiper.minTranslate()) / translatesDiff;
  1191. const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
  1192. const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
  1193. isBeginning = isBeginningRounded || progress <= 0;
  1194. isEnd = isEndRounded || progress >= 1;
  1195. if (isBeginningRounded) progress = 0;
  1196. if (isEndRounded) progress = 1;
  1197. }
  1198. if (params.loop) {
  1199. const firstSlideIndex = swiper.getSlideIndexByData(0);
  1200. const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
  1201. const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
  1202. const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
  1203. const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
  1204. const translateAbs = Math.abs(translate);
  1205. if (translateAbs >= firstSlideTranslate) {
  1206. progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
  1207. } else {
  1208. progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
  1209. }
  1210. if (progressLoop > 1) progressLoop -= 1;
  1211. }
  1212. Object.assign(swiper, {
  1213. progress,
  1214. progressLoop,
  1215. isBeginning,
  1216. isEnd
  1217. });
  1218. if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
  1219. if (isBeginning && !wasBeginning) {
  1220. swiper.emit('reachBeginning toEdge');
  1221. }
  1222. if (isEnd && !wasEnd) {
  1223. swiper.emit('reachEnd toEdge');
  1224. }
  1225. if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
  1226. swiper.emit('fromEdge');
  1227. }
  1228. swiper.emit('progress', progress);
  1229. }
  1230. function updateSlidesClasses() {
  1231. const swiper = this;
  1232. const {
  1233. slides,
  1234. params,
  1235. slidesEl,
  1236. activeIndex
  1237. } = swiper;
  1238. const isVirtual = swiper.virtual && params.virtual.enabled;
  1239. const getFilteredSlide = selector => {
  1240. return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
  1241. };
  1242. slides.forEach(slideEl => {
  1243. slideEl.classList.remove(params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
  1244. });
  1245. let activeSlide;
  1246. if (isVirtual) {
  1247. if (params.loop) {
  1248. let slideIndex = activeIndex - swiper.virtual.slidesBefore;
  1249. if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
  1250. if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
  1251. activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
  1252. } else {
  1253. activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
  1254. }
  1255. } else {
  1256. activeSlide = slides[activeIndex];
  1257. }
  1258. if (activeSlide) {
  1259. // Active classes
  1260. activeSlide.classList.add(params.slideActiveClass);
  1261. // Next Slide
  1262. let nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
  1263. if (params.loop && !nextSlide) {
  1264. nextSlide = slides[0];
  1265. }
  1266. if (nextSlide) {
  1267. nextSlide.classList.add(params.slideNextClass);
  1268. }
  1269. // Prev Slide
  1270. let prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
  1271. if (params.loop && !prevSlide === 0) {
  1272. prevSlide = slides[slides.length - 1];
  1273. }
  1274. if (prevSlide) {
  1275. prevSlide.classList.add(params.slidePrevClass);
  1276. }
  1277. }
  1278. swiper.emitSlidesClasses();
  1279. }
  1280. const processLazyPreloader = (swiper, imageEl) => {
  1281. if (!swiper || swiper.destroyed || !swiper.params) return;
  1282. const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
  1283. const slideEl = imageEl.closest(slideSelector());
  1284. if (slideEl) {
  1285. const lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
  1286. if (lazyEl) lazyEl.remove();
  1287. }
  1288. };
  1289. const unlazy = (swiper, index) => {
  1290. if (!swiper.slides[index]) return;
  1291. const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
  1292. if (imageEl) imageEl.removeAttribute('loading');
  1293. };
  1294. const preload = swiper => {
  1295. if (!swiper || swiper.destroyed || !swiper.params) return;
  1296. let amount = swiper.params.lazyPreloadPrevNext;
  1297. const len = swiper.slides.length;
  1298. if (!len || !amount || amount < 0) return;
  1299. amount = Math.min(amount, len);
  1300. const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
  1301. const activeIndex = swiper.activeIndex;
  1302. if (swiper.params.grid && swiper.params.grid.rows > 1) {
  1303. const activeColumn = activeIndex;
  1304. const preloadColumns = [activeColumn - amount];
  1305. preloadColumns.push(...Array.from({
  1306. length: amount
  1307. }).map((_, i) => {
  1308. return activeColumn + slidesPerView + i;
  1309. }));
  1310. swiper.slides.forEach((slideEl, i) => {
  1311. if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
  1312. });
  1313. return;
  1314. }
  1315. const slideIndexLastInView = activeIndex + slidesPerView - 1;
  1316. if (swiper.params.rewind || swiper.params.loop) {
  1317. for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
  1318. const realIndex = (i % len + len) % len;
  1319. if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
  1320. }
  1321. } else {
  1322. for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
  1323. if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
  1324. unlazy(swiper, i);
  1325. }
  1326. }
  1327. }
  1328. };
  1329. function getActiveIndexByTranslate(swiper) {
  1330. const {
  1331. slidesGrid,
  1332. params
  1333. } = swiper;
  1334. const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  1335. let activeIndex;
  1336. for (let i = 0; i < slidesGrid.length; i += 1) {
  1337. if (typeof slidesGrid[i + 1] !== 'undefined') {
  1338. if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
  1339. activeIndex = i;
  1340. } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
  1341. activeIndex = i + 1;
  1342. }
  1343. } else if (translate >= slidesGrid[i]) {
  1344. activeIndex = i;
  1345. }
  1346. }
  1347. // Normalize slideIndex
  1348. if (params.normalizeSlideIndex) {
  1349. if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
  1350. }
  1351. return activeIndex;
  1352. }
  1353. function updateActiveIndex(newActiveIndex) {
  1354. const swiper = this;
  1355. const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  1356. const {
  1357. snapGrid,
  1358. params,
  1359. activeIndex: previousIndex,
  1360. realIndex: previousRealIndex,
  1361. snapIndex: previousSnapIndex
  1362. } = swiper;
  1363. let activeIndex = newActiveIndex;
  1364. let snapIndex;
  1365. const getVirtualRealIndex = aIndex => {
  1366. let realIndex = aIndex - swiper.virtual.slidesBefore;
  1367. if (realIndex < 0) {
  1368. realIndex = swiper.virtual.slides.length + realIndex;
  1369. }
  1370. if (realIndex >= swiper.virtual.slides.length) {
  1371. realIndex -= swiper.virtual.slides.length;
  1372. }
  1373. return realIndex;
  1374. };
  1375. if (typeof activeIndex === 'undefined') {
  1376. activeIndex = getActiveIndexByTranslate(swiper);
  1377. }
  1378. if (snapGrid.indexOf(translate) >= 0) {
  1379. snapIndex = snapGrid.indexOf(translate);
  1380. } else {
  1381. const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
  1382. snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
  1383. }
  1384. if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
  1385. if (activeIndex === previousIndex) {
  1386. if (snapIndex !== previousSnapIndex) {
  1387. swiper.snapIndex = snapIndex;
  1388. swiper.emit('snapIndexChange');
  1389. }
  1390. if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
  1391. swiper.realIndex = getVirtualRealIndex(activeIndex);
  1392. }
  1393. return;
  1394. }
  1395. // Get real index
  1396. let realIndex;
  1397. if (swiper.virtual && params.virtual.enabled && params.loop) {
  1398. realIndex = getVirtualRealIndex(activeIndex);
  1399. } else if (swiper.slides[activeIndex]) {
  1400. realIndex = parseInt(swiper.slides[activeIndex].getAttribute('data-swiper-slide-index') || activeIndex, 10);
  1401. } else {
  1402. realIndex = activeIndex;
  1403. }
  1404. Object.assign(swiper, {
  1405. previousSnapIndex,
  1406. snapIndex,
  1407. previousRealIndex,
  1408. realIndex,
  1409. previousIndex,
  1410. activeIndex
  1411. });
  1412. if (swiper.initialized) {
  1413. preload(swiper);
  1414. }
  1415. swiper.emit('activeIndexChange');
  1416. swiper.emit('snapIndexChange');
  1417. if (previousRealIndex !== realIndex) {
  1418. swiper.emit('realIndexChange');
  1419. }
  1420. if (swiper.initialized || swiper.params.runCallbacksOnInit) {
  1421. swiper.emit('slideChange');
  1422. }
  1423. }
  1424. function updateClickedSlide(e) {
  1425. const swiper = this;
  1426. const params = swiper.params;
  1427. const slide = e.closest(`.${params.slideClass}, swiper-slide`);
  1428. let slideFound = false;
  1429. let slideIndex;
  1430. if (slide) {
  1431. for (let i = 0; i < swiper.slides.length; i += 1) {
  1432. if (swiper.slides[i] === slide) {
  1433. slideFound = true;
  1434. slideIndex = i;
  1435. break;
  1436. }
  1437. }
  1438. }
  1439. if (slide && slideFound) {
  1440. swiper.clickedSlide = slide;
  1441. if (swiper.virtual && swiper.params.virtual.enabled) {
  1442. swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
  1443. } else {
  1444. swiper.clickedIndex = slideIndex;
  1445. }
  1446. } else {
  1447. swiper.clickedSlide = undefined;
  1448. swiper.clickedIndex = undefined;
  1449. return;
  1450. }
  1451. if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
  1452. swiper.slideToClickedSlide();
  1453. }
  1454. }
  1455. var update = {
  1456. updateSize,
  1457. updateSlides,
  1458. updateAutoHeight,
  1459. updateSlidesOffset,
  1460. updateSlidesProgress,
  1461. updateProgress,
  1462. updateSlidesClasses,
  1463. updateActiveIndex,
  1464. updateClickedSlide
  1465. };
  1466. function getSwiperTranslate(axis) {
  1467. if (axis === void 0) {
  1468. axis = this.isHorizontal() ? 'x' : 'y';
  1469. }
  1470. const swiper = this;
  1471. const {
  1472. params,
  1473. rtlTranslate: rtl,
  1474. translate,
  1475. wrapperEl
  1476. } = swiper;
  1477. if (params.virtualTranslate) {
  1478. return rtl ? -translate : translate;
  1479. }
  1480. if (params.cssMode) {
  1481. return translate;
  1482. }
  1483. let currentTranslate = getTranslate(wrapperEl, axis);
  1484. currentTranslate += swiper.cssOverflowAdjustment();
  1485. if (rtl) currentTranslate = -currentTranslate;
  1486. return currentTranslate || 0;
  1487. }
  1488. function setTranslate(translate, byController) {
  1489. const swiper = this;
  1490. const {
  1491. rtlTranslate: rtl,
  1492. params,
  1493. wrapperEl,
  1494. progress
  1495. } = swiper;
  1496. let x = 0;
  1497. let y = 0;
  1498. const z = 0;
  1499. if (swiper.isHorizontal()) {
  1500. x = rtl ? -translate : translate;
  1501. } else {
  1502. y = translate;
  1503. }
  1504. if (params.roundLengths) {
  1505. x = Math.floor(x);
  1506. y = Math.floor(y);
  1507. }
  1508. swiper.previousTranslate = swiper.translate;
  1509. swiper.translate = swiper.isHorizontal() ? x : y;
  1510. if (params.cssMode) {
  1511. wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
  1512. } else if (!params.virtualTranslate) {
  1513. if (swiper.isHorizontal()) {
  1514. x -= swiper.cssOverflowAdjustment();
  1515. } else {
  1516. y -= swiper.cssOverflowAdjustment();
  1517. }
  1518. wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
  1519. }
  1520. // Check if we need to update progress
  1521. let newProgress;
  1522. const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  1523. if (translatesDiff === 0) {
  1524. newProgress = 0;
  1525. } else {
  1526. newProgress = (translate - swiper.minTranslate()) / translatesDiff;
  1527. }
  1528. if (newProgress !== progress) {
  1529. swiper.updateProgress(translate);
  1530. }
  1531. swiper.emit('setTranslate', swiper.translate, byController);
  1532. }
  1533. function minTranslate() {
  1534. return -this.snapGrid[0];
  1535. }
  1536. function maxTranslate() {
  1537. return -this.snapGrid[this.snapGrid.length - 1];
  1538. }
  1539. function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
  1540. if (translate === void 0) {
  1541. translate = 0;
  1542. }
  1543. if (speed === void 0) {
  1544. speed = this.params.speed;
  1545. }
  1546. if (runCallbacks === void 0) {
  1547. runCallbacks = true;
  1548. }
  1549. if (translateBounds === void 0) {
  1550. translateBounds = true;
  1551. }
  1552. const swiper = this;
  1553. const {
  1554. params,
  1555. wrapperEl
  1556. } = swiper;
  1557. if (swiper.animating && params.preventInteractionOnTransition) {
  1558. return false;
  1559. }
  1560. const minTranslate = swiper.minTranslate();
  1561. const maxTranslate = swiper.maxTranslate();
  1562. let newTranslate;
  1563. if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
  1564. // Update progress
  1565. swiper.updateProgress(newTranslate);
  1566. if (params.cssMode) {
  1567. const isH = swiper.isHorizontal();
  1568. if (speed === 0) {
  1569. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
  1570. } else {
  1571. if (!swiper.support.smoothScroll) {
  1572. animateCSSModeScroll({
  1573. swiper,
  1574. targetPosition: -newTranslate,
  1575. side: isH ? 'left' : 'top'
  1576. });
  1577. return true;
  1578. }
  1579. wrapperEl.scrollTo({
  1580. [isH ? 'left' : 'top']: -newTranslate,
  1581. behavior: 'smooth'
  1582. });
  1583. }
  1584. return true;
  1585. }
  1586. if (speed === 0) {
  1587. swiper.setTransition(0);
  1588. swiper.setTranslate(newTranslate);
  1589. if (runCallbacks) {
  1590. swiper.emit('beforeTransitionStart', speed, internal);
  1591. swiper.emit('transitionEnd');
  1592. }
  1593. } else {
  1594. swiper.setTransition(speed);
  1595. swiper.setTranslate(newTranslate);
  1596. if (runCallbacks) {
  1597. swiper.emit('beforeTransitionStart', speed, internal);
  1598. swiper.emit('transitionStart');
  1599. }
  1600. if (!swiper.animating) {
  1601. swiper.animating = true;
  1602. if (!swiper.onTranslateToWrapperTransitionEnd) {
  1603. swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
  1604. if (!swiper || swiper.destroyed) return;
  1605. if (e.target !== this) return;
  1606. swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  1607. swiper.onTranslateToWrapperTransitionEnd = null;
  1608. delete swiper.onTranslateToWrapperTransitionEnd;
  1609. if (runCallbacks) {
  1610. swiper.emit('transitionEnd');
  1611. }
  1612. };
  1613. }
  1614. swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  1615. }
  1616. }
  1617. return true;
  1618. }
  1619. var translate = {
  1620. getTranslate: getSwiperTranslate,
  1621. setTranslate,
  1622. minTranslate,
  1623. maxTranslate,
  1624. translateTo
  1625. };
  1626. function setTransition(duration, byController) {
  1627. const swiper = this;
  1628. if (!swiper.params.cssMode) {
  1629. swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
  1630. }
  1631. swiper.emit('setTransition', duration, byController);
  1632. }
  1633. function transitionEmit(_ref) {
  1634. let {
  1635. swiper,
  1636. runCallbacks,
  1637. direction,
  1638. step
  1639. } = _ref;
  1640. const {
  1641. activeIndex,
  1642. previousIndex
  1643. } = swiper;
  1644. let dir = direction;
  1645. if (!dir) {
  1646. if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
  1647. }
  1648. swiper.emit(`transition${step}`);
  1649. if (runCallbacks && activeIndex !== previousIndex) {
  1650. if (dir === 'reset') {
  1651. swiper.emit(`slideResetTransition${step}`);
  1652. return;
  1653. }
  1654. swiper.emit(`slideChangeTransition${step}`);
  1655. if (dir === 'next') {
  1656. swiper.emit(`slideNextTransition${step}`);
  1657. } else {
  1658. swiper.emit(`slidePrevTransition${step}`);
  1659. }
  1660. }
  1661. }
  1662. function transitionStart(runCallbacks, direction) {
  1663. if (runCallbacks === void 0) {
  1664. runCallbacks = true;
  1665. }
  1666. const swiper = this;
  1667. const {
  1668. params
  1669. } = swiper;
  1670. if (params.cssMode) return;
  1671. if (params.autoHeight) {
  1672. swiper.updateAutoHeight();
  1673. }
  1674. transitionEmit({
  1675. swiper,
  1676. runCallbacks,
  1677. direction,
  1678. step: 'Start'
  1679. });
  1680. }
  1681. function transitionEnd(runCallbacks, direction) {
  1682. if (runCallbacks === void 0) {
  1683. runCallbacks = true;
  1684. }
  1685. const swiper = this;
  1686. const {
  1687. params
  1688. } = swiper;
  1689. swiper.animating = false;
  1690. if (params.cssMode) return;
  1691. swiper.setTransition(0);
  1692. transitionEmit({
  1693. swiper,
  1694. runCallbacks,
  1695. direction,
  1696. step: 'End'
  1697. });
  1698. }
  1699. var transition = {
  1700. setTransition,
  1701. transitionStart,
  1702. transitionEnd
  1703. };
  1704. function slideTo(index, speed, runCallbacks, internal, initial) {
  1705. if (index === void 0) {
  1706. index = 0;
  1707. }
  1708. if (speed === void 0) {
  1709. speed = this.params.speed;
  1710. }
  1711. if (runCallbacks === void 0) {
  1712. runCallbacks = true;
  1713. }
  1714. if (typeof index === 'string') {
  1715. index = parseInt(index, 10);
  1716. }
  1717. const swiper = this;
  1718. let slideIndex = index;
  1719. if (slideIndex < 0) slideIndex = 0;
  1720. const {
  1721. params,
  1722. snapGrid,
  1723. slidesGrid,
  1724. previousIndex,
  1725. activeIndex,
  1726. rtlTranslate: rtl,
  1727. wrapperEl,
  1728. enabled
  1729. } = swiper;
  1730. if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {
  1731. return false;
  1732. }
  1733. const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
  1734. let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
  1735. if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
  1736. const translate = -snapGrid[snapIndex];
  1737. // Normalize slideIndex
  1738. if (params.normalizeSlideIndex) {
  1739. for (let i = 0; i < slidesGrid.length; i += 1) {
  1740. const normalizedTranslate = -Math.floor(translate * 100);
  1741. const normalizedGrid = Math.floor(slidesGrid[i] * 100);
  1742. const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
  1743. if (typeof slidesGrid[i + 1] !== 'undefined') {
  1744. if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
  1745. slideIndex = i;
  1746. } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
  1747. slideIndex = i + 1;
  1748. }
  1749. } else if (normalizedTranslate >= normalizedGrid) {
  1750. slideIndex = i;
  1751. }
  1752. }
  1753. }
  1754. // Directions locks
  1755. if (swiper.initialized && slideIndex !== activeIndex) {
  1756. if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
  1757. return false;
  1758. }
  1759. if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
  1760. if ((activeIndex || 0) !== slideIndex) {
  1761. return false;
  1762. }
  1763. }
  1764. }
  1765. if (slideIndex !== (previousIndex || 0) && runCallbacks) {
  1766. swiper.emit('beforeSlideChangeStart');
  1767. }
  1768. // Update progress
  1769. swiper.updateProgress(translate);
  1770. let direction;
  1771. if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
  1772. // Update Index
  1773. if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
  1774. swiper.updateActiveIndex(slideIndex);
  1775. // Update Height
  1776. if (params.autoHeight) {
  1777. swiper.updateAutoHeight();
  1778. }
  1779. swiper.updateSlidesClasses();
  1780. if (params.effect !== 'slide') {
  1781. swiper.setTranslate(translate);
  1782. }
  1783. if (direction !== 'reset') {
  1784. swiper.transitionStart(runCallbacks, direction);
  1785. swiper.transitionEnd(runCallbacks, direction);
  1786. }
  1787. return false;
  1788. }
  1789. if (params.cssMode) {
  1790. const isH = swiper.isHorizontal();
  1791. const t = rtl ? translate : -translate;
  1792. if (speed === 0) {
  1793. const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  1794. if (isVirtual) {
  1795. swiper.wrapperEl.style.scrollSnapType = 'none';
  1796. swiper._immediateVirtual = true;
  1797. }
  1798. if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
  1799. swiper._cssModeVirtualInitialSet = true;
  1800. requestAnimationFrame(() => {
  1801. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  1802. });
  1803. } else {
  1804. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  1805. }
  1806. if (isVirtual) {
  1807. requestAnimationFrame(() => {
  1808. swiper.wrapperEl.style.scrollSnapType = '';
  1809. swiper._immediateVirtual = false;
  1810. });
  1811. }
  1812. } else {
  1813. if (!swiper.support.smoothScroll) {
  1814. animateCSSModeScroll({
  1815. swiper,
  1816. targetPosition: t,
  1817. side: isH ? 'left' : 'top'
  1818. });
  1819. return true;
  1820. }
  1821. wrapperEl.scrollTo({
  1822. [isH ? 'left' : 'top']: t,
  1823. behavior: 'smooth'
  1824. });
  1825. }
  1826. return true;
  1827. }
  1828. swiper.setTransition(speed);
  1829. swiper.setTranslate(translate);
  1830. swiper.updateActiveIndex(slideIndex);
  1831. swiper.updateSlidesClasses();
  1832. swiper.emit('beforeTransitionStart', speed, internal);
  1833. swiper.transitionStart(runCallbacks, direction);
  1834. if (speed === 0) {
  1835. swiper.transitionEnd(runCallbacks, direction);
  1836. } else if (!swiper.animating) {
  1837. swiper.animating = true;
  1838. if (!swiper.onSlideToWrapperTransitionEnd) {
  1839. swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
  1840. if (!swiper || swiper.destroyed) return;
  1841. if (e.target !== this) return;
  1842. swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  1843. swiper.onSlideToWrapperTransitionEnd = null;
  1844. delete swiper.onSlideToWrapperTransitionEnd;
  1845. swiper.transitionEnd(runCallbacks, direction);
  1846. };
  1847. }
  1848. swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  1849. }
  1850. return true;
  1851. }
  1852. function slideToLoop(index, speed, runCallbacks, internal) {
  1853. if (index === void 0) {
  1854. index = 0;
  1855. }
  1856. if (speed === void 0) {
  1857. speed = this.params.speed;
  1858. }
  1859. if (runCallbacks === void 0) {
  1860. runCallbacks = true;
  1861. }
  1862. if (typeof index === 'string') {
  1863. const indexAsNumber = parseInt(index, 10);
  1864. index = indexAsNumber;
  1865. }
  1866. const swiper = this;
  1867. let newIndex = index;
  1868. if (swiper.params.loop) {
  1869. if (swiper.virtual && swiper.params.virtual.enabled) {
  1870. // eslint-disable-next-line
  1871. newIndex = newIndex + swiper.virtual.slidesBefore;
  1872. } else {
  1873. newIndex = swiper.getSlideIndexByData(newIndex);
  1874. }
  1875. }
  1876. return swiper.slideTo(newIndex, speed, runCallbacks, internal);
  1877. }
  1878. /* eslint no-unused-vars: "off" */
  1879. function slideNext(speed, runCallbacks, internal) {
  1880. if (speed === void 0) {
  1881. speed = this.params.speed;
  1882. }
  1883. if (runCallbacks === void 0) {
  1884. runCallbacks = true;
  1885. }
  1886. const swiper = this;
  1887. const {
  1888. enabled,
  1889. params,
  1890. animating
  1891. } = swiper;
  1892. if (!enabled) return swiper;
  1893. let perGroup = params.slidesPerGroup;
  1894. if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
  1895. perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
  1896. }
  1897. const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
  1898. const isVirtual = swiper.virtual && params.virtual.enabled;
  1899. if (params.loop) {
  1900. if (animating && !isVirtual && params.loopPreventsSliding) return false;
  1901. swiper.loopFix({
  1902. direction: 'next'
  1903. });
  1904. // eslint-disable-next-line
  1905. swiper._clientLeft = swiper.wrapperEl.clientLeft;
  1906. }
  1907. if (params.rewind && swiper.isEnd) {
  1908. return swiper.slideTo(0, speed, runCallbacks, internal);
  1909. }
  1910. return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
  1911. }
  1912. /* eslint no-unused-vars: "off" */
  1913. function slidePrev(speed, runCallbacks, internal) {
  1914. if (speed === void 0) {
  1915. speed = this.params.speed;
  1916. }
  1917. if (runCallbacks === void 0) {
  1918. runCallbacks = true;
  1919. }
  1920. const swiper = this;
  1921. const {
  1922. params,
  1923. snapGrid,
  1924. slidesGrid,
  1925. rtlTranslate,
  1926. enabled,
  1927. animating
  1928. } = swiper;
  1929. if (!enabled) return swiper;
  1930. const isVirtual = swiper.virtual && params.virtual.enabled;
  1931. if (params.loop) {
  1932. if (animating && !isVirtual && params.loopPreventsSliding) return false;
  1933. swiper.loopFix({
  1934. direction: 'prev'
  1935. });
  1936. // eslint-disable-next-line
  1937. swiper._clientLeft = swiper.wrapperEl.clientLeft;
  1938. }
  1939. const translate = rtlTranslate ? swiper.translate : -swiper.translate;
  1940. function normalize(val) {
  1941. if (val < 0) return -Math.floor(Math.abs(val));
  1942. return Math.floor(val);
  1943. }
  1944. const normalizedTranslate = normalize(translate);
  1945. const normalizedSnapGrid = snapGrid.map(val => normalize(val));
  1946. let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
  1947. if (typeof prevSnap === 'undefined' && params.cssMode) {
  1948. let prevSnapIndex;
  1949. snapGrid.forEach((snap, snapIndex) => {
  1950. if (normalizedTranslate >= snap) {
  1951. // prevSnap = snap;
  1952. prevSnapIndex = snapIndex;
  1953. }
  1954. });
  1955. if (typeof prevSnapIndex !== 'undefined') {
  1956. prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
  1957. }
  1958. }
  1959. let prevIndex = 0;
  1960. if (typeof prevSnap !== 'undefined') {
  1961. prevIndex = slidesGrid.indexOf(prevSnap);
  1962. if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
  1963. if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
  1964. prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
  1965. prevIndex = Math.max(prevIndex, 0);
  1966. }
  1967. }
  1968. if (params.rewind && swiper.isBeginning) {
  1969. const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
  1970. return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
  1971. }
  1972. return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
  1973. }
  1974. /* eslint no-unused-vars: "off" */
  1975. function slideReset(speed, runCallbacks, internal) {
  1976. if (speed === void 0) {
  1977. speed = this.params.speed;
  1978. }
  1979. if (runCallbacks === void 0) {
  1980. runCallbacks = true;
  1981. }
  1982. const swiper = this;
  1983. return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
  1984. }
  1985. /* eslint no-unused-vars: "off" */
  1986. function slideToClosest(speed, runCallbacks, internal, threshold) {
  1987. if (speed === void 0) {
  1988. speed = this.params.speed;
  1989. }
  1990. if (runCallbacks === void 0) {
  1991. runCallbacks = true;
  1992. }
  1993. if (threshold === void 0) {
  1994. threshold = 0.5;
  1995. }
  1996. const swiper = this;
  1997. let index = swiper.activeIndex;
  1998. const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
  1999. const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
  2000. const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  2001. if (translate >= swiper.snapGrid[snapIndex]) {
  2002. // The current translate is on or after the current snap index, so the choice
  2003. // is between the current index and the one after it.
  2004. const currentSnap = swiper.snapGrid[snapIndex];
  2005. const nextSnap = swiper.snapGrid[snapIndex + 1];
  2006. if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
  2007. index += swiper.params.slidesPerGroup;
  2008. }
  2009. } else {
  2010. // The current translate is before the current snap index, so the choice
  2011. // is between the current index and the one before it.
  2012. const prevSnap = swiper.snapGrid[snapIndex - 1];
  2013. const currentSnap = swiper.snapGrid[snapIndex];
  2014. if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {
  2015. index -= swiper.params.slidesPerGroup;
  2016. }
  2017. }
  2018. index = Math.max(index, 0);
  2019. index = Math.min(index, swiper.slidesGrid.length - 1);
  2020. return swiper.slideTo(index, speed, runCallbacks, internal);
  2021. }
  2022. function slideToClickedSlide() {
  2023. const swiper = this;
  2024. const {
  2025. params,
  2026. slidesEl
  2027. } = swiper;
  2028. const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
  2029. let slideToIndex = swiper.clickedIndex;
  2030. let realIndex;
  2031. const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
  2032. if (params.loop) {
  2033. if (swiper.animating) return;
  2034. realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
  2035. if (params.centeredSlides) {
  2036. if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
  2037. swiper.loopFix();
  2038. slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
  2039. nextTick(() => {
  2040. swiper.slideTo(slideToIndex);
  2041. });
  2042. } else {
  2043. swiper.slideTo(slideToIndex);
  2044. }
  2045. } else if (slideToIndex > swiper.slides.length - slidesPerView) {
  2046. swiper.loopFix();
  2047. slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
  2048. nextTick(() => {
  2049. swiper.slideTo(slideToIndex);
  2050. });
  2051. } else {
  2052. swiper.slideTo(slideToIndex);
  2053. }
  2054. } else {
  2055. swiper.slideTo(slideToIndex);
  2056. }
  2057. }
  2058. var slide = {
  2059. slideTo,
  2060. slideToLoop,
  2061. slideNext,
  2062. slidePrev,
  2063. slideReset,
  2064. slideToClosest,
  2065. slideToClickedSlide
  2066. };
  2067. function loopCreate(slideRealIndex) {
  2068. const swiper = this;
  2069. const {
  2070. params,
  2071. slidesEl
  2072. } = swiper;
  2073. if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
  2074. const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
  2075. slides.forEach((el, index) => {
  2076. el.setAttribute('data-swiper-slide-index', index);
  2077. });
  2078. swiper.loopFix({
  2079. slideRealIndex,
  2080. direction: params.centeredSlides ? undefined : 'next'
  2081. });
  2082. }
  2083. function loopFix(_temp) {
  2084. let {
  2085. slideRealIndex,
  2086. slideTo = true,
  2087. direction,
  2088. setTranslate,
  2089. activeSlideIndex,
  2090. byController,
  2091. byMousewheel
  2092. } = _temp === void 0 ? {} : _temp;
  2093. const swiper = this;
  2094. if (!swiper.params.loop) return;
  2095. swiper.emit('beforeLoopFix');
  2096. const {
  2097. slides,
  2098. allowSlidePrev,
  2099. allowSlideNext,
  2100. slidesEl,
  2101. params
  2102. } = swiper;
  2103. swiper.allowSlidePrev = true;
  2104. swiper.allowSlideNext = true;
  2105. if (swiper.virtual && params.virtual.enabled) {
  2106. if (slideTo) {
  2107. if (!params.centeredSlides && swiper.snapIndex === 0) {
  2108. swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
  2109. } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
  2110. swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
  2111. } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
  2112. swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
  2113. }
  2114. }
  2115. swiper.allowSlidePrev = allowSlidePrev;
  2116. swiper.allowSlideNext = allowSlideNext;
  2117. swiper.emit('loopFix');
  2118. return;
  2119. }
  2120. const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
  2121. let loopedSlides = params.loopedSlides || slidesPerView;
  2122. if (loopedSlides % params.slidesPerGroup !== 0) {
  2123. loopedSlides += params.slidesPerGroup - loopedSlides % params.slidesPerGroup;
  2124. }
  2125. swiper.loopedSlides = loopedSlides;
  2126. const prependSlidesIndexes = [];
  2127. const appendSlidesIndexes = [];
  2128. let activeIndex = swiper.activeIndex;
  2129. if (typeof activeSlideIndex === 'undefined') {
  2130. activeSlideIndex = swiper.getSlideIndex(swiper.slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);
  2131. } else {
  2132. activeIndex = activeSlideIndex;
  2133. }
  2134. const isNext = direction === 'next' || !direction;
  2135. const isPrev = direction === 'prev' || !direction;
  2136. let slidesPrepended = 0;
  2137. let slidesAppended = 0;
  2138. // prepend last slides before start
  2139. if (activeSlideIndex < loopedSlides) {
  2140. slidesPrepended = Math.max(loopedSlides - activeSlideIndex, params.slidesPerGroup);
  2141. for (let i = 0; i < loopedSlides - activeSlideIndex; i += 1) {
  2142. const index = i - Math.floor(i / slides.length) * slides.length;
  2143. prependSlidesIndexes.push(slides.length - index - 1);
  2144. }
  2145. } else if (activeSlideIndex /* + slidesPerView */ > swiper.slides.length - loopedSlides * 2) {
  2146. slidesAppended = Math.max(activeSlideIndex - (swiper.slides.length - loopedSlides * 2), params.slidesPerGroup);
  2147. for (let i = 0; i < slidesAppended; i += 1) {
  2148. const index = i - Math.floor(i / slides.length) * slides.length;
  2149. appendSlidesIndexes.push(index);
  2150. }
  2151. }
  2152. if (isPrev) {
  2153. prependSlidesIndexes.forEach(index => {
  2154. swiper.slides[index].swiperLoopMoveDOM = true;
  2155. slidesEl.prepend(swiper.slides[index]);
  2156. swiper.slides[index].swiperLoopMoveDOM = false;
  2157. });
  2158. }
  2159. if (isNext) {
  2160. appendSlidesIndexes.forEach(index => {
  2161. swiper.slides[index].swiperLoopMoveDOM = true;
  2162. slidesEl.append(swiper.slides[index]);
  2163. swiper.slides[index].swiperLoopMoveDOM = false;
  2164. });
  2165. }
  2166. swiper.recalcSlides();
  2167. if (params.slidesPerView === 'auto') {
  2168. swiper.updateSlides();
  2169. }
  2170. if (params.watchSlidesProgress) {
  2171. swiper.updateSlidesOffset();
  2172. }
  2173. if (slideTo) {
  2174. if (prependSlidesIndexes.length > 0 && isPrev) {
  2175. if (typeof slideRealIndex === 'undefined') {
  2176. const currentSlideTranslate = swiper.slidesGrid[activeIndex];
  2177. const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
  2178. const diff = newSlideTranslate - currentSlideTranslate;
  2179. if (byMousewheel) {
  2180. swiper.setTranslate(swiper.translate - diff);
  2181. } else {
  2182. swiper.slideTo(activeIndex + slidesPrepended, 0, false, true);
  2183. if (setTranslate) {
  2184. swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;
  2185. }
  2186. }
  2187. } else {
  2188. if (setTranslate) {
  2189. swiper.slideToLoop(slideRealIndex, 0, false, true);
  2190. }
  2191. }
  2192. } else if (appendSlidesIndexes.length > 0 && isNext) {
  2193. if (typeof slideRealIndex === 'undefined') {
  2194. const currentSlideTranslate = swiper.slidesGrid[activeIndex];
  2195. const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
  2196. const diff = newSlideTranslate - currentSlideTranslate;
  2197. if (byMousewheel) {
  2198. swiper.setTranslate(swiper.translate - diff);
  2199. } else {
  2200. swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
  2201. if (setTranslate) {
  2202. swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;
  2203. }
  2204. }
  2205. } else {
  2206. swiper.slideToLoop(slideRealIndex, 0, false, true);
  2207. }
  2208. }
  2209. }
  2210. swiper.allowSlidePrev = allowSlidePrev;
  2211. swiper.allowSlideNext = allowSlideNext;
  2212. if (swiper.controller && swiper.controller.control && !byController) {
  2213. const loopParams = {
  2214. slideRealIndex,
  2215. slideTo: false,
  2216. direction,
  2217. setTranslate,
  2218. activeSlideIndex,
  2219. byController: true
  2220. };
  2221. if (Array.isArray(swiper.controller.control)) {
  2222. swiper.controller.control.forEach(c => {
  2223. if (!c.destroyed && c.params.loop) c.loopFix(loopParams);
  2224. });
  2225. } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
  2226. swiper.controller.control.loopFix(loopParams);
  2227. }
  2228. }
  2229. swiper.emit('loopFix');
  2230. }
  2231. function loopDestroy() {
  2232. const swiper = this;
  2233. const {
  2234. params,
  2235. slidesEl
  2236. } = swiper;
  2237. if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
  2238. swiper.recalcSlides();
  2239. const newSlidesOrder = [];
  2240. swiper.slides.forEach(slideEl => {
  2241. const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
  2242. newSlidesOrder[index] = slideEl;
  2243. });
  2244. swiper.slides.forEach(slideEl => {
  2245. slideEl.removeAttribute('data-swiper-slide-index');
  2246. });
  2247. newSlidesOrder.forEach(slideEl => {
  2248. slidesEl.append(slideEl);
  2249. });
  2250. swiper.recalcSlides();
  2251. swiper.slideTo(swiper.realIndex, 0);
  2252. }
  2253. var loop = {
  2254. loopCreate,
  2255. loopFix,
  2256. loopDestroy
  2257. };
  2258. function setGrabCursor(moving) {
  2259. const swiper = this;
  2260. if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
  2261. const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
  2262. if (swiper.isElement) {
  2263. swiper.__preventObserver__ = true;
  2264. }
  2265. el.style.cursor = 'move';
  2266. el.style.cursor = moving ? 'grabbing' : 'grab';
  2267. if (swiper.isElement) {
  2268. requestAnimationFrame(() => {
  2269. swiper.__preventObserver__ = false;
  2270. });
  2271. }
  2272. }
  2273. function unsetGrabCursor() {
  2274. const swiper = this;
  2275. if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
  2276. return;
  2277. }
  2278. if (swiper.isElement) {
  2279. swiper.__preventObserver__ = true;
  2280. }
  2281. swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
  2282. if (swiper.isElement) {
  2283. requestAnimationFrame(() => {
  2284. swiper.__preventObserver__ = false;
  2285. });
  2286. }
  2287. }
  2288. var grabCursor = {
  2289. setGrabCursor,
  2290. unsetGrabCursor
  2291. };
  2292. // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
  2293. function closestElement(selector, base) {
  2294. if (base === void 0) {
  2295. base = this;
  2296. }
  2297. function __closestFrom(el) {
  2298. if (!el || el === getDocument() || el === getWindow()) return null;
  2299. if (el.assignedSlot) el = el.assignedSlot;
  2300. const found = el.closest(selector);
  2301. if (!found && !el.getRootNode) {
  2302. return null;
  2303. }
  2304. return found || __closestFrom(el.getRootNode().host);
  2305. }
  2306. return __closestFrom(base);
  2307. }
  2308. function onTouchStart(event) {
  2309. const swiper = this;
  2310. const document = getDocument();
  2311. const window = getWindow();
  2312. const data = swiper.touchEventsData;
  2313. data.evCache.push(event);
  2314. const {
  2315. params,
  2316. touches,
  2317. enabled
  2318. } = swiper;
  2319. if (!enabled) return;
  2320. if (!params.simulateTouch && event.pointerType === 'mouse') return;
  2321. if (swiper.animating && params.preventInteractionOnTransition) {
  2322. return;
  2323. }
  2324. if (!swiper.animating && params.cssMode && params.loop) {
  2325. swiper.loopFix();
  2326. }
  2327. let e = event;
  2328. if (e.originalEvent) e = e.originalEvent;
  2329. let targetEl = e.target;
  2330. if (params.touchEventsTarget === 'wrapper') {
  2331. if (!swiper.wrapperEl.contains(targetEl)) return;
  2332. }
  2333. if ('which' in e && e.which === 3) return;
  2334. if ('button' in e && e.button > 0) return;
  2335. if (data.isTouched && data.isMoved) return;
  2336. // change target el for shadow root component
  2337. const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
  2338. // eslint-disable-next-line
  2339. const eventPath = event.composedPath ? event.composedPath() : event.path;
  2340. if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
  2341. targetEl = eventPath[0];
  2342. }
  2343. const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
  2344. const isTargetShadow = !!(e.target && e.target.shadowRoot);
  2345. // use closestElement for shadow root element to get the actual closest for nested shadow root element
  2346. if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
  2347. swiper.allowClick = true;
  2348. return;
  2349. }
  2350. if (params.swipeHandler) {
  2351. if (!targetEl.closest(params.swipeHandler)) return;
  2352. }
  2353. touches.currentX = e.pageX;
  2354. touches.currentY = e.pageY;
  2355. const startX = touches.currentX;
  2356. const startY = touches.currentY;
  2357. // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
  2358. const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
  2359. const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
  2360. if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
  2361. if (edgeSwipeDetection === 'prevent') {
  2362. event.preventDefault();
  2363. } else {
  2364. return;
  2365. }
  2366. }
  2367. Object.assign(data, {
  2368. isTouched: true,
  2369. isMoved: false,
  2370. allowTouchCallbacks: true,
  2371. isScrolling: undefined,
  2372. startMoving: undefined
  2373. });
  2374. touches.startX = startX;
  2375. touches.startY = startY;
  2376. data.touchStartTime = now();
  2377. swiper.allowClick = true;
  2378. swiper.updateSize();
  2379. swiper.swipeDirection = undefined;
  2380. if (params.threshold > 0) data.allowThresholdMove = false;
  2381. let preventDefault = true;
  2382. if (targetEl.matches(data.focusableElements)) {
  2383. preventDefault = false;
  2384. if (targetEl.nodeName === 'SELECT') {
  2385. data.isTouched = false;
  2386. }
  2387. }
  2388. if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {
  2389. document.activeElement.blur();
  2390. }
  2391. const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
  2392. if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
  2393. e.preventDefault();
  2394. }
  2395. if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
  2396. swiper.freeMode.onTouchStart();
  2397. }
  2398. swiper.emit('touchStart', e);
  2399. }
  2400. function onTouchMove(event) {
  2401. const document = getDocument();
  2402. const swiper = this;
  2403. const data = swiper.touchEventsData;
  2404. const {
  2405. params,
  2406. touches,
  2407. rtlTranslate: rtl,
  2408. enabled
  2409. } = swiper;
  2410. if (!enabled) return;
  2411. if (!params.simulateTouch && event.pointerType === 'mouse') return;
  2412. let e = event;
  2413. if (e.originalEvent) e = e.originalEvent;
  2414. if (!data.isTouched) {
  2415. if (data.startMoving && data.isScrolling) {
  2416. swiper.emit('touchMoveOpposite', e);
  2417. }
  2418. return;
  2419. }
  2420. const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
  2421. if (pointerIndex >= 0) data.evCache[pointerIndex] = e;
  2422. const targetTouch = data.evCache.length > 1 ? data.evCache[0] : e;
  2423. const pageX = targetTouch.pageX;
  2424. const pageY = targetTouch.pageY;
  2425. if (e.preventedByNestedSwiper) {
  2426. touches.startX = pageX;
  2427. touches.startY = pageY;
  2428. return;
  2429. }
  2430. if (!swiper.allowTouchMove) {
  2431. if (!e.target.matches(data.focusableElements)) {
  2432. swiper.allowClick = false;
  2433. }
  2434. if (data.isTouched) {
  2435. Object.assign(touches, {
  2436. startX: pageX,
  2437. startY: pageY,
  2438. prevX: swiper.touches.currentX,
  2439. prevY: swiper.touches.currentY,
  2440. currentX: pageX,
  2441. currentY: pageY
  2442. });
  2443. data.touchStartTime = now();
  2444. }
  2445. return;
  2446. }
  2447. if (params.touchReleaseOnEdges && !params.loop) {
  2448. if (swiper.isVertical()) {
  2449. // Vertical
  2450. if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
  2451. data.isTouched = false;
  2452. data.isMoved = false;
  2453. return;
  2454. }
  2455. } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
  2456. return;
  2457. }
  2458. }
  2459. if (document.activeElement) {
  2460. if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
  2461. data.isMoved = true;
  2462. swiper.allowClick = false;
  2463. return;
  2464. }
  2465. }
  2466. if (data.allowTouchCallbacks) {
  2467. swiper.emit('touchMove', e);
  2468. }
  2469. if (e.targetTouches && e.targetTouches.length > 1) return;
  2470. touches.currentX = pageX;
  2471. touches.currentY = pageY;
  2472. const diffX = touches.currentX - touches.startX;
  2473. const diffY = touches.currentY - touches.startY;
  2474. if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
  2475. if (typeof data.isScrolling === 'undefined') {
  2476. let touchAngle;
  2477. if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
  2478. data.isScrolling = false;
  2479. } else {
  2480. // eslint-disable-next-line
  2481. if (diffX * diffX + diffY * diffY >= 25) {
  2482. touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
  2483. data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
  2484. }
  2485. }
  2486. }
  2487. if (data.isScrolling) {
  2488. swiper.emit('touchMoveOpposite', e);
  2489. }
  2490. if (typeof data.startMoving === 'undefined') {
  2491. if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
  2492. data.startMoving = true;
  2493. }
  2494. }
  2495. if (data.isScrolling || swiper.zoom && swiper.params.zoom && swiper.params.zoom.enabled && data.evCache.length > 1) {
  2496. data.isTouched = false;
  2497. return;
  2498. }
  2499. if (!data.startMoving) {
  2500. return;
  2501. }
  2502. swiper.allowClick = false;
  2503. if (!params.cssMode && e.cancelable) {
  2504. e.preventDefault();
  2505. }
  2506. if (params.touchMoveStopPropagation && !params.nested) {
  2507. e.stopPropagation();
  2508. }
  2509. let diff = swiper.isHorizontal() ? diffX : diffY;
  2510. let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
  2511. if (params.oneWayMovement) {
  2512. diff = Math.abs(diff) * (rtl ? 1 : -1);
  2513. touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
  2514. }
  2515. touches.diff = diff;
  2516. diff *= params.touchRatio;
  2517. if (rtl) {
  2518. diff = -diff;
  2519. touchesDiff = -touchesDiff;
  2520. }
  2521. const prevTouchesDirection = swiper.touchesDirection;
  2522. swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
  2523. swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
  2524. const isLoop = swiper.params.loop && !params.cssMode;
  2525. if (!data.isMoved) {
  2526. if (isLoop) {
  2527. swiper.loopFix({
  2528. direction: swiper.swipeDirection
  2529. });
  2530. }
  2531. data.startTranslate = swiper.getTranslate();
  2532. swiper.setTransition(0);
  2533. if (swiper.animating) {
  2534. const evt = new window.CustomEvent('transitionend', {
  2535. bubbles: true,
  2536. cancelable: true
  2537. });
  2538. swiper.wrapperEl.dispatchEvent(evt);
  2539. }
  2540. data.allowMomentumBounce = false;
  2541. // Grab Cursor
  2542. if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  2543. swiper.setGrabCursor(true);
  2544. }
  2545. swiper.emit('sliderFirstMove', e);
  2546. }
  2547. let loopFixed;
  2548. if (data.isMoved && prevTouchesDirection !== swiper.touchesDirection && isLoop && Math.abs(diff) >= 1) {
  2549. // need another loop fix
  2550. swiper.loopFix({
  2551. direction: swiper.swipeDirection,
  2552. setTranslate: true
  2553. });
  2554. loopFixed = true;
  2555. }
  2556. swiper.emit('sliderMove', e);
  2557. data.isMoved = true;
  2558. data.currentTranslate = diff + data.startTranslate;
  2559. let disableParentSwiper = true;
  2560. let resistanceRatio = params.resistanceRatio;
  2561. if (params.touchReleaseOnEdges) {
  2562. resistanceRatio = 0;
  2563. }
  2564. if (diff > 0) {
  2565. if (isLoop && !loopFixed && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.size / 2 : swiper.minTranslate())) {
  2566. swiper.loopFix({
  2567. direction: 'prev',
  2568. setTranslate: true,
  2569. activeSlideIndex: 0
  2570. });
  2571. }
  2572. if (data.currentTranslate > swiper.minTranslate()) {
  2573. disableParentSwiper = false;
  2574. if (params.resistance) {
  2575. data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
  2576. }
  2577. }
  2578. } else if (diff < 0) {
  2579. if (isLoop && !loopFixed && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.size / 2 : swiper.maxTranslate())) {
  2580. swiper.loopFix({
  2581. direction: 'next',
  2582. setTranslate: true,
  2583. activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
  2584. });
  2585. }
  2586. if (data.currentTranslate < swiper.maxTranslate()) {
  2587. disableParentSwiper = false;
  2588. if (params.resistance) {
  2589. data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
  2590. }
  2591. }
  2592. }
  2593. if (disableParentSwiper) {
  2594. e.preventedByNestedSwiper = true;
  2595. }
  2596. // Directions locks
  2597. if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
  2598. data.currentTranslate = data.startTranslate;
  2599. }
  2600. if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
  2601. data.currentTranslate = data.startTranslate;
  2602. }
  2603. if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
  2604. data.currentTranslate = data.startTranslate;
  2605. }
  2606. // Threshold
  2607. if (params.threshold > 0) {
  2608. if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
  2609. if (!data.allowThresholdMove) {
  2610. data.allowThresholdMove = true;
  2611. touches.startX = touches.currentX;
  2612. touches.startY = touches.currentY;
  2613. data.currentTranslate = data.startTranslate;
  2614. touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
  2615. return;
  2616. }
  2617. } else {
  2618. data.currentTranslate = data.startTranslate;
  2619. return;
  2620. }
  2621. }
  2622. if (!params.followFinger || params.cssMode) return;
  2623. // Update active index in free mode
  2624. if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
  2625. swiper.updateActiveIndex();
  2626. swiper.updateSlidesClasses();
  2627. }
  2628. if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
  2629. swiper.freeMode.onTouchMove();
  2630. }
  2631. // Update progress
  2632. swiper.updateProgress(data.currentTranslate);
  2633. // Update translate
  2634. swiper.setTranslate(data.currentTranslate);
  2635. }
  2636. function onTouchEnd(event) {
  2637. const swiper = this;
  2638. const data = swiper.touchEventsData;
  2639. const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === event.pointerId);
  2640. if (pointerIndex >= 0) {
  2641. data.evCache.splice(pointerIndex, 1);
  2642. }
  2643. if (['pointercancel', 'pointerout', 'pointerleave'].includes(event.type)) {
  2644. const proceed = event.type === 'pointercancel' && (swiper.browser.isSafari || swiper.browser.isWebView);
  2645. if (!proceed) {
  2646. return;
  2647. }
  2648. }
  2649. const {
  2650. params,
  2651. touches,
  2652. rtlTranslate: rtl,
  2653. slidesGrid,
  2654. enabled
  2655. } = swiper;
  2656. if (!enabled) return;
  2657. if (!params.simulateTouch && event.pointerType === 'mouse') return;
  2658. let e = event;
  2659. if (e.originalEvent) e = e.originalEvent;
  2660. if (data.allowTouchCallbacks) {
  2661. swiper.emit('touchEnd', e);
  2662. }
  2663. data.allowTouchCallbacks = false;
  2664. if (!data.isTouched) {
  2665. if (data.isMoved && params.grabCursor) {
  2666. swiper.setGrabCursor(false);
  2667. }
  2668. data.isMoved = false;
  2669. data.startMoving = false;
  2670. return;
  2671. }
  2672. // Return Grab Cursor
  2673. if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  2674. swiper.setGrabCursor(false);
  2675. }
  2676. // Time diff
  2677. const touchEndTime = now();
  2678. const timeDiff = touchEndTime - data.touchStartTime;
  2679. // Tap, doubleTap, Click
  2680. if (swiper.allowClick) {
  2681. const pathTree = e.path || e.composedPath && e.composedPath();
  2682. swiper.updateClickedSlide(pathTree && pathTree[0] || e.target);
  2683. swiper.emit('tap click', e);
  2684. if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
  2685. swiper.emit('doubleTap doubleClick', e);
  2686. }
  2687. }
  2688. data.lastClickTime = now();
  2689. nextTick(() => {
  2690. if (!swiper.destroyed) swiper.allowClick = true;
  2691. });
  2692. if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
  2693. data.isTouched = false;
  2694. data.isMoved = false;
  2695. data.startMoving = false;
  2696. return;
  2697. }
  2698. data.isTouched = false;
  2699. data.isMoved = false;
  2700. data.startMoving = false;
  2701. let currentPos;
  2702. if (params.followFinger) {
  2703. currentPos = rtl ? swiper.translate : -swiper.translate;
  2704. } else {
  2705. currentPos = -data.currentTranslate;
  2706. }
  2707. if (params.cssMode) {
  2708. return;
  2709. }
  2710. if (params.freeMode && params.freeMode.enabled) {
  2711. swiper.freeMode.onTouchEnd({
  2712. currentPos
  2713. });
  2714. return;
  2715. }
  2716. // Find current slide
  2717. let stopIndex = 0;
  2718. let groupSize = swiper.slidesSizesGrid[0];
  2719. for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
  2720. const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  2721. if (typeof slidesGrid[i + increment] !== 'undefined') {
  2722. if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
  2723. stopIndex = i;
  2724. groupSize = slidesGrid[i + increment] - slidesGrid[i];
  2725. }
  2726. } else if (currentPos >= slidesGrid[i]) {
  2727. stopIndex = i;
  2728. groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
  2729. }
  2730. }
  2731. let rewindFirstIndex = null;
  2732. let rewindLastIndex = null;
  2733. if (params.rewind) {
  2734. if (swiper.isBeginning) {
  2735. rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
  2736. } else if (swiper.isEnd) {
  2737. rewindFirstIndex = 0;
  2738. }
  2739. }
  2740. // Find current slide size
  2741. const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
  2742. const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
  2743. if (timeDiff > params.longSwipesMs) {
  2744. // Long touches
  2745. if (!params.longSwipes) {
  2746. swiper.slideTo(swiper.activeIndex);
  2747. return;
  2748. }
  2749. if (swiper.swipeDirection === 'next') {
  2750. if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
  2751. }
  2752. if (swiper.swipeDirection === 'prev') {
  2753. if (ratio > 1 - params.longSwipesRatio) {
  2754. swiper.slideTo(stopIndex + increment);
  2755. } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
  2756. swiper.slideTo(rewindLastIndex);
  2757. } else {
  2758. swiper.slideTo(stopIndex);
  2759. }
  2760. }
  2761. } else {
  2762. // Short swipes
  2763. if (!params.shortSwipes) {
  2764. swiper.slideTo(swiper.activeIndex);
  2765. return;
  2766. }
  2767. const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
  2768. if (!isNavButtonTarget) {
  2769. if (swiper.swipeDirection === 'next') {
  2770. swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
  2771. }
  2772. if (swiper.swipeDirection === 'prev') {
  2773. swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
  2774. }
  2775. } else if (e.target === swiper.navigation.nextEl) {
  2776. swiper.slideTo(stopIndex + increment);
  2777. } else {
  2778. swiper.slideTo(stopIndex);
  2779. }
  2780. }
  2781. }
  2782. function onResize() {
  2783. const swiper = this;
  2784. const {
  2785. params,
  2786. el
  2787. } = swiper;
  2788. if (el && el.offsetWidth === 0) return;
  2789. // Breakpoints
  2790. if (params.breakpoints) {
  2791. swiper.setBreakpoint();
  2792. }
  2793. // Save locks
  2794. const {
  2795. allowSlideNext,
  2796. allowSlidePrev,
  2797. snapGrid
  2798. } = swiper;
  2799. const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  2800. // Disable locks on resize
  2801. swiper.allowSlideNext = true;
  2802. swiper.allowSlidePrev = true;
  2803. swiper.updateSize();
  2804. swiper.updateSlides();
  2805. swiper.updateSlidesClasses();
  2806. const isVirtualLoop = isVirtual && params.loop;
  2807. if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
  2808. swiper.slideTo(swiper.slides.length - 1, 0, false, true);
  2809. } else {
  2810. if (swiper.params.loop && !isVirtual) {
  2811. swiper.slideToLoop(swiper.realIndex, 0, false, true);
  2812. } else {
  2813. swiper.slideTo(swiper.activeIndex, 0, false, true);
  2814. }
  2815. }
  2816. if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
  2817. clearTimeout(swiper.autoplay.resizeTimeout);
  2818. swiper.autoplay.resizeTimeout = setTimeout(() => {
  2819. if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
  2820. swiper.autoplay.resume();
  2821. }
  2822. }, 500);
  2823. }
  2824. // Return locks after resize
  2825. swiper.allowSlidePrev = allowSlidePrev;
  2826. swiper.allowSlideNext = allowSlideNext;
  2827. if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
  2828. swiper.checkOverflow();
  2829. }
  2830. }
  2831. function onClick(e) {
  2832. const swiper = this;
  2833. if (!swiper.enabled) return;
  2834. if (!swiper.allowClick) {
  2835. if (swiper.params.preventClicks) e.preventDefault();
  2836. if (swiper.params.preventClicksPropagation && swiper.animating) {
  2837. e.stopPropagation();
  2838. e.stopImmediatePropagation();
  2839. }
  2840. }
  2841. }
  2842. function onScroll() {
  2843. const swiper = this;
  2844. const {
  2845. wrapperEl,
  2846. rtlTranslate,
  2847. enabled
  2848. } = swiper;
  2849. if (!enabled) return;
  2850. swiper.previousTranslate = swiper.translate;
  2851. if (swiper.isHorizontal()) {
  2852. swiper.translate = -wrapperEl.scrollLeft;
  2853. } else {
  2854. swiper.translate = -wrapperEl.scrollTop;
  2855. }
  2856. // eslint-disable-next-line
  2857. if (swiper.translate === 0) swiper.translate = 0;
  2858. swiper.updateActiveIndex();
  2859. swiper.updateSlidesClasses();
  2860. let newProgress;
  2861. const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  2862. if (translatesDiff === 0) {
  2863. newProgress = 0;
  2864. } else {
  2865. newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
  2866. }
  2867. if (newProgress !== swiper.progress) {
  2868. swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
  2869. }
  2870. swiper.emit('setTranslate', swiper.translate, false);
  2871. }
  2872. function onLoad(e) {
  2873. const swiper = this;
  2874. processLazyPreloader(swiper, e.target);
  2875. if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
  2876. return;
  2877. }
  2878. swiper.update();
  2879. }
  2880. let dummyEventAttached = false;
  2881. function dummyEventListener() {}
  2882. const events = (swiper, method) => {
  2883. const document = getDocument();
  2884. const {
  2885. params,
  2886. el,
  2887. wrapperEl,
  2888. device
  2889. } = swiper;
  2890. const capture = !!params.nested;
  2891. const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
  2892. const swiperMethod = method;
  2893. // Touch Events
  2894. el[domMethod]('pointerdown', swiper.onTouchStart, {
  2895. passive: false
  2896. });
  2897. document[domMethod]('pointermove', swiper.onTouchMove, {
  2898. passive: false,
  2899. capture
  2900. });
  2901. document[domMethod]('pointerup', swiper.onTouchEnd, {
  2902. passive: true
  2903. });
  2904. document[domMethod]('pointercancel', swiper.onTouchEnd, {
  2905. passive: true
  2906. });
  2907. document[domMethod]('pointerout', swiper.onTouchEnd, {
  2908. passive: true
  2909. });
  2910. document[domMethod]('pointerleave', swiper.onTouchEnd, {
  2911. passive: true
  2912. });
  2913. // Prevent Links Clicks
  2914. if (params.preventClicks || params.preventClicksPropagation) {
  2915. el[domMethod]('click', swiper.onClick, true);
  2916. }
  2917. if (params.cssMode) {
  2918. wrapperEl[domMethod]('scroll', swiper.onScroll);
  2919. }
  2920. // Resize handler
  2921. if (params.updateOnWindowResize) {
  2922. swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
  2923. } else {
  2924. swiper[swiperMethod]('observerUpdate', onResize, true);
  2925. }
  2926. // Images loader
  2927. el[domMethod]('load', swiper.onLoad, {
  2928. capture: true
  2929. });
  2930. };
  2931. function attachEvents() {
  2932. const swiper = this;
  2933. const document = getDocument();
  2934. const {
  2935. params
  2936. } = swiper;
  2937. swiper.onTouchStart = onTouchStart.bind(swiper);
  2938. swiper.onTouchMove = onTouchMove.bind(swiper);
  2939. swiper.onTouchEnd = onTouchEnd.bind(swiper);
  2940. if (params.cssMode) {
  2941. swiper.onScroll = onScroll.bind(swiper);
  2942. }
  2943. swiper.onClick = onClick.bind(swiper);
  2944. swiper.onLoad = onLoad.bind(swiper);
  2945. if (!dummyEventAttached) {
  2946. document.addEventListener('touchstart', dummyEventListener);
  2947. dummyEventAttached = true;
  2948. }
  2949. events(swiper, 'on');
  2950. }
  2951. function detachEvents() {
  2952. const swiper = this;
  2953. events(swiper, 'off');
  2954. }
  2955. var events$1 = {
  2956. attachEvents,
  2957. detachEvents
  2958. };
  2959. const isGridEnabled = (swiper, params) => {
  2960. return swiper.grid && params.grid && params.grid.rows > 1;
  2961. };
  2962. function setBreakpoint() {
  2963. const swiper = this;
  2964. const {
  2965. realIndex,
  2966. initialized,
  2967. params,
  2968. el
  2969. } = swiper;
  2970. const breakpoints = params.breakpoints;
  2971. if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
  2972. // Get breakpoint for window width and update parameters
  2973. const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
  2974. if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
  2975. const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
  2976. const breakpointParams = breakpointOnlyParams || swiper.originalParams;
  2977. const wasMultiRow = isGridEnabled(swiper, params);
  2978. const isMultiRow = isGridEnabled(swiper, breakpointParams);
  2979. const wasEnabled = params.enabled;
  2980. if (wasMultiRow && !isMultiRow) {
  2981. el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
  2982. swiper.emitContainerClasses();
  2983. } else if (!wasMultiRow && isMultiRow) {
  2984. el.classList.add(`${params.containerModifierClass}grid`);
  2985. if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
  2986. el.classList.add(`${params.containerModifierClass}grid-column`);
  2987. }
  2988. swiper.emitContainerClasses();
  2989. }
  2990. // Toggle navigation, pagination, scrollbar
  2991. ['navigation', 'pagination', 'scrollbar'].forEach(prop => {
  2992. if (typeof breakpointParams[prop] === 'undefined') return;
  2993. const wasModuleEnabled = params[prop] && params[prop].enabled;
  2994. const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
  2995. if (wasModuleEnabled && !isModuleEnabled) {
  2996. swiper[prop].disable();
  2997. }
  2998. if (!wasModuleEnabled && isModuleEnabled) {
  2999. swiper[prop].enable();
  3000. }
  3001. });
  3002. const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
  3003. const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
  3004. if (directionChanged && initialized) {
  3005. swiper.changeDirection();
  3006. }
  3007. extend$1(swiper.params, breakpointParams);
  3008. const isEnabled = swiper.params.enabled;
  3009. Object.assign(swiper, {
  3010. allowTouchMove: swiper.params.allowTouchMove,
  3011. allowSlideNext: swiper.params.allowSlideNext,
  3012. allowSlidePrev: swiper.params.allowSlidePrev
  3013. });
  3014. if (wasEnabled && !isEnabled) {
  3015. swiper.disable();
  3016. } else if (!wasEnabled && isEnabled) {
  3017. swiper.enable();
  3018. }
  3019. swiper.currentBreakpoint = breakpoint;
  3020. swiper.emit('_beforeBreakpoint', breakpointParams);
  3021. if (needsReLoop && initialized) {
  3022. swiper.loopDestroy();
  3023. swiper.loopCreate(realIndex);
  3024. swiper.updateSlides();
  3025. }
  3026. swiper.emit('breakpoint', breakpointParams);
  3027. }
  3028. function getBreakpoint(breakpoints, base, containerEl) {
  3029. if (base === void 0) {
  3030. base = 'window';
  3031. }
  3032. if (!breakpoints || base === 'container' && !containerEl) return undefined;
  3033. let breakpoint = false;
  3034. const window = getWindow();
  3035. const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
  3036. const points = Object.keys(breakpoints).map(point => {
  3037. if (typeof point === 'string' && point.indexOf('@') === 0) {
  3038. const minRatio = parseFloat(point.substr(1));
  3039. const value = currentHeight * minRatio;
  3040. return {
  3041. value,
  3042. point
  3043. };
  3044. }
  3045. return {
  3046. value: point,
  3047. point
  3048. };
  3049. });
  3050. points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
  3051. for (let i = 0; i < points.length; i += 1) {
  3052. const {
  3053. point,
  3054. value
  3055. } = points[i];
  3056. if (base === 'window') {
  3057. if (window.matchMedia(`(min-width: ${value}px)`).matches) {
  3058. breakpoint = point;
  3059. }
  3060. } else if (value <= containerEl.clientWidth) {
  3061. breakpoint = point;
  3062. }
  3063. }
  3064. return breakpoint || 'max';
  3065. }
  3066. var breakpoints = {
  3067. setBreakpoint,
  3068. getBreakpoint
  3069. };
  3070. function prepareClasses(entries, prefix) {
  3071. const resultClasses = [];
  3072. entries.forEach(item => {
  3073. if (typeof item === 'object') {
  3074. Object.keys(item).forEach(classNames => {
  3075. if (item[classNames]) {
  3076. resultClasses.push(prefix + classNames);
  3077. }
  3078. });
  3079. } else if (typeof item === 'string') {
  3080. resultClasses.push(prefix + item);
  3081. }
  3082. });
  3083. return resultClasses;
  3084. }
  3085. function addClasses() {
  3086. const swiper = this;
  3087. const {
  3088. classNames,
  3089. params,
  3090. rtl,
  3091. el,
  3092. device
  3093. } = swiper;
  3094. // prettier-ignore
  3095. const suffixes = prepareClasses(['initialized', params.direction, {
  3096. 'free-mode': swiper.params.freeMode && params.freeMode.enabled
  3097. }, {
  3098. 'autoheight': params.autoHeight
  3099. }, {
  3100. 'rtl': rtl
  3101. }, {
  3102. 'grid': params.grid && params.grid.rows > 1
  3103. }, {
  3104. 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
  3105. }, {
  3106. 'android': device.android
  3107. }, {
  3108. 'ios': device.ios
  3109. }, {
  3110. 'css-mode': params.cssMode
  3111. }, {
  3112. 'centered': params.cssMode && params.centeredSlides
  3113. }, {
  3114. 'watch-progress': params.watchSlidesProgress
  3115. }], params.containerModifierClass);
  3116. classNames.push(...suffixes);
  3117. el.classList.add(...classNames);
  3118. swiper.emitContainerClasses();
  3119. }
  3120. function removeClasses() {
  3121. const swiper = this;
  3122. const {
  3123. el,
  3124. classNames
  3125. } = swiper;
  3126. el.classList.remove(...classNames);
  3127. swiper.emitContainerClasses();
  3128. }
  3129. var classes = {
  3130. addClasses,
  3131. removeClasses
  3132. };
  3133. function checkOverflow() {
  3134. const swiper = this;
  3135. const {
  3136. isLocked: wasLocked,
  3137. params
  3138. } = swiper;
  3139. const {
  3140. slidesOffsetBefore
  3141. } = params;
  3142. if (slidesOffsetBefore) {
  3143. const lastSlideIndex = swiper.slides.length - 1;
  3144. const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
  3145. swiper.isLocked = swiper.size > lastSlideRightEdge;
  3146. } else {
  3147. swiper.isLocked = swiper.snapGrid.length === 1;
  3148. }
  3149. if (params.allowSlideNext === true) {
  3150. swiper.allowSlideNext = !swiper.isLocked;
  3151. }
  3152. if (params.allowSlidePrev === true) {
  3153. swiper.allowSlidePrev = !swiper.isLocked;
  3154. }
  3155. if (wasLocked && wasLocked !== swiper.isLocked) {
  3156. swiper.isEnd = false;
  3157. }
  3158. if (wasLocked !== swiper.isLocked) {
  3159. swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
  3160. }
  3161. }
  3162. var checkOverflow$1 = {
  3163. checkOverflow
  3164. };
  3165. var defaults = {
  3166. init: true,
  3167. direction: 'horizontal',
  3168. oneWayMovement: false,
  3169. touchEventsTarget: 'wrapper',
  3170. initialSlide: 0,
  3171. speed: 300,
  3172. cssMode: false,
  3173. updateOnWindowResize: true,
  3174. resizeObserver: true,
  3175. nested: false,
  3176. createElements: false,
  3177. enabled: true,
  3178. focusableElements: 'input, select, option, textarea, button, video, label',
  3179. // Overrides
  3180. width: null,
  3181. height: null,
  3182. //
  3183. preventInteractionOnTransition: false,
  3184. // ssr
  3185. userAgent: null,
  3186. url: null,
  3187. // To support iOS's swipe-to-go-back gesture (when being used in-app).
  3188. edgeSwipeDetection: false,
  3189. edgeSwipeThreshold: 20,
  3190. // Autoheight
  3191. autoHeight: false,
  3192. // Set wrapper width
  3193. setWrapperSize: false,
  3194. // Virtual Translate
  3195. virtualTranslate: false,
  3196. // Effects
  3197. effect: 'slide',
  3198. // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
  3199. // Breakpoints
  3200. breakpoints: undefined,
  3201. breakpointsBase: 'window',
  3202. // Slides grid
  3203. spaceBetween: 0,
  3204. slidesPerView: 1,
  3205. slidesPerGroup: 1,
  3206. slidesPerGroupSkip: 0,
  3207. slidesPerGroupAuto: false,
  3208. centeredSlides: false,
  3209. centeredSlidesBounds: false,
  3210. slidesOffsetBefore: 0,
  3211. // in px
  3212. slidesOffsetAfter: 0,
  3213. // in px
  3214. normalizeSlideIndex: true,
  3215. centerInsufficientSlides: false,
  3216. // Disable swiper and hide navigation when container not overflow
  3217. watchOverflow: true,
  3218. // Round length
  3219. roundLengths: false,
  3220. // Touches
  3221. touchRatio: 1,
  3222. touchAngle: 45,
  3223. simulateTouch: true,
  3224. shortSwipes: true,
  3225. longSwipes: true,
  3226. longSwipesRatio: 0.5,
  3227. longSwipesMs: 300,
  3228. followFinger: true,
  3229. allowTouchMove: true,
  3230. threshold: 5,
  3231. touchMoveStopPropagation: false,
  3232. touchStartPreventDefault: true,
  3233. touchStartForcePreventDefault: false,
  3234. touchReleaseOnEdges: false,
  3235. // Unique Navigation Elements
  3236. uniqueNavElements: true,
  3237. // Resistance
  3238. resistance: true,
  3239. resistanceRatio: 0.85,
  3240. // Progress
  3241. watchSlidesProgress: false,
  3242. // Cursor
  3243. grabCursor: false,
  3244. // Clicks
  3245. preventClicks: true,
  3246. preventClicksPropagation: true,
  3247. slideToClickedSlide: false,
  3248. // loop
  3249. loop: false,
  3250. loopedSlides: null,
  3251. loopPreventsSliding: true,
  3252. // rewind
  3253. rewind: false,
  3254. // Swiping/no swiping
  3255. allowSlidePrev: true,
  3256. allowSlideNext: true,
  3257. swipeHandler: null,
  3258. // '.swipe-handler',
  3259. noSwiping: true,
  3260. noSwipingClass: 'swiper-no-swiping',
  3261. noSwipingSelector: null,
  3262. // Passive Listeners
  3263. passiveListeners: true,
  3264. maxBackfaceHiddenSlides: 10,
  3265. // NS
  3266. containerModifierClass: 'swiper-',
  3267. // NEW
  3268. slideClass: 'swiper-slide',
  3269. slideActiveClass: 'swiper-slide-active',
  3270. slideVisibleClass: 'swiper-slide-visible',
  3271. slideNextClass: 'swiper-slide-next',
  3272. slidePrevClass: 'swiper-slide-prev',
  3273. wrapperClass: 'swiper-wrapper',
  3274. lazyPreloaderClass: 'swiper-lazy-preloader',
  3275. lazyPreloadPrevNext: 0,
  3276. // Callbacks
  3277. runCallbacksOnInit: true,
  3278. // Internals
  3279. _emitClasses: false
  3280. };
  3281. function moduleExtendParams(params, allModulesParams) {
  3282. return function extendParams(obj) {
  3283. if (obj === void 0) {
  3284. obj = {};
  3285. }
  3286. const moduleParamName = Object.keys(obj)[0];
  3287. const moduleParams = obj[moduleParamName];
  3288. if (typeof moduleParams !== 'object' || moduleParams === null) {
  3289. extend$1(allModulesParams, obj);
  3290. return;
  3291. }
  3292. if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {
  3293. params[moduleParamName] = {
  3294. auto: true
  3295. };
  3296. }
  3297. if (!(moduleParamName in params && 'enabled' in moduleParams)) {
  3298. extend$1(allModulesParams, obj);
  3299. return;
  3300. }
  3301. if (params[moduleParamName] === true) {
  3302. params[moduleParamName] = {
  3303. enabled: true
  3304. };
  3305. }
  3306. if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
  3307. params[moduleParamName].enabled = true;
  3308. }
  3309. if (!params[moduleParamName]) params[moduleParamName] = {
  3310. enabled: false
  3311. };
  3312. extend$1(allModulesParams, obj);
  3313. };
  3314. }
  3315. /* eslint no-param-reassign: "off" */
  3316. const prototypes = {
  3317. eventsEmitter,
  3318. update,
  3319. translate,
  3320. transition,
  3321. slide,
  3322. loop,
  3323. grabCursor,
  3324. events: events$1,
  3325. breakpoints,
  3326. checkOverflow: checkOverflow$1,
  3327. classes
  3328. };
  3329. const extendedDefaults = {};
  3330. class Swiper {
  3331. constructor() {
  3332. let el;
  3333. let params;
  3334. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  3335. args[_key] = arguments[_key];
  3336. }
  3337. if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
  3338. params = args[0];
  3339. } else {
  3340. [el, params] = args;
  3341. }
  3342. if (!params) params = {};
  3343. params = extend$1({}, params);
  3344. if (el && !params.el) params.el = el;
  3345. const document = getDocument();
  3346. if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
  3347. const swipers = [];
  3348. document.querySelectorAll(params.el).forEach(containerEl => {
  3349. const newParams = extend$1({}, params, {
  3350. el: containerEl
  3351. });
  3352. swipers.push(new Swiper(newParams));
  3353. });
  3354. // eslint-disable-next-line no-constructor-return
  3355. return swipers;
  3356. }
  3357. // Swiper Instance
  3358. const swiper = this;
  3359. swiper.__swiper__ = true;
  3360. swiper.support = getSupport();
  3361. swiper.device = getDevice({
  3362. userAgent: params.userAgent
  3363. });
  3364. swiper.browser = getBrowser();
  3365. swiper.eventsListeners = {};
  3366. swiper.eventsAnyListeners = [];
  3367. swiper.modules = [...swiper.__modules__];
  3368. if (params.modules && Array.isArray(params.modules)) {
  3369. swiper.modules.push(...params.modules);
  3370. }
  3371. const allModulesParams = {};
  3372. swiper.modules.forEach(mod => {
  3373. mod({
  3374. params,
  3375. swiper,
  3376. extendParams: moduleExtendParams(params, allModulesParams),
  3377. on: swiper.on.bind(swiper),
  3378. once: swiper.once.bind(swiper),
  3379. off: swiper.off.bind(swiper),
  3380. emit: swiper.emit.bind(swiper)
  3381. });
  3382. });
  3383. // Extend defaults with modules params
  3384. const swiperParams = extend$1({}, defaults, allModulesParams);
  3385. // Extend defaults with passed params
  3386. swiper.params = extend$1({}, swiperParams, extendedDefaults, params);
  3387. swiper.originalParams = extend$1({}, swiper.params);
  3388. swiper.passedParams = extend$1({}, params);
  3389. // add event listeners
  3390. if (swiper.params && swiper.params.on) {
  3391. Object.keys(swiper.params.on).forEach(eventName => {
  3392. swiper.on(eventName, swiper.params.on[eventName]);
  3393. });
  3394. }
  3395. if (swiper.params && swiper.params.onAny) {
  3396. swiper.onAny(swiper.params.onAny);
  3397. }
  3398. // Extend Swiper
  3399. Object.assign(swiper, {
  3400. enabled: swiper.params.enabled,
  3401. el,
  3402. // Classes
  3403. classNames: [],
  3404. // Slides
  3405. slides: [],
  3406. slidesGrid: [],
  3407. snapGrid: [],
  3408. slidesSizesGrid: [],
  3409. // isDirection
  3410. isHorizontal() {
  3411. return swiper.params.direction === 'horizontal';
  3412. },
  3413. isVertical() {
  3414. return swiper.params.direction === 'vertical';
  3415. },
  3416. // Indexes
  3417. activeIndex: 0,
  3418. realIndex: 0,
  3419. //
  3420. isBeginning: true,
  3421. isEnd: false,
  3422. // Props
  3423. translate: 0,
  3424. previousTranslate: 0,
  3425. progress: 0,
  3426. velocity: 0,
  3427. animating: false,
  3428. cssOverflowAdjustment() {
  3429. // Returns 0 unless `translate` is > 2**23
  3430. // Should be subtracted from css values to prevent overflow
  3431. return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
  3432. },
  3433. // Locks
  3434. allowSlideNext: swiper.params.allowSlideNext,
  3435. allowSlidePrev: swiper.params.allowSlidePrev,
  3436. // Touch Events
  3437. touchEventsData: {
  3438. isTouched: undefined,
  3439. isMoved: undefined,
  3440. allowTouchCallbacks: undefined,
  3441. touchStartTime: undefined,
  3442. isScrolling: undefined,
  3443. currentTranslate: undefined,
  3444. startTranslate: undefined,
  3445. allowThresholdMove: undefined,
  3446. // Form elements to match
  3447. focusableElements: swiper.params.focusableElements,
  3448. // Last click time
  3449. lastClickTime: 0,
  3450. clickTimeout: undefined,
  3451. // Velocities
  3452. velocities: [],
  3453. allowMomentumBounce: undefined,
  3454. startMoving: undefined,
  3455. evCache: []
  3456. },
  3457. // Clicks
  3458. allowClick: true,
  3459. // Touches
  3460. allowTouchMove: swiper.params.allowTouchMove,
  3461. touches: {
  3462. startX: 0,
  3463. startY: 0,
  3464. currentX: 0,
  3465. currentY: 0,
  3466. diff: 0
  3467. },
  3468. // Images
  3469. imagesToLoad: [],
  3470. imagesLoaded: 0
  3471. });
  3472. swiper.emit('_swiper');
  3473. // Init
  3474. if (swiper.params.init) {
  3475. swiper.init();
  3476. }
  3477. // Return app instance
  3478. // eslint-disable-next-line no-constructor-return
  3479. return swiper;
  3480. }
  3481. getSlideIndex(slideEl) {
  3482. const {
  3483. slidesEl,
  3484. params
  3485. } = this;
  3486. const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
  3487. const firstSlideIndex = elementIndex(slides[0]);
  3488. return elementIndex(slideEl) - firstSlideIndex;
  3489. }
  3490. getSlideIndexByData(index) {
  3491. return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);
  3492. }
  3493. recalcSlides() {
  3494. const swiper = this;
  3495. const {
  3496. slidesEl,
  3497. params
  3498. } = swiper;
  3499. swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
  3500. }
  3501. enable() {
  3502. const swiper = this;
  3503. if (swiper.enabled) return;
  3504. swiper.enabled = true;
  3505. if (swiper.params.grabCursor) {
  3506. swiper.setGrabCursor();
  3507. }
  3508. swiper.emit('enable');
  3509. }
  3510. disable() {
  3511. const swiper = this;
  3512. if (!swiper.enabled) return;
  3513. swiper.enabled = false;
  3514. if (swiper.params.grabCursor) {
  3515. swiper.unsetGrabCursor();
  3516. }
  3517. swiper.emit('disable');
  3518. }
  3519. setProgress(progress, speed) {
  3520. const swiper = this;
  3521. progress = Math.min(Math.max(progress, 0), 1);
  3522. const min = swiper.minTranslate();
  3523. const max = swiper.maxTranslate();
  3524. const current = (max - min) * progress + min;
  3525. swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
  3526. swiper.updateActiveIndex();
  3527. swiper.updateSlidesClasses();
  3528. }
  3529. emitContainerClasses() {
  3530. const swiper = this;
  3531. if (!swiper.params._emitClasses || !swiper.el) return;
  3532. const cls = swiper.el.className.split(' ').filter(className => {
  3533. return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
  3534. });
  3535. swiper.emit('_containerClasses', cls.join(' '));
  3536. }
  3537. getSlideClasses(slideEl) {
  3538. const swiper = this;
  3539. if (swiper.destroyed) return '';
  3540. return slideEl.className.split(' ').filter(className => {
  3541. return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
  3542. }).join(' ');
  3543. }
  3544. emitSlidesClasses() {
  3545. const swiper = this;
  3546. if (!swiper.params._emitClasses || !swiper.el) return;
  3547. const updates = [];
  3548. swiper.slides.forEach(slideEl => {
  3549. const classNames = swiper.getSlideClasses(slideEl);
  3550. updates.push({
  3551. slideEl,
  3552. classNames
  3553. });
  3554. swiper.emit('_slideClass', slideEl, classNames);
  3555. });
  3556. swiper.emit('_slideClasses', updates);
  3557. }
  3558. slidesPerViewDynamic(view, exact) {
  3559. if (view === void 0) {
  3560. view = 'current';
  3561. }
  3562. if (exact === void 0) {
  3563. exact = false;
  3564. }
  3565. const swiper = this;
  3566. const {
  3567. params,
  3568. slides,
  3569. slidesGrid,
  3570. slidesSizesGrid,
  3571. size: swiperSize,
  3572. activeIndex
  3573. } = swiper;
  3574. let spv = 1;
  3575. if (params.centeredSlides) {
  3576. let slideSize = slides[activeIndex] ? slides[activeIndex].swiperSlideSize : 0;
  3577. let breakLoop;
  3578. for (let i = activeIndex + 1; i < slides.length; i += 1) {
  3579. if (slides[i] && !breakLoop) {
  3580. slideSize += slides[i].swiperSlideSize;
  3581. spv += 1;
  3582. if (slideSize > swiperSize) breakLoop = true;
  3583. }
  3584. }
  3585. for (let i = activeIndex - 1; i >= 0; i -= 1) {
  3586. if (slides[i] && !breakLoop) {
  3587. slideSize += slides[i].swiperSlideSize;
  3588. spv += 1;
  3589. if (slideSize > swiperSize) breakLoop = true;
  3590. }
  3591. }
  3592. } else {
  3593. // eslint-disable-next-line
  3594. if (view === 'current') {
  3595. for (let i = activeIndex + 1; i < slides.length; i += 1) {
  3596. const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
  3597. if (slideInView) {
  3598. spv += 1;
  3599. }
  3600. }
  3601. } else {
  3602. // previous
  3603. for (let i = activeIndex - 1; i >= 0; i -= 1) {
  3604. const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
  3605. if (slideInView) {
  3606. spv += 1;
  3607. }
  3608. }
  3609. }
  3610. }
  3611. return spv;
  3612. }
  3613. update() {
  3614. const swiper = this;
  3615. if (!swiper || swiper.destroyed) return;
  3616. const {
  3617. snapGrid,
  3618. params
  3619. } = swiper;
  3620. // Breakpoints
  3621. if (params.breakpoints) {
  3622. swiper.setBreakpoint();
  3623. }
  3624. [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
  3625. if (imageEl.complete) {
  3626. processLazyPreloader(swiper, imageEl);
  3627. }
  3628. });
  3629. swiper.updateSize();
  3630. swiper.updateSlides();
  3631. swiper.updateProgress();
  3632. swiper.updateSlidesClasses();
  3633. function setTranslate() {
  3634. const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
  3635. const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
  3636. swiper.setTranslate(newTranslate);
  3637. swiper.updateActiveIndex();
  3638. swiper.updateSlidesClasses();
  3639. }
  3640. let translated;
  3641. if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
  3642. setTranslate();
  3643. if (params.autoHeight) {
  3644. swiper.updateAutoHeight();
  3645. }
  3646. } else {
  3647. if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
  3648. const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
  3649. translated = swiper.slideTo(slides.length - 1, 0, false, true);
  3650. } else {
  3651. translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
  3652. }
  3653. if (!translated) {
  3654. setTranslate();
  3655. }
  3656. }
  3657. if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
  3658. swiper.checkOverflow();
  3659. }
  3660. swiper.emit('update');
  3661. }
  3662. changeDirection(newDirection, needUpdate) {
  3663. if (needUpdate === void 0) {
  3664. needUpdate = true;
  3665. }
  3666. const swiper = this;
  3667. const currentDirection = swiper.params.direction;
  3668. if (!newDirection) {
  3669. // eslint-disable-next-line
  3670. newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
  3671. }
  3672. if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
  3673. return swiper;
  3674. }
  3675. swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
  3676. swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
  3677. swiper.emitContainerClasses();
  3678. swiper.params.direction = newDirection;
  3679. swiper.slides.forEach(slideEl => {
  3680. if (newDirection === 'vertical') {
  3681. slideEl.style.width = '';
  3682. } else {
  3683. slideEl.style.height = '';
  3684. }
  3685. });
  3686. swiper.emit('changeDirection');
  3687. if (needUpdate) swiper.update();
  3688. return swiper;
  3689. }
  3690. changeLanguageDirection(direction) {
  3691. const swiper = this;
  3692. if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
  3693. swiper.rtl = direction === 'rtl';
  3694. swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
  3695. if (swiper.rtl) {
  3696. swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
  3697. swiper.el.dir = 'rtl';
  3698. } else {
  3699. swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
  3700. swiper.el.dir = 'ltr';
  3701. }
  3702. swiper.update();
  3703. }
  3704. mount(element) {
  3705. const swiper = this;
  3706. if (swiper.mounted) return true;
  3707. // Find el
  3708. let el = element || swiper.params.el;
  3709. if (typeof el === 'string') {
  3710. el = document.querySelector(el);
  3711. }
  3712. if (!el) {
  3713. return false;
  3714. }
  3715. el.swiper = swiper;
  3716. if (el.shadowEl) {
  3717. swiper.isElement = true;
  3718. }
  3719. const getWrapperSelector = () => {
  3720. return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;
  3721. };
  3722. const getWrapper = () => {
  3723. if (el && el.shadowRoot && el.shadowRoot.querySelector) {
  3724. const res = el.shadowRoot.querySelector(getWrapperSelector());
  3725. // Children needs to return slot items
  3726. return res;
  3727. }
  3728. return elementChildren(el, getWrapperSelector())[0];
  3729. };
  3730. // Find Wrapper
  3731. let wrapperEl = getWrapper();
  3732. if (!wrapperEl && swiper.params.createElements) {
  3733. wrapperEl = createElement('div', swiper.params.wrapperClass);
  3734. el.append(wrapperEl);
  3735. elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {
  3736. wrapperEl.append(slideEl);
  3737. });
  3738. }
  3739. Object.assign(swiper, {
  3740. el,
  3741. wrapperEl,
  3742. slidesEl: swiper.isElement ? el : wrapperEl,
  3743. mounted: true,
  3744. // RTL
  3745. rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',
  3746. rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),
  3747. wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'
  3748. });
  3749. return true;
  3750. }
  3751. init(el) {
  3752. const swiper = this;
  3753. if (swiper.initialized) return swiper;
  3754. const mounted = swiper.mount(el);
  3755. if (mounted === false) return swiper;
  3756. swiper.emit('beforeInit');
  3757. // Set breakpoint
  3758. if (swiper.params.breakpoints) {
  3759. swiper.setBreakpoint();
  3760. }
  3761. // Add Classes
  3762. swiper.addClasses();
  3763. // Update size
  3764. swiper.updateSize();
  3765. // Update slides
  3766. swiper.updateSlides();
  3767. if (swiper.params.watchOverflow) {
  3768. swiper.checkOverflow();
  3769. }
  3770. // Set Grab Cursor
  3771. if (swiper.params.grabCursor && swiper.enabled) {
  3772. swiper.setGrabCursor();
  3773. }
  3774. // Slide To Initial Slide
  3775. if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
  3776. swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
  3777. } else {
  3778. swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
  3779. }
  3780. // Create loop
  3781. if (swiper.params.loop) {
  3782. swiper.loopCreate();
  3783. }
  3784. // Attach events
  3785. swiper.attachEvents();
  3786. [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
  3787. if (imageEl.complete) {
  3788. processLazyPreloader(swiper, imageEl);
  3789. } else {
  3790. imageEl.addEventListener('load', e => {
  3791. processLazyPreloader(swiper, e.target);
  3792. });
  3793. }
  3794. });
  3795. preload(swiper);
  3796. // Init Flag
  3797. swiper.initialized = true;
  3798. preload(swiper);
  3799. // Emit
  3800. swiper.emit('init');
  3801. swiper.emit('afterInit');
  3802. return swiper;
  3803. }
  3804. destroy(deleteInstance, cleanStyles) {
  3805. if (deleteInstance === void 0) {
  3806. deleteInstance = true;
  3807. }
  3808. if (cleanStyles === void 0) {
  3809. cleanStyles = true;
  3810. }
  3811. const swiper = this;
  3812. const {
  3813. params,
  3814. el,
  3815. wrapperEl,
  3816. slides
  3817. } = swiper;
  3818. if (typeof swiper.params === 'undefined' || swiper.destroyed) {
  3819. return null;
  3820. }
  3821. swiper.emit('beforeDestroy');
  3822. // Init Flag
  3823. swiper.initialized = false;
  3824. // Detach events
  3825. swiper.detachEvents();
  3826. // Destroy loop
  3827. if (params.loop) {
  3828. swiper.loopDestroy();
  3829. }
  3830. // Cleanup styles
  3831. if (cleanStyles) {
  3832. swiper.removeClasses();
  3833. el.removeAttribute('style');
  3834. wrapperEl.removeAttribute('style');
  3835. if (slides && slides.length) {
  3836. slides.forEach(slideEl => {
  3837. slideEl.classList.remove(params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
  3838. slideEl.removeAttribute('style');
  3839. slideEl.removeAttribute('data-swiper-slide-index');
  3840. });
  3841. }
  3842. }
  3843. swiper.emit('destroy');
  3844. // Detach emitter events
  3845. Object.keys(swiper.eventsListeners).forEach(eventName => {
  3846. swiper.off(eventName);
  3847. });
  3848. if (deleteInstance !== false) {
  3849. swiper.el.swiper = null;
  3850. deleteProps(swiper);
  3851. }
  3852. swiper.destroyed = true;
  3853. return null;
  3854. }
  3855. static extendDefaults(newDefaults) {
  3856. extend$1(extendedDefaults, newDefaults);
  3857. }
  3858. static get extendedDefaults() {
  3859. return extendedDefaults;
  3860. }
  3861. static get defaults() {
  3862. return defaults;
  3863. }
  3864. static installModule(mod) {
  3865. if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
  3866. const modules = Swiper.prototype.__modules__;
  3867. if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
  3868. modules.push(mod);
  3869. }
  3870. }
  3871. static use(module) {
  3872. if (Array.isArray(module)) {
  3873. module.forEach(m => Swiper.installModule(m));
  3874. return Swiper;
  3875. }
  3876. Swiper.installModule(module);
  3877. return Swiper;
  3878. }
  3879. }
  3880. Object.keys(prototypes).forEach(prototypeGroup => {
  3881. Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {
  3882. Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
  3883. });
  3884. });
  3885. Swiper.use([Resize, Observer]);
  3886. function Virtual(_ref) {
  3887. let {
  3888. swiper,
  3889. extendParams,
  3890. on,
  3891. emit
  3892. } = _ref;
  3893. extendParams({
  3894. virtual: {
  3895. enabled: false,
  3896. slides: [],
  3897. cache: true,
  3898. renderSlide: null,
  3899. renderExternal: null,
  3900. renderExternalUpdate: true,
  3901. addSlidesBefore: 0,
  3902. addSlidesAfter: 0
  3903. }
  3904. });
  3905. let cssModeTimeout;
  3906. const document = getDocument();
  3907. swiper.virtual = {
  3908. cache: {},
  3909. from: undefined,
  3910. to: undefined,
  3911. slides: [],
  3912. offset: 0,
  3913. slidesGrid: []
  3914. };
  3915. const tempDOM = document.createElement('div');
  3916. function renderSlide(slide, index) {
  3917. const params = swiper.params.virtual;
  3918. if (params.cache && swiper.virtual.cache[index]) {
  3919. return swiper.virtual.cache[index];
  3920. }
  3921. // eslint-disable-next-line
  3922. let slideEl;
  3923. if (params.renderSlide) {
  3924. slideEl = params.renderSlide.call(swiper, slide, index);
  3925. if (typeof slideEl === 'string') {
  3926. tempDOM.innerHTML = slideEl;
  3927. slideEl = tempDOM.children[0];
  3928. }
  3929. } else if (swiper.isElement) {
  3930. slideEl = createElement('swiper-slide');
  3931. } else {
  3932. slideEl = createElement('div', swiper.params.slideClass);
  3933. }
  3934. slideEl.setAttribute('data-swiper-slide-index', index);
  3935. if (!params.renderSlide) {
  3936. slideEl.innerHTML = slide;
  3937. }
  3938. if (params.cache) swiper.virtual.cache[index] = slideEl;
  3939. return slideEl;
  3940. }
  3941. function update(force) {
  3942. const {
  3943. slidesPerView,
  3944. slidesPerGroup,
  3945. centeredSlides,
  3946. loop: isLoop
  3947. } = swiper.params;
  3948. const {
  3949. addSlidesBefore,
  3950. addSlidesAfter
  3951. } = swiper.params.virtual;
  3952. const {
  3953. from: previousFrom,
  3954. to: previousTo,
  3955. slides,
  3956. slidesGrid: previousSlidesGrid,
  3957. offset: previousOffset
  3958. } = swiper.virtual;
  3959. if (!swiper.params.cssMode) {
  3960. swiper.updateActiveIndex();
  3961. }
  3962. const activeIndex = swiper.activeIndex || 0;
  3963. let offsetProp;
  3964. if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
  3965. let slidesAfter;
  3966. let slidesBefore;
  3967. if (centeredSlides) {
  3968. slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
  3969. slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
  3970. } else {
  3971. slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
  3972. slidesBefore = (isLoop ? slidesPerView : slidesPerGroup) + addSlidesBefore;
  3973. }
  3974. let from = activeIndex - slidesBefore;
  3975. let to = activeIndex + slidesAfter;
  3976. if (!isLoop) {
  3977. from = Math.max(from, 0);
  3978. to = Math.min(to, slides.length - 1);
  3979. }
  3980. let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
  3981. if (isLoop && activeIndex >= slidesBefore) {
  3982. from -= slidesBefore;
  3983. if (!centeredSlides) offset += swiper.slidesGrid[0];
  3984. } else if (isLoop && activeIndex < slidesBefore) {
  3985. from = -slidesBefore;
  3986. if (centeredSlides) offset += swiper.slidesGrid[0];
  3987. }
  3988. Object.assign(swiper.virtual, {
  3989. from,
  3990. to,
  3991. offset,
  3992. slidesGrid: swiper.slidesGrid,
  3993. slidesBefore,
  3994. slidesAfter
  3995. });
  3996. function onRendered() {
  3997. swiper.updateSlides();
  3998. swiper.updateProgress();
  3999. swiper.updateSlidesClasses();
  4000. emit('virtualUpdate');
  4001. }
  4002. if (previousFrom === from && previousTo === to && !force) {
  4003. if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
  4004. swiper.slides.forEach(slideEl => {
  4005. slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
  4006. });
  4007. }
  4008. swiper.updateProgress();
  4009. emit('virtualUpdate');
  4010. return;
  4011. }
  4012. if (swiper.params.virtual.renderExternal) {
  4013. swiper.params.virtual.renderExternal.call(swiper, {
  4014. offset,
  4015. from,
  4016. to,
  4017. slides: function getSlides() {
  4018. const slidesToRender = [];
  4019. for (let i = from; i <= to; i += 1) {
  4020. slidesToRender.push(slides[i]);
  4021. }
  4022. return slidesToRender;
  4023. }()
  4024. });
  4025. if (swiper.params.virtual.renderExternalUpdate) {
  4026. onRendered();
  4027. } else {
  4028. emit('virtualUpdate');
  4029. }
  4030. return;
  4031. }
  4032. const prependIndexes = [];
  4033. const appendIndexes = [];
  4034. const getSlideIndex = index => {
  4035. let slideIndex = index;
  4036. if (index < 0) {
  4037. slideIndex = slides.length + index;
  4038. } else if (slideIndex >= slides.length) {
  4039. // eslint-disable-next-line
  4040. slideIndex = slideIndex - slides.length;
  4041. }
  4042. return slideIndex;
  4043. };
  4044. if (force) {
  4045. swiper.slidesEl.querySelectorAll(`.${swiper.params.slideClass}, swiper-slide`).forEach(slideEl => {
  4046. slideEl.remove();
  4047. });
  4048. } else {
  4049. for (let i = previousFrom; i <= previousTo; i += 1) {
  4050. if (i < from || i > to) {
  4051. const slideIndex = getSlideIndex(i);
  4052. swiper.slidesEl.querySelectorAll(`.${swiper.params.slideClass}[data-swiper-slide-index="${slideIndex}"], swiper-slide[data-swiper-slide-index="${slideIndex}"]`).forEach(slideEl => {
  4053. slideEl.remove();
  4054. });
  4055. }
  4056. }
  4057. }
  4058. const loopFrom = isLoop ? -slides.length : 0;
  4059. const loopTo = isLoop ? slides.length * 2 : slides.length;
  4060. for (let i = loopFrom; i < loopTo; i += 1) {
  4061. if (i >= from && i <= to) {
  4062. const slideIndex = getSlideIndex(i);
  4063. if (typeof previousTo === 'undefined' || force) {
  4064. appendIndexes.push(slideIndex);
  4065. } else {
  4066. if (i > previousTo) appendIndexes.push(slideIndex);
  4067. if (i < previousFrom) prependIndexes.push(slideIndex);
  4068. }
  4069. }
  4070. }
  4071. appendIndexes.forEach(index => {
  4072. swiper.slidesEl.append(renderSlide(slides[index], index));
  4073. });
  4074. if (isLoop) {
  4075. for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {
  4076. const index = prependIndexes[i];
  4077. swiper.slidesEl.prepend(renderSlide(slides[index], index));
  4078. }
  4079. } else {
  4080. prependIndexes.sort((a, b) => b - a);
  4081. prependIndexes.forEach(index => {
  4082. swiper.slidesEl.prepend(renderSlide(slides[index], index));
  4083. });
  4084. }
  4085. elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(slideEl => {
  4086. slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
  4087. });
  4088. onRendered();
  4089. }
  4090. function appendSlide(slides) {
  4091. if (typeof slides === 'object' && 'length' in slides) {
  4092. for (let i = 0; i < slides.length; i += 1) {
  4093. if (slides[i]) swiper.virtual.slides.push(slides[i]);
  4094. }
  4095. } else {
  4096. swiper.virtual.slides.push(slides);
  4097. }
  4098. update(true);
  4099. }
  4100. function prependSlide(slides) {
  4101. const activeIndex = swiper.activeIndex;
  4102. let newActiveIndex = activeIndex + 1;
  4103. let numberOfNewSlides = 1;
  4104. if (Array.isArray(slides)) {
  4105. for (let i = 0; i < slides.length; i += 1) {
  4106. if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
  4107. }
  4108. newActiveIndex = activeIndex + slides.length;
  4109. numberOfNewSlides = slides.length;
  4110. } else {
  4111. swiper.virtual.slides.unshift(slides);
  4112. }
  4113. if (swiper.params.virtual.cache) {
  4114. const cache = swiper.virtual.cache;
  4115. const newCache = {};
  4116. Object.keys(cache).forEach(cachedIndex => {
  4117. const cachedEl = cache[cachedIndex];
  4118. const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');
  4119. if (cachedElIndex) {
  4120. cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);
  4121. }
  4122. newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;
  4123. });
  4124. swiper.virtual.cache = newCache;
  4125. }
  4126. update(true);
  4127. swiper.slideTo(newActiveIndex, 0);
  4128. }
  4129. function removeSlide(slidesIndexes) {
  4130. if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
  4131. let activeIndex = swiper.activeIndex;
  4132. if (Array.isArray(slidesIndexes)) {
  4133. for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {
  4134. swiper.virtual.slides.splice(slidesIndexes[i], 1);
  4135. if (swiper.params.virtual.cache) {
  4136. delete swiper.virtual.cache[slidesIndexes[i]];
  4137. }
  4138. if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
  4139. activeIndex = Math.max(activeIndex, 0);
  4140. }
  4141. } else {
  4142. swiper.virtual.slides.splice(slidesIndexes, 1);
  4143. if (swiper.params.virtual.cache) {
  4144. delete swiper.virtual.cache[slidesIndexes];
  4145. }
  4146. if (slidesIndexes < activeIndex) activeIndex -= 1;
  4147. activeIndex = Math.max(activeIndex, 0);
  4148. }
  4149. update(true);
  4150. swiper.slideTo(activeIndex, 0);
  4151. }
  4152. function removeAllSlides() {
  4153. swiper.virtual.slides = [];
  4154. if (swiper.params.virtual.cache) {
  4155. swiper.virtual.cache = {};
  4156. }
  4157. update(true);
  4158. swiper.slideTo(0, 0);
  4159. }
  4160. on('beforeInit', () => {
  4161. if (!swiper.params.virtual.enabled) return;
  4162. let domSlidesAssigned;
  4163. if (typeof swiper.passedParams.virtual.slides === 'undefined') {
  4164. const slides = [...swiper.slidesEl.children].filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`));
  4165. if (slides && slides.length) {
  4166. swiper.virtual.slides = [...slides];
  4167. domSlidesAssigned = true;
  4168. slides.forEach((slideEl, slideIndex) => {
  4169. slideEl.setAttribute('data-swiper-slide-index', slideIndex);
  4170. swiper.virtual.cache[slideIndex] = slideEl;
  4171. slideEl.remove();
  4172. });
  4173. }
  4174. }
  4175. if (!domSlidesAssigned) {
  4176. swiper.virtual.slides = swiper.params.virtual.slides;
  4177. }
  4178. swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);
  4179. swiper.params.watchSlidesProgress = true;
  4180. swiper.originalParams.watchSlidesProgress = true;
  4181. if (!swiper.params.initialSlide) {
  4182. update();
  4183. }
  4184. });
  4185. on('setTranslate', () => {
  4186. if (!swiper.params.virtual.enabled) return;
  4187. if (swiper.params.cssMode && !swiper._immediateVirtual) {
  4188. clearTimeout(cssModeTimeout);
  4189. cssModeTimeout = setTimeout(() => {
  4190. update();
  4191. }, 100);
  4192. } else {
  4193. update();
  4194. }
  4195. });
  4196. on('init update resize', () => {
  4197. if (!swiper.params.virtual.enabled) return;
  4198. if (swiper.params.cssMode) {
  4199. setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);
  4200. }
  4201. });
  4202. Object.assign(swiper.virtual, {
  4203. appendSlide,
  4204. prependSlide,
  4205. removeSlide,
  4206. removeAllSlides,
  4207. update
  4208. });
  4209. }
  4210. /* eslint-disable consistent-return */
  4211. function Keyboard(_ref) {
  4212. let {
  4213. swiper,
  4214. extendParams,
  4215. on,
  4216. emit
  4217. } = _ref;
  4218. const document = getDocument();
  4219. const window = getWindow();
  4220. swiper.keyboard = {
  4221. enabled: false
  4222. };
  4223. extendParams({
  4224. keyboard: {
  4225. enabled: false,
  4226. onlyInViewport: true,
  4227. pageUpDown: true
  4228. }
  4229. });
  4230. function handle(event) {
  4231. if (!swiper.enabled) return;
  4232. const {
  4233. rtlTranslate: rtl
  4234. } = swiper;
  4235. let e = event;
  4236. if (e.originalEvent) e = e.originalEvent; // jquery fix
  4237. const kc = e.keyCode || e.charCode;
  4238. const pageUpDown = swiper.params.keyboard.pageUpDown;
  4239. const isPageUp = pageUpDown && kc === 33;
  4240. const isPageDown = pageUpDown && kc === 34;
  4241. const isArrowLeft = kc === 37;
  4242. const isArrowRight = kc === 39;
  4243. const isArrowUp = kc === 38;
  4244. const isArrowDown = kc === 40;
  4245. // Directions locks
  4246. if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
  4247. return false;
  4248. }
  4249. if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
  4250. return false;
  4251. }
  4252. if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
  4253. return undefined;
  4254. }
  4255. if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
  4256. return undefined;
  4257. }
  4258. if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
  4259. let inView = false;
  4260. // Check that swiper should be inside of visible area of window
  4261. if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {
  4262. return undefined;
  4263. }
  4264. const el = swiper.el;
  4265. const swiperWidth = el.clientWidth;
  4266. const swiperHeight = el.clientHeight;
  4267. const windowWidth = window.innerWidth;
  4268. const windowHeight = window.innerHeight;
  4269. const swiperOffset = elementOffset(el);
  4270. if (rtl) swiperOffset.left -= el.scrollLeft;
  4271. const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
  4272. for (let i = 0; i < swiperCoord.length; i += 1) {
  4273. const point = swiperCoord[i];
  4274. if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
  4275. if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
  4276. inView = true;
  4277. }
  4278. }
  4279. if (!inView) return undefined;
  4280. }
  4281. if (swiper.isHorizontal()) {
  4282. if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
  4283. if (e.preventDefault) e.preventDefault();else e.returnValue = false;
  4284. }
  4285. if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();
  4286. if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();
  4287. } else {
  4288. if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
  4289. if (e.preventDefault) e.preventDefault();else e.returnValue = false;
  4290. }
  4291. if (isPageDown || isArrowDown) swiper.slideNext();
  4292. if (isPageUp || isArrowUp) swiper.slidePrev();
  4293. }
  4294. emit('keyPress', kc);
  4295. return undefined;
  4296. }
  4297. function enable() {
  4298. if (swiper.keyboard.enabled) return;
  4299. document.addEventListener('keydown', handle);
  4300. swiper.keyboard.enabled = true;
  4301. }
  4302. function disable() {
  4303. if (!swiper.keyboard.enabled) return;
  4304. document.removeEventListener('keydown', handle);
  4305. swiper.keyboard.enabled = false;
  4306. }
  4307. on('init', () => {
  4308. if (swiper.params.keyboard.enabled) {
  4309. enable();
  4310. }
  4311. });
  4312. on('destroy', () => {
  4313. if (swiper.keyboard.enabled) {
  4314. disable();
  4315. }
  4316. });
  4317. Object.assign(swiper.keyboard, {
  4318. enable,
  4319. disable
  4320. });
  4321. }
  4322. /* eslint-disable consistent-return */
  4323. function Mousewheel(_ref) {
  4324. let {
  4325. swiper,
  4326. extendParams,
  4327. on,
  4328. emit
  4329. } = _ref;
  4330. const window = getWindow();
  4331. extendParams({
  4332. mousewheel: {
  4333. enabled: false,
  4334. releaseOnEdges: false,
  4335. invert: false,
  4336. forceToAxis: false,
  4337. sensitivity: 1,
  4338. eventsTarget: 'container',
  4339. thresholdDelta: null,
  4340. thresholdTime: null,
  4341. noMousewheelClass: 'swiper-no-mousewheel'
  4342. }
  4343. });
  4344. swiper.mousewheel = {
  4345. enabled: false
  4346. };
  4347. let timeout;
  4348. let lastScrollTime = now();
  4349. let lastEventBeforeSnap;
  4350. const recentWheelEvents = [];
  4351. function normalize(e) {
  4352. // Reasonable defaults
  4353. const PIXEL_STEP = 10;
  4354. const LINE_HEIGHT = 40;
  4355. const PAGE_HEIGHT = 800;
  4356. let sX = 0;
  4357. let sY = 0; // spinX, spinY
  4358. let pX = 0;
  4359. let pY = 0; // pixelX, pixelY
  4360. // Legacy
  4361. if ('detail' in e) {
  4362. sY = e.detail;
  4363. }
  4364. if ('wheelDelta' in e) {
  4365. sY = -e.wheelDelta / 120;
  4366. }
  4367. if ('wheelDeltaY' in e) {
  4368. sY = -e.wheelDeltaY / 120;
  4369. }
  4370. if ('wheelDeltaX' in e) {
  4371. sX = -e.wheelDeltaX / 120;
  4372. }
  4373. // side scrolling on FF with DOMMouseScroll
  4374. if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
  4375. sX = sY;
  4376. sY = 0;
  4377. }
  4378. pX = sX * PIXEL_STEP;
  4379. pY = sY * PIXEL_STEP;
  4380. if ('deltaY' in e) {
  4381. pY = e.deltaY;
  4382. }
  4383. if ('deltaX' in e) {
  4384. pX = e.deltaX;
  4385. }
  4386. if (e.shiftKey && !pX) {
  4387. // if user scrolls with shift he wants horizontal scroll
  4388. pX = pY;
  4389. pY = 0;
  4390. }
  4391. if ((pX || pY) && e.deltaMode) {
  4392. if (e.deltaMode === 1) {
  4393. // delta in LINE units
  4394. pX *= LINE_HEIGHT;
  4395. pY *= LINE_HEIGHT;
  4396. } else {
  4397. // delta in PAGE units
  4398. pX *= PAGE_HEIGHT;
  4399. pY *= PAGE_HEIGHT;
  4400. }
  4401. }
  4402. // Fall-back if spin cannot be determined
  4403. if (pX && !sX) {
  4404. sX = pX < 1 ? -1 : 1;
  4405. }
  4406. if (pY && !sY) {
  4407. sY = pY < 1 ? -1 : 1;
  4408. }
  4409. return {
  4410. spinX: sX,
  4411. spinY: sY,
  4412. pixelX: pX,
  4413. pixelY: pY
  4414. };
  4415. }
  4416. function handleMouseEnter() {
  4417. if (!swiper.enabled) return;
  4418. swiper.mouseEntered = true;
  4419. }
  4420. function handleMouseLeave() {
  4421. if (!swiper.enabled) return;
  4422. swiper.mouseEntered = false;
  4423. }
  4424. function animateSlider(newEvent) {
  4425. if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {
  4426. // Prevent if delta of wheel scroll delta is below configured threshold
  4427. return false;
  4428. }
  4429. if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {
  4430. // Prevent if time between scrolls is below configured threshold
  4431. return false;
  4432. }
  4433. // If the movement is NOT big enough and
  4434. // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
  4435. // Don't go any further (avoid insignificant scroll movement).
  4436. if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {
  4437. // Return false as a default
  4438. return true;
  4439. }
  4440. // If user is scrolling towards the end:
  4441. // If the slider hasn't hit the latest slide or
  4442. // if the slider is a loop and
  4443. // if the slider isn't moving right now:
  4444. // Go to next slide and
  4445. // emit a scroll event.
  4446. // Else (the user is scrolling towards the beginning) and
  4447. // if the slider hasn't hit the first slide or
  4448. // if the slider is a loop and
  4449. // if the slider isn't moving right now:
  4450. // Go to prev slide and
  4451. // emit a scroll event.
  4452. if (newEvent.direction < 0) {
  4453. if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
  4454. swiper.slideNext();
  4455. emit('scroll', newEvent.raw);
  4456. }
  4457. } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
  4458. swiper.slidePrev();
  4459. emit('scroll', newEvent.raw);
  4460. }
  4461. // If you got here is because an animation has been triggered so store the current time
  4462. lastScrollTime = new window.Date().getTime();
  4463. // Return false as a default
  4464. return false;
  4465. }
  4466. function releaseScroll(newEvent) {
  4467. const params = swiper.params.mousewheel;
  4468. if (newEvent.direction < 0) {
  4469. if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
  4470. // Return true to animate scroll on edges
  4471. return true;
  4472. }
  4473. } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
  4474. // Return true to animate scroll on edges
  4475. return true;
  4476. }
  4477. return false;
  4478. }
  4479. function handle(event) {
  4480. let e = event;
  4481. let disableParentSwiper = true;
  4482. if (!swiper.enabled) return;
  4483. // Ignore event if the target or its parents have the swiper-no-mousewheel class
  4484. if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;
  4485. const params = swiper.params.mousewheel;
  4486. if (swiper.params.cssMode) {
  4487. e.preventDefault();
  4488. }
  4489. let targetEl = swiper.el;
  4490. if (swiper.params.mousewheel.eventsTarget !== 'container') {
  4491. targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
  4492. }
  4493. const targetElContainsTarget = targetEl && targetEl.contains(e.target);
  4494. if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;
  4495. if (e.originalEvent) e = e.originalEvent; // jquery fix
  4496. let delta = 0;
  4497. const rtlFactor = swiper.rtlTranslate ? -1 : 1;
  4498. const data = normalize(e);
  4499. if (params.forceToAxis) {
  4500. if (swiper.isHorizontal()) {
  4501. if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
  4502. } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
  4503. } else {
  4504. delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
  4505. }
  4506. if (delta === 0) return true;
  4507. if (params.invert) delta = -delta;
  4508. // Get the scroll positions
  4509. let positions = swiper.getTranslate() + delta * params.sensitivity;
  4510. if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
  4511. if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();
  4512. // When loop is true:
  4513. // the disableParentSwiper will be true.
  4514. // When loop is false:
  4515. // if the scroll positions is not on edge,
  4516. // then the disableParentSwiper will be true.
  4517. // if the scroll on edge positions,
  4518. // then the disableParentSwiper will be false.
  4519. disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
  4520. if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
  4521. if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {
  4522. // Register the new event in a variable which stores the relevant data
  4523. const newEvent = {
  4524. time: now(),
  4525. delta: Math.abs(delta),
  4526. direction: Math.sign(delta),
  4527. raw: event
  4528. };
  4529. // Keep the most recent events
  4530. if (recentWheelEvents.length >= 2) {
  4531. recentWheelEvents.shift(); // only store the last N events
  4532. }
  4533. const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
  4534. recentWheelEvents.push(newEvent);
  4535. // If there is at least one previous recorded event:
  4536. // If direction has changed or
  4537. // if the scroll is quicker than the previous one:
  4538. // Animate the slider.
  4539. // Else (this is the first time the wheel is moved):
  4540. // Animate the slider.
  4541. if (prevEvent) {
  4542. if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
  4543. animateSlider(newEvent);
  4544. }
  4545. } else {
  4546. animateSlider(newEvent);
  4547. }
  4548. // If it's time to release the scroll:
  4549. // Return now so you don't hit the preventDefault.
  4550. if (releaseScroll(newEvent)) {
  4551. return true;
  4552. }
  4553. } else {
  4554. // Freemode or scrollContainer:
  4555. // If we recently snapped after a momentum scroll, then ignore wheel events
  4556. // to give time for the deceleration to finish. Stop ignoring after 500 msecs
  4557. // or if it's a new scroll (larger delta or inverse sign as last event before
  4558. // an end-of-momentum snap).
  4559. const newEvent = {
  4560. time: now(),
  4561. delta: Math.abs(delta),
  4562. direction: Math.sign(delta)
  4563. };
  4564. const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;
  4565. if (!ignoreWheelEvents) {
  4566. lastEventBeforeSnap = undefined;
  4567. let position = swiper.getTranslate() + delta * params.sensitivity;
  4568. const wasBeginning = swiper.isBeginning;
  4569. const wasEnd = swiper.isEnd;
  4570. if (position >= swiper.minTranslate()) position = swiper.minTranslate();
  4571. if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
  4572. swiper.setTransition(0);
  4573. swiper.setTranslate(position);
  4574. swiper.updateProgress();
  4575. swiper.updateActiveIndex();
  4576. swiper.updateSlidesClasses();
  4577. if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
  4578. swiper.updateSlidesClasses();
  4579. }
  4580. if (swiper.params.loop) {
  4581. swiper.loopFix({
  4582. direction: newEvent.direction < 0 ? 'next' : 'prev',
  4583. byMousewheel: true
  4584. });
  4585. }
  4586. if (swiper.params.freeMode.sticky) {
  4587. // When wheel scrolling starts with sticky (aka snap) enabled, then detect
  4588. // the end of a momentum scroll by storing recent (N=15?) wheel events.
  4589. // 1. do all N events have decreasing or same (absolute value) delta?
  4590. // 2. did all N events arrive in the last M (M=500?) msecs?
  4591. // 3. does the earliest event have an (absolute value) delta that's
  4592. // at least P (P=1?) larger than the most recent event's delta?
  4593. // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
  4594. // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
  4595. // Snap immediately and ignore remaining wheel events in this scroll.
  4596. // See comment above for "remaining wheel events in this scroll" determination.
  4597. // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
  4598. clearTimeout(timeout);
  4599. timeout = undefined;
  4600. if (recentWheelEvents.length >= 15) {
  4601. recentWheelEvents.shift(); // only store the last N events
  4602. }
  4603. const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
  4604. const firstEvent = recentWheelEvents[0];
  4605. recentWheelEvents.push(newEvent);
  4606. if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {
  4607. // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
  4608. recentWheelEvents.splice(0);
  4609. } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {
  4610. // We're at the end of the deceleration of a momentum scroll, so there's no need
  4611. // to wait for more events. Snap ASAP on the next tick.
  4612. // Also, because there's some remaining momentum we'll bias the snap in the
  4613. // direction of the ongoing scroll because it's better UX for the scroll to snap
  4614. // in the same direction as the scroll instead of reversing to snap. Therefore,
  4615. // if it's already scrolled more than 20% in the current direction, keep going.
  4616. const snapToThreshold = delta > 0 ? 0.8 : 0.2;
  4617. lastEventBeforeSnap = newEvent;
  4618. recentWheelEvents.splice(0);
  4619. timeout = nextTick(() => {
  4620. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  4621. }, 0); // no delay; move on next tick
  4622. }
  4623. if (!timeout) {
  4624. // if we get here, then we haven't detected the end of a momentum scroll, so
  4625. // we'll consider a scroll "complete" when there haven't been any wheel events
  4626. // for 500ms.
  4627. timeout = nextTick(() => {
  4628. const snapToThreshold = 0.5;
  4629. lastEventBeforeSnap = newEvent;
  4630. recentWheelEvents.splice(0);
  4631. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  4632. }, 500);
  4633. }
  4634. }
  4635. // Emit event
  4636. if (!ignoreWheelEvents) emit('scroll', e);
  4637. // Stop autoplay
  4638. if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop();
  4639. // Return page scroll on edge positions
  4640. if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;
  4641. }
  4642. }
  4643. if (e.preventDefault) e.preventDefault();else e.returnValue = false;
  4644. return false;
  4645. }
  4646. function events(method) {
  4647. let targetEl = swiper.el;
  4648. if (swiper.params.mousewheel.eventsTarget !== 'container') {
  4649. targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
  4650. }
  4651. targetEl[method]('mouseenter', handleMouseEnter);
  4652. targetEl[method]('mouseleave', handleMouseLeave);
  4653. targetEl[method]('wheel', handle);
  4654. }
  4655. function enable() {
  4656. if (swiper.params.cssMode) {
  4657. swiper.wrapperEl.removeEventListener('wheel', handle);
  4658. return true;
  4659. }
  4660. if (swiper.mousewheel.enabled) return false;
  4661. events('addEventListener');
  4662. swiper.mousewheel.enabled = true;
  4663. return true;
  4664. }
  4665. function disable() {
  4666. if (swiper.params.cssMode) {
  4667. swiper.wrapperEl.addEventListener(event, handle);
  4668. return true;
  4669. }
  4670. if (!swiper.mousewheel.enabled) return false;
  4671. events('removeEventListener');
  4672. swiper.mousewheel.enabled = false;
  4673. return true;
  4674. }
  4675. on('init', () => {
  4676. if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
  4677. disable();
  4678. }
  4679. if (swiper.params.mousewheel.enabled) enable();
  4680. });
  4681. on('destroy', () => {
  4682. if (swiper.params.cssMode) {
  4683. enable();
  4684. }
  4685. if (swiper.mousewheel.enabled) disable();
  4686. });
  4687. Object.assign(swiper.mousewheel, {
  4688. enable,
  4689. disable
  4690. });
  4691. }
  4692. function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
  4693. if (swiper.params.createElements) {
  4694. Object.keys(checkProps).forEach(key => {
  4695. if (!params[key] && params.auto === true) {
  4696. let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];
  4697. if (!element) {
  4698. element = createElement('div', checkProps[key]);
  4699. element.className = checkProps[key];
  4700. swiper.el.append(element);
  4701. }
  4702. params[key] = element;
  4703. originalParams[key] = element;
  4704. }
  4705. });
  4706. }
  4707. return params;
  4708. }
  4709. function Navigation(_ref) {
  4710. let {
  4711. swiper,
  4712. extendParams,
  4713. on,
  4714. emit
  4715. } = _ref;
  4716. extendParams({
  4717. navigation: {
  4718. nextEl: null,
  4719. prevEl: null,
  4720. hideOnClick: false,
  4721. disabledClass: 'swiper-button-disabled',
  4722. hiddenClass: 'swiper-button-hidden',
  4723. lockClass: 'swiper-button-lock',
  4724. navigationDisabledClass: 'swiper-navigation-disabled'
  4725. }
  4726. });
  4727. swiper.navigation = {
  4728. nextEl: null,
  4729. prevEl: null
  4730. };
  4731. const makeElementsArray = el => {
  4732. if (!Array.isArray(el)) el = [el].filter(e => !!e);
  4733. return el;
  4734. };
  4735. function getEl(el) {
  4736. let res;
  4737. if (el && typeof el === 'string' && swiper.isElement) {
  4738. res = swiper.el.shadowRoot.querySelector(el);
  4739. if (res) return res;
  4740. }
  4741. if (el) {
  4742. if (typeof el === 'string') res = [...document.querySelectorAll(el)];
  4743. if (swiper.params.uniqueNavElements && typeof el === 'string' && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
  4744. res = swiper.el.querySelector(el);
  4745. }
  4746. }
  4747. if (el && !res) return el;
  4748. // if (Array.isArray(res) && res.length === 1) res = res[0];
  4749. return res;
  4750. }
  4751. function toggleEl(el, disabled) {
  4752. const params = swiper.params.navigation;
  4753. el = makeElementsArray(el);
  4754. el.forEach(subEl => {
  4755. if (subEl) {
  4756. subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));
  4757. if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;
  4758. if (swiper.params.watchOverflow && swiper.enabled) {
  4759. subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
  4760. }
  4761. }
  4762. });
  4763. }
  4764. function update() {
  4765. // Update Navigation Buttons
  4766. const {
  4767. nextEl,
  4768. prevEl
  4769. } = swiper.navigation;
  4770. if (swiper.params.loop) {
  4771. toggleEl(prevEl, false);
  4772. toggleEl(nextEl, false);
  4773. return;
  4774. }
  4775. toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
  4776. toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
  4777. }
  4778. function onPrevClick(e) {
  4779. e.preventDefault();
  4780. if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;
  4781. swiper.slidePrev();
  4782. emit('navigationPrev');
  4783. }
  4784. function onNextClick(e) {
  4785. e.preventDefault();
  4786. if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;
  4787. swiper.slideNext();
  4788. emit('navigationNext');
  4789. }
  4790. function init() {
  4791. const params = swiper.params.navigation;
  4792. swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
  4793. nextEl: 'swiper-button-next',
  4794. prevEl: 'swiper-button-prev'
  4795. });
  4796. if (!(params.nextEl || params.prevEl)) return;
  4797. let nextEl = getEl(params.nextEl);
  4798. let prevEl = getEl(params.prevEl);
  4799. Object.assign(swiper.navigation, {
  4800. nextEl,
  4801. prevEl
  4802. });
  4803. nextEl = makeElementsArray(nextEl);
  4804. prevEl = makeElementsArray(prevEl);
  4805. const initButton = (el, dir) => {
  4806. if (el) {
  4807. el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
  4808. }
  4809. if (!swiper.enabled && el) {
  4810. el.classList.add(...params.lockClass.split(' '));
  4811. }
  4812. };
  4813. nextEl.forEach(el => initButton(el, 'next'));
  4814. prevEl.forEach(el => initButton(el, 'prev'));
  4815. }
  4816. function destroy() {
  4817. let {
  4818. nextEl,
  4819. prevEl
  4820. } = swiper.navigation;
  4821. nextEl = makeElementsArray(nextEl);
  4822. prevEl = makeElementsArray(prevEl);
  4823. const destroyButton = (el, dir) => {
  4824. el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
  4825. el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));
  4826. };
  4827. nextEl.forEach(el => destroyButton(el, 'next'));
  4828. prevEl.forEach(el => destroyButton(el, 'prev'));
  4829. }
  4830. on('init', () => {
  4831. if (swiper.params.navigation.enabled === false) {
  4832. // eslint-disable-next-line
  4833. disable();
  4834. } else {
  4835. init();
  4836. update();
  4837. }
  4838. });
  4839. on('toEdge fromEdge lock unlock', () => {
  4840. update();
  4841. });
  4842. on('destroy', () => {
  4843. destroy();
  4844. });
  4845. on('enable disable', () => {
  4846. let {
  4847. nextEl,
  4848. prevEl
  4849. } = swiper.navigation;
  4850. nextEl = makeElementsArray(nextEl);
  4851. prevEl = makeElementsArray(prevEl);
  4852. [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.navigation.lockClass));
  4853. });
  4854. on('click', (_s, e) => {
  4855. let {
  4856. nextEl,
  4857. prevEl
  4858. } = swiper.navigation;
  4859. nextEl = makeElementsArray(nextEl);
  4860. prevEl = makeElementsArray(prevEl);
  4861. const targetEl = e.target;
  4862. if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) {
  4863. if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
  4864. let isHidden;
  4865. if (nextEl.length) {
  4866. isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
  4867. } else if (prevEl.length) {
  4868. isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
  4869. }
  4870. if (isHidden === true) {
  4871. emit('navigationShow');
  4872. } else {
  4873. emit('navigationHide');
  4874. }
  4875. [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));
  4876. }
  4877. });
  4878. const enable = () => {
  4879. swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));
  4880. init();
  4881. update();
  4882. };
  4883. const disable = () => {
  4884. swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));
  4885. destroy();
  4886. };
  4887. Object.assign(swiper.navigation, {
  4888. enable,
  4889. disable,
  4890. update,
  4891. init,
  4892. destroy
  4893. });
  4894. }
  4895. function classesToSelector(classes) {
  4896. if (classes === void 0) {
  4897. classes = '';
  4898. }
  4899. return `.${classes.trim().replace(/([\.:!+\/])/g, '\\$1') // eslint-disable-line
  4900. .replace(/ /g, '.')}`;
  4901. }
  4902. function Pagination(_ref) {
  4903. let {
  4904. swiper,
  4905. extendParams,
  4906. on,
  4907. emit
  4908. } = _ref;
  4909. const pfx = 'swiper-pagination';
  4910. extendParams({
  4911. pagination: {
  4912. el: null,
  4913. bulletElement: 'span',
  4914. clickable: false,
  4915. hideOnClick: false,
  4916. renderBullet: null,
  4917. renderProgressbar: null,
  4918. renderFraction: null,
  4919. renderCustom: null,
  4920. progressbarOpposite: false,
  4921. type: 'bullets',
  4922. // 'bullets' or 'progressbar' or 'fraction' or 'custom'
  4923. dynamicBullets: false,
  4924. dynamicMainBullets: 1,
  4925. formatFractionCurrent: number => number,
  4926. formatFractionTotal: number => number,
  4927. bulletClass: `${pfx}-bullet`,
  4928. bulletActiveClass: `${pfx}-bullet-active`,
  4929. modifierClass: `${pfx}-`,
  4930. currentClass: `${pfx}-current`,
  4931. totalClass: `${pfx}-total`,
  4932. hiddenClass: `${pfx}-hidden`,
  4933. progressbarFillClass: `${pfx}-progressbar-fill`,
  4934. progressbarOppositeClass: `${pfx}-progressbar-opposite`,
  4935. clickableClass: `${pfx}-clickable`,
  4936. lockClass: `${pfx}-lock`,
  4937. horizontalClass: `${pfx}-horizontal`,
  4938. verticalClass: `${pfx}-vertical`,
  4939. paginationDisabledClass: `${pfx}-disabled`
  4940. }
  4941. });
  4942. swiper.pagination = {
  4943. el: null,
  4944. bullets: []
  4945. };
  4946. let bulletSize;
  4947. let dynamicBulletIndex = 0;
  4948. const makeElementsArray = el => {
  4949. if (!Array.isArray(el)) el = [el].filter(e => !!e);
  4950. return el;
  4951. };
  4952. function isPaginationDisabled() {
  4953. return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;
  4954. }
  4955. function setSideBullets(bulletEl, position) {
  4956. const {
  4957. bulletActiveClass
  4958. } = swiper.params.pagination;
  4959. if (!bulletEl) return;
  4960. bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
  4961. if (bulletEl) {
  4962. bulletEl.classList.add(`${bulletActiveClass}-${position}`);
  4963. bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
  4964. if (bulletEl) {
  4965. bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);
  4966. }
  4967. }
  4968. }
  4969. function onBulletClick(e) {
  4970. const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));
  4971. if (!bulletEl) {
  4972. return;
  4973. }
  4974. e.preventDefault();
  4975. const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;
  4976. if (swiper.params.loop) {
  4977. if (swiper.realIndex === index) return;
  4978. const newSlideIndex = swiper.getSlideIndexByData(index);
  4979. const currentSlideIndex = swiper.getSlideIndexByData(swiper.realIndex);
  4980. if (newSlideIndex > swiper.slides.length - swiper.loopedSlides) {
  4981. swiper.loopFix({
  4982. direction: newSlideIndex > currentSlideIndex ? 'next' : 'prev',
  4983. activeSlideIndex: newSlideIndex,
  4984. slideTo: false
  4985. });
  4986. }
  4987. swiper.slideToLoop(index);
  4988. } else {
  4989. swiper.slideTo(index);
  4990. }
  4991. }
  4992. function update() {
  4993. // Render || Update Pagination bullets/items
  4994. const rtl = swiper.rtl;
  4995. const params = swiper.params.pagination;
  4996. if (isPaginationDisabled()) return;
  4997. let el = swiper.pagination.el;
  4998. el = makeElementsArray(el);
  4999. // Current/Total
  5000. let current;
  5001. let previousIndex;
  5002. const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  5003. const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  5004. if (swiper.params.loop) {
  5005. previousIndex = swiper.previousRealIndex || 0;
  5006. current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;
  5007. } else if (typeof swiper.snapIndex !== 'undefined') {
  5008. current = swiper.snapIndex;
  5009. previousIndex = swiper.previousSnapIndex;
  5010. } else {
  5011. previousIndex = swiper.previousIndex || 0;
  5012. current = swiper.activeIndex || 0;
  5013. }
  5014. // Types
  5015. if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
  5016. const bullets = swiper.pagination.bullets;
  5017. let firstIndex;
  5018. let lastIndex;
  5019. let midIndex;
  5020. if (params.dynamicBullets) {
  5021. bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);
  5022. el.forEach(subEl => {
  5023. subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;
  5024. });
  5025. if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {
  5026. dynamicBulletIndex += current - (previousIndex || 0);
  5027. if (dynamicBulletIndex > params.dynamicMainBullets - 1) {
  5028. dynamicBulletIndex = params.dynamicMainBullets - 1;
  5029. } else if (dynamicBulletIndex < 0) {
  5030. dynamicBulletIndex = 0;
  5031. }
  5032. }
  5033. firstIndex = Math.max(current - dynamicBulletIndex, 0);
  5034. lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
  5035. midIndex = (lastIndex + firstIndex) / 2;
  5036. }
  5037. bullets.forEach(bulletEl => {
  5038. const classesToRemove = [...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`)].map(s => typeof s === 'string' && s.includes(' ') ? s.split(' ') : s).flat();
  5039. bulletEl.classList.remove(...classesToRemove);
  5040. });
  5041. if (el.length > 1) {
  5042. bullets.forEach(bullet => {
  5043. const bulletIndex = elementIndex(bullet);
  5044. if (bulletIndex === current) {
  5045. bullet.classList.add(...params.bulletActiveClass.split(' '));
  5046. } else if (swiper.isElement) {
  5047. bullet.setAttribute('part', 'bullet');
  5048. }
  5049. if (params.dynamicBullets) {
  5050. if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
  5051. bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));
  5052. }
  5053. if (bulletIndex === firstIndex) {
  5054. setSideBullets(bullet, 'prev');
  5055. }
  5056. if (bulletIndex === lastIndex) {
  5057. setSideBullets(bullet, 'next');
  5058. }
  5059. }
  5060. });
  5061. } else {
  5062. const bullet = bullets[current];
  5063. if (bullet) {
  5064. bullet.classList.add(...params.bulletActiveClass.split(' '));
  5065. }
  5066. if (swiper.isElement) {
  5067. bullets.forEach((bulletEl, bulletIndex) => {
  5068. bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');
  5069. });
  5070. }
  5071. if (params.dynamicBullets) {
  5072. const firstDisplayedBullet = bullets[firstIndex];
  5073. const lastDisplayedBullet = bullets[lastIndex];
  5074. for (let i = firstIndex; i <= lastIndex; i += 1) {
  5075. if (bullets[i]) {
  5076. bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));
  5077. }
  5078. }
  5079. setSideBullets(firstDisplayedBullet, 'prev');
  5080. setSideBullets(lastDisplayedBullet, 'next');
  5081. }
  5082. }
  5083. if (params.dynamicBullets) {
  5084. const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
  5085. const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;
  5086. const offsetProp = rtl ? 'right' : 'left';
  5087. bullets.forEach(bullet => {
  5088. bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;
  5089. });
  5090. }
  5091. }
  5092. el.forEach((subEl, subElIndex) => {
  5093. if (params.type === 'fraction') {
  5094. subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach(fractionEl => {
  5095. fractionEl.textContent = params.formatFractionCurrent(current + 1);
  5096. });
  5097. subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach(totalEl => {
  5098. totalEl.textContent = params.formatFractionTotal(total);
  5099. });
  5100. }
  5101. if (params.type === 'progressbar') {
  5102. let progressbarDirection;
  5103. if (params.progressbarOpposite) {
  5104. progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
  5105. } else {
  5106. progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
  5107. }
  5108. const scale = (current + 1) / total;
  5109. let scaleX = 1;
  5110. let scaleY = 1;
  5111. if (progressbarDirection === 'horizontal') {
  5112. scaleX = scale;
  5113. } else {
  5114. scaleY = scale;
  5115. }
  5116. subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach(progressEl => {
  5117. progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;
  5118. progressEl.style.transitionDuration = `${swiper.params.speed}ms`;
  5119. });
  5120. }
  5121. if (params.type === 'custom' && params.renderCustom) {
  5122. subEl.innerHTML = params.renderCustom(swiper, current + 1, total);
  5123. if (subElIndex === 0) emit('paginationRender', subEl);
  5124. } else {
  5125. if (subElIndex === 0) emit('paginationRender', subEl);
  5126. emit('paginationUpdate', subEl);
  5127. }
  5128. if (swiper.params.watchOverflow && swiper.enabled) {
  5129. subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
  5130. }
  5131. });
  5132. }
  5133. function render() {
  5134. // Render Container
  5135. const params = swiper.params.pagination;
  5136. if (isPaginationDisabled()) return;
  5137. const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  5138. let el = swiper.pagination.el;
  5139. el = makeElementsArray(el);
  5140. let paginationHTML = '';
  5141. if (params.type === 'bullets') {
  5142. let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  5143. if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {
  5144. numberOfBullets = slidesLength;
  5145. }
  5146. for (let i = 0; i < numberOfBullets; i += 1) {
  5147. if (params.renderBullet) {
  5148. paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
  5149. } else {
  5150. // prettier-ignore
  5151. paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ''} class="${params.bulletClass}"></${params.bulletElement}>`;
  5152. }
  5153. }
  5154. }
  5155. if (params.type === 'fraction') {
  5156. if (params.renderFraction) {
  5157. paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
  5158. } else {
  5159. paginationHTML = `<span class="${params.currentClass}"></span>` + ' / ' + `<span class="${params.totalClass}"></span>`;
  5160. }
  5161. }
  5162. if (params.type === 'progressbar') {
  5163. if (params.renderProgressbar) {
  5164. paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
  5165. } else {
  5166. paginationHTML = `<span class="${params.progressbarFillClass}"></span>`;
  5167. }
  5168. }
  5169. swiper.pagination.bullets = [];
  5170. el.forEach(subEl => {
  5171. if (params.type !== 'custom') {
  5172. subEl.innerHTML = paginationHTML || '';
  5173. }
  5174. if (params.type === 'bullets') {
  5175. swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));
  5176. }
  5177. });
  5178. if (params.type !== 'custom') {
  5179. emit('paginationRender', el[0]);
  5180. }
  5181. }
  5182. function init() {
  5183. swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {
  5184. el: 'swiper-pagination'
  5185. });
  5186. const params = swiper.params.pagination;
  5187. if (!params.el) return;
  5188. let el;
  5189. if (typeof params.el === 'string' && swiper.isElement) {
  5190. el = swiper.el.shadowRoot.querySelector(params.el);
  5191. }
  5192. if (!el && typeof params.el === 'string') {
  5193. el = [...document.querySelectorAll(params.el)];
  5194. }
  5195. if (!el) {
  5196. el = params.el;
  5197. }
  5198. if (!el || el.length === 0) return;
  5199. if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {
  5200. el = [...swiper.el.querySelectorAll(params.el)];
  5201. // check if it belongs to another nested Swiper
  5202. if (el.length > 1) {
  5203. el = el.filter(subEl => {
  5204. if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;
  5205. return true;
  5206. })[0];
  5207. }
  5208. }
  5209. if (Array.isArray(el) && el.length === 1) el = el[0];
  5210. Object.assign(swiper.pagination, {
  5211. el
  5212. });
  5213. el = makeElementsArray(el);
  5214. el.forEach(subEl => {
  5215. if (params.type === 'bullets' && params.clickable) {
  5216. subEl.classList.add(params.clickableClass);
  5217. }
  5218. subEl.classList.add(params.modifierClass + params.type);
  5219. subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
  5220. if (params.type === 'bullets' && params.dynamicBullets) {
  5221. subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);
  5222. dynamicBulletIndex = 0;
  5223. if (params.dynamicMainBullets < 1) {
  5224. params.dynamicMainBullets = 1;
  5225. }
  5226. }
  5227. if (params.type === 'progressbar' && params.progressbarOpposite) {
  5228. subEl.classList.add(params.progressbarOppositeClass);
  5229. }
  5230. if (params.clickable) {
  5231. subEl.addEventListener('click', onBulletClick);
  5232. }
  5233. if (!swiper.enabled) {
  5234. subEl.classList.add(params.lockClass);
  5235. }
  5236. });
  5237. }
  5238. function destroy() {
  5239. const params = swiper.params.pagination;
  5240. if (isPaginationDisabled()) return;
  5241. let el = swiper.pagination.el;
  5242. if (el) {
  5243. el = makeElementsArray(el);
  5244. el.forEach(subEl => {
  5245. subEl.classList.remove(params.hiddenClass);
  5246. subEl.classList.remove(params.modifierClass + params.type);
  5247. subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
  5248. if (params.clickable) {
  5249. subEl.removeEventListener('click', onBulletClick);
  5250. }
  5251. });
  5252. }
  5253. if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(subEl => subEl.classList.remove(...params.bulletActiveClass.split(' ')));
  5254. }
  5255. on('changeDirection', () => {
  5256. if (!swiper.pagination || !swiper.pagination.el) return;
  5257. const params = swiper.params.pagination;
  5258. let {
  5259. el
  5260. } = swiper.pagination;
  5261. el = makeElementsArray(el);
  5262. el.forEach(subEl => {
  5263. subEl.classList.remove(params.horizontalClass, params.verticalClass);
  5264. subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
  5265. });
  5266. });
  5267. on('init', () => {
  5268. if (swiper.params.pagination.enabled === false) {
  5269. // eslint-disable-next-line
  5270. disable();
  5271. } else {
  5272. init();
  5273. render();
  5274. update();
  5275. }
  5276. });
  5277. on('activeIndexChange', () => {
  5278. if (typeof swiper.snapIndex === 'undefined') {
  5279. update();
  5280. }
  5281. });
  5282. on('snapIndexChange', () => {
  5283. update();
  5284. });
  5285. on('snapGridLengthChange', () => {
  5286. render();
  5287. update();
  5288. });
  5289. on('destroy', () => {
  5290. destroy();
  5291. });
  5292. on('enable disable', () => {
  5293. let {
  5294. el
  5295. } = swiper.pagination;
  5296. if (el) {
  5297. el = makeElementsArray(el);
  5298. el.forEach(subEl => subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass));
  5299. }
  5300. });
  5301. on('lock unlock', () => {
  5302. update();
  5303. });
  5304. on('click', (_s, e) => {
  5305. const targetEl = e.target;
  5306. let {
  5307. el
  5308. } = swiper.pagination;
  5309. if (!Array.isArray(el)) el = [el].filter(element => !!element);
  5310. if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {
  5311. if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
  5312. const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);
  5313. if (isHidden === true) {
  5314. emit('paginationShow');
  5315. } else {
  5316. emit('paginationHide');
  5317. }
  5318. el.forEach(subEl => subEl.classList.toggle(swiper.params.pagination.hiddenClass));
  5319. }
  5320. });
  5321. const enable = () => {
  5322. swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);
  5323. let {
  5324. el
  5325. } = swiper.pagination;
  5326. if (el) {
  5327. el = makeElementsArray(el);
  5328. el.forEach(subEl => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));
  5329. }
  5330. init();
  5331. render();
  5332. update();
  5333. };
  5334. const disable = () => {
  5335. swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);
  5336. let {
  5337. el
  5338. } = swiper.pagination;
  5339. if (el) {
  5340. el = makeElementsArray(el);
  5341. el.forEach(subEl => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));
  5342. }
  5343. destroy();
  5344. };
  5345. Object.assign(swiper.pagination, {
  5346. enable,
  5347. disable,
  5348. render,
  5349. update,
  5350. init,
  5351. destroy
  5352. });
  5353. }
  5354. function Scrollbar(_ref) {
  5355. let {
  5356. swiper,
  5357. extendParams,
  5358. on,
  5359. emit
  5360. } = _ref;
  5361. const document = getDocument();
  5362. let isTouched = false;
  5363. let timeout = null;
  5364. let dragTimeout = null;
  5365. let dragStartPos;
  5366. let dragSize;
  5367. let trackSize;
  5368. let divider;
  5369. extendParams({
  5370. scrollbar: {
  5371. el: null,
  5372. dragSize: 'auto',
  5373. hide: false,
  5374. draggable: false,
  5375. snapOnRelease: true,
  5376. lockClass: 'swiper-scrollbar-lock',
  5377. dragClass: 'swiper-scrollbar-drag',
  5378. scrollbarDisabledClass: 'swiper-scrollbar-disabled',
  5379. horizontalClass: `swiper-scrollbar-horizontal`,
  5380. verticalClass: `swiper-scrollbar-vertical`
  5381. }
  5382. });
  5383. swiper.scrollbar = {
  5384. el: null,
  5385. dragEl: null
  5386. };
  5387. function setTranslate() {
  5388. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
  5389. const {
  5390. scrollbar,
  5391. rtlTranslate: rtl
  5392. } = swiper;
  5393. const {
  5394. dragEl,
  5395. el
  5396. } = scrollbar;
  5397. const params = swiper.params.scrollbar;
  5398. const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;
  5399. let newSize = dragSize;
  5400. let newPos = (trackSize - dragSize) * progress;
  5401. if (rtl) {
  5402. newPos = -newPos;
  5403. if (newPos > 0) {
  5404. newSize = dragSize - newPos;
  5405. newPos = 0;
  5406. } else if (-newPos + dragSize > trackSize) {
  5407. newSize = trackSize + newPos;
  5408. }
  5409. } else if (newPos < 0) {
  5410. newSize = dragSize + newPos;
  5411. newPos = 0;
  5412. } else if (newPos + dragSize > trackSize) {
  5413. newSize = trackSize - newPos;
  5414. }
  5415. if (swiper.isHorizontal()) {
  5416. dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;
  5417. dragEl.style.width = `${newSize}px`;
  5418. } else {
  5419. dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;
  5420. dragEl.style.height = `${newSize}px`;
  5421. }
  5422. if (params.hide) {
  5423. clearTimeout(timeout);
  5424. el.style.opacity = 1;
  5425. timeout = setTimeout(() => {
  5426. el.style.opacity = 0;
  5427. el.style.transitionDuration = '400ms';
  5428. }, 1000);
  5429. }
  5430. }
  5431. function setTransition(duration) {
  5432. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
  5433. swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;
  5434. }
  5435. function updateSize() {
  5436. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
  5437. const {
  5438. scrollbar
  5439. } = swiper;
  5440. const {
  5441. dragEl,
  5442. el
  5443. } = scrollbar;
  5444. dragEl.style.width = '';
  5445. dragEl.style.height = '';
  5446. trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;
  5447. divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));
  5448. if (swiper.params.scrollbar.dragSize === 'auto') {
  5449. dragSize = trackSize * divider;
  5450. } else {
  5451. dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
  5452. }
  5453. if (swiper.isHorizontal()) {
  5454. dragEl.style.width = `${dragSize}px`;
  5455. } else {
  5456. dragEl.style.height = `${dragSize}px`;
  5457. }
  5458. if (divider >= 1) {
  5459. el.style.display = 'none';
  5460. } else {
  5461. el.style.display = '';
  5462. }
  5463. if (swiper.params.scrollbar.hide) {
  5464. el.style.opacity = 0;
  5465. }
  5466. if (swiper.params.watchOverflow && swiper.enabled) {
  5467. scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);
  5468. }
  5469. }
  5470. function getPointerPosition(e) {
  5471. return swiper.isHorizontal() ? e.clientX : e.clientY;
  5472. }
  5473. function setDragPosition(e) {
  5474. const {
  5475. scrollbar,
  5476. rtlTranslate: rtl
  5477. } = swiper;
  5478. const {
  5479. el
  5480. } = scrollbar;
  5481. let positionRatio;
  5482. positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
  5483. positionRatio = Math.max(Math.min(positionRatio, 1), 0);
  5484. if (rtl) {
  5485. positionRatio = 1 - positionRatio;
  5486. }
  5487. const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
  5488. swiper.updateProgress(position);
  5489. swiper.setTranslate(position);
  5490. swiper.updateActiveIndex();
  5491. swiper.updateSlidesClasses();
  5492. }
  5493. function onDragStart(e) {
  5494. const params = swiper.params.scrollbar;
  5495. const {
  5496. scrollbar,
  5497. wrapperEl
  5498. } = swiper;
  5499. const {
  5500. el,
  5501. dragEl
  5502. } = scrollbar;
  5503. isTouched = true;
  5504. dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
  5505. e.preventDefault();
  5506. e.stopPropagation();
  5507. wrapperEl.style.transitionDuration = '100ms';
  5508. dragEl.style.transitionDuration = '100ms';
  5509. setDragPosition(e);
  5510. clearTimeout(dragTimeout);
  5511. el.style.transitionDuration = '0ms';
  5512. if (params.hide) {
  5513. el.style.opacity = 1;
  5514. }
  5515. if (swiper.params.cssMode) {
  5516. swiper.wrapperEl.style['scroll-snap-type'] = 'none';
  5517. }
  5518. emit('scrollbarDragStart', e);
  5519. }
  5520. function onDragMove(e) {
  5521. const {
  5522. scrollbar,
  5523. wrapperEl
  5524. } = swiper;
  5525. const {
  5526. el,
  5527. dragEl
  5528. } = scrollbar;
  5529. if (!isTouched) return;
  5530. if (e.preventDefault) e.preventDefault();else e.returnValue = false;
  5531. setDragPosition(e);
  5532. wrapperEl.style.transitionDuration = '0ms';
  5533. el.style.transitionDuration = '0ms';
  5534. dragEl.style.transitionDuration = '0ms';
  5535. emit('scrollbarDragMove', e);
  5536. }
  5537. function onDragEnd(e) {
  5538. const params = swiper.params.scrollbar;
  5539. const {
  5540. scrollbar,
  5541. wrapperEl
  5542. } = swiper;
  5543. const {
  5544. el
  5545. } = scrollbar;
  5546. if (!isTouched) return;
  5547. isTouched = false;
  5548. if (swiper.params.cssMode) {
  5549. swiper.wrapperEl.style['scroll-snap-type'] = '';
  5550. wrapperEl.style.transitionDuration = '';
  5551. }
  5552. if (params.hide) {
  5553. clearTimeout(dragTimeout);
  5554. dragTimeout = nextTick(() => {
  5555. el.style.opacity = 0;
  5556. el.style.transitionDuration = '400ms';
  5557. }, 1000);
  5558. }
  5559. emit('scrollbarDragEnd', e);
  5560. if (params.snapOnRelease) {
  5561. swiper.slideToClosest();
  5562. }
  5563. }
  5564. function events(method) {
  5565. const {
  5566. scrollbar,
  5567. params
  5568. } = swiper;
  5569. const el = scrollbar.el;
  5570. if (!el) return;
  5571. const target = el;
  5572. const activeListener = params.passiveListeners ? {
  5573. passive: false,
  5574. capture: false
  5575. } : false;
  5576. const passiveListener = params.passiveListeners ? {
  5577. passive: true,
  5578. capture: false
  5579. } : false;
  5580. if (!target) return;
  5581. const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
  5582. target[eventMethod]('pointerdown', onDragStart, activeListener);
  5583. document[eventMethod]('pointermove', onDragMove, activeListener);
  5584. document[eventMethod]('pointerup', onDragEnd, passiveListener);
  5585. }
  5586. function enableDraggable() {
  5587. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
  5588. events('on');
  5589. }
  5590. function disableDraggable() {
  5591. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
  5592. events('off');
  5593. }
  5594. function init() {
  5595. const {
  5596. scrollbar,
  5597. el: swiperEl
  5598. } = swiper;
  5599. swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {
  5600. el: 'swiper-scrollbar'
  5601. });
  5602. const params = swiper.params.scrollbar;
  5603. if (!params.el) return;
  5604. let el;
  5605. if (typeof params.el === 'string' && swiper.isElement) {
  5606. el = swiper.el.shadowRoot.querySelector(params.el);
  5607. }
  5608. if (!el && typeof params.el === 'string') {
  5609. el = document.querySelectorAll(params.el);
  5610. } else if (!el) {
  5611. el = params.el;
  5612. }
  5613. if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {
  5614. el = swiperEl.querySelector(params.el);
  5615. }
  5616. if (el.length > 0) el = el[0];
  5617. el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
  5618. let dragEl;
  5619. if (el) {
  5620. dragEl = el.querySelector(`.${swiper.params.scrollbar.dragClass}`);
  5621. if (!dragEl) {
  5622. dragEl = createElement('div', swiper.params.scrollbar.dragClass);
  5623. el.append(dragEl);
  5624. }
  5625. }
  5626. Object.assign(scrollbar, {
  5627. el,
  5628. dragEl
  5629. });
  5630. if (params.draggable) {
  5631. enableDraggable();
  5632. }
  5633. if (el) {
  5634. el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);
  5635. }
  5636. }
  5637. function destroy() {
  5638. const params = swiper.params.scrollbar;
  5639. const el = swiper.scrollbar.el;
  5640. if (el) {
  5641. el.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
  5642. }
  5643. disableDraggable();
  5644. }
  5645. on('init', () => {
  5646. if (swiper.params.scrollbar.enabled === false) {
  5647. // eslint-disable-next-line
  5648. disable();
  5649. } else {
  5650. init();
  5651. updateSize();
  5652. setTranslate();
  5653. }
  5654. });
  5655. on('update resize observerUpdate lock unlock', () => {
  5656. updateSize();
  5657. });
  5658. on('setTranslate', () => {
  5659. setTranslate();
  5660. });
  5661. on('setTransition', (_s, duration) => {
  5662. setTransition(duration);
  5663. });
  5664. on('enable disable', () => {
  5665. const {
  5666. el
  5667. } = swiper.scrollbar;
  5668. if (el) {
  5669. el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);
  5670. }
  5671. });
  5672. on('destroy', () => {
  5673. destroy();
  5674. });
  5675. const enable = () => {
  5676. swiper.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);
  5677. if (swiper.scrollbar.el) {
  5678. swiper.scrollbar.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);
  5679. }
  5680. init();
  5681. updateSize();
  5682. setTranslate();
  5683. };
  5684. const disable = () => {
  5685. swiper.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);
  5686. if (swiper.scrollbar.el) {
  5687. swiper.scrollbar.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);
  5688. }
  5689. destroy();
  5690. };
  5691. Object.assign(swiper.scrollbar, {
  5692. enable,
  5693. disable,
  5694. updateSize,
  5695. setTranslate,
  5696. init,
  5697. destroy
  5698. });
  5699. }
  5700. function Parallax(_ref) {
  5701. let {
  5702. swiper,
  5703. extendParams,
  5704. on
  5705. } = _ref;
  5706. extendParams({
  5707. parallax: {
  5708. enabled: false
  5709. }
  5710. });
  5711. const setTransform = (el, progress) => {
  5712. const {
  5713. rtl
  5714. } = swiper;
  5715. const rtlFactor = rtl ? -1 : 1;
  5716. const p = el.getAttribute('data-swiper-parallax') || '0';
  5717. let x = el.getAttribute('data-swiper-parallax-x');
  5718. let y = el.getAttribute('data-swiper-parallax-y');
  5719. const scale = el.getAttribute('data-swiper-parallax-scale');
  5720. const opacity = el.getAttribute('data-swiper-parallax-opacity');
  5721. const rotate = el.getAttribute('data-swiper-parallax-rotate');
  5722. if (x || y) {
  5723. x = x || '0';
  5724. y = y || '0';
  5725. } else if (swiper.isHorizontal()) {
  5726. x = p;
  5727. y = '0';
  5728. } else {
  5729. y = p;
  5730. x = '0';
  5731. }
  5732. if (x.indexOf('%') >= 0) {
  5733. x = `${parseInt(x, 10) * progress * rtlFactor}%`;
  5734. } else {
  5735. x = `${x * progress * rtlFactor}px`;
  5736. }
  5737. if (y.indexOf('%') >= 0) {
  5738. y = `${parseInt(y, 10) * progress}%`;
  5739. } else {
  5740. y = `${y * progress}px`;
  5741. }
  5742. if (typeof opacity !== 'undefined' && opacity !== null) {
  5743. const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
  5744. el.style.opacity = currentOpacity;
  5745. }
  5746. let transform = `translate3d(${x}, ${y}, 0px)`;
  5747. if (typeof scale !== 'undefined' && scale !== null) {
  5748. const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
  5749. transform += ` scale(${currentScale})`;
  5750. }
  5751. if (rotate && typeof rotate !== 'undefined' && rotate !== null) {
  5752. const currentRotate = rotate * progress * -1;
  5753. transform += ` rotate(${currentRotate}deg)`;
  5754. }
  5755. el.style.transform = transform;
  5756. };
  5757. const setTranslate = () => {
  5758. const {
  5759. el,
  5760. slides,
  5761. progress,
  5762. snapGrid
  5763. } = swiper;
  5764. elementChildren(el, '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').forEach(subEl => {
  5765. setTransform(subEl, progress);
  5766. });
  5767. slides.forEach((slideEl, slideIndex) => {
  5768. let slideProgress = slideEl.progress;
  5769. if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
  5770. slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
  5771. }
  5772. slideProgress = Math.min(Math.max(slideProgress, -1), 1);
  5773. slideEl.querySelectorAll('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale], [data-swiper-parallax-rotate]').forEach(subEl => {
  5774. setTransform(subEl, slideProgress);
  5775. });
  5776. });
  5777. };
  5778. const setTransition = function (duration) {
  5779. if (duration === void 0) {
  5780. duration = swiper.params.speed;
  5781. }
  5782. const {
  5783. el
  5784. } = swiper;
  5785. el.querySelectorAll('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').forEach(parallaxEl => {
  5786. let parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;
  5787. if (duration === 0) parallaxDuration = 0;
  5788. parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;
  5789. });
  5790. };
  5791. on('beforeInit', () => {
  5792. if (!swiper.params.parallax.enabled) return;
  5793. swiper.params.watchSlidesProgress = true;
  5794. swiper.originalParams.watchSlidesProgress = true;
  5795. });
  5796. on('init', () => {
  5797. if (!swiper.params.parallax.enabled) return;
  5798. setTranslate();
  5799. });
  5800. on('setTranslate', () => {
  5801. if (!swiper.params.parallax.enabled) return;
  5802. setTranslate();
  5803. });
  5804. on('setTransition', (_swiper, duration) => {
  5805. if (!swiper.params.parallax.enabled) return;
  5806. setTransition(duration);
  5807. });
  5808. }
  5809. function Zoom(_ref) {
  5810. let {
  5811. swiper,
  5812. extendParams,
  5813. on,
  5814. emit
  5815. } = _ref;
  5816. const window = getWindow();
  5817. extendParams({
  5818. zoom: {
  5819. enabled: false,
  5820. maxRatio: 3,
  5821. minRatio: 1,
  5822. toggle: true,
  5823. containerClass: 'swiper-zoom-container',
  5824. zoomedSlideClass: 'swiper-slide-zoomed'
  5825. }
  5826. });
  5827. swiper.zoom = {
  5828. enabled: false
  5829. };
  5830. let currentScale = 1;
  5831. let isScaling = false;
  5832. let fakeGestureTouched;
  5833. let fakeGestureMoved;
  5834. const evCache = [];
  5835. const gesture = {
  5836. originX: 0,
  5837. originY: 0,
  5838. slideEl: undefined,
  5839. slideWidth: undefined,
  5840. slideHeight: undefined,
  5841. imageEl: undefined,
  5842. imageWrapEl: undefined,
  5843. maxRatio: 3
  5844. };
  5845. const image = {
  5846. isTouched: undefined,
  5847. isMoved: undefined,
  5848. currentX: undefined,
  5849. currentY: undefined,
  5850. minX: undefined,
  5851. minY: undefined,
  5852. maxX: undefined,
  5853. maxY: undefined,
  5854. width: undefined,
  5855. height: undefined,
  5856. startX: undefined,
  5857. startY: undefined,
  5858. touchesStart: {},
  5859. touchesCurrent: {}
  5860. };
  5861. const velocity = {
  5862. x: undefined,
  5863. y: undefined,
  5864. prevPositionX: undefined,
  5865. prevPositionY: undefined,
  5866. prevTime: undefined
  5867. };
  5868. let scale = 1;
  5869. Object.defineProperty(swiper.zoom, 'scale', {
  5870. get() {
  5871. return scale;
  5872. },
  5873. set(value) {
  5874. if (scale !== value) {
  5875. const imageEl = gesture.imageEl;
  5876. const slideEl = gesture.slideEl;
  5877. emit('zoomChange', value, imageEl, slideEl);
  5878. }
  5879. scale = value;
  5880. }
  5881. });
  5882. function getDistanceBetweenTouches() {
  5883. if (evCache.length < 2) return 1;
  5884. const x1 = evCache[0].pageX;
  5885. const y1 = evCache[0].pageY;
  5886. const x2 = evCache[1].pageX;
  5887. const y2 = evCache[1].pageY;
  5888. const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
  5889. return distance;
  5890. }
  5891. function getScaleOrigin() {
  5892. if (evCache.length < 2) return {
  5893. x: null,
  5894. y: null
  5895. };
  5896. const box = gesture.imageEl.getBoundingClientRect();
  5897. return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y) / currentScale];
  5898. }
  5899. function getSlideSelector() {
  5900. return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
  5901. }
  5902. function eventWithinSlide(e) {
  5903. const slideSelector = getSlideSelector();
  5904. if (e.target.matches(slideSelector)) return true;
  5905. if (swiper.slides.filter(slideEl => slideEl.contains(e.target)).length > 0) return true;
  5906. return false;
  5907. }
  5908. function eventWithinZoomContainer(e) {
  5909. const selector = `.${swiper.params.zoom.containerClass}`;
  5910. if (e.target.matches(selector)) return true;
  5911. if ([...swiper.el.querySelectorAll(selector)].filter(containerEl => containerEl.contains(e.target)).length > 0) return true;
  5912. return false;
  5913. }
  5914. // Events
  5915. function onGestureStart(e) {
  5916. if (e.pointerType === 'mouse') {
  5917. evCache.splice(0, evCache.length);
  5918. }
  5919. if (!eventWithinSlide(e)) return;
  5920. const params = swiper.params.zoom;
  5921. fakeGestureTouched = false;
  5922. fakeGestureMoved = false;
  5923. evCache.push(e);
  5924. if (evCache.length < 2) {
  5925. return;
  5926. }
  5927. fakeGestureTouched = true;
  5928. gesture.scaleStart = getDistanceBetweenTouches();
  5929. if (!gesture.slideEl) {
  5930. gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
  5931. if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];
  5932. let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
  5933. if (imageEl) {
  5934. imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
  5935. }
  5936. gesture.imageEl = imageEl;
  5937. if (imageEl) {
  5938. gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
  5939. } else {
  5940. gesture.imageWrapEl = undefined;
  5941. }
  5942. if (!gesture.imageWrapEl) {
  5943. gesture.imageEl = undefined;
  5944. return;
  5945. }
  5946. gesture.maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
  5947. }
  5948. if (gesture.imageEl) {
  5949. const [originX, originY] = getScaleOrigin();
  5950. gesture.originX = originX;
  5951. gesture.originY = originY;
  5952. gesture.imageEl.style.transitionDuration = '0ms';
  5953. }
  5954. isScaling = true;
  5955. }
  5956. function onGestureChange(e) {
  5957. if (!eventWithinSlide(e)) return;
  5958. const params = swiper.params.zoom;
  5959. const zoom = swiper.zoom;
  5960. const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
  5961. if (pointerIndex >= 0) evCache[pointerIndex] = e;
  5962. if (evCache.length < 2) {
  5963. return;
  5964. }
  5965. fakeGestureMoved = true;
  5966. gesture.scaleMove = getDistanceBetweenTouches();
  5967. if (!gesture.imageEl) {
  5968. return;
  5969. }
  5970. zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;
  5971. if (zoom.scale > gesture.maxRatio) {
  5972. zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;
  5973. }
  5974. if (zoom.scale < params.minRatio) {
  5975. zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;
  5976. }
  5977. gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
  5978. }
  5979. function onGestureEnd(e) {
  5980. if (!eventWithinSlide(e)) return;
  5981. if (e.pointerType === 'mouse' && e.type === 'pointerout') return;
  5982. const params = swiper.params.zoom;
  5983. const zoom = swiper.zoom;
  5984. const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
  5985. if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);
  5986. if (!fakeGestureTouched || !fakeGestureMoved) {
  5987. return;
  5988. }
  5989. fakeGestureTouched = false;
  5990. fakeGestureMoved = false;
  5991. if (!gesture.imageEl) return;
  5992. zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
  5993. gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;
  5994. gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
  5995. currentScale = zoom.scale;
  5996. isScaling = false;
  5997. if (zoom.scale > 1 && gesture.slideEl) {
  5998. gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
  5999. } else if (zoom.scale <= 1 && gesture.slideEl) {
  6000. gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
  6001. }
  6002. if (zoom.scale === 1) {
  6003. gesture.originX = 0;
  6004. gesture.originY = 0;
  6005. gesture.slideEl = undefined;
  6006. }
  6007. }
  6008. function onTouchStart(e) {
  6009. const device = swiper.device;
  6010. if (!gesture.imageEl) return;
  6011. if (image.isTouched) return;
  6012. if (device.android && e.cancelable) e.preventDefault();
  6013. image.isTouched = true;
  6014. const event = evCache.length > 0 ? evCache[0] : e;
  6015. image.touchesStart.x = event.pageX;
  6016. image.touchesStart.y = event.pageY;
  6017. }
  6018. function onTouchMove(e) {
  6019. if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) return;
  6020. const zoom = swiper.zoom;
  6021. if (!gesture.imageEl) return;
  6022. if (!image.isTouched || !gesture.slideEl) return;
  6023. if (!image.isMoved) {
  6024. image.width = gesture.imageEl.offsetWidth;
  6025. image.height = gesture.imageEl.offsetHeight;
  6026. image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;
  6027. image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;
  6028. gesture.slideWidth = gesture.slideEl.offsetWidth;
  6029. gesture.slideHeight = gesture.slideEl.offsetHeight;
  6030. gesture.imageWrapEl.style.transitionDuration = '0ms';
  6031. }
  6032. // Define if we need image drag
  6033. const scaledWidth = image.width * zoom.scale;
  6034. const scaledHeight = image.height * zoom.scale;
  6035. if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;
  6036. image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
  6037. image.maxX = -image.minX;
  6038. image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
  6039. image.maxY = -image.minY;
  6040. image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;
  6041. image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;
  6042. const touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));
  6043. if (touchesDiff > 5) {
  6044. swiper.allowClick = false;
  6045. }
  6046. if (!image.isMoved && !isScaling) {
  6047. if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
  6048. image.isTouched = false;
  6049. return;
  6050. }
  6051. if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
  6052. image.isTouched = false;
  6053. return;
  6054. }
  6055. }
  6056. if (e.cancelable) {
  6057. e.preventDefault();
  6058. }
  6059. e.stopPropagation();
  6060. image.isMoved = true;
  6061. const scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);
  6062. const {
  6063. originX,
  6064. originY
  6065. } = gesture;
  6066. image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.width - originX * 2);
  6067. image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);
  6068. if (image.currentX < image.minX) {
  6069. image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;
  6070. }
  6071. if (image.currentX > image.maxX) {
  6072. image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;
  6073. }
  6074. if (image.currentY < image.minY) {
  6075. image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;
  6076. }
  6077. if (image.currentY > image.maxY) {
  6078. image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;
  6079. }
  6080. // Velocity
  6081. if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
  6082. if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
  6083. if (!velocity.prevTime) velocity.prevTime = Date.now();
  6084. velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
  6085. velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
  6086. if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
  6087. if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
  6088. velocity.prevPositionX = image.touchesCurrent.x;
  6089. velocity.prevPositionY = image.touchesCurrent.y;
  6090. velocity.prevTime = Date.now();
  6091. gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
  6092. }
  6093. function onTouchEnd() {
  6094. const zoom = swiper.zoom;
  6095. if (!gesture.imageEl) return;
  6096. if (!image.isTouched || !image.isMoved) {
  6097. image.isTouched = false;
  6098. image.isMoved = false;
  6099. return;
  6100. }
  6101. image.isTouched = false;
  6102. image.isMoved = false;
  6103. let momentumDurationX = 300;
  6104. let momentumDurationY = 300;
  6105. const momentumDistanceX = velocity.x * momentumDurationX;
  6106. const newPositionX = image.currentX + momentumDistanceX;
  6107. const momentumDistanceY = velocity.y * momentumDurationY;
  6108. const newPositionY = image.currentY + momentumDistanceY;
  6109. // Fix duration
  6110. if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
  6111. if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
  6112. const momentumDuration = Math.max(momentumDurationX, momentumDurationY);
  6113. image.currentX = newPositionX;
  6114. image.currentY = newPositionY;
  6115. // Define if we need image drag
  6116. const scaledWidth = image.width * zoom.scale;
  6117. const scaledHeight = image.height * zoom.scale;
  6118. image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
  6119. image.maxX = -image.minX;
  6120. image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
  6121. image.maxY = -image.minY;
  6122. image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
  6123. image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
  6124. gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;
  6125. gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
  6126. }
  6127. function onTransitionEnd() {
  6128. const zoom = swiper.zoom;
  6129. if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {
  6130. if (gesture.imageEl) {
  6131. gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
  6132. }
  6133. if (gesture.imageWrapEl) {
  6134. gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
  6135. }
  6136. gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);
  6137. zoom.scale = 1;
  6138. currentScale = 1;
  6139. gesture.slideEl = undefined;
  6140. gesture.imageEl = undefined;
  6141. gesture.imageWrapEl = undefined;
  6142. gesture.originX = 0;
  6143. gesture.originY = 0;
  6144. }
  6145. }
  6146. function zoomIn(e) {
  6147. const zoom = swiper.zoom;
  6148. const params = swiper.params.zoom;
  6149. if (!gesture.slideEl) {
  6150. if (e && e.target) {
  6151. gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
  6152. }
  6153. if (!gesture.slideEl) {
  6154. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  6155. gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
  6156. } else {
  6157. gesture.slideEl = swiper.slides[swiper.activeIndex];
  6158. }
  6159. }
  6160. let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
  6161. if (imageEl) {
  6162. imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
  6163. }
  6164. gesture.imageEl = imageEl;
  6165. if (imageEl) {
  6166. gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
  6167. } else {
  6168. gesture.imageWrapEl = undefined;
  6169. }
  6170. }
  6171. if (!gesture.imageEl || !gesture.imageWrapEl) return;
  6172. if (swiper.params.cssMode) {
  6173. swiper.wrapperEl.style.overflow = 'hidden';
  6174. swiper.wrapperEl.style.touchAction = 'none';
  6175. }
  6176. gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
  6177. let touchX;
  6178. let touchY;
  6179. let offsetX;
  6180. let offsetY;
  6181. let diffX;
  6182. let diffY;
  6183. let translateX;
  6184. let translateY;
  6185. let imageWidth;
  6186. let imageHeight;
  6187. let scaledWidth;
  6188. let scaledHeight;
  6189. let translateMinX;
  6190. let translateMinY;
  6191. let translateMaxX;
  6192. let translateMaxY;
  6193. let slideWidth;
  6194. let slideHeight;
  6195. if (typeof image.touchesStart.x === 'undefined' && e) {
  6196. touchX = e.pageX;
  6197. touchY = e.pageY;
  6198. } else {
  6199. touchX = image.touchesStart.x;
  6200. touchY = image.touchesStart.y;
  6201. }
  6202. const forceZoomRatio = typeof e === 'number' ? e : null;
  6203. if (currentScale === 1 && forceZoomRatio) {
  6204. touchX = undefined;
  6205. touchY = undefined;
  6206. }
  6207. zoom.scale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
  6208. currentScale = forceZoomRatio || gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
  6209. if (e && !(currentScale === 1 && forceZoomRatio)) {
  6210. slideWidth = gesture.slideEl.offsetWidth;
  6211. slideHeight = gesture.slideEl.offsetHeight;
  6212. offsetX = elementOffset(gesture.slideEl).left + window.scrollX;
  6213. offsetY = elementOffset(gesture.slideEl).top + window.scrollY;
  6214. diffX = offsetX + slideWidth / 2 - touchX;
  6215. diffY = offsetY + slideHeight / 2 - touchY;
  6216. imageWidth = gesture.imageEl.offsetWidth;
  6217. imageHeight = gesture.imageEl.offsetHeight;
  6218. scaledWidth = imageWidth * zoom.scale;
  6219. scaledHeight = imageHeight * zoom.scale;
  6220. translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
  6221. translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
  6222. translateMaxX = -translateMinX;
  6223. translateMaxY = -translateMinY;
  6224. translateX = diffX * zoom.scale;
  6225. translateY = diffY * zoom.scale;
  6226. if (translateX < translateMinX) {
  6227. translateX = translateMinX;
  6228. }
  6229. if (translateX > translateMaxX) {
  6230. translateX = translateMaxX;
  6231. }
  6232. if (translateY < translateMinY) {
  6233. translateY = translateMinY;
  6234. }
  6235. if (translateY > translateMaxY) {
  6236. translateY = translateMaxY;
  6237. }
  6238. } else {
  6239. translateX = 0;
  6240. translateY = 0;
  6241. }
  6242. if (forceZoomRatio && zoom.scale === 1) {
  6243. gesture.originX = 0;
  6244. gesture.originY = 0;
  6245. }
  6246. gesture.imageWrapEl.style.transitionDuration = '300ms';
  6247. gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;
  6248. gesture.imageEl.style.transitionDuration = '300ms';
  6249. gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
  6250. }
  6251. function zoomOut() {
  6252. const zoom = swiper.zoom;
  6253. const params = swiper.params.zoom;
  6254. if (!gesture.slideEl) {
  6255. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  6256. gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
  6257. } else {
  6258. gesture.slideEl = swiper.slides[swiper.activeIndex];
  6259. }
  6260. let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
  6261. if (imageEl) {
  6262. imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
  6263. }
  6264. gesture.imageEl = imageEl;
  6265. if (imageEl) {
  6266. gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
  6267. } else {
  6268. gesture.imageWrapEl = undefined;
  6269. }
  6270. }
  6271. if (!gesture.imageEl || !gesture.imageWrapEl) return;
  6272. if (swiper.params.cssMode) {
  6273. swiper.wrapperEl.style.overflow = '';
  6274. swiper.wrapperEl.style.touchAction = '';
  6275. }
  6276. zoom.scale = 1;
  6277. currentScale = 1;
  6278. gesture.imageWrapEl.style.transitionDuration = '300ms';
  6279. gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
  6280. gesture.imageEl.style.transitionDuration = '300ms';
  6281. gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
  6282. gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
  6283. gesture.slideEl = undefined;
  6284. gesture.originX = 0;
  6285. gesture.originY = 0;
  6286. }
  6287. // Toggle Zoom
  6288. function zoomToggle(e) {
  6289. const zoom = swiper.zoom;
  6290. if (zoom.scale && zoom.scale !== 1) {
  6291. // Zoom Out
  6292. zoomOut();
  6293. } else {
  6294. // Zoom In
  6295. zoomIn(e);
  6296. }
  6297. }
  6298. function getListeners() {
  6299. const passiveListener = swiper.params.passiveListeners ? {
  6300. passive: true,
  6301. capture: false
  6302. } : false;
  6303. const activeListenerWithCapture = swiper.params.passiveListeners ? {
  6304. passive: false,
  6305. capture: true
  6306. } : true;
  6307. return {
  6308. passiveListener,
  6309. activeListenerWithCapture
  6310. };
  6311. }
  6312. // Attach/Detach Events
  6313. function enable() {
  6314. const zoom = swiper.zoom;
  6315. if (zoom.enabled) return;
  6316. zoom.enabled = true;
  6317. const {
  6318. passiveListener,
  6319. activeListenerWithCapture
  6320. } = getListeners();
  6321. // Scale image
  6322. swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);
  6323. swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);
  6324. ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
  6325. swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);
  6326. });
  6327. // Move image
  6328. swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);
  6329. }
  6330. function disable() {
  6331. const zoom = swiper.zoom;
  6332. if (!zoom.enabled) return;
  6333. zoom.enabled = false;
  6334. const {
  6335. passiveListener,
  6336. activeListenerWithCapture
  6337. } = getListeners();
  6338. // Scale image
  6339. swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);
  6340. swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);
  6341. ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
  6342. swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);
  6343. });
  6344. // Move image
  6345. swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);
  6346. }
  6347. on('init', () => {
  6348. if (swiper.params.zoom.enabled) {
  6349. enable();
  6350. }
  6351. });
  6352. on('destroy', () => {
  6353. disable();
  6354. });
  6355. on('touchStart', (_s, e) => {
  6356. if (!swiper.zoom.enabled) return;
  6357. onTouchStart(e);
  6358. });
  6359. on('touchEnd', (_s, e) => {
  6360. if (!swiper.zoom.enabled) return;
  6361. onTouchEnd();
  6362. });
  6363. on('doubleTap', (_s, e) => {
  6364. if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
  6365. zoomToggle(e);
  6366. }
  6367. });
  6368. on('transitionEnd', () => {
  6369. if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
  6370. onTransitionEnd();
  6371. }
  6372. });
  6373. on('slideChange', () => {
  6374. if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
  6375. onTransitionEnd();
  6376. }
  6377. });
  6378. Object.assign(swiper.zoom, {
  6379. enable,
  6380. disable,
  6381. in: zoomIn,
  6382. out: zoomOut,
  6383. toggle: zoomToggle
  6384. });
  6385. }
  6386. /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
  6387. function Controller(_ref) {
  6388. let {
  6389. swiper,
  6390. extendParams,
  6391. on
  6392. } = _ref;
  6393. extendParams({
  6394. controller: {
  6395. control: undefined,
  6396. inverse: false,
  6397. by: 'slide' // or 'container'
  6398. }
  6399. });
  6400. swiper.controller = {
  6401. control: undefined
  6402. };
  6403. function LinearSpline(x, y) {
  6404. const binarySearch = function search() {
  6405. let maxIndex;
  6406. let minIndex;
  6407. let guess;
  6408. return (array, val) => {
  6409. minIndex = -1;
  6410. maxIndex = array.length;
  6411. while (maxIndex - minIndex > 1) {
  6412. guess = maxIndex + minIndex >> 1;
  6413. if (array[guess] <= val) {
  6414. minIndex = guess;
  6415. } else {
  6416. maxIndex = guess;
  6417. }
  6418. }
  6419. return maxIndex;
  6420. };
  6421. }();
  6422. this.x = x;
  6423. this.y = y;
  6424. this.lastIndex = x.length - 1;
  6425. // Given an x value (x2), return the expected y2 value:
  6426. // (x1,y1) is the known point before given value,
  6427. // (x3,y3) is the known point after given value.
  6428. let i1;
  6429. let i3;
  6430. this.interpolate = function interpolate(x2) {
  6431. if (!x2) return 0;
  6432. // Get the indexes of x1 and x3 (the array indexes before and after given x2):
  6433. i3 = binarySearch(this.x, x2);
  6434. i1 = i3 - 1;
  6435. // We have our indexes i1 & i3, so we can calculate already:
  6436. // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
  6437. return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
  6438. };
  6439. return this;
  6440. }
  6441. function getInterpolateFunction(c) {
  6442. swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);
  6443. }
  6444. function setTranslate(_t, byController) {
  6445. const controlled = swiper.controller.control;
  6446. let multiplier;
  6447. let controlledTranslate;
  6448. const Swiper = swiper.constructor;
  6449. function setControlledTranslate(c) {
  6450. if (c.destroyed) return;
  6451. // this will create an Interpolate function based on the snapGrids
  6452. // x is the Grid of the scrolled scroller and y will be the controlled scroller
  6453. // it makes sense to create this only once and recall it for the interpolation
  6454. // the function does a lot of value caching for performance
  6455. const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
  6456. if (swiper.params.controller.by === 'slide') {
  6457. getInterpolateFunction(c);
  6458. // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
  6459. // but it did not work out
  6460. controlledTranslate = -swiper.controller.spline.interpolate(-translate);
  6461. }
  6462. if (!controlledTranslate || swiper.params.controller.by === 'container') {
  6463. multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
  6464. if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {
  6465. multiplier = 1;
  6466. }
  6467. controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
  6468. }
  6469. if (swiper.params.controller.inverse) {
  6470. controlledTranslate = c.maxTranslate() - controlledTranslate;
  6471. }
  6472. c.updateProgress(controlledTranslate);
  6473. c.setTranslate(controlledTranslate, swiper);
  6474. c.updateActiveIndex();
  6475. c.updateSlidesClasses();
  6476. }
  6477. if (Array.isArray(controlled)) {
  6478. for (let i = 0; i < controlled.length; i += 1) {
  6479. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  6480. setControlledTranslate(controlled[i]);
  6481. }
  6482. }
  6483. } else if (controlled instanceof Swiper && byController !== controlled) {
  6484. setControlledTranslate(controlled);
  6485. }
  6486. }
  6487. function setTransition(duration, byController) {
  6488. const Swiper = swiper.constructor;
  6489. const controlled = swiper.controller.control;
  6490. let i;
  6491. function setControlledTransition(c) {
  6492. if (c.destroyed) return;
  6493. c.setTransition(duration, swiper);
  6494. if (duration !== 0) {
  6495. c.transitionStart();
  6496. if (c.params.autoHeight) {
  6497. nextTick(() => {
  6498. c.updateAutoHeight();
  6499. });
  6500. }
  6501. elementTransitionEnd(c.wrapperEl, () => {
  6502. if (!controlled) return;
  6503. c.transitionEnd();
  6504. });
  6505. }
  6506. }
  6507. if (Array.isArray(controlled)) {
  6508. for (i = 0; i < controlled.length; i += 1) {
  6509. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  6510. setControlledTransition(controlled[i]);
  6511. }
  6512. }
  6513. } else if (controlled instanceof Swiper && byController !== controlled) {
  6514. setControlledTransition(controlled);
  6515. }
  6516. }
  6517. function removeSpline() {
  6518. if (!swiper.controller.control) return;
  6519. if (swiper.controller.spline) {
  6520. swiper.controller.spline = undefined;
  6521. delete swiper.controller.spline;
  6522. }
  6523. }
  6524. on('beforeInit', () => {
  6525. if (typeof window !== 'undefined' && (
  6526. // eslint-disable-line
  6527. typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {
  6528. const controlElement = document.querySelector(swiper.params.controller.control);
  6529. if (controlElement && controlElement.swiper) {
  6530. swiper.controller.control = controlElement.swiper;
  6531. } else if (controlElement) {
  6532. const onControllerSwiper = e => {
  6533. swiper.controller.control = e.detail[0];
  6534. swiper.update();
  6535. controlElement.removeEventListener('init', onControllerSwiper);
  6536. };
  6537. controlElement.addEventListener('init', onControllerSwiper);
  6538. }
  6539. return;
  6540. }
  6541. swiper.controller.control = swiper.params.controller.control;
  6542. });
  6543. on('update', () => {
  6544. removeSpline();
  6545. });
  6546. on('resize', () => {
  6547. removeSpline();
  6548. });
  6549. on('observerUpdate', () => {
  6550. removeSpline();
  6551. });
  6552. on('setTranslate', (_s, translate, byController) => {
  6553. if (!swiper.controller.control || swiper.controller.control.destroyed) return;
  6554. swiper.controller.setTranslate(translate, byController);
  6555. });
  6556. on('setTransition', (_s, duration, byController) => {
  6557. if (!swiper.controller.control || swiper.controller.control.destroyed) return;
  6558. swiper.controller.setTransition(duration, byController);
  6559. });
  6560. Object.assign(swiper.controller, {
  6561. setTranslate,
  6562. setTransition
  6563. });
  6564. }
  6565. function A11y(_ref) {
  6566. let {
  6567. swiper,
  6568. extendParams,
  6569. on
  6570. } = _ref;
  6571. extendParams({
  6572. a11y: {
  6573. enabled: true,
  6574. notificationClass: 'swiper-notification',
  6575. prevSlideMessage: 'Previous slide',
  6576. nextSlideMessage: 'Next slide',
  6577. firstSlideMessage: 'This is the first slide',
  6578. lastSlideMessage: 'This is the last slide',
  6579. paginationBulletMessage: 'Go to slide {{index}}',
  6580. slideLabelMessage: '{{index}} / {{slidesLength}}',
  6581. containerMessage: null,
  6582. containerRoleDescriptionMessage: null,
  6583. itemRoleDescriptionMessage: null,
  6584. slideRole: 'group',
  6585. id: null
  6586. }
  6587. });
  6588. swiper.a11y = {
  6589. clicked: false
  6590. };
  6591. let liveRegion = null;
  6592. function notify(message) {
  6593. const notification = liveRegion;
  6594. if (notification.length === 0) return;
  6595. notification.innerHTML = '';
  6596. notification.innerHTML = message;
  6597. }
  6598. const makeElementsArray = el => {
  6599. if (!Array.isArray(el)) el = [el].filter(e => !!e);
  6600. return el;
  6601. };
  6602. function getRandomNumber(size) {
  6603. if (size === void 0) {
  6604. size = 16;
  6605. }
  6606. const randomChar = () => Math.round(16 * Math.random()).toString(16);
  6607. return 'x'.repeat(size).replace(/x/g, randomChar);
  6608. }
  6609. function makeElFocusable(el) {
  6610. el = makeElementsArray(el);
  6611. el.forEach(subEl => {
  6612. subEl.setAttribute('tabIndex', '0');
  6613. });
  6614. }
  6615. function makeElNotFocusable(el) {
  6616. el = makeElementsArray(el);
  6617. el.forEach(subEl => {
  6618. subEl.setAttribute('tabIndex', '-1');
  6619. });
  6620. }
  6621. function addElRole(el, role) {
  6622. el = makeElementsArray(el);
  6623. el.forEach(subEl => {
  6624. subEl.setAttribute('role', role);
  6625. });
  6626. }
  6627. function addElRoleDescription(el, description) {
  6628. el = makeElementsArray(el);
  6629. el.forEach(subEl => {
  6630. subEl.setAttribute('aria-roledescription', description);
  6631. });
  6632. }
  6633. function addElControls(el, controls) {
  6634. el = makeElementsArray(el);
  6635. el.forEach(subEl => {
  6636. subEl.setAttribute('aria-controls', controls);
  6637. });
  6638. }
  6639. function addElLabel(el, label) {
  6640. el = makeElementsArray(el);
  6641. el.forEach(subEl => {
  6642. subEl.setAttribute('aria-label', label);
  6643. });
  6644. }
  6645. function addElId(el, id) {
  6646. el = makeElementsArray(el);
  6647. el.forEach(subEl => {
  6648. subEl.setAttribute('id', id);
  6649. });
  6650. }
  6651. function addElLive(el, live) {
  6652. el = makeElementsArray(el);
  6653. el.forEach(subEl => {
  6654. subEl.setAttribute('aria-live', live);
  6655. });
  6656. }
  6657. function disableEl(el) {
  6658. el = makeElementsArray(el);
  6659. el.forEach(subEl => {
  6660. subEl.setAttribute('aria-disabled', true);
  6661. });
  6662. }
  6663. function enableEl(el) {
  6664. el = makeElementsArray(el);
  6665. el.forEach(subEl => {
  6666. subEl.setAttribute('aria-disabled', false);
  6667. });
  6668. }
  6669. function onEnterOrSpaceKey(e) {
  6670. if (e.keyCode !== 13 && e.keyCode !== 32) return;
  6671. const params = swiper.params.a11y;
  6672. const targetEl = e.target;
  6673. if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {
  6674. if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;
  6675. }
  6676. if (swiper.navigation && swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl) {
  6677. if (!(swiper.isEnd && !swiper.params.loop)) {
  6678. swiper.slideNext();
  6679. }
  6680. if (swiper.isEnd) {
  6681. notify(params.lastSlideMessage);
  6682. } else {
  6683. notify(params.nextSlideMessage);
  6684. }
  6685. }
  6686. if (swiper.navigation && swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl) {
  6687. if (!(swiper.isBeginning && !swiper.params.loop)) {
  6688. swiper.slidePrev();
  6689. }
  6690. if (swiper.isBeginning) {
  6691. notify(params.firstSlideMessage);
  6692. } else {
  6693. notify(params.prevSlideMessage);
  6694. }
  6695. }
  6696. if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {
  6697. targetEl.click();
  6698. }
  6699. }
  6700. function updateNavigation() {
  6701. if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;
  6702. const {
  6703. nextEl,
  6704. prevEl
  6705. } = swiper.navigation;
  6706. if (prevEl) {
  6707. if (swiper.isBeginning) {
  6708. disableEl(prevEl);
  6709. makeElNotFocusable(prevEl);
  6710. } else {
  6711. enableEl(prevEl);
  6712. makeElFocusable(prevEl);
  6713. }
  6714. }
  6715. if (nextEl) {
  6716. if (swiper.isEnd) {
  6717. disableEl(nextEl);
  6718. makeElNotFocusable(nextEl);
  6719. } else {
  6720. enableEl(nextEl);
  6721. makeElFocusable(nextEl);
  6722. }
  6723. }
  6724. }
  6725. function hasPagination() {
  6726. return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;
  6727. }
  6728. function hasClickablePagination() {
  6729. return hasPagination() && swiper.params.pagination.clickable;
  6730. }
  6731. function updatePagination() {
  6732. const params = swiper.params.a11y;
  6733. if (!hasPagination()) return;
  6734. swiper.pagination.bullets.forEach(bulletEl => {
  6735. if (swiper.params.pagination.clickable) {
  6736. makeElFocusable(bulletEl);
  6737. if (!swiper.params.pagination.renderBullet) {
  6738. addElRole(bulletEl, 'button');
  6739. addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, elementIndex(bulletEl) + 1));
  6740. }
  6741. }
  6742. if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {
  6743. bulletEl.setAttribute('aria-current', 'true');
  6744. } else {
  6745. bulletEl.removeAttribute('aria-current');
  6746. }
  6747. });
  6748. }
  6749. const initNavEl = (el, wrapperId, message) => {
  6750. makeElFocusable(el);
  6751. if (el.tagName !== 'BUTTON') {
  6752. addElRole(el, 'button');
  6753. el.addEventListener('keydown', onEnterOrSpaceKey);
  6754. }
  6755. addElLabel(el, message);
  6756. addElControls(el, wrapperId);
  6757. };
  6758. const handlePointerDown = () => {
  6759. swiper.a11y.clicked = true;
  6760. };
  6761. const handlePointerUp = () => {
  6762. requestAnimationFrame(() => {
  6763. requestAnimationFrame(() => {
  6764. if (!swiper.destroyed) {
  6765. swiper.a11y.clicked = false;
  6766. }
  6767. });
  6768. });
  6769. };
  6770. const handleFocus = e => {
  6771. if (swiper.a11y.clicked) return;
  6772. const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
  6773. if (!slideEl || !swiper.slides.includes(slideEl)) return;
  6774. const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;
  6775. const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);
  6776. if (isActive || isVisible) return;
  6777. if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
  6778. if (swiper.isHorizontal()) {
  6779. swiper.el.scrollLeft = 0;
  6780. } else {
  6781. swiper.el.scrollTop = 0;
  6782. }
  6783. swiper.slideTo(swiper.slides.indexOf(slideEl), 0);
  6784. };
  6785. const initSlides = () => {
  6786. const params = swiper.params.a11y;
  6787. if (params.itemRoleDescriptionMessage) {
  6788. addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);
  6789. }
  6790. if (params.slideRole) {
  6791. addElRole(swiper.slides, params.slideRole);
  6792. }
  6793. const slidesLength = swiper.slides.length;
  6794. if (params.slideLabelMessage) {
  6795. swiper.slides.forEach((slideEl, index) => {
  6796. const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;
  6797. const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength);
  6798. addElLabel(slideEl, ariaLabelMessage);
  6799. });
  6800. }
  6801. };
  6802. const init = () => {
  6803. const params = swiper.params.a11y;
  6804. if (swiper.isElement) {
  6805. swiper.el.shadowEl.append(liveRegion);
  6806. } else {
  6807. swiper.el.append(liveRegion);
  6808. }
  6809. // Container
  6810. const containerEl = swiper.el;
  6811. if (params.containerRoleDescriptionMessage) {
  6812. addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);
  6813. }
  6814. if (params.containerMessage) {
  6815. addElLabel(containerEl, params.containerMessage);
  6816. }
  6817. // Wrapper
  6818. const wrapperEl = swiper.wrapperEl;
  6819. const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;
  6820. const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
  6821. addElId(wrapperEl, wrapperId);
  6822. addElLive(wrapperEl, live);
  6823. // Slide
  6824. initSlides();
  6825. // Navigation
  6826. let {
  6827. nextEl,
  6828. prevEl
  6829. } = swiper.navigation ? swiper.navigation : {};
  6830. nextEl = makeElementsArray(nextEl);
  6831. prevEl = makeElementsArray(prevEl);
  6832. if (nextEl) {
  6833. nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));
  6834. }
  6835. if (prevEl) {
  6836. prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));
  6837. }
  6838. // Pagination
  6839. if (hasClickablePagination()) {
  6840. const paginationEl = Array.isArray(swiper.pagination.el) ? swiper.pagination.el : [swiper.pagination.el];
  6841. paginationEl.forEach(el => {
  6842. el.addEventListener('keydown', onEnterOrSpaceKey);
  6843. });
  6844. }
  6845. // Tab focus
  6846. swiper.el.addEventListener('focus', handleFocus, true);
  6847. swiper.el.addEventListener('pointerdown', handlePointerDown, true);
  6848. swiper.el.addEventListener('pointerup', handlePointerUp, true);
  6849. };
  6850. function destroy() {
  6851. if (liveRegion) liveRegion.remove();
  6852. let {
  6853. nextEl,
  6854. prevEl
  6855. } = swiper.navigation ? swiper.navigation : {};
  6856. nextEl = makeElementsArray(nextEl);
  6857. prevEl = makeElementsArray(prevEl);
  6858. if (nextEl) {
  6859. nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
  6860. }
  6861. if (prevEl) {
  6862. prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
  6863. }
  6864. // Pagination
  6865. if (hasClickablePagination()) {
  6866. const paginationEl = Array.isArray(swiper.pagination.el) ? swiper.pagination.el : [swiper.pagination.el];
  6867. paginationEl.forEach(el => {
  6868. el.removeEventListener('keydown', onEnterOrSpaceKey);
  6869. });
  6870. }
  6871. // Tab focus
  6872. swiper.el.removeEventListener('focus', handleFocus, true);
  6873. swiper.el.removeEventListener('pointerdown', handlePointerDown, true);
  6874. swiper.el.removeEventListener('pointerup', handlePointerUp, true);
  6875. }
  6876. on('beforeInit', () => {
  6877. liveRegion = createElement('span', swiper.params.a11y.notificationClass);
  6878. liveRegion.setAttribute('aria-live', 'assertive');
  6879. liveRegion.setAttribute('aria-atomic', 'true');
  6880. });
  6881. on('afterInit', () => {
  6882. if (!swiper.params.a11y.enabled) return;
  6883. init();
  6884. });
  6885. on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {
  6886. if (!swiper.params.a11y.enabled) return;
  6887. initSlides();
  6888. });
  6889. on('fromEdge toEdge afterInit lock unlock', () => {
  6890. if (!swiper.params.a11y.enabled) return;
  6891. updateNavigation();
  6892. });
  6893. on('paginationUpdate', () => {
  6894. if (!swiper.params.a11y.enabled) return;
  6895. updatePagination();
  6896. });
  6897. on('destroy', () => {
  6898. if (!swiper.params.a11y.enabled) return;
  6899. destroy();
  6900. });
  6901. }
  6902. function History(_ref) {
  6903. let {
  6904. swiper,
  6905. extendParams,
  6906. on
  6907. } = _ref;
  6908. extendParams({
  6909. history: {
  6910. enabled: false,
  6911. root: '',
  6912. replaceState: false,
  6913. key: 'slides',
  6914. keepQuery: false
  6915. }
  6916. });
  6917. let initialized = false;
  6918. let paths = {};
  6919. const slugify = text => {
  6920. return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
  6921. };
  6922. const getPathValues = urlOverride => {
  6923. const window = getWindow();
  6924. let location;
  6925. if (urlOverride) {
  6926. location = new URL(urlOverride);
  6927. } else {
  6928. location = window.location;
  6929. }
  6930. const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');
  6931. const total = pathArray.length;
  6932. const key = pathArray[total - 2];
  6933. const value = pathArray[total - 1];
  6934. return {
  6935. key,
  6936. value
  6937. };
  6938. };
  6939. const setHistory = (key, index) => {
  6940. const window = getWindow();
  6941. if (!initialized || !swiper.params.history.enabled) return;
  6942. let location;
  6943. if (swiper.params.url) {
  6944. location = new URL(swiper.params.url);
  6945. } else {
  6946. location = window.location;
  6947. }
  6948. const slide = swiper.slides[index];
  6949. let value = slugify(slide.getAttribute('data-history'));
  6950. if (swiper.params.history.root.length > 0) {
  6951. let root = swiper.params.history.root;
  6952. if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);
  6953. value = `${root}/${key ? `${key}/` : ''}${value}`;
  6954. } else if (!location.pathname.includes(key)) {
  6955. value = `${key ? `${key}/` : ''}${value}`;
  6956. }
  6957. if (swiper.params.history.keepQuery) {
  6958. value += location.search;
  6959. }
  6960. const currentState = window.history.state;
  6961. if (currentState && currentState.value === value) {
  6962. return;
  6963. }
  6964. if (swiper.params.history.replaceState) {
  6965. window.history.replaceState({
  6966. value
  6967. }, null, value);
  6968. } else {
  6969. window.history.pushState({
  6970. value
  6971. }, null, value);
  6972. }
  6973. };
  6974. const scrollToSlide = (speed, value, runCallbacks) => {
  6975. if (value) {
  6976. for (let i = 0, length = swiper.slides.length; i < length; i += 1) {
  6977. const slide = swiper.slides[i];
  6978. const slideHistory = slugify(slide.getAttribute('data-history'));
  6979. if (slideHistory === value) {
  6980. const index = swiper.getSlideIndex(slide);
  6981. swiper.slideTo(index, speed, runCallbacks);
  6982. }
  6983. }
  6984. } else {
  6985. swiper.slideTo(0, speed, runCallbacks);
  6986. }
  6987. };
  6988. const setHistoryPopState = () => {
  6989. paths = getPathValues(swiper.params.url);
  6990. scrollToSlide(swiper.params.speed, paths.value, false);
  6991. };
  6992. const init = () => {
  6993. const window = getWindow();
  6994. if (!swiper.params.history) return;
  6995. if (!window.history || !window.history.pushState) {
  6996. swiper.params.history.enabled = false;
  6997. swiper.params.hashNavigation.enabled = true;
  6998. return;
  6999. }
  7000. initialized = true;
  7001. paths = getPathValues(swiper.params.url);
  7002. if (!paths.key && !paths.value) {
  7003. if (!swiper.params.history.replaceState) {
  7004. window.addEventListener('popstate', setHistoryPopState);
  7005. }
  7006. return;
  7007. }
  7008. scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);
  7009. if (!swiper.params.history.replaceState) {
  7010. window.addEventListener('popstate', setHistoryPopState);
  7011. }
  7012. };
  7013. const destroy = () => {
  7014. const window = getWindow();
  7015. if (!swiper.params.history.replaceState) {
  7016. window.removeEventListener('popstate', setHistoryPopState);
  7017. }
  7018. };
  7019. on('init', () => {
  7020. if (swiper.params.history.enabled) {
  7021. init();
  7022. }
  7023. });
  7024. on('destroy', () => {
  7025. if (swiper.params.history.enabled) {
  7026. destroy();
  7027. }
  7028. });
  7029. on('transitionEnd _freeModeNoMomentumRelease', () => {
  7030. if (initialized) {
  7031. setHistory(swiper.params.history.key, swiper.activeIndex);
  7032. }
  7033. });
  7034. on('slideChange', () => {
  7035. if (initialized && swiper.params.cssMode) {
  7036. setHistory(swiper.params.history.key, swiper.activeIndex);
  7037. }
  7038. });
  7039. }
  7040. function HashNavigation(_ref) {
  7041. let {
  7042. swiper,
  7043. extendParams,
  7044. emit,
  7045. on
  7046. } = _ref;
  7047. let initialized = false;
  7048. const document = getDocument();
  7049. const window = getWindow();
  7050. extendParams({
  7051. hashNavigation: {
  7052. enabled: false,
  7053. replaceState: false,
  7054. watchState: false,
  7055. getSlideIndex(_s, hash) {
  7056. if (swiper.virtual && swiper.params.virtual.enabled) {
  7057. const slideWithHash = swiper.slides.filter(slideEl => slideEl.getAttribute('data-hash') === hash)[0];
  7058. if (!slideWithHash) return 0;
  7059. const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);
  7060. return index;
  7061. }
  7062. return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash="${hash}"], swiper-slide[data-hash="${hash}"]`)[0]);
  7063. }
  7064. }
  7065. });
  7066. const onHashChange = () => {
  7067. emit('hashChange');
  7068. const newHash = document.location.hash.replace('#', '');
  7069. const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
  7070. const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';
  7071. if (newHash !== activeSlideHash) {
  7072. const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);
  7073. if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;
  7074. swiper.slideTo(newIndex);
  7075. }
  7076. };
  7077. const setHash = () => {
  7078. if (!initialized || !swiper.params.hashNavigation.enabled) return;
  7079. const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
  7080. const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';
  7081. if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
  7082. window.history.replaceState(null, null, `#${activeSlideHash}` || '');
  7083. emit('hashSet');
  7084. } else {
  7085. document.location.hash = activeSlideHash || '';
  7086. emit('hashSet');
  7087. }
  7088. };
  7089. const init = () => {
  7090. if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
  7091. initialized = true;
  7092. const hash = document.location.hash.replace('#', '');
  7093. if (hash) {
  7094. const speed = 0;
  7095. const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);
  7096. swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);
  7097. }
  7098. if (swiper.params.hashNavigation.watchState) {
  7099. window.addEventListener('hashchange', onHashChange);
  7100. }
  7101. };
  7102. const destroy = () => {
  7103. if (swiper.params.hashNavigation.watchState) {
  7104. window.removeEventListener('hashchange', onHashChange);
  7105. }
  7106. };
  7107. on('init', () => {
  7108. if (swiper.params.hashNavigation.enabled) {
  7109. init();
  7110. }
  7111. });
  7112. on('destroy', () => {
  7113. if (swiper.params.hashNavigation.enabled) {
  7114. destroy();
  7115. }
  7116. });
  7117. on('transitionEnd _freeModeNoMomentumRelease', () => {
  7118. if (initialized) {
  7119. setHash();
  7120. }
  7121. });
  7122. on('slideChange', () => {
  7123. if (initialized && swiper.params.cssMode) {
  7124. setHash();
  7125. }
  7126. });
  7127. }
  7128. /* eslint no-underscore-dangle: "off" */
  7129. function Autoplay(_ref) {
  7130. let {
  7131. swiper,
  7132. extendParams,
  7133. on,
  7134. emit,
  7135. params
  7136. } = _ref;
  7137. swiper.autoplay = {
  7138. running: false,
  7139. paused: false,
  7140. timeLeft: 0
  7141. };
  7142. extendParams({
  7143. autoplay: {
  7144. enabled: false,
  7145. delay: 3000,
  7146. waitForTransition: true,
  7147. disableOnInteraction: true,
  7148. stopOnLastSlide: false,
  7149. reverseDirection: false,
  7150. pauseOnMouseEnter: false
  7151. }
  7152. });
  7153. let timeout;
  7154. let raf;
  7155. let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;
  7156. let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;
  7157. let autoplayTimeLeft;
  7158. let autoplayStartTime = new Date().getTime;
  7159. let wasPaused;
  7160. let isTouched;
  7161. let pausedByTouch;
  7162. let touchStartTimeout;
  7163. let slideChanged;
  7164. let pausedByInteraction;
  7165. function onTransitionEnd(e) {
  7166. if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;
  7167. if (e.target !== swiper.wrapperEl) return;
  7168. swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);
  7169. resume();
  7170. }
  7171. const calcTimeLeft = () => {
  7172. if (swiper.destroyed || !swiper.autoplay.running) return;
  7173. if (swiper.autoplay.paused) {
  7174. wasPaused = true;
  7175. } else if (wasPaused) {
  7176. autoplayDelayCurrent = autoplayTimeLeft;
  7177. wasPaused = false;
  7178. }
  7179. const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();
  7180. swiper.autoplay.timeLeft = timeLeft;
  7181. emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);
  7182. raf = requestAnimationFrame(() => {
  7183. calcTimeLeft();
  7184. });
  7185. };
  7186. const getSlideDelay = () => {
  7187. let activeSlideEl;
  7188. if (swiper.virtual && swiper.params.virtual.enabled) {
  7189. activeSlideEl = swiper.slides.filter(slideEl => slideEl.classList.contains('swiper-slide-active'))[0];
  7190. } else {
  7191. activeSlideEl = swiper.slides[swiper.activeIndex];
  7192. }
  7193. if (!activeSlideEl) return undefined;
  7194. const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);
  7195. return currentSlideDelay;
  7196. };
  7197. const run = delayForce => {
  7198. if (swiper.destroyed || !swiper.autoplay.running) return;
  7199. cancelAnimationFrame(raf);
  7200. calcTimeLeft();
  7201. let delay = typeof delayForce === 'undefined' ? swiper.params.autoplay.delay : delayForce;
  7202. autoplayDelayTotal = swiper.params.autoplay.delay;
  7203. autoplayDelayCurrent = swiper.params.autoplay.delay;
  7204. const currentSlideDelay = getSlideDelay();
  7205. if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === 'undefined') {
  7206. delay = currentSlideDelay;
  7207. autoplayDelayTotal = currentSlideDelay;
  7208. autoplayDelayCurrent = currentSlideDelay;
  7209. }
  7210. autoplayTimeLeft = delay;
  7211. const speed = swiper.params.speed;
  7212. const proceed = () => {
  7213. if (!swiper || swiper.destroyed) return;
  7214. if (swiper.params.autoplay.reverseDirection) {
  7215. if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
  7216. swiper.slidePrev(speed, true, true);
  7217. emit('autoplay');
  7218. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  7219. swiper.slideTo(swiper.slides.length - 1, speed, true, true);
  7220. emit('autoplay');
  7221. }
  7222. } else {
  7223. if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
  7224. swiper.slideNext(speed, true, true);
  7225. emit('autoplay');
  7226. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  7227. swiper.slideTo(0, speed, true, true);
  7228. emit('autoplay');
  7229. }
  7230. }
  7231. if (swiper.params.cssMode) {
  7232. autoplayStartTime = new Date().getTime();
  7233. requestAnimationFrame(() => {
  7234. run();
  7235. });
  7236. }
  7237. };
  7238. if (delay > 0) {
  7239. clearTimeout(timeout);
  7240. timeout = setTimeout(() => {
  7241. proceed();
  7242. }, delay);
  7243. } else {
  7244. requestAnimationFrame(() => {
  7245. proceed();
  7246. });
  7247. }
  7248. // eslint-disable-next-line
  7249. return delay;
  7250. };
  7251. const start = () => {
  7252. swiper.autoplay.running = true;
  7253. run();
  7254. emit('autoplayStart');
  7255. };
  7256. const stop = () => {
  7257. swiper.autoplay.running = false;
  7258. clearTimeout(timeout);
  7259. cancelAnimationFrame(raf);
  7260. emit('autoplayStop');
  7261. };
  7262. const pause = (internal, reset) => {
  7263. if (swiper.destroyed || !swiper.autoplay.running) return;
  7264. clearTimeout(timeout);
  7265. if (!internal) {
  7266. pausedByInteraction = true;
  7267. }
  7268. const proceed = () => {
  7269. emit('autoplayPause');
  7270. if (swiper.params.autoplay.waitForTransition) {
  7271. swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);
  7272. } else {
  7273. resume();
  7274. }
  7275. };
  7276. swiper.autoplay.paused = true;
  7277. if (reset) {
  7278. if (slideChanged) {
  7279. autoplayTimeLeft = swiper.params.autoplay.delay;
  7280. }
  7281. slideChanged = false;
  7282. proceed();
  7283. return;
  7284. }
  7285. const delay = autoplayTimeLeft || swiper.params.autoplay.delay;
  7286. autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);
  7287. if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;
  7288. if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;
  7289. proceed();
  7290. };
  7291. const resume = () => {
  7292. if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;
  7293. autoplayStartTime = new Date().getTime();
  7294. if (pausedByInteraction) {
  7295. pausedByInteraction = false;
  7296. run(autoplayTimeLeft);
  7297. } else {
  7298. run();
  7299. }
  7300. swiper.autoplay.paused = false;
  7301. emit('autoplayResume');
  7302. };
  7303. const onVisibilityChange = () => {
  7304. if (swiper.destroyed || !swiper.autoplay.running) return;
  7305. const document = getDocument();
  7306. if (document.visibilityState === 'hidden') {
  7307. pausedByInteraction = true;
  7308. pause(true);
  7309. }
  7310. if (document.visibilityState === 'visible') {
  7311. resume();
  7312. }
  7313. };
  7314. const onPointerEnter = e => {
  7315. if (e.pointerType !== 'mouse') return;
  7316. pausedByInteraction = true;
  7317. pause(true);
  7318. };
  7319. const onPointerLeave = e => {
  7320. if (e.pointerType !== 'mouse') return;
  7321. if (swiper.autoplay.paused) {
  7322. resume();
  7323. }
  7324. };
  7325. const attachMouseEvents = () => {
  7326. if (swiper.params.autoplay.pauseOnMouseEnter) {
  7327. swiper.el.addEventListener('pointerenter', onPointerEnter);
  7328. swiper.el.addEventListener('pointerleave', onPointerLeave);
  7329. }
  7330. };
  7331. const detachMouseEvents = () => {
  7332. swiper.el.removeEventListener('pointerenter', onPointerEnter);
  7333. swiper.el.removeEventListener('pointerleave', onPointerLeave);
  7334. };
  7335. const attachDocumentEvents = () => {
  7336. const document = getDocument();
  7337. document.addEventListener('visibilitychange', onVisibilityChange);
  7338. };
  7339. const detachDocumentEvents = () => {
  7340. const document = getDocument();
  7341. document.removeEventListener('visibilitychange', onVisibilityChange);
  7342. };
  7343. on('init', () => {
  7344. if (swiper.params.autoplay.enabled) {
  7345. attachMouseEvents();
  7346. attachDocumentEvents();
  7347. autoplayStartTime = new Date().getTime();
  7348. start();
  7349. }
  7350. });
  7351. on('destroy', () => {
  7352. detachMouseEvents();
  7353. detachDocumentEvents();
  7354. if (swiper.autoplay.running) {
  7355. stop();
  7356. }
  7357. });
  7358. on('beforeTransitionStart', (_s, speed, internal) => {
  7359. if (swiper.destroyed || !swiper.autoplay.running) return;
  7360. if (internal || !swiper.params.autoplay.disableOnInteraction) {
  7361. pause(true, true);
  7362. } else {
  7363. stop();
  7364. }
  7365. });
  7366. on('sliderFirstMove', () => {
  7367. if (swiper.destroyed || !swiper.autoplay.running) return;
  7368. if (swiper.params.autoplay.disableOnInteraction) {
  7369. stop();
  7370. return;
  7371. }
  7372. isTouched = true;
  7373. pausedByTouch = false;
  7374. pausedByInteraction = false;
  7375. touchStartTimeout = setTimeout(() => {
  7376. pausedByInteraction = true;
  7377. pausedByTouch = true;
  7378. pause(true);
  7379. }, 200);
  7380. });
  7381. on('touchEnd', () => {
  7382. if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;
  7383. clearTimeout(touchStartTimeout);
  7384. clearTimeout(timeout);
  7385. if (swiper.params.autoplay.disableOnInteraction) {
  7386. pausedByTouch = false;
  7387. isTouched = false;
  7388. return;
  7389. }
  7390. if (pausedByTouch && swiper.params.cssMode) resume();
  7391. pausedByTouch = false;
  7392. isTouched = false;
  7393. });
  7394. on('slideChange', () => {
  7395. if (swiper.destroyed || !swiper.autoplay.running) return;
  7396. slideChanged = true;
  7397. });
  7398. Object.assign(swiper.autoplay, {
  7399. start,
  7400. stop,
  7401. pause,
  7402. resume
  7403. });
  7404. }
  7405. function Thumb(_ref) {
  7406. let {
  7407. swiper,
  7408. extendParams,
  7409. on
  7410. } = _ref;
  7411. extendParams({
  7412. thumbs: {
  7413. swiper: null,
  7414. multipleActiveThumbs: true,
  7415. autoScrollOffset: 0,
  7416. slideThumbActiveClass: 'swiper-slide-thumb-active',
  7417. thumbsContainerClass: 'swiper-thumbs'
  7418. }
  7419. });
  7420. let initialized = false;
  7421. let swiperCreated = false;
  7422. swiper.thumbs = {
  7423. swiper: null
  7424. };
  7425. function onThumbClick() {
  7426. const thumbsSwiper = swiper.thumbs.swiper;
  7427. if (!thumbsSwiper || thumbsSwiper.destroyed) return;
  7428. const clickedIndex = thumbsSwiper.clickedIndex;
  7429. const clickedSlide = thumbsSwiper.clickedSlide;
  7430. if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;
  7431. if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
  7432. let slideToIndex;
  7433. if (thumbsSwiper.params.loop) {
  7434. slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
  7435. } else {
  7436. slideToIndex = clickedIndex;
  7437. }
  7438. if (swiper.params.loop) {
  7439. swiper.slideToLoop(slideToIndex);
  7440. } else {
  7441. swiper.slideTo(slideToIndex);
  7442. }
  7443. }
  7444. function init() {
  7445. const {
  7446. thumbs: thumbsParams
  7447. } = swiper.params;
  7448. if (initialized) return false;
  7449. initialized = true;
  7450. const SwiperClass = swiper.constructor;
  7451. if (thumbsParams.swiper instanceof SwiperClass) {
  7452. swiper.thumbs.swiper = thumbsParams.swiper;
  7453. Object.assign(swiper.thumbs.swiper.originalParams, {
  7454. watchSlidesProgress: true,
  7455. slideToClickedSlide: false
  7456. });
  7457. Object.assign(swiper.thumbs.swiper.params, {
  7458. watchSlidesProgress: true,
  7459. slideToClickedSlide: false
  7460. });
  7461. swiper.thumbs.swiper.update();
  7462. } else if (isObject$1(thumbsParams.swiper)) {
  7463. const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
  7464. Object.assign(thumbsSwiperParams, {
  7465. watchSlidesProgress: true,
  7466. slideToClickedSlide: false
  7467. });
  7468. swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
  7469. swiperCreated = true;
  7470. }
  7471. swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);
  7472. swiper.thumbs.swiper.on('tap', onThumbClick);
  7473. return true;
  7474. }
  7475. function update(initial) {
  7476. const thumbsSwiper = swiper.thumbs.swiper;
  7477. if (!thumbsSwiper || thumbsSwiper.destroyed) return;
  7478. const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
  7479. // Activate thumbs
  7480. let thumbsToActivate = 1;
  7481. const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
  7482. if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
  7483. thumbsToActivate = swiper.params.slidesPerView;
  7484. }
  7485. if (!swiper.params.thumbs.multipleActiveThumbs) {
  7486. thumbsToActivate = 1;
  7487. }
  7488. thumbsToActivate = Math.floor(thumbsToActivate);
  7489. thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));
  7490. if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
  7491. for (let i = 0; i < thumbsToActivate; i += 1) {
  7492. elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index="${swiper.realIndex + i}"]`).forEach(slideEl => {
  7493. slideEl.classList.add(thumbActiveClass);
  7494. });
  7495. }
  7496. } else {
  7497. for (let i = 0; i < thumbsToActivate; i += 1) {
  7498. if (thumbsSwiper.slides[swiper.realIndex + i]) {
  7499. thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);
  7500. }
  7501. }
  7502. }
  7503. const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
  7504. const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
  7505. if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
  7506. const currentThumbsIndex = thumbsSwiper.activeIndex;
  7507. let newThumbsIndex;
  7508. let direction;
  7509. if (thumbsSwiper.params.loop) {
  7510. const newThumbsSlide = thumbsSwiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`)[0];
  7511. newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);
  7512. direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
  7513. } else {
  7514. newThumbsIndex = swiper.realIndex;
  7515. direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
  7516. }
  7517. if (useOffset) {
  7518. newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
  7519. }
  7520. if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
  7521. if (thumbsSwiper.params.centeredSlides) {
  7522. if (newThumbsIndex > currentThumbsIndex) {
  7523. newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
  7524. } else {
  7525. newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
  7526. }
  7527. } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;
  7528. thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
  7529. }
  7530. }
  7531. }
  7532. on('beforeInit', () => {
  7533. const {
  7534. thumbs
  7535. } = swiper.params;
  7536. if (!thumbs || !thumbs.swiper) return;
  7537. if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {
  7538. const document = getDocument();
  7539. const getThumbsElementAndInit = () => {
  7540. const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;
  7541. if (thumbsElement && thumbsElement.swiper) {
  7542. thumbs.swiper = thumbsElement.swiper;
  7543. init();
  7544. update(true);
  7545. } else if (thumbsElement) {
  7546. const onThumbsSwiper = e => {
  7547. thumbs.swiper = e.detail[0];
  7548. thumbsElement.removeEventListener('init', onThumbsSwiper);
  7549. init();
  7550. update(true);
  7551. thumbs.swiper.update();
  7552. swiper.update();
  7553. };
  7554. thumbsElement.addEventListener('init', onThumbsSwiper);
  7555. }
  7556. return thumbsElement;
  7557. };
  7558. const watchForThumbsToAppear = () => {
  7559. if (swiper.destroyed) return;
  7560. const thumbsElement = getThumbsElementAndInit();
  7561. if (!thumbsElement) {
  7562. requestAnimationFrame(watchForThumbsToAppear);
  7563. }
  7564. };
  7565. requestAnimationFrame(watchForThumbsToAppear);
  7566. } else {
  7567. init();
  7568. update(true);
  7569. }
  7570. });
  7571. on('slideChange update resize observerUpdate', () => {
  7572. update();
  7573. });
  7574. on('setTransition', (_s, duration) => {
  7575. const thumbsSwiper = swiper.thumbs.swiper;
  7576. if (!thumbsSwiper || thumbsSwiper.destroyed) return;
  7577. thumbsSwiper.setTransition(duration);
  7578. });
  7579. on('beforeDestroy', () => {
  7580. const thumbsSwiper = swiper.thumbs.swiper;
  7581. if (!thumbsSwiper || thumbsSwiper.destroyed) return;
  7582. if (swiperCreated) {
  7583. thumbsSwiper.destroy();
  7584. }
  7585. });
  7586. Object.assign(swiper.thumbs, {
  7587. init,
  7588. update
  7589. });
  7590. }
  7591. function freeMode(_ref) {
  7592. let {
  7593. swiper,
  7594. extendParams,
  7595. emit,
  7596. once
  7597. } = _ref;
  7598. extendParams({
  7599. freeMode: {
  7600. enabled: false,
  7601. momentum: true,
  7602. momentumRatio: 1,
  7603. momentumBounce: true,
  7604. momentumBounceRatio: 1,
  7605. momentumVelocityRatio: 1,
  7606. sticky: false,
  7607. minimumVelocity: 0.02
  7608. }
  7609. });
  7610. function onTouchStart() {
  7611. if (swiper.params.cssMode) return;
  7612. const translate = swiper.getTranslate();
  7613. swiper.setTranslate(translate);
  7614. swiper.setTransition(0);
  7615. swiper.touchEventsData.velocities.length = 0;
  7616. swiper.freeMode.onTouchEnd({
  7617. currentPos: swiper.rtl ? swiper.translate : -swiper.translate
  7618. });
  7619. }
  7620. function onTouchMove() {
  7621. if (swiper.params.cssMode) return;
  7622. const {
  7623. touchEventsData: data,
  7624. touches
  7625. } = swiper;
  7626. // Velocity
  7627. if (data.velocities.length === 0) {
  7628. data.velocities.push({
  7629. position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
  7630. time: data.touchStartTime
  7631. });
  7632. }
  7633. data.velocities.push({
  7634. position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
  7635. time: now()
  7636. });
  7637. }
  7638. function onTouchEnd(_ref2) {
  7639. let {
  7640. currentPos
  7641. } = _ref2;
  7642. if (swiper.params.cssMode) return;
  7643. const {
  7644. params,
  7645. wrapperEl,
  7646. rtlTranslate: rtl,
  7647. snapGrid,
  7648. touchEventsData: data
  7649. } = swiper;
  7650. // Time diff
  7651. const touchEndTime = now();
  7652. const timeDiff = touchEndTime - data.touchStartTime;
  7653. if (currentPos < -swiper.minTranslate()) {
  7654. swiper.slideTo(swiper.activeIndex);
  7655. return;
  7656. }
  7657. if (currentPos > -swiper.maxTranslate()) {
  7658. if (swiper.slides.length < snapGrid.length) {
  7659. swiper.slideTo(snapGrid.length - 1);
  7660. } else {
  7661. swiper.slideTo(swiper.slides.length - 1);
  7662. }
  7663. return;
  7664. }
  7665. if (params.freeMode.momentum) {
  7666. if (data.velocities.length > 1) {
  7667. const lastMoveEvent = data.velocities.pop();
  7668. const velocityEvent = data.velocities.pop();
  7669. const distance = lastMoveEvent.position - velocityEvent.position;
  7670. const time = lastMoveEvent.time - velocityEvent.time;
  7671. swiper.velocity = distance / time;
  7672. swiper.velocity /= 2;
  7673. if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {
  7674. swiper.velocity = 0;
  7675. }
  7676. // this implies that the user stopped moving a finger then released.
  7677. // There would be no events with distance zero, so the last event is stale.
  7678. if (time > 150 || now() - lastMoveEvent.time > 300) {
  7679. swiper.velocity = 0;
  7680. }
  7681. } else {
  7682. swiper.velocity = 0;
  7683. }
  7684. swiper.velocity *= params.freeMode.momentumVelocityRatio;
  7685. data.velocities.length = 0;
  7686. let momentumDuration = 1000 * params.freeMode.momentumRatio;
  7687. const momentumDistance = swiper.velocity * momentumDuration;
  7688. let newPosition = swiper.translate + momentumDistance;
  7689. if (rtl) newPosition = -newPosition;
  7690. let doBounce = false;
  7691. let afterBouncePosition;
  7692. const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;
  7693. let needsLoopFix;
  7694. if (newPosition < swiper.maxTranslate()) {
  7695. if (params.freeMode.momentumBounce) {
  7696. if (newPosition + swiper.maxTranslate() < -bounceAmount) {
  7697. newPosition = swiper.maxTranslate() - bounceAmount;
  7698. }
  7699. afterBouncePosition = swiper.maxTranslate();
  7700. doBounce = true;
  7701. data.allowMomentumBounce = true;
  7702. } else {
  7703. newPosition = swiper.maxTranslate();
  7704. }
  7705. if (params.loop && params.centeredSlides) needsLoopFix = true;
  7706. } else if (newPosition > swiper.minTranslate()) {
  7707. if (params.freeMode.momentumBounce) {
  7708. if (newPosition - swiper.minTranslate() > bounceAmount) {
  7709. newPosition = swiper.minTranslate() + bounceAmount;
  7710. }
  7711. afterBouncePosition = swiper.minTranslate();
  7712. doBounce = true;
  7713. data.allowMomentumBounce = true;
  7714. } else {
  7715. newPosition = swiper.minTranslate();
  7716. }
  7717. if (params.loop && params.centeredSlides) needsLoopFix = true;
  7718. } else if (params.freeMode.sticky) {
  7719. let nextSlide;
  7720. for (let j = 0; j < snapGrid.length; j += 1) {
  7721. if (snapGrid[j] > -newPosition) {
  7722. nextSlide = j;
  7723. break;
  7724. }
  7725. }
  7726. if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
  7727. newPosition = snapGrid[nextSlide];
  7728. } else {
  7729. newPosition = snapGrid[nextSlide - 1];
  7730. }
  7731. newPosition = -newPosition;
  7732. }
  7733. if (needsLoopFix) {
  7734. once('transitionEnd', () => {
  7735. swiper.loopFix();
  7736. });
  7737. }
  7738. // Fix duration
  7739. if (swiper.velocity !== 0) {
  7740. if (rtl) {
  7741. momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
  7742. } else {
  7743. momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
  7744. }
  7745. if (params.freeMode.sticky) {
  7746. // If freeMode.sticky is active and the user ends a swipe with a slow-velocity
  7747. // event, then durations can be 20+ seconds to slide one (or zero!) slides.
  7748. // It's easy to see this when simulating touch with mouse events. To fix this,
  7749. // limit single-slide swipes to the default slide duration. This also has the
  7750. // nice side effect of matching slide speed if the user stopped moving before
  7751. // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
  7752. // For faster swipes, also apply limits (albeit higher ones).
  7753. const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
  7754. const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
  7755. if (moveDistance < currentSlideSize) {
  7756. momentumDuration = params.speed;
  7757. } else if (moveDistance < 2 * currentSlideSize) {
  7758. momentumDuration = params.speed * 1.5;
  7759. } else {
  7760. momentumDuration = params.speed * 2.5;
  7761. }
  7762. }
  7763. } else if (params.freeMode.sticky) {
  7764. swiper.slideToClosest();
  7765. return;
  7766. }
  7767. if (params.freeMode.momentumBounce && doBounce) {
  7768. swiper.updateProgress(afterBouncePosition);
  7769. swiper.setTransition(momentumDuration);
  7770. swiper.setTranslate(newPosition);
  7771. swiper.transitionStart(true, swiper.swipeDirection);
  7772. swiper.animating = true;
  7773. elementTransitionEnd(wrapperEl, () => {
  7774. if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
  7775. emit('momentumBounce');
  7776. swiper.setTransition(params.speed);
  7777. setTimeout(() => {
  7778. swiper.setTranslate(afterBouncePosition);
  7779. elementTransitionEnd(wrapperEl, () => {
  7780. if (!swiper || swiper.destroyed) return;
  7781. swiper.transitionEnd();
  7782. });
  7783. }, 0);
  7784. });
  7785. } else if (swiper.velocity) {
  7786. emit('_freeModeNoMomentumRelease');
  7787. swiper.updateProgress(newPosition);
  7788. swiper.setTransition(momentumDuration);
  7789. swiper.setTranslate(newPosition);
  7790. swiper.transitionStart(true, swiper.swipeDirection);
  7791. if (!swiper.animating) {
  7792. swiper.animating = true;
  7793. elementTransitionEnd(wrapperEl, () => {
  7794. if (!swiper || swiper.destroyed) return;
  7795. swiper.transitionEnd();
  7796. });
  7797. }
  7798. } else {
  7799. swiper.updateProgress(newPosition);
  7800. }
  7801. swiper.updateActiveIndex();
  7802. swiper.updateSlidesClasses();
  7803. } else if (params.freeMode.sticky) {
  7804. swiper.slideToClosest();
  7805. return;
  7806. } else if (params.freeMode) {
  7807. emit('_freeModeNoMomentumRelease');
  7808. }
  7809. if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {
  7810. swiper.updateProgress();
  7811. swiper.updateActiveIndex();
  7812. swiper.updateSlidesClasses();
  7813. }
  7814. }
  7815. Object.assign(swiper, {
  7816. freeMode: {
  7817. onTouchStart,
  7818. onTouchMove,
  7819. onTouchEnd
  7820. }
  7821. });
  7822. }
  7823. function Grid(_ref) {
  7824. let {
  7825. swiper,
  7826. extendParams
  7827. } = _ref;
  7828. extendParams({
  7829. grid: {
  7830. rows: 1,
  7831. fill: 'column'
  7832. }
  7833. });
  7834. let slidesNumberEvenToRows;
  7835. let slidesPerRow;
  7836. let numFullColumns;
  7837. const getSpaceBetween = () => {
  7838. let spaceBetween = swiper.params.spaceBetween;
  7839. if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
  7840. spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
  7841. } else if (typeof spaceBetween === 'string') {
  7842. spaceBetween = parseFloat(spaceBetween);
  7843. }
  7844. return spaceBetween;
  7845. };
  7846. const initSlides = slidesLength => {
  7847. const {
  7848. slidesPerView
  7849. } = swiper.params;
  7850. const {
  7851. rows,
  7852. fill
  7853. } = swiper.params.grid;
  7854. numFullColumns = Math.floor(slidesLength / rows);
  7855. if (Math.floor(slidesLength / rows) === slidesLength / rows) {
  7856. slidesNumberEvenToRows = slidesLength;
  7857. } else {
  7858. slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;
  7859. }
  7860. if (slidesPerView !== 'auto' && fill === 'row') {
  7861. slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);
  7862. }
  7863. slidesPerRow = slidesNumberEvenToRows / rows;
  7864. };
  7865. const updateSlide = (i, slide, slidesLength, getDirectionLabel) => {
  7866. const {
  7867. slidesPerGroup
  7868. } = swiper.params;
  7869. const spaceBetween = getSpaceBetween();
  7870. const {
  7871. rows,
  7872. fill
  7873. } = swiper.params.grid;
  7874. // Set slides order
  7875. let newSlideOrderIndex;
  7876. let column;
  7877. let row;
  7878. if (fill === 'row' && slidesPerGroup > 1) {
  7879. const groupIndex = Math.floor(i / (slidesPerGroup * rows));
  7880. const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;
  7881. const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);
  7882. row = Math.floor(slideIndexInGroup / columnsInGroup);
  7883. column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;
  7884. newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;
  7885. slide.style.order = newSlideOrderIndex;
  7886. } else if (fill === 'column') {
  7887. column = Math.floor(i / rows);
  7888. row = i - column * rows;
  7889. if (column > numFullColumns || column === numFullColumns && row === rows - 1) {
  7890. row += 1;
  7891. if (row >= rows) {
  7892. row = 0;
  7893. column += 1;
  7894. }
  7895. }
  7896. } else {
  7897. row = Math.floor(i / slidesPerRow);
  7898. column = i - row * slidesPerRow;
  7899. }
  7900. slide.row = row;
  7901. slide.column = column;
  7902. slide.style[getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && `${spaceBetween}px` : '';
  7903. };
  7904. const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => {
  7905. const {
  7906. centeredSlides,
  7907. roundLengths
  7908. } = swiper.params;
  7909. const spaceBetween = getSpaceBetween();
  7910. const {
  7911. rows
  7912. } = swiper.params.grid;
  7913. swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;
  7914. swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;
  7915. swiper.wrapperEl.style[getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
  7916. if (centeredSlides) {
  7917. const newSlidesGrid = [];
  7918. for (let i = 0; i < snapGrid.length; i += 1) {
  7919. let slidesGridItem = snapGrid[i];
  7920. if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);
  7921. if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
  7922. }
  7923. snapGrid.splice(0, snapGrid.length);
  7924. snapGrid.push(...newSlidesGrid);
  7925. }
  7926. };
  7927. swiper.grid = {
  7928. initSlides,
  7929. updateSlide,
  7930. updateWrapperSize
  7931. };
  7932. }
  7933. function appendSlide(slides) {
  7934. const swiper = this;
  7935. const {
  7936. params,
  7937. slidesEl
  7938. } = swiper;
  7939. if (params.loop) {
  7940. swiper.loopDestroy();
  7941. }
  7942. const appendElement = slideEl => {
  7943. if (typeof slideEl === 'string') {
  7944. const tempDOM = document.createElement('div');
  7945. tempDOM.innerHTML = slideEl;
  7946. slidesEl.append(tempDOM.children[0]);
  7947. tempDOM.innerHTML = '';
  7948. } else {
  7949. slidesEl.append(slideEl);
  7950. }
  7951. };
  7952. if (typeof slides === 'object' && 'length' in slides) {
  7953. for (let i = 0; i < slides.length; i += 1) {
  7954. if (slides[i]) appendElement(slides[i]);
  7955. }
  7956. } else {
  7957. appendElement(slides);
  7958. }
  7959. swiper.recalcSlides();
  7960. if (params.loop) {
  7961. swiper.loopCreate();
  7962. }
  7963. if (!params.observer || swiper.isElement) {
  7964. swiper.update();
  7965. }
  7966. }
  7967. function prependSlide(slides) {
  7968. const swiper = this;
  7969. const {
  7970. params,
  7971. activeIndex,
  7972. slidesEl
  7973. } = swiper;
  7974. if (params.loop) {
  7975. swiper.loopDestroy();
  7976. }
  7977. let newActiveIndex = activeIndex + 1;
  7978. const prependElement = slideEl => {
  7979. if (typeof slideEl === 'string') {
  7980. const tempDOM = document.createElement('div');
  7981. tempDOM.innerHTML = slideEl;
  7982. slidesEl.prepend(tempDOM.children[0]);
  7983. tempDOM.innerHTML = '';
  7984. } else {
  7985. slidesEl.prepend(slideEl);
  7986. }
  7987. };
  7988. if (typeof slides === 'object' && 'length' in slides) {
  7989. for (let i = 0; i < slides.length; i += 1) {
  7990. if (slides[i]) prependElement(slides[i]);
  7991. }
  7992. newActiveIndex = activeIndex + slides.length;
  7993. } else {
  7994. prependElement(slides);
  7995. }
  7996. swiper.recalcSlides();
  7997. if (params.loop) {
  7998. swiper.loopCreate();
  7999. }
  8000. if (!params.observer || swiper.isElement) {
  8001. swiper.update();
  8002. }
  8003. swiper.slideTo(newActiveIndex, 0, false);
  8004. }
  8005. function addSlide(index, slides) {
  8006. const swiper = this;
  8007. const {
  8008. params,
  8009. activeIndex,
  8010. slidesEl
  8011. } = swiper;
  8012. let activeIndexBuffer = activeIndex;
  8013. if (params.loop) {
  8014. activeIndexBuffer -= swiper.loopedSlides;
  8015. swiper.loopDestroy();
  8016. swiper.recalcSlides();
  8017. }
  8018. const baseLength = swiper.slides.length;
  8019. if (index <= 0) {
  8020. swiper.prependSlide(slides);
  8021. return;
  8022. }
  8023. if (index >= baseLength) {
  8024. swiper.appendSlide(slides);
  8025. return;
  8026. }
  8027. let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
  8028. const slidesBuffer = [];
  8029. for (let i = baseLength - 1; i >= index; i -= 1) {
  8030. const currentSlide = swiper.slides[i];
  8031. currentSlide.remove();
  8032. slidesBuffer.unshift(currentSlide);
  8033. }
  8034. if (typeof slides === 'object' && 'length' in slides) {
  8035. for (let i = 0; i < slides.length; i += 1) {
  8036. if (slides[i]) slidesEl.append(slides[i]);
  8037. }
  8038. newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
  8039. } else {
  8040. slidesEl.append(slides);
  8041. }
  8042. for (let i = 0; i < slidesBuffer.length; i += 1) {
  8043. slidesEl.append(slidesBuffer[i]);
  8044. }
  8045. swiper.recalcSlides();
  8046. if (params.loop) {
  8047. swiper.loopCreate();
  8048. }
  8049. if (!params.observer || swiper.isElement) {
  8050. swiper.update();
  8051. }
  8052. if (params.loop) {
  8053. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  8054. } else {
  8055. swiper.slideTo(newActiveIndex, 0, false);
  8056. }
  8057. }
  8058. function removeSlide(slidesIndexes) {
  8059. const swiper = this;
  8060. const {
  8061. params,
  8062. activeIndex
  8063. } = swiper;
  8064. let activeIndexBuffer = activeIndex;
  8065. if (params.loop) {
  8066. activeIndexBuffer -= swiper.loopedSlides;
  8067. swiper.loopDestroy();
  8068. }
  8069. let newActiveIndex = activeIndexBuffer;
  8070. let indexToRemove;
  8071. if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
  8072. for (let i = 0; i < slidesIndexes.length; i += 1) {
  8073. indexToRemove = slidesIndexes[i];
  8074. if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
  8075. if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
  8076. }
  8077. newActiveIndex = Math.max(newActiveIndex, 0);
  8078. } else {
  8079. indexToRemove = slidesIndexes;
  8080. if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
  8081. if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
  8082. newActiveIndex = Math.max(newActiveIndex, 0);
  8083. }
  8084. swiper.recalcSlides();
  8085. if (params.loop) {
  8086. swiper.loopCreate();
  8087. }
  8088. if (!params.observer || swiper.isElement) {
  8089. swiper.update();
  8090. }
  8091. if (params.loop) {
  8092. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  8093. } else {
  8094. swiper.slideTo(newActiveIndex, 0, false);
  8095. }
  8096. }
  8097. function removeAllSlides() {
  8098. const swiper = this;
  8099. const slidesIndexes = [];
  8100. for (let i = 0; i < swiper.slides.length; i += 1) {
  8101. slidesIndexes.push(i);
  8102. }
  8103. swiper.removeSlide(slidesIndexes);
  8104. }
  8105. function Manipulation(_ref) {
  8106. let {
  8107. swiper
  8108. } = _ref;
  8109. Object.assign(swiper, {
  8110. appendSlide: appendSlide.bind(swiper),
  8111. prependSlide: prependSlide.bind(swiper),
  8112. addSlide: addSlide.bind(swiper),
  8113. removeSlide: removeSlide.bind(swiper),
  8114. removeAllSlides: removeAllSlides.bind(swiper)
  8115. });
  8116. }
  8117. function effectInit(params) {
  8118. const {
  8119. effect,
  8120. swiper,
  8121. on,
  8122. setTranslate,
  8123. setTransition,
  8124. overwriteParams,
  8125. perspective,
  8126. recreateShadows,
  8127. getEffectParams
  8128. } = params;
  8129. on('beforeInit', () => {
  8130. if (swiper.params.effect !== effect) return;
  8131. swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);
  8132. if (perspective && perspective()) {
  8133. swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);
  8134. }
  8135. const overwriteParamsResult = overwriteParams ? overwriteParams() : {};
  8136. Object.assign(swiper.params, overwriteParamsResult);
  8137. Object.assign(swiper.originalParams, overwriteParamsResult);
  8138. });
  8139. on('setTranslate', () => {
  8140. if (swiper.params.effect !== effect) return;
  8141. setTranslate();
  8142. });
  8143. on('setTransition', (_s, duration) => {
  8144. if (swiper.params.effect !== effect) return;
  8145. setTransition(duration);
  8146. });
  8147. on('transitionEnd', () => {
  8148. if (swiper.params.effect !== effect) return;
  8149. if (recreateShadows) {
  8150. if (!getEffectParams || !getEffectParams().slideShadows) return;
  8151. // remove shadows
  8152. swiper.slides.forEach(slideEl => {
  8153. slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => shadowEl.remove());
  8154. });
  8155. // create new one
  8156. recreateShadows();
  8157. }
  8158. });
  8159. let requireUpdateOnVirtual;
  8160. on('virtualUpdate', () => {
  8161. if (swiper.params.effect !== effect) return;
  8162. if (!swiper.slides.length) {
  8163. requireUpdateOnVirtual = true;
  8164. }
  8165. requestAnimationFrame(() => {
  8166. if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {
  8167. setTranslate();
  8168. requireUpdateOnVirtual = false;
  8169. }
  8170. });
  8171. });
  8172. }
  8173. function effectTarget(effectParams, slideEl) {
  8174. const transformEl = getSlideTransformEl(slideEl);
  8175. if (transformEl !== slideEl) {
  8176. transformEl.style.backfaceVisibility = 'hidden';
  8177. transformEl.style['-webkit-backface-visibility'] = 'hidden';
  8178. }
  8179. return transformEl;
  8180. }
  8181. function effectVirtualTransitionEnd(_ref) {
  8182. let {
  8183. swiper,
  8184. duration,
  8185. transformElements,
  8186. allSlides
  8187. } = _ref;
  8188. const {
  8189. activeIndex
  8190. } = swiper;
  8191. const getSlide = el => {
  8192. if (!el.parentElement) {
  8193. // assume shadow root
  8194. const slide = swiper.slides.filter(slideEl => slideEl.shadowEl && slideEl.shadowEl === el.parentNode)[0];
  8195. return slide;
  8196. }
  8197. return el.parentElement;
  8198. };
  8199. if (swiper.params.virtualTranslate && duration !== 0) {
  8200. let eventTriggered = false;
  8201. let transitionEndTarget;
  8202. if (allSlides) {
  8203. transitionEndTarget = transformElements;
  8204. } else {
  8205. transitionEndTarget = transformElements.filter(transformEl => {
  8206. const el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;
  8207. return swiper.getSlideIndex(el) === activeIndex;
  8208. });
  8209. }
  8210. transitionEndTarget.forEach(el => {
  8211. elementTransitionEnd(el, () => {
  8212. if (eventTriggered) return;
  8213. if (!swiper || swiper.destroyed) return;
  8214. eventTriggered = true;
  8215. swiper.animating = false;
  8216. const evt = new window.CustomEvent('transitionend', {
  8217. bubbles: true,
  8218. cancelable: true
  8219. });
  8220. swiper.wrapperEl.dispatchEvent(evt);
  8221. });
  8222. });
  8223. }
  8224. }
  8225. function EffectFade(_ref) {
  8226. let {
  8227. swiper,
  8228. extendParams,
  8229. on
  8230. } = _ref;
  8231. extendParams({
  8232. fadeEffect: {
  8233. crossFade: false
  8234. }
  8235. });
  8236. const setTranslate = () => {
  8237. const {
  8238. slides
  8239. } = swiper;
  8240. const params = swiper.params.fadeEffect;
  8241. for (let i = 0; i < slides.length; i += 1) {
  8242. const slideEl = swiper.slides[i];
  8243. const offset = slideEl.swiperSlideOffset;
  8244. let tx = -offset;
  8245. if (!swiper.params.virtualTranslate) tx -= swiper.translate;
  8246. let ty = 0;
  8247. if (!swiper.isHorizontal()) {
  8248. ty = tx;
  8249. tx = 0;
  8250. }
  8251. const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);
  8252. const targetEl = effectTarget(params, slideEl);
  8253. targetEl.style.opacity = slideOpacity;
  8254. targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;
  8255. }
  8256. };
  8257. const setTransition = duration => {
  8258. const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
  8259. transformElements.forEach(el => {
  8260. el.style.transitionDuration = `${duration}ms`;
  8261. });
  8262. effectVirtualTransitionEnd({
  8263. swiper,
  8264. duration,
  8265. transformElements,
  8266. allSlides: true
  8267. });
  8268. };
  8269. effectInit({
  8270. effect: 'fade',
  8271. swiper,
  8272. on,
  8273. setTranslate,
  8274. setTransition,
  8275. overwriteParams: () => ({
  8276. slidesPerView: 1,
  8277. slidesPerGroup: 1,
  8278. watchSlidesProgress: true,
  8279. spaceBetween: 0,
  8280. virtualTranslate: !swiper.params.cssMode
  8281. })
  8282. });
  8283. }
  8284. function EffectCube(_ref) {
  8285. let {
  8286. swiper,
  8287. extendParams,
  8288. on
  8289. } = _ref;
  8290. extendParams({
  8291. cubeEffect: {
  8292. slideShadows: true,
  8293. shadow: true,
  8294. shadowOffset: 20,
  8295. shadowScale: 0.94
  8296. }
  8297. });
  8298. const createSlideShadows = (slideEl, progress, isHorizontal) => {
  8299. let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
  8300. let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
  8301. if (!shadowBefore) {
  8302. shadowBefore = createElement('div', `swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`);
  8303. slideEl.append(shadowBefore);
  8304. }
  8305. if (!shadowAfter) {
  8306. shadowAfter = createElement('div', `swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`);
  8307. slideEl.append(shadowAfter);
  8308. }
  8309. if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
  8310. if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
  8311. };
  8312. const recreateShadows = () => {
  8313. // create new ones
  8314. const isHorizontal = swiper.isHorizontal();
  8315. swiper.slides.forEach(slideEl => {
  8316. const progress = Math.max(Math.min(slideEl.progress, 1), -1);
  8317. createSlideShadows(slideEl, progress, isHorizontal);
  8318. });
  8319. };
  8320. const setTranslate = () => {
  8321. const {
  8322. el,
  8323. wrapperEl,
  8324. slides,
  8325. width: swiperWidth,
  8326. height: swiperHeight,
  8327. rtlTranslate: rtl,
  8328. size: swiperSize,
  8329. browser
  8330. } = swiper;
  8331. const params = swiper.params.cubeEffect;
  8332. const isHorizontal = swiper.isHorizontal();
  8333. const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  8334. let wrapperRotate = 0;
  8335. let cubeShadowEl;
  8336. if (params.shadow) {
  8337. if (isHorizontal) {
  8338. cubeShadowEl = swiper.slidesEl.querySelector('.swiper-cube-shadow');
  8339. if (!cubeShadowEl) {
  8340. cubeShadowEl = createElement('div', 'swiper-cube-shadow');
  8341. swiper.slidesEl.append(cubeShadowEl);
  8342. }
  8343. cubeShadowEl.style.height = `${swiperWidth}px`;
  8344. } else {
  8345. cubeShadowEl = el.querySelector('.swiper-cube-shadow');
  8346. if (!cubeShadowEl) {
  8347. cubeShadowEl = createElement('div', 'swiper-cube-shadow');
  8348. el.append(cubeShadowEl);
  8349. }
  8350. }
  8351. }
  8352. for (let i = 0; i < slides.length; i += 1) {
  8353. const slideEl = slides[i];
  8354. let slideIndex = i;
  8355. if (isVirtual) {
  8356. slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);
  8357. }
  8358. let slideAngle = slideIndex * 90;
  8359. let round = Math.floor(slideAngle / 360);
  8360. if (rtl) {
  8361. slideAngle = -slideAngle;
  8362. round = Math.floor(-slideAngle / 360);
  8363. }
  8364. const progress = Math.max(Math.min(slideEl.progress, 1), -1);
  8365. let tx = 0;
  8366. let ty = 0;
  8367. let tz = 0;
  8368. if (slideIndex % 4 === 0) {
  8369. tx = -round * 4 * swiperSize;
  8370. tz = 0;
  8371. } else if ((slideIndex - 1) % 4 === 0) {
  8372. tx = 0;
  8373. tz = -round * 4 * swiperSize;
  8374. } else if ((slideIndex - 2) % 4 === 0) {
  8375. tx = swiperSize + round * 4 * swiperSize;
  8376. tz = swiperSize;
  8377. } else if ((slideIndex - 3) % 4 === 0) {
  8378. tx = -swiperSize;
  8379. tz = 3 * swiperSize + swiperSize * 4 * round;
  8380. }
  8381. if (rtl) {
  8382. tx = -tx;
  8383. }
  8384. if (!isHorizontal) {
  8385. ty = tx;
  8386. tx = 0;
  8387. }
  8388. const transform = `rotateX(${isHorizontal ? 0 : -slideAngle}deg) rotateY(${isHorizontal ? slideAngle : 0}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;
  8389. if (progress <= 1 && progress > -1) {
  8390. wrapperRotate = slideIndex * 90 + progress * 90;
  8391. if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
  8392. }
  8393. slideEl.style.transform = transform;
  8394. if (params.slideShadows) {
  8395. createSlideShadows(slideEl, progress, isHorizontal);
  8396. }
  8397. }
  8398. wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;
  8399. wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;
  8400. if (params.shadow) {
  8401. if (isHorizontal) {
  8402. cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`;
  8403. } else {
  8404. const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
  8405. const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
  8406. const scale1 = params.shadowScale;
  8407. const scale2 = params.shadowScale / multiplier;
  8408. const offset = params.shadowOffset;
  8409. cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`;
  8410. }
  8411. }
  8412. const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;
  8413. wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${swiper.isHorizontal() ? 0 : wrapperRotate}deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`;
  8414. wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);
  8415. };
  8416. const setTransition = duration => {
  8417. const {
  8418. el,
  8419. slides
  8420. } = swiper;
  8421. slides.forEach(slideEl => {
  8422. slideEl.style.transitionDuration = `${duration}ms`;
  8423. slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {
  8424. subEl.style.transitionDuration = `${duration}ms`;
  8425. });
  8426. });
  8427. if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
  8428. const shadowEl = el.querySelector('.swiper-cube-shadow');
  8429. if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;
  8430. }
  8431. };
  8432. effectInit({
  8433. effect: 'cube',
  8434. swiper,
  8435. on,
  8436. setTranslate,
  8437. setTransition,
  8438. recreateShadows,
  8439. getEffectParams: () => swiper.params.cubeEffect,
  8440. perspective: () => true,
  8441. overwriteParams: () => ({
  8442. slidesPerView: 1,
  8443. slidesPerGroup: 1,
  8444. watchSlidesProgress: true,
  8445. resistanceRatio: 0,
  8446. spaceBetween: 0,
  8447. centeredSlides: false,
  8448. virtualTranslate: true
  8449. })
  8450. });
  8451. }
  8452. function createShadow(params, slideEl, side) {
  8453. const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}`;
  8454. const shadowContainer = getSlideTransformEl(slideEl);
  8455. let shadowEl = shadowContainer.querySelector(`.${shadowClass}`);
  8456. if (!shadowEl) {
  8457. shadowEl = createElement('div', `swiper-slide-shadow${side ? `-${side}` : ''}`);
  8458. shadowContainer.append(shadowEl);
  8459. }
  8460. return shadowEl;
  8461. }
  8462. function EffectFlip(_ref) {
  8463. let {
  8464. swiper,
  8465. extendParams,
  8466. on
  8467. } = _ref;
  8468. extendParams({
  8469. flipEffect: {
  8470. slideShadows: true,
  8471. limitRotation: true
  8472. }
  8473. });
  8474. const createSlideShadows = (slideEl, progress, params) => {
  8475. let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
  8476. let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
  8477. if (!shadowBefore) {
  8478. shadowBefore = createShadow(params, slideEl, swiper.isHorizontal() ? 'left' : 'top');
  8479. }
  8480. if (!shadowAfter) {
  8481. shadowAfter = createShadow(params, slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
  8482. }
  8483. if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
  8484. if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
  8485. };
  8486. const recreateShadows = () => {
  8487. // Set shadows
  8488. const params = swiper.params.flipEffect;
  8489. swiper.slides.forEach(slideEl => {
  8490. let progress = slideEl.progress;
  8491. if (swiper.params.flipEffect.limitRotation) {
  8492. progress = Math.max(Math.min(slideEl.progress, 1), -1);
  8493. }
  8494. createSlideShadows(slideEl, progress, params);
  8495. });
  8496. };
  8497. const setTranslate = () => {
  8498. const {
  8499. slides,
  8500. rtlTranslate: rtl
  8501. } = swiper;
  8502. const params = swiper.params.flipEffect;
  8503. for (let i = 0; i < slides.length; i += 1) {
  8504. const slideEl = slides[i];
  8505. let progress = slideEl.progress;
  8506. if (swiper.params.flipEffect.limitRotation) {
  8507. progress = Math.max(Math.min(slideEl.progress, 1), -1);
  8508. }
  8509. const offset = slideEl.swiperSlideOffset;
  8510. const rotate = -180 * progress;
  8511. let rotateY = rotate;
  8512. let rotateX = 0;
  8513. let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
  8514. let ty = 0;
  8515. if (!swiper.isHorizontal()) {
  8516. ty = tx;
  8517. tx = 0;
  8518. rotateX = -rotateY;
  8519. rotateY = 0;
  8520. } else if (rtl) {
  8521. rotateY = -rotateY;
  8522. }
  8523. slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
  8524. if (params.slideShadows) {
  8525. createSlideShadows(slideEl, progress, params);
  8526. }
  8527. const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
  8528. const targetEl = effectTarget(params, slideEl);
  8529. targetEl.style.transform = transform;
  8530. }
  8531. };
  8532. const setTransition = duration => {
  8533. const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
  8534. transformElements.forEach(el => {
  8535. el.style.transitionDuration = `${duration}ms`;
  8536. el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
  8537. shadowEl.style.transitionDuration = `${duration}ms`;
  8538. });
  8539. });
  8540. effectVirtualTransitionEnd({
  8541. swiper,
  8542. duration,
  8543. transformElements
  8544. });
  8545. };
  8546. effectInit({
  8547. effect: 'flip',
  8548. swiper,
  8549. on,
  8550. setTranslate,
  8551. setTransition,
  8552. recreateShadows,
  8553. getEffectParams: () => swiper.params.flipEffect,
  8554. perspective: () => true,
  8555. overwriteParams: () => ({
  8556. slidesPerView: 1,
  8557. slidesPerGroup: 1,
  8558. watchSlidesProgress: true,
  8559. spaceBetween: 0,
  8560. virtualTranslate: !swiper.params.cssMode
  8561. })
  8562. });
  8563. }
  8564. function EffectCoverflow(_ref) {
  8565. let {
  8566. swiper,
  8567. extendParams,
  8568. on
  8569. } = _ref;
  8570. extendParams({
  8571. coverflowEffect: {
  8572. rotate: 50,
  8573. stretch: 0,
  8574. depth: 100,
  8575. scale: 1,
  8576. modifier: 1,
  8577. slideShadows: true
  8578. }
  8579. });
  8580. const setTranslate = () => {
  8581. const {
  8582. width: swiperWidth,
  8583. height: swiperHeight,
  8584. slides,
  8585. slidesSizesGrid
  8586. } = swiper;
  8587. const params = swiper.params.coverflowEffect;
  8588. const isHorizontal = swiper.isHorizontal();
  8589. const transform = swiper.translate;
  8590. const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
  8591. const rotate = isHorizontal ? params.rotate : -params.rotate;
  8592. const translate = params.depth;
  8593. // Each slide offset from center
  8594. for (let i = 0, length = slides.length; i < length; i += 1) {
  8595. const slideEl = slides[i];
  8596. const slideSize = slidesSizesGrid[i];
  8597. const slideOffset = slideEl.swiperSlideOffset;
  8598. const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;
  8599. const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;
  8600. let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
  8601. let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
  8602. // var rotateZ = 0
  8603. let translateZ = -translate * Math.abs(offsetMultiplier);
  8604. let stretch = params.stretch;
  8605. // Allow percentage to make a relative stretch for responsive sliders
  8606. if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
  8607. stretch = parseFloat(params.stretch) / 100 * slideSize;
  8608. }
  8609. let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
  8610. let translateX = isHorizontal ? stretch * offsetMultiplier : 0;
  8611. let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);
  8612. // Fix for ultra small values
  8613. if (Math.abs(translateX) < 0.001) translateX = 0;
  8614. if (Math.abs(translateY) < 0.001) translateY = 0;
  8615. if (Math.abs(translateZ) < 0.001) translateZ = 0;
  8616. if (Math.abs(rotateY) < 0.001) rotateY = 0;
  8617. if (Math.abs(rotateX) < 0.001) rotateX = 0;
  8618. if (Math.abs(scale) < 0.001) scale = 0;
  8619. const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;
  8620. const targetEl = effectTarget(params, slideEl);
  8621. targetEl.style.transform = slideTransform;
  8622. slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
  8623. if (params.slideShadows) {
  8624. // Set shadows
  8625. let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
  8626. let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
  8627. if (!shadowBeforeEl) {
  8628. shadowBeforeEl = createShadow(params, slideEl, isHorizontal ? 'left' : 'top');
  8629. }
  8630. if (!shadowAfterEl) {
  8631. shadowAfterEl = createShadow(params, slideEl, isHorizontal ? 'right' : 'bottom');
  8632. }
  8633. if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
  8634. if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
  8635. }
  8636. }
  8637. };
  8638. const setTransition = duration => {
  8639. const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
  8640. transformElements.forEach(el => {
  8641. el.style.transitionDuration = `${duration}ms`;
  8642. el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
  8643. shadowEl.style.transitionDuration = `${duration}ms`;
  8644. });
  8645. });
  8646. };
  8647. effectInit({
  8648. effect: 'coverflow',
  8649. swiper,
  8650. on,
  8651. setTranslate,
  8652. setTransition,
  8653. perspective: () => true,
  8654. overwriteParams: () => ({
  8655. watchSlidesProgress: true
  8656. })
  8657. });
  8658. }
  8659. function EffectCreative(_ref) {
  8660. let {
  8661. swiper,
  8662. extendParams,
  8663. on
  8664. } = _ref;
  8665. extendParams({
  8666. creativeEffect: {
  8667. limitProgress: 1,
  8668. shadowPerProgress: false,
  8669. progressMultiplier: 1,
  8670. perspective: true,
  8671. prev: {
  8672. translate: [0, 0, 0],
  8673. rotate: [0, 0, 0],
  8674. opacity: 1,
  8675. scale: 1
  8676. },
  8677. next: {
  8678. translate: [0, 0, 0],
  8679. rotate: [0, 0, 0],
  8680. opacity: 1,
  8681. scale: 1
  8682. }
  8683. }
  8684. });
  8685. const getTranslateValue = value => {
  8686. if (typeof value === 'string') return value;
  8687. return `${value}px`;
  8688. };
  8689. const setTranslate = () => {
  8690. const {
  8691. slides,
  8692. wrapperEl,
  8693. slidesSizesGrid
  8694. } = swiper;
  8695. const params = swiper.params.creativeEffect;
  8696. const {
  8697. progressMultiplier: multiplier
  8698. } = params;
  8699. const isCenteredSlides = swiper.params.centeredSlides;
  8700. if (isCenteredSlides) {
  8701. const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;
  8702. wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;
  8703. }
  8704. for (let i = 0; i < slides.length; i += 1) {
  8705. const slideEl = slides[i];
  8706. const slideProgress = slideEl.progress;
  8707. const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);
  8708. let originalProgress = progress;
  8709. if (!isCenteredSlides) {
  8710. originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);
  8711. }
  8712. const offset = slideEl.swiperSlideOffset;
  8713. const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];
  8714. const r = [0, 0, 0];
  8715. let custom = false;
  8716. if (!swiper.isHorizontal()) {
  8717. t[1] = t[0];
  8718. t[0] = 0;
  8719. }
  8720. let data = {
  8721. translate: [0, 0, 0],
  8722. rotate: [0, 0, 0],
  8723. scale: 1,
  8724. opacity: 1
  8725. };
  8726. if (progress < 0) {
  8727. data = params.next;
  8728. custom = true;
  8729. } else if (progress > 0) {
  8730. data = params.prev;
  8731. custom = true;
  8732. }
  8733. // set translate
  8734. t.forEach((value, index) => {
  8735. t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;
  8736. });
  8737. // set rotates
  8738. r.forEach((value, index) => {
  8739. r[index] = data.rotate[index] * Math.abs(progress * multiplier);
  8740. });
  8741. slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
  8742. const translateString = t.join(', ');
  8743. const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`;
  8744. const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;
  8745. const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;
  8746. const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;
  8747. // Set shadows
  8748. if (custom && data.shadow || !custom) {
  8749. let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
  8750. if (!shadowEl && data.shadow) {
  8751. shadowEl = createShadow(params, slideEl);
  8752. }
  8753. if (shadowEl) {
  8754. const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;
  8755. shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);
  8756. }
  8757. }
  8758. const targetEl = effectTarget(params, slideEl);
  8759. targetEl.style.transform = transform;
  8760. targetEl.style.opacity = opacityString;
  8761. if (data.origin) {
  8762. targetEl.style.transformOrigin = data.origin;
  8763. }
  8764. }
  8765. };
  8766. const setTransition = duration => {
  8767. const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
  8768. transformElements.forEach(el => {
  8769. el.style.transitionDuration = `${duration}ms`;
  8770. el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
  8771. shadowEl.style.transitionDuration = `${duration}ms`;
  8772. });
  8773. });
  8774. effectVirtualTransitionEnd({
  8775. swiper,
  8776. duration,
  8777. transformElements,
  8778. allSlides: true
  8779. });
  8780. };
  8781. effectInit({
  8782. effect: 'creative',
  8783. swiper,
  8784. on,
  8785. setTranslate,
  8786. setTransition,
  8787. perspective: () => swiper.params.creativeEffect.perspective,
  8788. overwriteParams: () => ({
  8789. watchSlidesProgress: true,
  8790. virtualTranslate: !swiper.params.cssMode
  8791. })
  8792. });
  8793. }
  8794. function EffectCards(_ref) {
  8795. let {
  8796. swiper,
  8797. extendParams,
  8798. on
  8799. } = _ref;
  8800. extendParams({
  8801. cardsEffect: {
  8802. slideShadows: true,
  8803. rotate: true,
  8804. perSlideRotate: 2,
  8805. perSlideOffset: 8
  8806. }
  8807. });
  8808. const setTranslate = () => {
  8809. const {
  8810. slides,
  8811. activeIndex,
  8812. rtlTranslate: rtl
  8813. } = swiper;
  8814. const params = swiper.params.cardsEffect;
  8815. const {
  8816. startTranslate,
  8817. isTouched
  8818. } = swiper.touchEventsData;
  8819. const currentTranslate = rtl ? -swiper.translate : swiper.translate;
  8820. for (let i = 0; i < slides.length; i += 1) {
  8821. const slideEl = slides[i];
  8822. const slideProgress = slideEl.progress;
  8823. const progress = Math.min(Math.max(slideProgress, -4), 4);
  8824. let offset = slideEl.swiperSlideOffset;
  8825. if (swiper.params.centeredSlides && !swiper.params.cssMode) {
  8826. swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;
  8827. }
  8828. if (swiper.params.centeredSlides && swiper.params.cssMode) {
  8829. offset -= slides[0].swiperSlideOffset;
  8830. }
  8831. let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;
  8832. let tY = 0;
  8833. const tZ = -100 * Math.abs(progress);
  8834. let scale = 1;
  8835. let rotate = -params.perSlideRotate * progress;
  8836. let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;
  8837. const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;
  8838. const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;
  8839. const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;
  8840. if (isSwipeToNext || isSwipeToPrev) {
  8841. const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;
  8842. rotate += -28 * progress * subProgress;
  8843. scale += -0.5 * subProgress;
  8844. tXAdd += 96 * subProgress;
  8845. tY = `${-25 * subProgress * Math.abs(progress)}%`;
  8846. }
  8847. if (progress < 0) {
  8848. // next
  8849. tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;
  8850. } else if (progress > 0) {
  8851. // prev
  8852. tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;
  8853. } else {
  8854. tX = `${tX}px`;
  8855. }
  8856. if (!swiper.isHorizontal()) {
  8857. const prevY = tY;
  8858. tY = tX;
  8859. tX = prevY;
  8860. }
  8861. const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;
  8862. /* eslint-disable */
  8863. const transform = `
  8864. translate3d(${tX}, ${tY}, ${tZ}px)
  8865. rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)
  8866. scale(${scaleString})
  8867. `;
  8868. /* eslint-enable */
  8869. if (params.slideShadows) {
  8870. // Set shadows
  8871. let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
  8872. if (!shadowEl) {
  8873. shadowEl = createShadow(params, slideEl);
  8874. }
  8875. if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);
  8876. }
  8877. slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
  8878. const targetEl = effectTarget(params, slideEl);
  8879. targetEl.style.transform = transform;
  8880. }
  8881. };
  8882. const setTransition = duration => {
  8883. const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
  8884. transformElements.forEach(el => {
  8885. el.style.transitionDuration = `${duration}ms`;
  8886. el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
  8887. shadowEl.style.transitionDuration = `${duration}ms`;
  8888. });
  8889. });
  8890. effectVirtualTransitionEnd({
  8891. swiper,
  8892. duration,
  8893. transformElements
  8894. });
  8895. };
  8896. effectInit({
  8897. effect: 'cards',
  8898. swiper,
  8899. on,
  8900. setTranslate,
  8901. setTransition,
  8902. perspective: () => true,
  8903. overwriteParams: () => ({
  8904. watchSlidesProgress: true,
  8905. virtualTranslate: !swiper.params.cssMode
  8906. })
  8907. });
  8908. }
  8909. /**
  8910. * Swiper 9.4.1
  8911. * Most modern mobile touch slider and framework with hardware accelerated transitions
  8912. * https://swiperjs.com
  8913. *
  8914. * Copyright 2014-2023 Vladimir Kharlampidi
  8915. *
  8916. * Released under the MIT License
  8917. *
  8918. * Released on: June 13, 2023
  8919. */
  8920. // Swiper Class
  8921. const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards];
  8922. Swiper.use(modules);
  8923. /* underscore in name -> watch for changes */
  8924. const paramsList = ['eventsPrefix', 'injectStyles', 'injectStylesUrls', 'modules', 'init', '_direction', 'oneWayMovement', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', 'maxBackfaceHiddenSlides', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_loop', 'loopedSlides', 'loopPreventsSliding', '_rewind', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideActiveClass', 'slideVisibleClass', 'slideNextClass', 'slidePrevClass', 'wrapperClass', 'lazyPreloaderClass', 'lazyPreloadPrevNext', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren',
  8925. // modules
  8926. 'a11y', '_autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom', 'control'];
  8927. function isObject(o) {
  8928. return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
  8929. }
  8930. function extend(target, src) {
  8931. const noExtend = ['__proto__', 'constructor', 'prototype'];
  8932. Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {
  8933. if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
  8934. if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]);
  8935. } else {
  8936. target[key] = src[key];
  8937. }
  8938. });
  8939. }
  8940. function needsNavigation(params) {
  8941. if (params === void 0) {
  8942. params = {};
  8943. }
  8944. return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined';
  8945. }
  8946. function needsPagination(params) {
  8947. if (params === void 0) {
  8948. params = {};
  8949. }
  8950. return params.pagination && typeof params.pagination.el === 'undefined';
  8951. }
  8952. function needsScrollbar(params) {
  8953. if (params === void 0) {
  8954. params = {};
  8955. }
  8956. return params.scrollbar && typeof params.scrollbar.el === 'undefined';
  8957. }
  8958. function attrToProp(attrName) {
  8959. if (attrName === void 0) {
  8960. attrName = '';
  8961. }
  8962. return attrName.replace(/-[a-z]/g, l => l.toUpperCase().replace('-', ''));
  8963. }
  8964. const formatValue = val => {
  8965. if (parseFloat(val) === Number(val)) return Number(val);
  8966. if (val === 'true') return true;
  8967. if (val === '') return true;
  8968. if (val === 'false') return false;
  8969. if (val === 'null') return null;
  8970. if (val === 'undefined') return undefined;
  8971. return val;
  8972. };
  8973. const modulesParamsList = ['a11y', 'autoplay', 'controller', 'cards-effect', 'coverflow-effect', 'creative-effect', 'cube-effect', 'fade-effect', 'flip-effect', 'free-mode', 'grid', 'hash-navigation', 'history', 'keyboard', 'mousewheel', 'navigation', 'pagination', 'parallax', 'scrollbar', 'thumbs', 'virtual', 'zoom'];
  8974. function getParams(element, propName, propValue) {
  8975. const params = {};
  8976. const passedParams = {};
  8977. extend(params, defaults);
  8978. const localParamsList = [...paramsList, 'on'];
  8979. const allowedParams = localParamsList.map(key => key.replace(/_/, ''));
  8980. // First check props
  8981. localParamsList.forEach(paramName => {
  8982. paramName = paramName.replace('_', '');
  8983. if (typeof element[paramName] !== 'undefined') {
  8984. passedParams[paramName] = element[paramName];
  8985. }
  8986. });
  8987. // Attributes
  8988. const attrsList = [...element.attributes];
  8989. if (typeof propName === 'string' && typeof propValue !== 'undefined') {
  8990. attrsList.push({
  8991. name: propName,
  8992. value: propValue
  8993. });
  8994. }
  8995. attrsList.forEach(attr => {
  8996. const moduleParam = modulesParamsList.filter(mParam => attr.name.indexOf(`${mParam}-`) === 0)[0];
  8997. if (moduleParam) {
  8998. const parentObjName = attrToProp(moduleParam);
  8999. const subObjName = attrToProp(attr.name.split(`${moduleParam}-`)[1]);
  9000. if (typeof passedParams[parentObjName] === 'undefined') passedParams[parentObjName] = {};
  9001. if (passedParams[parentObjName] === true) {
  9002. passedParams[parentObjName] = {
  9003. enabled: true
  9004. };
  9005. }
  9006. passedParams[parentObjName][subObjName] = formatValue(attr.value);
  9007. } else {
  9008. const name = attrToProp(attr.name);
  9009. if (!allowedParams.includes(name)) return;
  9010. const value = formatValue(attr.value);
  9011. if (passedParams[name] && modulesParamsList.includes(attr.name)) {
  9012. if (passedParams[name].constructor !== Object) {
  9013. passedParams[name] = {};
  9014. }
  9015. passedParams[name].enabled = value;
  9016. } else {
  9017. passedParams[name] = value;
  9018. }
  9019. }
  9020. });
  9021. extend(params, passedParams);
  9022. if (params.navigation) {
  9023. params.navigation = {
  9024. prevEl: '.swiper-button-prev',
  9025. nextEl: '.swiper-button-next',
  9026. ...(params.navigation !== true ? params.navigation : {})
  9027. };
  9028. } else if (params.navigation === false) {
  9029. delete params.navigation;
  9030. }
  9031. if (params.scrollbar) {
  9032. params.scrollbar = {
  9033. el: '.swiper-scrollbar',
  9034. ...(params.scrollbar !== true ? params.scrollbar : {})
  9035. };
  9036. } else if (params.scrollbar === false) {
  9037. delete params.scrollbar;
  9038. }
  9039. if (params.pagination) {
  9040. params.pagination = {
  9041. el: '.swiper-pagination',
  9042. ...(params.pagination !== true ? params.pagination : {})
  9043. };
  9044. } else if (params.pagination === false) {
  9045. delete params.pagination;
  9046. }
  9047. return {
  9048. params,
  9049. passedParams
  9050. };
  9051. }
  9052. function updateSwiper(_ref) {
  9053. let {
  9054. swiper,
  9055. slides,
  9056. passedParams,
  9057. changedParams,
  9058. nextEl,
  9059. prevEl,
  9060. scrollbarEl,
  9061. paginationEl
  9062. } = _ref;
  9063. const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction' && key !== 'wrapperClass');
  9064. const {
  9065. params: currentParams,
  9066. pagination,
  9067. navigation,
  9068. scrollbar,
  9069. virtual,
  9070. thumbs
  9071. } = swiper;
  9072. let needThumbsInit;
  9073. let needControllerInit;
  9074. let needPaginationInit;
  9075. let needScrollbarInit;
  9076. let needNavigationInit;
  9077. let loopNeedDestroy;
  9078. let loopNeedEnable;
  9079. let loopNeedReloop;
  9080. if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {
  9081. needThumbsInit = true;
  9082. }
  9083. if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {
  9084. needControllerInit = true;
  9085. }
  9086. if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {
  9087. needPaginationInit = true;
  9088. }
  9089. if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {
  9090. needScrollbarInit = true;
  9091. }
  9092. if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {
  9093. needNavigationInit = true;
  9094. }
  9095. const destroyModule = mod => {
  9096. if (!swiper[mod]) return;
  9097. swiper[mod].destroy();
  9098. if (mod === 'navigation') {
  9099. if (swiper.isElement) {
  9100. swiper[mod].prevEl.remove();
  9101. swiper[mod].nextEl.remove();
  9102. }
  9103. currentParams[mod].prevEl = undefined;
  9104. currentParams[mod].nextEl = undefined;
  9105. swiper[mod].prevEl = undefined;
  9106. swiper[mod].nextEl = undefined;
  9107. } else {
  9108. if (swiper.isElement) {
  9109. swiper[mod].el.remove();
  9110. }
  9111. currentParams[mod].el = undefined;
  9112. swiper[mod].el = undefined;
  9113. }
  9114. };
  9115. if (changedParams.includes('loop') && swiper.isElement) {
  9116. if (currentParams.loop && !passedParams.loop) {
  9117. loopNeedDestroy = true;
  9118. } else if (!currentParams.loop && passedParams.loop) {
  9119. loopNeedEnable = true;
  9120. } else {
  9121. loopNeedReloop = true;
  9122. }
  9123. }
  9124. updateParams.forEach(key => {
  9125. if (isObject(currentParams[key]) && isObject(passedParams[key])) {
  9126. extend(currentParams[key], passedParams[key]);
  9127. if ((key === 'navigation' || key === 'pagination' || key === 'scrollbar') && 'enabled' in passedParams[key] && !passedParams[key].enabled) {
  9128. destroyModule(key);
  9129. }
  9130. } else {
  9131. const newValue = passedParams[key];
  9132. if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) {
  9133. if (newValue === false) {
  9134. destroyModule(key);
  9135. }
  9136. } else {
  9137. currentParams[key] = passedParams[key];
  9138. }
  9139. }
  9140. });
  9141. if (updateParams.includes('controller') && !needControllerInit && swiper.controller && swiper.controller.control && currentParams.controller && currentParams.controller.control) {
  9142. swiper.controller.control = currentParams.controller.control;
  9143. }
  9144. if (changedParams.includes('children') && slides && virtual && currentParams.virtual.enabled) {
  9145. virtual.slides = slides;
  9146. virtual.update(true);
  9147. }
  9148. if (changedParams.includes('children') && slides && currentParams.loop) {
  9149. loopNeedReloop = true;
  9150. }
  9151. if (needThumbsInit) {
  9152. const initialized = thumbs.init();
  9153. if (initialized) thumbs.update(true);
  9154. }
  9155. if (needControllerInit) {
  9156. swiper.controller.control = currentParams.controller.control;
  9157. }
  9158. if (needPaginationInit) {
  9159. if (swiper.isElement && (!paginationEl || typeof paginationEl === 'string')) {
  9160. paginationEl = document.createElement('div');
  9161. paginationEl.classList.add('swiper-pagination');
  9162. swiper.el.shadowEl.appendChild(paginationEl);
  9163. }
  9164. if (paginationEl) currentParams.pagination.el = paginationEl;
  9165. pagination.init();
  9166. pagination.render();
  9167. pagination.update();
  9168. }
  9169. if (needScrollbarInit) {
  9170. if (swiper.isElement && (!scrollbarEl || typeof scrollbarEl === 'string')) {
  9171. scrollbarEl = document.createElement('div');
  9172. scrollbarEl.classList.add('swiper-scrollbar');
  9173. swiper.el.shadowEl.appendChild(scrollbarEl);
  9174. }
  9175. if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;
  9176. scrollbar.init();
  9177. scrollbar.updateSize();
  9178. scrollbar.setTranslate();
  9179. }
  9180. if (needNavigationInit) {
  9181. if (swiper.isElement) {
  9182. if (!nextEl || typeof nextEl === 'string') {
  9183. nextEl = document.createElement('div');
  9184. nextEl.classList.add('swiper-button-next');
  9185. swiper.el.shadowEl.appendChild(nextEl);
  9186. }
  9187. if (!prevEl || typeof prevEl === 'string') {
  9188. prevEl = document.createElement('div');
  9189. prevEl.classList.add('swiper-button-prev');
  9190. swiper.el.shadowEl.appendChild(prevEl);
  9191. }
  9192. }
  9193. if (nextEl) currentParams.navigation.nextEl = nextEl;
  9194. if (prevEl) currentParams.navigation.prevEl = prevEl;
  9195. navigation.init();
  9196. navigation.update();
  9197. }
  9198. if (changedParams.includes('allowSlideNext')) {
  9199. swiper.allowSlideNext = passedParams.allowSlideNext;
  9200. }
  9201. if (changedParams.includes('allowSlidePrev')) {
  9202. swiper.allowSlidePrev = passedParams.allowSlidePrev;
  9203. }
  9204. if (changedParams.includes('direction')) {
  9205. swiper.changeDirection(passedParams.direction, false);
  9206. }
  9207. if (loopNeedDestroy || loopNeedReloop) {
  9208. swiper.loopDestroy();
  9209. }
  9210. if (loopNeedEnable || loopNeedReloop) {
  9211. swiper.loopCreate();
  9212. }
  9213. swiper.update();
  9214. }
  9215. /* eslint-disable spaced-comment */
  9216. const SwiperFontCSS = `@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}`;
  9217. const SwiperCSS = `:root{--swiper-theme-color:#007aff}.swiper,swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}:host(.swiper-vertical)>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight swiper-slide{height:auto}:host(.swiper-autoheight) .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}:host(.swiper-3d.swiper-css-mode) .swiper-wrapper{perspective:1200px}:host(.swiper-3d) .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top,.swiper-3d swiper-slide{transform-style:preserve-3d}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}:host(.swiper-css-mode)>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}:host(.swiper-css-mode)>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>swiper-slide{scroll-snap-align:start start}:host(.swiper-horizontal.swiper-css-mode)>.swiper-wrapper{scroll-snap-type:x mandatory}:host(.swiper-vertical.swiper-css-mode)>.swiper-wrapper{scroll-snap-type:y mandatory}:host(.swiper-css-mode.swiper-free-mode)>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>swiper-slide{scroll-snap-align:none}:host(.swiper-centered)>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-centered>swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-centered.swiper-horizontal>swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}:host(.swiper-centered.swiper-horizontal)>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-centered.swiper-vertical>swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}:host(.swiper-centered.swiper-vertical)>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader,swiper-container:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper-virtual swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}:host(.swiper-virtual.swiper-css-mode) .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}:host(.swiper-virtual.swiper-css-mode.swiper-horizontal) .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}:host(.swiper-virtual.swiper-css-mode.swiper-vertical) .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev,:host(.swiper-rtl) .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-prev:after,:host(.swiper-rtl) .swiper-button-next:after{content:'prev'}.swiper-button-next,:host(.swiper-rtl) .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-next:after,:host(.swiper-rtl) .swiper-button-prev:after{content:'next'}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,:host(.swiper-horizontal.swiper-rtl) .swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}:host(.swiper-rtl) .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;-ms-touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification,swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}:host(.swiper-free-mode)>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}:host(.swiper-grid)>.swiper-wrapper{flex-wrap:wrap}:host(.swiper-grid-column)>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode swiper-slide{transition-timing-function:ease-out}.swiper-fade swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade swiper-slide swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active,.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube swiper-slide swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev,.swiper-cube swiper-slide-next+swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-flip{overflow:visible}.swiper-flip swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip swiper-slide swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}`;
  9218. let globalInjectStyles = true;
  9219. const addGlobalStyles = (preInit, swiper) => {
  9220. let globalStyles = document.querySelector('style#swiper-element-styles');
  9221. const shouldOverwrite = globalStyles && globalStyles.preInit && !preInit;
  9222. if (!preInit && swiper) {
  9223. swiper.cssLinks().forEach(url => {
  9224. const linkEl = document.createElement('link');
  9225. linkEl.rel = 'stylesheet';
  9226. linkEl.href = url;
  9227. document.head.prepend(linkEl);
  9228. });
  9229. }
  9230. if (!globalStyles || shouldOverwrite) {
  9231. globalStyles = globalStyles || document.createElement('style');
  9232. globalStyles.textContent = [SwiperFontCSS, swiper ? swiper.cssStyles() : ''].join('\n'); // eslint-disable-line
  9233. globalStyles.id = 'swiper-element-styles';
  9234. globalStyles.preInit = preInit;
  9235. document.head.prepend(globalStyles);
  9236. }
  9237. };
  9238. class DummyHTMLElement {}
  9239. const ClassToExtend = typeof window === 'undefined' || typeof HTMLElement === 'undefined' ? DummyHTMLElement : HTMLElement;
  9240. class SwiperContainer extends ClassToExtend {
  9241. constructor() {
  9242. super();
  9243. this.tempDiv = document.createElement('div');
  9244. this.shadowEl = this.attachShadow({
  9245. mode: 'open'
  9246. });
  9247. }
  9248. cssStyles() {
  9249. return [globalInjectStyles ? SwiperCSS : '',
  9250. // eslint-disable-line
  9251. ...(this.injectStyles && Array.isArray(this.injectStyles) ? this.injectStyles : [])].join('\n');
  9252. }
  9253. cssLinks() {
  9254. return this.injectStylesUrls || [];
  9255. }
  9256. render() {
  9257. if (this.rendered) return;
  9258. if (globalInjectStyles) {
  9259. // global styles
  9260. addGlobalStyles(false, this);
  9261. }
  9262. // local styles
  9263. const localStyles = this.cssStyles();
  9264. if (localStyles.length) {
  9265. this.stylesEl = document.createElement('style');
  9266. this.stylesEl.textContent = localStyles;
  9267. this.shadowEl.appendChild(this.stylesEl);
  9268. }
  9269. this.cssLinks().forEach(url => {
  9270. const linkExists = this.shadowEl.querySelector(`link[href="${url}"]`);
  9271. if (linkExists) return;
  9272. const linkEl = document.createElement('link');
  9273. linkEl.rel = 'stylesheet';
  9274. linkEl.href = url;
  9275. this.shadowEl.appendChild(linkEl);
  9276. });
  9277. // prettier-ignore
  9278. this.tempDiv.innerHTML = `
  9279. <slot name="container-start"></slot>
  9280. <div class="swiper-wrapper">
  9281. <slot></slot>
  9282. </div>
  9283. <slot name="container-end"></slot>
  9284. ${needsNavigation(this.passedParams) ? `
  9285. <div part="button-prev" class="swiper-button-prev"></div>
  9286. <div part="button-next" class="swiper-button-next"></div>
  9287. ` : ''}
  9288. ${needsPagination(this.passedParams) ? `
  9289. <div part="pagination" class="swiper-pagination"></div>
  9290. ` : ''}
  9291. ${needsScrollbar(this.passedParams) ? `
  9292. <div part="scrollbar" class="swiper-scrollbar"></div>
  9293. ` : ''}
  9294. `;
  9295. [...this.tempDiv.children].forEach(el => {
  9296. this.shadowEl.appendChild(el);
  9297. });
  9298. this.rendered = true;
  9299. }
  9300. initialize() {
  9301. var _this = this;
  9302. if (this.initialized) return;
  9303. this.initialized = true;
  9304. const {
  9305. params: swiperParams,
  9306. passedParams
  9307. } = getParams(this);
  9308. this.swiperParams = swiperParams;
  9309. this.passedParams = passedParams;
  9310. delete this.swiperParams.init;
  9311. this.render();
  9312. // eslint-disable-next-line
  9313. this.swiper = new Swiper(this, {
  9314. ...swiperParams,
  9315. touchEventsTarget: 'container',
  9316. ...(swiperParams.virtual ? {} : {
  9317. observer: true
  9318. }),
  9319. onAny: function (name) {
  9320. const eventName = swiperParams.eventsPrefix ? `${swiperParams.eventsPrefix}${name.toLowerCase()}` : name.toLowerCase();
  9321. for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  9322. args[_key - 1] = arguments[_key];
  9323. }
  9324. const event = new CustomEvent(eventName, {
  9325. detail: args,
  9326. bubbles: true,
  9327. cancelable: true
  9328. });
  9329. _this.dispatchEvent(event);
  9330. }
  9331. });
  9332. }
  9333. connectedCallback() {
  9334. if (this.initialized && this.nested && this.closest('swiper-slide') && this.closest('swiper-slide').swiperLoopMoveDOM) {
  9335. return;
  9336. }
  9337. if (this.init === false || this.getAttribute('init') === 'false') {
  9338. addGlobalStyles(true, this);
  9339. return;
  9340. }
  9341. this.initialize();
  9342. }
  9343. disconnectedCallback() {
  9344. if (this.nested && this.closest('swiper-slide') && this.closest('swiper-slide').swiperLoopMoveDOM) {
  9345. return;
  9346. }
  9347. if (this.swiper && this.swiper.destroy) {
  9348. this.swiper.destroy();
  9349. }
  9350. this.initialized = false;
  9351. }
  9352. updateSwiperOnPropChange(propName, propValue) {
  9353. const {
  9354. params: swiperParams,
  9355. passedParams
  9356. } = getParams(this, propName, propValue);
  9357. this.passedParams = passedParams;
  9358. this.swiperParams = swiperParams;
  9359. updateSwiper({
  9360. swiper: this.swiper,
  9361. passedParams: this.passedParams,
  9362. changedParams: [attrToProp(propName)],
  9363. ...(propName === 'navigation' && passedParams[propName] ? {
  9364. prevEl: '.swiper-button-prev',
  9365. nextEl: '.swiper-button-next'
  9366. } : {}),
  9367. ...(propName === 'pagination' && passedParams[propName] ? {
  9368. paginationEl: '.swiper-pagination'
  9369. } : {}),
  9370. ...(propName === 'scrollbar' && passedParams[propName] ? {
  9371. scrollbarEl: '.swiper-scrollbar'
  9372. } : {})
  9373. });
  9374. }
  9375. attributeChangedCallback(attr, prevValue, newValue) {
  9376. if (!this.initialized) return;
  9377. if (prevValue === 'true' && newValue === null) {
  9378. newValue = false;
  9379. }
  9380. this.updateSwiperOnPropChange(attr, newValue);
  9381. }
  9382. static get observedAttributes() {
  9383. const attrs = paramsList.filter(param => param.includes('_')).map(param => param.replace(/[A-Z]/g, v => `-${v}`).replace('_', '').toLowerCase());
  9384. return attrs;
  9385. }
  9386. }
  9387. paramsList.forEach(paramName => {
  9388. if (paramName === 'init') return;
  9389. paramName = paramName.replace('_', '');
  9390. Object.defineProperty(SwiperContainer.prototype, paramName, {
  9391. configurable: true,
  9392. get() {
  9393. return (this.passedParams || {})[paramName];
  9394. },
  9395. set(value) {
  9396. if (!this.passedParams) this.passedParams = {};
  9397. this.passedParams[paramName] = value;
  9398. if (!this.initialized) return;
  9399. this.updateSwiperOnPropChange(paramName);
  9400. }
  9401. });
  9402. });
  9403. class SwiperSlide extends ClassToExtend {
  9404. constructor() {
  9405. super();
  9406. this.tempDiv = document.createElement('div');
  9407. this.shadowEl = this.attachShadow({
  9408. mode: 'open'
  9409. });
  9410. }
  9411. render() {
  9412. const lazy = this.lazy || this.getAttribute('lazy') === '' || this.getAttribute('lazy') === 'true';
  9413. this.tempDiv.innerHTML = `<slot />`;
  9414. [...this.tempDiv.children].forEach(el => {
  9415. this.shadowEl.appendChild(el);
  9416. });
  9417. if (lazy) {
  9418. const lazyDiv = document.createElement('div');
  9419. lazyDiv.classList.add('swiper-lazy-preloader');
  9420. this.appendChild(lazyDiv);
  9421. }
  9422. }
  9423. initialize() {
  9424. this.render();
  9425. }
  9426. connectedCallback() {
  9427. this.initialize();
  9428. }
  9429. }
  9430. // eslint-disable-next-line
  9431. const register = function (injectStyles) {
  9432. if (injectStyles === void 0) {
  9433. injectStyles = true;
  9434. }
  9435. if (typeof window === 'undefined') return;
  9436. if (!injectStyles) {
  9437. globalInjectStyles = false;
  9438. }
  9439. if (globalInjectStyles) {
  9440. addGlobalStyles(true);
  9441. }
  9442. if (!window.customElements.get('swiper-container')) window.customElements.define('swiper-container', SwiperContainer);
  9443. if (!window.customElements.get('swiper-slide')) window.customElements.define('swiper-slide', SwiperSlide);
  9444. };
  9445. if (typeof window !== 'undefined') {
  9446. window.SwiperElementRegisterParams = params => {
  9447. paramsList.push(...params);
  9448. };
  9449. }
  9450. register();
  9451. })();