123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360 |
- /*!
- * Materialize v1.0.0-rc.2 (http://materializecss.com)
- * Copyright 2014-2017 Materialize
- * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)
- */
- var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
- /*! cash-dom 1.3.5, https://github.com/kenwheeler/cash @license MIT */
- (function (factory) {
- window.cash = factory();
- })(function () {
- var doc = document,
- win = window,
- ArrayProto = Array.prototype,
- slice = ArrayProto.slice,
- filter = ArrayProto.filter,
- push = ArrayProto.push;
- var noop = function () {},
- isFunction = function (item) {
- // @see https://crbug.com/568448
- return typeof item === typeof noop && item.call;
- },
- isString = function (item) {
- return typeof item === typeof "";
- };
- var idMatch = /^#[\w-]*$/,
- classMatch = /^\.[\w-]*$/,
- htmlMatch = /<.+>/,
- singlet = /^\w+$/;
- function find(selector, context) {
- context = context || doc;
- var elems = classMatch.test(selector) ? context.getElementsByClassName(selector.slice(1)) : singlet.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector);
- return elems;
- }
- var frag;
- function parseHTML(str) {
- if (!frag) {
- frag = doc.implementation.createHTMLDocument(null);
- var base = frag.createElement("base");
- base.href = doc.location.href;
- frag.head.appendChild(base);
- }
- frag.body.innerHTML = str;
- return frag.body.childNodes;
- }
- function onReady(fn) {
- if (doc.readyState !== "loading") {
- fn();
- } else {
- doc.addEventListener("DOMContentLoaded", fn);
- }
- }
- function Init(selector, context) {
- if (!selector) {
- return this;
- }
- // If already a cash collection, don't do any further processing
- if (selector.cash && selector !== win) {
- return selector;
- }
- var elems = selector,
- i = 0,
- length;
- if (isString(selector)) {
- elems = idMatch.test(selector) ?
- // If an ID use the faster getElementById check
- doc.getElementById(selector.slice(1)) : htmlMatch.test(selector) ?
- // If HTML, parse it into real elements
- parseHTML(selector) :
- // else use `find`
- find(selector, context);
- // If function, use as shortcut for DOM ready
- } else if (isFunction(selector)) {
- onReady(selector);return this;
- }
- if (!elems) {
- return this;
- }
- // If a single DOM element is passed in or received via ID, return the single element
- if (elems.nodeType || elems === win) {
- this[0] = elems;
- this.length = 1;
- } else {
- // Treat like an array and loop through each item.
- length = this.length = elems.length;
- for (; i < length; i++) {
- this[i] = elems[i];
- }
- }
- return this;
- }
- function cash(selector, context) {
- return new Init(selector, context);
- }
- var fn = cash.fn = cash.prototype = Init.prototype = { // jshint ignore:line
- cash: true,
- length: 0,
- push: push,
- splice: ArrayProto.splice,
- map: ArrayProto.map,
- init: Init
- };
- Object.defineProperty(fn, "constructor", { value: cash });
- cash.parseHTML = parseHTML;
- cash.noop = noop;
- cash.isFunction = isFunction;
- cash.isString = isString;
- cash.extend = fn.extend = function (target) {
- target = target || {};
- var args = slice.call(arguments),
- length = args.length,
- i = 1;
- if (args.length === 1) {
- target = this;
- i = 0;
- }
- for (; i < length; i++) {
- if (!args[i]) {
- continue;
- }
- for (var key in args[i]) {
- if (args[i].hasOwnProperty(key)) {
- target[key] = args[i][key];
- }
- }
- }
- return target;
- };
- function each(collection, callback) {
- var l = collection.length,
- i = 0;
- for (; i < l; i++) {
- if (callback.call(collection[i], collection[i], i, collection) === false) {
- break;
- }
- }
- }
- function matches(el, selector) {
- var m = el && (el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector || el.oMatchesSelector);
- return !!m && m.call(el, selector);
- }
- function getCompareFunction(selector) {
- return (
- /* Use browser's `matches` function if string */
- isString(selector) ? matches :
- /* Match a cash element */
- selector.cash ? function (el) {
- return selector.is(el);
- } :
- /* Direct comparison */
- function (el, selector) {
- return el === selector;
- }
- );
- }
- function unique(collection) {
- return cash(slice.call(collection).filter(function (item, index, self) {
- return self.indexOf(item) === index;
- }));
- }
- cash.extend({
- merge: function (first, second) {
- var len = +second.length,
- i = first.length,
- j = 0;
- for (; j < len; i++, j++) {
- first[i] = second[j];
- }
- first.length = i;
- return first;
- },
- each: each,
- matches: matches,
- unique: unique,
- isArray: Array.isArray,
- isNumeric: function (n) {
- return !isNaN(parseFloat(n)) && isFinite(n);
- }
- });
- var uid = cash.uid = "_cash" + Date.now();
- function getDataCache(node) {
- return node[uid] = node[uid] || {};
- }
- function setData(node, key, value) {
- return getDataCache(node)[key] = value;
- }
- function getData(node, key) {
- var c = getDataCache(node);
- if (c[key] === undefined) {
- c[key] = node.dataset ? node.dataset[key] : cash(node).attr("data-" + key);
- }
- return c[key];
- }
- function removeData(node, key) {
- var c = getDataCache(node);
- if (c) {
- delete c[key];
- } else if (node.dataset) {
- delete node.dataset[key];
- } else {
- cash(node).removeAttr("data-" + name);
- }
- }
- fn.extend({
- data: function (name, value) {
- if (isString(name)) {
- return value === undefined ? getData(this[0], name) : this.each(function (v) {
- return setData(v, name, value);
- });
- }
- for (var key in name) {
- this.data(key, name[key]);
- }
- return this;
- },
- removeData: function (key) {
- return this.each(function (v) {
- return removeData(v, key);
- });
- }
- });
- var notWhiteMatch = /\S+/g;
- function getClasses(c) {
- return isString(c) && c.match(notWhiteMatch);
- }
- function hasClass(v, c) {
- return v.classList ? v.classList.contains(c) : new RegExp("(^| )" + c + "( |$)", "gi").test(v.className);
- }
- function addClass(v, c, spacedName) {
- if (v.classList) {
- v.classList.add(c);
- } else if (spacedName.indexOf(" " + c + " ")) {
- v.className += " " + c;
- }
- }
- function removeClass(v, c) {
- if (v.classList) {
- v.classList.remove(c);
- } else {
- v.className = v.className.replace(c, "");
- }
- }
- fn.extend({
- addClass: function (c) {
- var classes = getClasses(c);
- return classes ? this.each(function (v) {
- var spacedName = " " + v.className + " ";
- each(classes, function (c) {
- addClass(v, c, spacedName);
- });
- }) : this;
- },
- attr: function (name, value) {
- if (!name) {
- return undefined;
- }
- if (isString(name)) {
- if (value === undefined) {
- return this[0] ? this[0].getAttribute ? this[0].getAttribute(name) : this[0][name] : undefined;
- }
- return this.each(function (v) {
- if (v.setAttribute) {
- v.setAttribute(name, value);
- } else {
- v[name] = value;
- }
- });
- }
- for (var key in name) {
- this.attr(key, name[key]);
- }
- return this;
- },
- hasClass: function (c) {
- var check = false,
- classes = getClasses(c);
- if (classes && classes.length) {
- this.each(function (v) {
- check = hasClass(v, classes[0]);
- return !check;
- });
- }
- return check;
- },
- prop: function (name, value) {
- if (isString(name)) {
- return value === undefined ? this[0][name] : this.each(function (v) {
- v[name] = value;
- });
- }
- for (var key in name) {
- this.prop(key, name[key]);
- }
- return this;
- },
- removeAttr: function (name) {
- return this.each(function (v) {
- if (v.removeAttribute) {
- v.removeAttribute(name);
- } else {
- delete v[name];
- }
- });
- },
- removeClass: function (c) {
- if (!arguments.length) {
- return this.attr("class", "");
- }
- var classes = getClasses(c);
- return classes ? this.each(function (v) {
- each(classes, function (c) {
- removeClass(v, c);
- });
- }) : this;
- },
- removeProp: function (name) {
- return this.each(function (v) {
- delete v[name];
- });
- },
- toggleClass: function (c, state) {
- if (state !== undefined) {
- return this[state ? "addClass" : "removeClass"](c);
- }
- var classes = getClasses(c);
- return classes ? this.each(function (v) {
- var spacedName = " " + v.className + " ";
- each(classes, function (c) {
- if (hasClass(v, c)) {
- removeClass(v, c);
- } else {
- addClass(v, c, spacedName);
- }
- });
- }) : this;
- } });
- fn.extend({
- add: function (selector, context) {
- return unique(cash.merge(this, cash(selector, context)));
- },
- each: function (callback) {
- each(this, callback);
- return this;
- },
- eq: function (index) {
- return cash(this.get(index));
- },
- filter: function (selector) {
- if (!selector) {
- return this;
- }
- var comparator = isFunction(selector) ? selector : getCompareFunction(selector);
- return cash(filter.call(this, function (e) {
- return comparator(e, selector);
- }));
- },
- first: function () {
- return this.eq(0);
- },
- get: function (index) {
- if (index === undefined) {
- return slice.call(this);
- }
- return index < 0 ? this[index + this.length] : this[index];
- },
- index: function (elem) {
- var child = elem ? cash(elem)[0] : this[0],
- collection = elem ? this : cash(child).parent().children();
- return slice.call(collection).indexOf(child);
- },
- last: function () {
- return this.eq(-1);
- }
- });
- var camelCase = function () {
- var camelRegex = /(?:^\w|[A-Z]|\b\w)/g,
- whiteSpace = /[\s-_]+/g;
- return function (str) {
- return str.replace(camelRegex, function (letter, index) {
- return letter[index === 0 ? "toLowerCase" : "toUpperCase"]();
- }).replace(whiteSpace, "");
- };
- }();
- var getPrefixedProp = function () {
- var cache = {},
- doc = document,
- div = doc.createElement("div"),
- style = div.style;
- return function (prop) {
- prop = camelCase(prop);
- if (cache[prop]) {
- return cache[prop];
- }
- var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
- prefixes = ["webkit", "moz", "ms", "o"],
- props = (prop + " " + prefixes.join(ucProp + " ") + ucProp).split(" ");
- each(props, function (p) {
- if (p in style) {
- cache[p] = prop = cache[prop] = p;
- return false;
- }
- });
- return cache[prop];
- };
- }();
- cash.prefixedProp = getPrefixedProp;
- cash.camelCase = camelCase;
- fn.extend({
- css: function (prop, value) {
- if (isString(prop)) {
- prop = getPrefixedProp(prop);
- return arguments.length > 1 ? this.each(function (v) {
- return v.style[prop] = value;
- }) : win.getComputedStyle(this[0])[prop];
- }
- for (var key in prop) {
- this.css(key, prop[key]);
- }
- return this;
- }
- });
- function compute(el, prop) {
- return parseInt(win.getComputedStyle(el[0], null)[prop], 10) || 0;
- }
- each(["Width", "Height"], function (v) {
- var lower = v.toLowerCase();
- fn[lower] = function () {
- return this[0].getBoundingClientRect()[lower];
- };
- fn["inner" + v] = function () {
- return this[0]["client" + v];
- };
- fn["outer" + v] = function (margins) {
- return this[0]["offset" + v] + (margins ? compute(this, "margin" + (v === "Width" ? "Left" : "Top")) + compute(this, "margin" + (v === "Width" ? "Right" : "Bottom")) : 0);
- };
- });
- function registerEvent(node, eventName, callback) {
- var eventCache = getData(node, "_cashEvents") || setData(node, "_cashEvents", {});
- eventCache[eventName] = eventCache[eventName] || [];
- eventCache[eventName].push(callback);
- node.addEventListener(eventName, callback);
- }
- function removeEvent(node, eventName, callback) {
- var events = getData(node, "_cashEvents"),
- eventCache = events && events[eventName],
- index;
- if (!eventCache) {
- return;
- }
- if (callback) {
- node.removeEventListener(eventName, callback);
- index = eventCache.indexOf(callback);
- if (index >= 0) {
- eventCache.splice(index, 1);
- }
- } else {
- each(eventCache, function (event) {
- node.removeEventListener(eventName, event);
- });
- eventCache = [];
- }
- }
- fn.extend({
- off: function (eventName, callback) {
- return this.each(function (v) {
- return removeEvent(v, eventName, callback);
- });
- },
- on: function (eventName, delegate, callback, runOnce) {
- // jshint ignore:line
- var originalCallback;
- if (!isString(eventName)) {
- for (var key in eventName) {
- this.on(key, delegate, eventName[key]);
- }
- return this;
- }
- if (isFunction(delegate)) {
- callback = delegate;
- delegate = null;
- }
- if (eventName === "ready") {
- onReady(callback);
- return this;
- }
- if (delegate) {
- originalCallback = callback;
- callback = function (e) {
- var t = e.target;
- while (!matches(t, delegate)) {
- if (t === this || t === null) {
- return t = false;
- }
- t = t.parentNode;
- }
- if (t) {
- originalCallback.call(t, e);
- }
- };
- }
- return this.each(function (v) {
- var finalCallback = callback;
- if (runOnce) {
- finalCallback = function () {
- callback.apply(this, arguments);
- removeEvent(v, eventName, finalCallback);
- };
- }
- registerEvent(v, eventName, finalCallback);
- });
- },
- one: function (eventName, delegate, callback) {
- return this.on(eventName, delegate, callback, true);
- },
- ready: onReady,
- /**
- * Modified
- * Triggers browser event
- * @param String eventName
- * @param Object data - Add properties to event object
- */
- trigger: function (eventName, data) {
- if (document.createEvent) {
- var evt = document.createEvent('HTMLEvents');
- evt.initEvent(eventName, true, false);
- evt = this.extend(evt, data);
- return this.each(function (v) {
- return v.dispatchEvent(evt);
- });
- }
- }
- });
- function encode(name, value) {
- return "&" + encodeURIComponent(name) + "=" + encodeURIComponent(value).replace(/%20/g, "+");
- }
- function getSelectMultiple_(el) {
- var values = [];
- each(el.options, function (o) {
- if (o.selected) {
- values.push(o.value);
- }
- });
- return values.length ? values : null;
- }
- function getSelectSingle_(el) {
- var selectedIndex = el.selectedIndex;
- return selectedIndex >= 0 ? el.options[selectedIndex].value : null;
- }
- function getValue(el) {
- var type = el.type;
- if (!type) {
- return null;
- }
- switch (type.toLowerCase()) {
- case "select-one":
- return getSelectSingle_(el);
- case "select-multiple":
- return getSelectMultiple_(el);
- case "radio":
- return el.checked ? el.value : null;
- case "checkbox":
- return el.checked ? el.value : null;
- default:
- return el.value ? el.value : null;
- }
- }
- fn.extend({
- serialize: function () {
- var query = "";
- each(this[0].elements || this, function (el) {
- if (el.disabled || el.tagName === "FIELDSET") {
- return;
- }
- var name = el.name;
- switch (el.type.toLowerCase()) {
- case "file":
- case "reset":
- case "submit":
- case "button":
- break;
- case "select-multiple":
- var values = getValue(el);
- if (values !== null) {
- each(values, function (value) {
- query += encode(name, value);
- });
- }
- break;
- default:
- var value = getValue(el);
- if (value !== null) {
- query += encode(name, value);
- }
- }
- });
- return query.substr(1);
- },
- val: function (value) {
- if (value === undefined) {
- return getValue(this[0]);
- }
- return this.each(function (v) {
- return v.value = value;
- });
- }
- });
- function insertElement(el, child, prepend) {
- if (prepend) {
- var first = el.childNodes[0];
- el.insertBefore(child, first);
- } else {
- el.appendChild(child);
- }
- }
- function insertContent(parent, child, prepend) {
- var str = isString(child);
- if (!str && child.length) {
- each(child, function (v) {
- return insertContent(parent, v, prepend);
- });
- return;
- }
- each(parent, str ? function (v) {
- return v.insertAdjacentHTML(prepend ? "afterbegin" : "beforeend", child);
- } : function (v, i) {
- return insertElement(v, i === 0 ? child : child.cloneNode(true), prepend);
- });
- }
- fn.extend({
- after: function (selector) {
- cash(selector).insertAfter(this);
- return this;
- },
- append: function (content) {
- insertContent(this, content);
- return this;
- },
- appendTo: function (parent) {
- insertContent(cash(parent), this);
- return this;
- },
- before: function (selector) {
- cash(selector).insertBefore(this);
- return this;
- },
- clone: function () {
- return cash(this.map(function (v) {
- return v.cloneNode(true);
- }));
- },
- empty: function () {
- this.html("");
- return this;
- },
- html: function (content) {
- if (content === undefined) {
- return this[0].innerHTML;
- }
- var source = content.nodeType ? content[0].outerHTML : content;
- return this.each(function (v) {
- return v.innerHTML = source;
- });
- },
- insertAfter: function (selector) {
- var _this = this;
- cash(selector).each(function (el, i) {
- var parent = el.parentNode,
- sibling = el.nextSibling;
- _this.each(function (v) {
- parent.insertBefore(i === 0 ? v : v.cloneNode(true), sibling);
- });
- });
- return this;
- },
- insertBefore: function (selector) {
- var _this2 = this;
- cash(selector).each(function (el, i) {
- var parent = el.parentNode;
- _this2.each(function (v) {
- parent.insertBefore(i === 0 ? v : v.cloneNode(true), el);
- });
- });
- return this;
- },
- prepend: function (content) {
- insertContent(this, content, true);
- return this;
- },
- prependTo: function (parent) {
- insertContent(cash(parent), this, true);
- return this;
- },
- remove: function () {
- return this.each(function (v) {
- if (!!v.parentNode) {
- return v.parentNode.removeChild(v);
- }
- });
- },
- text: function (content) {
- if (content === undefined) {
- return this[0].textContent;
- }
- return this.each(function (v) {
- return v.textContent = content;
- });
- }
- });
- var docEl = doc.documentElement;
- fn.extend({
- position: function () {
- var el = this[0];
- return {
- left: el.offsetLeft,
- top: el.offsetTop
- };
- },
- offset: function () {
- var rect = this[0].getBoundingClientRect();
- return {
- top: rect.top + win.pageYOffset - docEl.clientTop,
- left: rect.left + win.pageXOffset - docEl.clientLeft
- };
- },
- offsetParent: function () {
- return cash(this[0].offsetParent);
- }
- });
- fn.extend({
- children: function (selector) {
- var elems = [];
- this.each(function (el) {
- push.apply(elems, el.children);
- });
- elems = unique(elems);
- return !selector ? elems : elems.filter(function (v) {
- return matches(v, selector);
- });
- },
- closest: function (selector) {
- if (!selector || this.length < 1) {
- return cash();
- }
- if (this.is(selector)) {
- return this.filter(selector);
- }
- return this.parent().closest(selector);
- },
- is: function (selector) {
- if (!selector) {
- return false;
- }
- var match = false,
- comparator = getCompareFunction(selector);
- this.each(function (el) {
- match = comparator(el, selector);
- return !match;
- });
- return match;
- },
- find: function (selector) {
- if (!selector || selector.nodeType) {
- return cash(selector && this.has(selector).length ? selector : null);
- }
- var elems = [];
- this.each(function (el) {
- push.apply(elems, find(selector, el));
- });
- return unique(elems);
- },
- has: function (selector) {
- var comparator = isString(selector) ? function (el) {
- return find(selector, el).length !== 0;
- } : function (el) {
- return el.contains(selector);
- };
- return this.filter(comparator);
- },
- next: function () {
- return cash(this[0].nextElementSibling);
- },
- not: function (selector) {
- if (!selector) {
- return this;
- }
- var comparator = getCompareFunction(selector);
- return this.filter(function (el) {
- return !comparator(el, selector);
- });
- },
- parent: function () {
- var result = [];
- this.each(function (item) {
- if (item && item.parentNode) {
- result.push(item.parentNode);
- }
- });
- return unique(result);
- },
- parents: function (selector) {
- var last,
- result = [];
- this.each(function (item) {
- last = item;
- while (last && last.parentNode && last !== doc.body.parentNode) {
- last = last.parentNode;
- if (!selector || selector && matches(last, selector)) {
- result.push(last);
- }
- }
- });
- return unique(result);
- },
- prev: function () {
- return cash(this[0].previousElementSibling);
- },
- siblings: function (selector) {
- var collection = this.parent().children(selector),
- el = this[0];
- return collection.filter(function (i) {
- return i !== el;
- });
- }
- });
- return cash;
- });
- ;
- var Component = function () {
- /**
- * Generic constructor for all components
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Component(classDef, el, options) {
- _classCallCheck(this, Component);
- // Display error if el is valid HTML Element
- if (!(el instanceof Element)) {
- console.error(Error(el + ' is not an HTML Element'));
- }
- // If exists, destroy and reinitialize in child
- var ins = classDef.getInstance(el);
- if (!!ins) {
- ins.destroy();
- }
- this.el = el;
- this.$el = cash(el);
- }
- /**
- * Initializes components
- * @param {class} classDef
- * @param {Element | NodeList | jQuery} els
- * @param {Object} options
- */
- _createClass(Component, null, [{
- key: "init",
- value: function init(classDef, els, options) {
- var instances = null;
- if (els instanceof Element) {
- instances = new classDef(els, options);
- } else if (!!els && (els.jquery || els.cash || els instanceof NodeList)) {
- var instancesArr = [];
- for (var i = 0; i < els.length; i++) {
- instancesArr.push(new classDef(els[i], options));
- }
- instances = instancesArr;
- }
- return instances;
- }
- }]);
- return Component;
- }();
- ; // Required for Meteor package, the use of window prevents export by Meteor
- (function (window) {
- if (window.Package) {
- M = {};
- } else {
- window.M = {};
- }
- // Check for jQuery
- M.jQueryLoaded = !!window.jQuery;
- })(window);
- // AMD
- if (typeof define === 'function' && define.amd) {
- define('M', [], function () {
- return M;
- });
- // Common JS
- } else if (typeof exports !== 'undefined' && !exports.nodeType) {
- if (typeof module !== 'undefined' && !module.nodeType && module.exports) {
- exports = module.exports = M;
- }
- exports.default = M;
- }
- M.keys = {
- TAB: 9,
- ENTER: 13,
- ESC: 27,
- ARROW_UP: 38,
- ARROW_DOWN: 40
- };
- /**
- * TabPress Keydown handler
- */
- M.tabPressed = false;
- M.keyDown = false;
- var docHandleKeydown = function (e) {
- M.keyDown = true;
- if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) {
- M.tabPressed = true;
- }
- };
- var docHandleKeyup = function (e) {
- M.keyDown = false;
- if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) {
- M.tabPressed = false;
- }
- };
- var docHandleFocus = function (e) {
- if (M.keyDown) {
- document.body.classList.add('keyboard-focused');
- }
- };
- var docHandleBlur = function (e) {
- document.body.classList.remove('keyboard-focused');
- };
- document.addEventListener('keydown', docHandleKeydown, true);
- document.addEventListener('keyup', docHandleKeyup, true);
- document.addEventListener('focus', docHandleFocus, true);
- document.addEventListener('blur', docHandleBlur, true);
- /**
- * Initialize jQuery wrapper for plugin
- * @param {Class} plugin javascript class
- * @param {string} pluginName jQuery plugin name
- * @param {string} classRef Class reference name
- */
- M.initializeJqueryWrapper = function (plugin, pluginName, classRef) {
- jQuery.fn[pluginName] = function (methodOrOptions) {
- // Call plugin method if valid method name is passed in
- if (plugin.prototype[methodOrOptions]) {
- var params = Array.prototype.slice.call(arguments, 1);
- // Getter methods
- if (methodOrOptions.slice(0, 3) === 'get') {
- var instance = this.first()[0][classRef];
- return instance[methodOrOptions].apply(instance, params);
- }
- // Void methods
- return this.each(function () {
- var instance = this[classRef];
- instance[methodOrOptions].apply(instance, params);
- });
- // Initialize plugin if options or no argument is passed in
- } else if (typeof methodOrOptions === 'object' || !methodOrOptions) {
- plugin.init(this, arguments[0]);
- return this;
- }
- // Return error if an unrecognized method name is passed in
- jQuery.error("Method " + methodOrOptions + " does not exist on jQuery." + pluginName);
- };
- };
- /**
- * Automatically initialize components
- * @param {Element} context DOM Element to search within for components
- */
- M.AutoInit = function (context) {
- // Use document.body if no context is given
- var root = !!context ? context : document.body;
- var registry = {
- Autocomplete: root.querySelectorAll('.autocomplete:not(.no-autoinit)'),
- Carousel: root.querySelectorAll('.carousel:not(.no-autoinit)'),
- Chips: root.querySelectorAll('.chips:not(.no-autoinit)'),
- Collapsible: root.querySelectorAll('.collapsible:not(.no-autoinit)'),
- Datepicker: root.querySelectorAll('.datepicker:not(.no-autoinit)'),
- Dropdown: root.querySelectorAll('.dropdown-trigger:not(.no-autoinit)'),
- Materialbox: root.querySelectorAll('.materialboxed:not(.no-autoinit)'),
- Modal: root.querySelectorAll('.modal:not(.no-autoinit)'),
- Parallax: root.querySelectorAll('.parallax:not(.no-autoinit)'),
- Pushpin: root.querySelectorAll('.pushpin:not(.no-autoinit)'),
- ScrollSpy: root.querySelectorAll('.scrollspy:not(.no-autoinit)'),
- FormSelect: root.querySelectorAll('select:not(.no-autoinit)'),
- Sidenav: root.querySelectorAll('.sidenav:not(.no-autoinit)'),
- Tabs: root.querySelectorAll('.tabs:not(.no-autoinit)'),
- TapTarget: root.querySelectorAll('.tap-target:not(.no-autoinit)'),
- Timepicker: root.querySelectorAll('.timepicker:not(.no-autoinit)'),
- Tooltip: root.querySelectorAll('.tooltipped:not(.no-autoinit)'),
- FloatingActionButton: root.querySelectorAll('.fixed-action-btn:not(.no-autoinit)')
- };
- for (var pluginName in registry) {
- var plugin = M[pluginName];
- plugin.init(registry[pluginName]);
- }
- };
- /**
- * Generate approximated selector string for a jQuery object
- * @param {jQuery} obj jQuery object to be parsed
- * @returns {string}
- */
- M.objectSelectorString = function (obj) {
- var tagStr = obj.prop('tagName') || '';
- var idStr = obj.attr('id') || '';
- var classStr = obj.attr('class') || '';
- return (tagStr + idStr + classStr).replace(/\s/g, '');
- };
- // Unique Random ID
- M.guid = function () {
- function s4() {
- return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
- }
- return function () {
- return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
- };
- }();
- /**
- * Escapes hash from special characters
- * @param {string} hash String returned from this.hash
- * @returns {string}
- */
- M.escapeHash = function (hash) {
- return hash.replace(/(:|\.|\[|\]|,|=|\/)/g, '\\$1');
- };
- M.elementOrParentIsFixed = function (element) {
- var $element = $(element);
- var $checkElements = $element.add($element.parents());
- var isFixed = false;
- $checkElements.each(function () {
- if ($(this).css('position') === 'fixed') {
- isFixed = true;
- return false;
- }
- });
- return isFixed;
- };
- /**
- * @typedef {Object} Edges
- * @property {Boolean} top If the top edge was exceeded
- * @property {Boolean} right If the right edge was exceeded
- * @property {Boolean} bottom If the bottom edge was exceeded
- * @property {Boolean} left If the left edge was exceeded
- */
- /**
- * @typedef {Object} Bounding
- * @property {Number} left left offset coordinate
- * @property {Number} top top offset coordinate
- * @property {Number} width
- * @property {Number} height
- */
- /**
- * Escapes hash from special characters
- * @param {Element} container Container element that acts as the boundary
- * @param {Bounding} bounding element bounding that is being checked
- * @param {Number} offset offset from edge that counts as exceeding
- * @returns {Edges}
- */
- M.checkWithinContainer = function (container, bounding, offset) {
- var edges = {
- top: false,
- right: false,
- bottom: false,
- left: false
- };
- var containerRect = container.getBoundingClientRect();
- // If body element is smaller than viewport, use viewport height instead.
- var containerBottom = container === document.body ? Math.max(containerRect.bottom, window.innerHeight) : containerRect.bottom;
- var scrollLeft = container.scrollLeft;
- var scrollTop = container.scrollTop;
- var scrolledX = bounding.left - scrollLeft;
- var scrolledY = bounding.top - scrollTop;
- // Check for container and viewport for each edge
- if (scrolledX < containerRect.left + offset || scrolledX < offset) {
- edges.left = true;
- }
- if (scrolledX + bounding.width > containerRect.right - offset || scrolledX + bounding.width > window.innerWidth - offset) {
- edges.right = true;
- }
- if (scrolledY < containerRect.top + offset || scrolledY < offset) {
- edges.top = true;
- }
- if (scrolledY + bounding.height > containerBottom - offset || scrolledY + bounding.height > window.innerHeight - offset) {
- edges.bottom = true;
- }
- return edges;
- };
- M.checkPossibleAlignments = function (el, container, bounding, offset) {
- var canAlign = {
- top: true,
- right: true,
- bottom: true,
- left: true,
- spaceOnTop: null,
- spaceOnRight: null,
- spaceOnBottom: null,
- spaceOnLeft: null
- };
- var containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';
- var containerRect = container.getBoundingClientRect();
- var containerHeight = Math.min(containerRect.height, window.innerHeight);
- var containerWidth = Math.min(containerRect.width, window.innerWidth);
- var elOffsetRect = el.getBoundingClientRect();
- var scrollLeft = container.scrollLeft;
- var scrollTop = container.scrollTop;
- var scrolledX = bounding.left - scrollLeft;
- var scrolledYTopEdge = bounding.top - scrollTop;
- var scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;
- // Check for container and viewport for left
- canAlign.spaceOnRight = !containerAllowsOverflow ? containerWidth - (scrolledX + bounding.width) : window.innerWidth - (elOffsetRect.left + bounding.width);
- if (canAlign.spaceOnRight < 0) {
- canAlign.left = false;
- }
- // Check for container and viewport for Right
- canAlign.spaceOnLeft = !containerAllowsOverflow ? scrolledX - bounding.width + elOffsetRect.width : elOffsetRect.right - bounding.width;
- if (canAlign.spaceOnLeft < 0) {
- canAlign.right = false;
- }
- // Check for container and viewport for Top
- canAlign.spaceOnBottom = !containerAllowsOverflow ? containerHeight - (scrolledYTopEdge + bounding.height + offset) : window.innerHeight - (elOffsetRect.top + bounding.height + offset);
- if (canAlign.spaceOnBottom < 0) {
- canAlign.top = false;
- }
- // Check for container and viewport for Bottom
- canAlign.spaceOnTop = !containerAllowsOverflow ? scrolledYBottomEdge - (bounding.height - offset) : elOffsetRect.bottom - (bounding.height + offset);
- if (canAlign.spaceOnTop < 0) {
- canAlign.bottom = false;
- }
- return canAlign;
- };
- M.getOverflowParent = function (element) {
- if (element == null) {
- return null;
- }
- if (element === document.body || getComputedStyle(element).overflow !== 'visible') {
- return element;
- }
- return M.getOverflowParent(element.parentElement);
- };
- /**
- * Gets id of component from a trigger
- * @param {Element} trigger trigger
- * @returns {string}
- */
- M.getIdFromTrigger = function (trigger) {
- var id = trigger.getAttribute('data-target');
- if (!id) {
- id = trigger.getAttribute('href');
- if (id) {
- id = id.slice(1);
- } else {
- id = '';
- }
- }
- return id;
- };
- /**
- * Multi browser support for document scroll top
- * @returns {Number}
- */
- M.getDocumentScrollTop = function () {
- return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
- };
- /**
- * Multi browser support for document scroll left
- * @returns {Number}
- */
- M.getDocumentScrollLeft = function () {
- return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
- };
- /**
- * @typedef {Object} Edges
- * @property {Boolean} top If the top edge was exceeded
- * @property {Boolean} right If the right edge was exceeded
- * @property {Boolean} bottom If the bottom edge was exceeded
- * @property {Boolean} left If the left edge was exceeded
- */
- /**
- * @typedef {Object} Bounding
- * @property {Number} left left offset coordinate
- * @property {Number} top top offset coordinate
- * @property {Number} width
- * @property {Number} height
- */
- /**
- * Get time in ms
- * @license https://raw.github.com/jashkenas/underscore/master/LICENSE
- * @type {function}
- * @return {number}
- */
- var getTime = Date.now || function () {
- return new Date().getTime();
- };
- /**
- * Returns a function, that, when invoked, will only be triggered at most once
- * during a given window of time. Normally, the throttled function will run
- * as much as it can, without ever going more than once per `wait` duration;
- * but if you'd like to disable the execution on the leading edge, pass
- * `{leading: false}`. To disable execution on the trailing edge, ditto.
- * @license https://raw.github.com/jashkenas/underscore/master/LICENSE
- * @param {function} func
- * @param {number} wait
- * @param {Object=} options
- * @returns {Function}
- */
- M.throttle = function (func, wait, options) {
- var context = void 0,
- args = void 0,
- result = void 0;
- var timeout = null;
- var previous = 0;
- options || (options = {});
- var later = function () {
- previous = options.leading === false ? 0 : getTime();
- timeout = null;
- result = func.apply(context, args);
- context = args = null;
- };
- return function () {
- var now = getTime();
- if (!previous && options.leading === false) previous = now;
- var remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
- timeout = null;
- previous = now;
- result = func.apply(context, args);
- context = args = null;
- } else if (!timeout && options.trailing !== false) {
- timeout = setTimeout(later, remaining);
- }
- return result;
- };
- };
- ; /*
- v2.2.0
- 2017 Julian Garnier
- Released under the MIT license
- */
- var $jscomp = { scope: {} };$jscomp.defineProperty = "function" == typeof Object.defineProperties ? Object.defineProperty : function (e, r, p) {
- if (p.get || p.set) throw new TypeError("ES3 does not support getters and setters.");e != Array.prototype && e != Object.prototype && (e[r] = p.value);
- };$jscomp.getGlobal = function (e) {
- return "undefined" != typeof window && window === e ? e : "undefined" != typeof global && null != global ? global : e;
- };$jscomp.global = $jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX = "jscomp_symbol_";
- $jscomp.initSymbol = function () {
- $jscomp.initSymbol = function () {};$jscomp.global.Symbol || ($jscomp.global.Symbol = $jscomp.Symbol);
- };$jscomp.symbolCounter_ = 0;$jscomp.Symbol = function (e) {
- return $jscomp.SYMBOL_PREFIX + (e || "") + $jscomp.symbolCounter_++;
- };
- $jscomp.initSymbolIterator = function () {
- $jscomp.initSymbol();var e = $jscomp.global.Symbol.iterator;e || (e = $jscomp.global.Symbol.iterator = $jscomp.global.Symbol("iterator"));"function" != typeof Array.prototype[e] && $jscomp.defineProperty(Array.prototype, e, { configurable: !0, writable: !0, value: function () {
- return $jscomp.arrayIterator(this);
- } });$jscomp.initSymbolIterator = function () {};
- };$jscomp.arrayIterator = function (e) {
- var r = 0;return $jscomp.iteratorPrototype(function () {
- return r < e.length ? { done: !1, value: e[r++] } : { done: !0 };
- });
- };
- $jscomp.iteratorPrototype = function (e) {
- $jscomp.initSymbolIterator();e = { next: e };e[$jscomp.global.Symbol.iterator] = function () {
- return this;
- };return e;
- };$jscomp.array = $jscomp.array || {};$jscomp.iteratorFromArray = function (e, r) {
- $jscomp.initSymbolIterator();e instanceof String && (e += "");var p = 0,
- m = { next: function () {
- if (p < e.length) {
- var u = p++;return { value: r(u, e[u]), done: !1 };
- }m.next = function () {
- return { done: !0, value: void 0 };
- };return m.next();
- } };m[Symbol.iterator] = function () {
- return m;
- };return m;
- };
- $jscomp.polyfill = function (e, r, p, m) {
- if (r) {
- p = $jscomp.global;e = e.split(".");for (m = 0; m < e.length - 1; m++) {
- var u = e[m];u in p || (p[u] = {});p = p[u];
- }e = e[e.length - 1];m = p[e];r = r(m);r != m && null != r && $jscomp.defineProperty(p, e, { configurable: !0, writable: !0, value: r });
- }
- };$jscomp.polyfill("Array.prototype.keys", function (e) {
- return e ? e : function () {
- return $jscomp.iteratorFromArray(this, function (e) {
- return e;
- });
- };
- }, "es6-impl", "es3");var $jscomp$this = this;
- (function (r) {
- M.anime = r();
- })(function () {
- function e(a) {
- if (!h.col(a)) try {
- return document.querySelectorAll(a);
- } catch (c) {}
- }function r(a, c) {
- for (var d = a.length, b = 2 <= arguments.length ? arguments[1] : void 0, f = [], n = 0; n < d; n++) {
- if (n in a) {
- var k = a[n];c.call(b, k, n, a) && f.push(k);
- }
- }return f;
- }function p(a) {
- return a.reduce(function (a, d) {
- return a.concat(h.arr(d) ? p(d) : d);
- }, []);
- }function m(a) {
- if (h.arr(a)) return a;
- h.str(a) && (a = e(a) || a);return a instanceof NodeList || a instanceof HTMLCollection ? [].slice.call(a) : [a];
- }function u(a, c) {
- return a.some(function (a) {
- return a === c;
- });
- }function C(a) {
- var c = {},
- d;for (d in a) {
- c[d] = a[d];
- }return c;
- }function D(a, c) {
- var d = C(a),
- b;for (b in a) {
- d[b] = c.hasOwnProperty(b) ? c[b] : a[b];
- }return d;
- }function z(a, c) {
- var d = C(a),
- b;for (b in c) {
- d[b] = h.und(a[b]) ? c[b] : a[b];
- }return d;
- }function T(a) {
- a = a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (a, c, d, k) {
- return c + c + d + d + k + k;
- });var c = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a);
- a = parseInt(c[1], 16);var d = parseInt(c[2], 16),
- c = parseInt(c[3], 16);return "rgba(" + a + "," + d + "," + c + ",1)";
- }function U(a) {
- function c(a, c, b) {
- 0 > b && (b += 1);1 < b && --b;return b < 1 / 6 ? a + 6 * (c - a) * b : .5 > b ? c : b < 2 / 3 ? a + (c - a) * (2 / 3 - b) * 6 : a;
- }var d = /hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a) || /hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(a);a = parseInt(d[1]) / 360;var b = parseInt(d[2]) / 100,
- f = parseInt(d[3]) / 100,
- d = d[4] || 1;if (0 == b) f = b = a = f;else {
- var n = .5 > f ? f * (1 + b) : f + b - f * b,
- k = 2 * f - n,
- f = c(k, n, a + 1 / 3),
- b = c(k, n, a);a = c(k, n, a - 1 / 3);
- }return "rgba(" + 255 * f + "," + 255 * b + "," + 255 * a + "," + d + ")";
- }function y(a) {
- if (a = /([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a)) return a[2];
- }function V(a) {
- if (-1 < a.indexOf("translate") || "perspective" === a) return "px";if (-1 < a.indexOf("rotate") || -1 < a.indexOf("skew")) return "deg";
- }function I(a, c) {
- return h.fnc(a) ? a(c.target, c.id, c.total) : a;
- }function E(a, c) {
- if (c in a.style) return getComputedStyle(a).getPropertyValue(c.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()) || "0";
- }function J(a, c) {
- if (h.dom(a) && u(W, c)) return "transform";if (h.dom(a) && (a.getAttribute(c) || h.svg(a) && a[c])) return "attribute";if (h.dom(a) && "transform" !== c && E(a, c)) return "css";if (null != a[c]) return "object";
- }function X(a, c) {
- var d = V(c),
- d = -1 < c.indexOf("scale") ? 1 : 0 + d;a = a.style.transform;if (!a) return d;for (var b = [], f = [], n = [], k = /(\w+)\((.+?)\)/g; b = k.exec(a);) {
- f.push(b[1]), n.push(b[2]);
- }a = r(n, function (a, b) {
- return f[b] === c;
- });return a.length ? a[0] : d;
- }function K(a, c) {
- switch (J(a, c)) {case "transform":
- return X(a, c);case "css":
- return E(a, c);case "attribute":
- return a.getAttribute(c);}return a[c] || 0;
- }function L(a, c) {
- var d = /^(\*=|\+=|-=)/.exec(a);if (!d) return a;var b = y(a) || 0;c = parseFloat(c);a = parseFloat(a.replace(d[0], ""));switch (d[0][0]) {case "+":
- return c + a + b;case "-":
- return c - a + b;case "*":
- return c * a + b;}
- }function F(a, c) {
- return Math.sqrt(Math.pow(c.x - a.x, 2) + Math.pow(c.y - a.y, 2));
- }function M(a) {
- a = a.points;for (var c = 0, d, b = 0; b < a.numberOfItems; b++) {
- var f = a.getItem(b);0 < b && (c += F(d, f));d = f;
- }return c;
- }function N(a) {
- if (a.getTotalLength) return a.getTotalLength();switch (a.tagName.toLowerCase()) {case "circle":
- return 2 * Math.PI * a.getAttribute("r");case "rect":
- return 2 * a.getAttribute("width") + 2 * a.getAttribute("height");case "line":
- return F({ x: a.getAttribute("x1"), y: a.getAttribute("y1") }, { x: a.getAttribute("x2"), y: a.getAttribute("y2") });case "polyline":
- return M(a);case "polygon":
- var c = a.points;return M(a) + F(c.getItem(c.numberOfItems - 1), c.getItem(0));}
- }function Y(a, c) {
- function d(b) {
- b = void 0 === b ? 0 : b;return a.el.getPointAtLength(1 <= c + b ? c + b : 0);
- }var b = d(),
- f = d(-1),
- n = d(1);switch (a.property) {case "x":
- return b.x;case "y":
- return b.y;
- case "angle":
- return 180 * Math.atan2(n.y - f.y, n.x - f.x) / Math.PI;}
- }function O(a, c) {
- var d = /-?\d*\.?\d+/g,
- b;b = h.pth(a) ? a.totalLength : a;if (h.col(b)) {
- if (h.rgb(b)) {
- var f = /rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(b);b = f ? "rgba(" + f[1] + ",1)" : b;
- } else b = h.hex(b) ? T(b) : h.hsl(b) ? U(b) : void 0;
- } else f = (f = y(b)) ? b.substr(0, b.length - f.length) : b, b = c && !/\s/g.test(b) ? f + c : f;b += "";return { original: b, numbers: b.match(d) ? b.match(d).map(Number) : [0], strings: h.str(a) || c ? b.split(d) : [] };
- }function P(a) {
- a = a ? p(h.arr(a) ? a.map(m) : m(a)) : [];return r(a, function (a, d, b) {
- return b.indexOf(a) === d;
- });
- }function Z(a) {
- var c = P(a);return c.map(function (a, b) {
- return { target: a, id: b, total: c.length };
- });
- }function aa(a, c) {
- var d = C(c);if (h.arr(a)) {
- var b = a.length;2 !== b || h.obj(a[0]) ? h.fnc(c.duration) || (d.duration = c.duration / b) : a = { value: a };
- }return m(a).map(function (a, b) {
- b = b ? 0 : c.delay;a = h.obj(a) && !h.pth(a) ? a : { value: a };h.und(a.delay) && (a.delay = b);return a;
- }).map(function (a) {
- return z(a, d);
- });
- }function ba(a, c) {
- var d = {},
- b;for (b in a) {
- var f = I(a[b], c);h.arr(f) && (f = f.map(function (a) {
- return I(a, c);
- }), 1 === f.length && (f = f[0]));d[b] = f;
- }d.duration = parseFloat(d.duration);d.delay = parseFloat(d.delay);return d;
- }function ca(a) {
- return h.arr(a) ? A.apply(this, a) : Q[a];
- }function da(a, c) {
- var d;return a.tweens.map(function (b) {
- b = ba(b, c);var f = b.value,
- e = K(c.target, a.name),
- k = d ? d.to.original : e,
- k = h.arr(f) ? f[0] : k,
- w = L(h.arr(f) ? f[1] : f, k),
- e = y(w) || y(k) || y(e);b.from = O(k, e);b.to = O(w, e);b.start = d ? d.end : a.offset;b.end = b.start + b.delay + b.duration;b.easing = ca(b.easing);b.elasticity = (1E3 - Math.min(Math.max(b.elasticity, 1), 999)) / 1E3;b.isPath = h.pth(f);b.isColor = h.col(b.from.original);b.isColor && (b.round = 1);return d = b;
- });
- }function ea(a, c) {
- return r(p(a.map(function (a) {
- return c.map(function (b) {
- var c = J(a.target, b.name);if (c) {
- var d = da(b, a);b = { type: c, property: b.name, animatable: a, tweens: d, duration: d[d.length - 1].end, delay: d[0].delay };
- } else b = void 0;return b;
- });
- })), function (a) {
- return !h.und(a);
- });
- }function R(a, c, d, b) {
- var f = "delay" === a;return c.length ? (f ? Math.min : Math.max).apply(Math, c.map(function (b) {
- return b[a];
- })) : f ? b.delay : d.offset + b.delay + b.duration;
- }function fa(a) {
- var c = D(ga, a),
- d = D(S, a),
- b = Z(a.targets),
- f = [],
- e = z(c, d),
- k;for (k in a) {
- e.hasOwnProperty(k) || "targets" === k || f.push({ name: k, offset: e.offset, tweens: aa(a[k], d) });
- }a = ea(b, f);return z(c, { children: [], animatables: b, animations: a, duration: R("duration", a, c, d), delay: R("delay", a, c, d) });
- }function q(a) {
- function c() {
- return window.Promise && new Promise(function (a) {
- return p = a;
- });
- }function d(a) {
- return g.reversed ? g.duration - a : a;
- }function b(a) {
- for (var b = 0, c = {}, d = g.animations, f = d.length; b < f;) {
- var e = d[b],
- k = e.animatable,
- h = e.tweens,
- n = h.length - 1,
- l = h[n];n && (l = r(h, function (b) {
- return a < b.end;
- })[0] || l);for (var h = Math.min(Math.max(a - l.start - l.delay, 0), l.duration) / l.duration, w = isNaN(h) ? 1 : l.easing(h, l.elasticity), h = l.to.strings, p = l.round, n = [], m = void 0, m = l.to.numbers.length, t = 0; t < m; t++) {
- var x = void 0,
- x = l.to.numbers[t],
- q = l.from.numbers[t],
- x = l.isPath ? Y(l.value, w * x) : q + w * (x - q);p && (l.isColor && 2 < t || (x = Math.round(x * p) / p));n.push(x);
- }if (l = h.length) for (m = h[0], w = 0; w < l; w++) {
- p = h[w + 1], t = n[w], isNaN(t) || (m = p ? m + (t + p) : m + (t + " "));
- } else m = n[0];ha[e.type](k.target, e.property, m, c, k.id);e.currentValue = m;b++;
- }if (b = Object.keys(c).length) for (d = 0; d < b; d++) {
- H || (H = E(document.body, "transform") ? "transform" : "-webkit-transform"), g.animatables[d].target.style[H] = c[d].join(" ");
- }g.currentTime = a;g.progress = a / g.duration * 100;
- }function f(a) {
- if (g[a]) g[a](g);
- }function e() {
- g.remaining && !0 !== g.remaining && g.remaining--;
- }function k(a) {
- var k = g.duration,
- n = g.offset,
- w = n + g.delay,
- r = g.currentTime,
- x = g.reversed,
- q = d(a);if (g.children.length) {
- var u = g.children,
- v = u.length;
- if (q >= g.currentTime) for (var G = 0; G < v; G++) {
- u[G].seek(q);
- } else for (; v--;) {
- u[v].seek(q);
- }
- }if (q >= w || !k) g.began || (g.began = !0, f("begin")), f("run");if (q > n && q < k) b(q);else if (q <= n && 0 !== r && (b(0), x && e()), q >= k && r !== k || !k) b(k), x || e();f("update");a >= k && (g.remaining ? (t = h, "alternate" === g.direction && (g.reversed = !g.reversed)) : (g.pause(), g.completed || (g.completed = !0, f("complete"), "Promise" in window && (p(), m = c()))), l = 0);
- }a = void 0 === a ? {} : a;var h,
- t,
- l = 0,
- p = null,
- m = c(),
- g = fa(a);g.reset = function () {
- var a = g.direction,
- c = g.loop;g.currentTime = 0;g.progress = 0;g.paused = !0;g.began = !1;g.completed = !1;g.reversed = "reverse" === a;g.remaining = "alternate" === a && 1 === c ? 2 : c;b(0);for (a = g.children.length; a--;) {
- g.children[a].reset();
- }
- };g.tick = function (a) {
- h = a;t || (t = h);k((l + h - t) * q.speed);
- };g.seek = function (a) {
- k(d(a));
- };g.pause = function () {
- var a = v.indexOf(g);-1 < a && v.splice(a, 1);g.paused = !0;
- };g.play = function () {
- g.paused && (g.paused = !1, t = 0, l = d(g.currentTime), v.push(g), B || ia());
- };g.reverse = function () {
- g.reversed = !g.reversed;t = 0;l = d(g.currentTime);
- };g.restart = function () {
- g.pause();
- g.reset();g.play();
- };g.finished = m;g.reset();g.autoplay && g.play();return g;
- }var ga = { update: void 0, begin: void 0, run: void 0, complete: void 0, loop: 1, direction: "normal", autoplay: !0, offset: 0 },
- S = { duration: 1E3, delay: 0, easing: "easeOutElastic", elasticity: 500, round: 0 },
- W = "translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "),
- H,
- h = { arr: function (a) {
- return Array.isArray(a);
- }, obj: function (a) {
- return -1 < Object.prototype.toString.call(a).indexOf("Object");
- },
- pth: function (a) {
- return h.obj(a) && a.hasOwnProperty("totalLength");
- }, svg: function (a) {
- return a instanceof SVGElement;
- }, dom: function (a) {
- return a.nodeType || h.svg(a);
- }, str: function (a) {
- return "string" === typeof a;
- }, fnc: function (a) {
- return "function" === typeof a;
- }, und: function (a) {
- return "undefined" === typeof a;
- }, hex: function (a) {
- return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)
- );
- }, rgb: function (a) {
- return (/^rgb/.test(a)
- );
- }, hsl: function (a) {
- return (/^hsl/.test(a)
- );
- }, col: function (a) {
- return h.hex(a) || h.rgb(a) || h.hsl(a);
- } },
- A = function () {
- function a(a, d, b) {
- return (((1 - 3 * b + 3 * d) * a + (3 * b - 6 * d)) * a + 3 * d) * a;
- }return function (c, d, b, f) {
- if (0 <= c && 1 >= c && 0 <= b && 1 >= b) {
- var e = new Float32Array(11);if (c !== d || b !== f) for (var k = 0; 11 > k; ++k) {
- e[k] = a(.1 * k, c, b);
- }return function (k) {
- if (c === d && b === f) return k;if (0 === k) return 0;if (1 === k) return 1;for (var h = 0, l = 1; 10 !== l && e[l] <= k; ++l) {
- h += .1;
- }--l;var l = h + (k - e[l]) / (e[l + 1] - e[l]) * .1,
- n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (.001 <= n) {
- for (h = 0; 4 > h; ++h) {
- n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (0 === n) break;var m = a(l, c, b) - k,
- l = l - m / n;
- }k = l;
- } else if (0 === n) k = l;else {
- var l = h,
- h = h + .1,
- g = 0;do {
- m = l + (h - l) / 2, n = a(m, c, b) - k, 0 < n ? h = m : l = m;
- } while (1e-7 < Math.abs(n) && 10 > ++g);k = m;
- }return a(k, d, f);
- };
- }
- };
- }(),
- Q = function () {
- function a(a, b) {
- return 0 === a || 1 === a ? a : -Math.pow(2, 10 * (a - 1)) * Math.sin(2 * (a - 1 - b / (2 * Math.PI) * Math.asin(1)) * Math.PI / b);
- }var c = "Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),
- d = { In: [[.55, .085, .68, .53], [.55, .055, .675, .19], [.895, .03, .685, .22], [.755, .05, .855, .06], [.47, 0, .745, .715], [.95, .05, .795, .035], [.6, .04, .98, .335], [.6, -.28, .735, .045], a], Out: [[.25, .46, .45, .94], [.215, .61, .355, 1], [.165, .84, .44, 1], [.23, 1, .32, 1], [.39, .575, .565, 1], [.19, 1, .22, 1], [.075, .82, .165, 1], [.175, .885, .32, 1.275], function (b, c) {
- return 1 - a(1 - b, c);
- }], InOut: [[.455, .03, .515, .955], [.645, .045, .355, 1], [.77, 0, .175, 1], [.86, 0, .07, 1], [.445, .05, .55, .95], [1, 0, 0, 1], [.785, .135, .15, .86], [.68, -.55, .265, 1.55], function (b, c) {
- return .5 > b ? a(2 * b, c) / 2 : 1 - a(-2 * b + 2, c) / 2;
- }] },
- b = { linear: A(.25, .25, .75, .75) },
- f = {},
- e;for (e in d) {
- f.type = e, d[f.type].forEach(function (a) {
- return function (d, f) {
- b["ease" + a.type + c[f]] = h.fnc(d) ? d : A.apply($jscomp$this, d);
- };
- }(f)), f = { type: f.type };
- }return b;
- }(),
- ha = { css: function (a, c, d) {
- return a.style[c] = d;
- }, attribute: function (a, c, d) {
- return a.setAttribute(c, d);
- }, object: function (a, c, d) {
- return a[c] = d;
- }, transform: function (a, c, d, b, f) {
- b[f] || (b[f] = []);b[f].push(c + "(" + d + ")");
- } },
- v = [],
- B = 0,
- ia = function () {
- function a() {
- B = requestAnimationFrame(c);
- }function c(c) {
- var b = v.length;if (b) {
- for (var d = 0; d < b;) {
- v[d] && v[d].tick(c), d++;
- }a();
- } else cancelAnimationFrame(B), B = 0;
- }return a;
- }();q.version = "2.2.0";q.speed = 1;q.running = v;q.remove = function (a) {
- a = P(a);for (var c = v.length; c--;) {
- for (var d = v[c], b = d.animations, f = b.length; f--;) {
- u(a, b[f].animatable.target) && (b.splice(f, 1), b.length || d.pause());
- }
- }
- };q.getValue = K;q.path = function (a, c) {
- var d = h.str(a) ? e(a)[0] : a,
- b = c || 100;return function (a) {
- return { el: d, property: a, totalLength: N(d) * (b / 100) };
- };
- };q.setDashoffset = function (a) {
- var c = N(a);a.setAttribute("stroke-dasharray", c);return c;
- };q.bezier = A;q.easings = Q;q.timeline = function (a) {
- var c = q(a);c.pause();c.duration = 0;c.add = function (d) {
- c.children.forEach(function (a) {
- a.began = !0;a.completed = !0;
- });m(d).forEach(function (b) {
- var d = z(b, D(S, a || {}));d.targets = d.targets || a.targets;b = c.duration;var e = d.offset;d.autoplay = !1;d.direction = c.direction;d.offset = h.und(e) ? b : L(e, b);c.began = !0;c.completed = !0;c.seek(d.offset);d = q(d);d.began = !0;d.completed = !0;d.duration > b && (c.duration = d.duration);c.children.push(d);
- });c.seek(0);c.reset();c.autoplay && c.restart();return c;
- };return c;
- };q.random = function (a, c) {
- return Math.floor(Math.random() * (c - a + 1)) + a;
- };return q;
- });
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- accordion: true,
- onOpenStart: undefined,
- onOpenEnd: undefined,
- onCloseStart: undefined,
- onCloseEnd: undefined,
- inDuration: 300,
- outDuration: 300
- };
- /**
- * @class
- *
- */
- var Collapsible = function (_Component) {
- _inherits(Collapsible, _Component);
- /**
- * Construct Collapsible instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Collapsible(el, options) {
- _classCallCheck(this, Collapsible);
- var _this3 = _possibleConstructorReturn(this, (Collapsible.__proto__ || Object.getPrototypeOf(Collapsible)).call(this, Collapsible, el, options));
- _this3.el.M_Collapsible = _this3;
- /**
- * Options for the collapsible
- * @member Collapsible#options
- * @prop {Boolean} [accordion=false] - Type of the collapsible
- * @prop {Function} onOpenStart - Callback function called before collapsible is opened
- * @prop {Function} onOpenEnd - Callback function called after collapsible is opened
- * @prop {Function} onCloseStart - Callback function called before collapsible is closed
- * @prop {Function} onCloseEnd - Callback function called after collapsible is closed
- * @prop {Number} inDuration - Transition in duration in milliseconds.
- * @prop {Number} outDuration - Transition duration in milliseconds.
- */
- _this3.options = $.extend({}, Collapsible.defaults, options);
- // Setup tab indices
- _this3.$headers = _this3.$el.children('li').children('.collapsible-header');
- _this3.$headers.attr('tabindex', 0);
- _this3._setupEventHandlers();
- // Open first active
- var $activeBodies = _this3.$el.children('li.active').children('.collapsible-body');
- if (_this3.options.accordion) {
- // Handle Accordion
- $activeBodies.first().css('display', 'block');
- } else {
- // Handle Expandables
- $activeBodies.css('display', 'block');
- }
- return _this3;
- }
- _createClass(Collapsible, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.M_Collapsible = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- var _this4 = this;
- this._handleCollapsibleClickBound = this._handleCollapsibleClick.bind(this);
- this._handleCollapsibleKeydownBound = this._handleCollapsibleKeydown.bind(this);
- this.el.addEventListener('click', this._handleCollapsibleClickBound);
- this.$headers.each(function (header) {
- header.addEventListener('keydown', _this4._handleCollapsibleKeydownBound);
- });
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- var _this5 = this;
- this.el.removeEventListener('click', this._handleCollapsibleClickBound);
- this.$headers.each(function (header) {
- header.removeEventListener('keydown', _this5._handleCollapsibleKeydownBound);
- });
- }
- /**
- * Handle Collapsible Click
- * @param {Event} e
- */
- }, {
- key: "_handleCollapsibleClick",
- value: function _handleCollapsibleClick(e) {
- var $header = $(e.target).closest('.collapsible-header');
- if (e.target && $header.length) {
- var $collapsible = $header.closest('.collapsible');
- if ($collapsible[0] === this.el) {
- var $collapsibleLi = $header.closest('li');
- var $collapsibleLis = $collapsible.children('li');
- var isActive = $collapsibleLi[0].classList.contains('active');
- var index = $collapsibleLis.index($collapsibleLi);
- if (isActive) {
- this.close(index);
- } else {
- this.open(index);
- }
- }
- }
- }
- /**
- * Handle Collapsible Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleCollapsibleKeydown",
- value: function _handleCollapsibleKeydown(e) {
- if (e.keyCode === 13) {
- this._handleCollapsibleClickBound(e);
- }
- }
- /**
- * Animate in collapsible slide
- * @param {Number} index - 0th index of slide
- */
- }, {
- key: "_animateIn",
- value: function _animateIn(index) {
- var _this6 = this;
- var $collapsibleLi = this.$el.children('li').eq(index);
- if ($collapsibleLi.length) {
- var $body = $collapsibleLi.children('.collapsible-body');
- anim.remove($body[0]);
- $body.css({
- display: 'block',
- overflow: 'hidden',
- height: 0,
- paddingTop: '',
- paddingBottom: ''
- });
- var pTop = $body.css('padding-top');
- var pBottom = $body.css('padding-bottom');
- var finalHeight = $body[0].scrollHeight;
- $body.css({
- paddingTop: 0,
- paddingBottom: 0
- });
- anim({
- targets: $body[0],
- height: finalHeight,
- paddingTop: pTop,
- paddingBottom: pBottom,
- duration: this.options.inDuration,
- easing: 'easeInOutCubic',
- complete: function (anim) {
- $body.css({
- overflow: '',
- paddingTop: '',
- paddingBottom: '',
- height: ''
- });
- // onOpenEnd callback
- if (typeof _this6.options.onOpenEnd === 'function') {
- _this6.options.onOpenEnd.call(_this6, $collapsibleLi[0]);
- }
- }
- });
- }
- }
- /**
- * Animate out collapsible slide
- * @param {Number} index - 0th index of slide to open
- */
- }, {
- key: "_animateOut",
- value: function _animateOut(index) {
- var _this7 = this;
- var $collapsibleLi = this.$el.children('li').eq(index);
- if ($collapsibleLi.length) {
- var $body = $collapsibleLi.children('.collapsible-body');
- anim.remove($body[0]);
- $body.css('overflow', 'hidden');
- anim({
- targets: $body[0],
- height: 0,
- paddingTop: 0,
- paddingBottom: 0,
- duration: this.options.outDuration,
- easing: 'easeInOutCubic',
- complete: function () {
- $body.css({
- height: '',
- overflow: '',
- padding: '',
- display: ''
- });
- // onCloseEnd callback
- if (typeof _this7.options.onCloseEnd === 'function') {
- _this7.options.onCloseEnd.call(_this7, $collapsibleLi[0]);
- }
- }
- });
- }
- }
- /**
- * Open Collapsible
- * @param {Number} index - 0th index of slide
- */
- }, {
- key: "open",
- value: function open(index) {
- var _this8 = this;
- var $collapsibleLi = this.$el.children('li').eq(index);
- if ($collapsibleLi.length && !$collapsibleLi[0].classList.contains('active')) {
- // onOpenStart callback
- if (typeof this.options.onOpenStart === 'function') {
- this.options.onOpenStart.call(this, $collapsibleLi[0]);
- }
- // Handle accordion behavior
- if (this.options.accordion) {
- var $collapsibleLis = this.$el.children('li');
- var $activeLis = this.$el.children('li.active');
- $activeLis.each(function (el) {
- var index = $collapsibleLis.index($(el));
- _this8.close(index);
- });
- }
- // Animate in
- $collapsibleLi[0].classList.add('active');
- this._animateIn(index);
- }
- }
- /**
- * Close Collapsible
- * @param {Number} index - 0th index of slide
- */
- }, {
- key: "close",
- value: function close(index) {
- var $collapsibleLi = this.$el.children('li').eq(index);
- if ($collapsibleLi.length && $collapsibleLi[0].classList.contains('active')) {
- // onCloseStart callback
- if (typeof this.options.onCloseStart === 'function') {
- this.options.onCloseStart.call(this, $collapsibleLi[0]);
- }
- // Animate out
- $collapsibleLi[0].classList.remove('active');
- this._animateOut(index);
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Collapsible.__proto__ || Object.getPrototypeOf(Collapsible), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Collapsible;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Collapsible;
- }(Component);
- M.Collapsible = Collapsible;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Collapsible, 'collapsible', 'M_Collapsible');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- alignment: 'left',
- autoFocus: true,
- constrainWidth: true,
- container: null,
- coverTrigger: true,
- closeOnClick: true,
- hover: false,
- inDuration: 150,
- outDuration: 250,
- onOpenStart: null,
- onOpenEnd: null,
- onCloseStart: null,
- onCloseEnd: null,
- onItemClick: null
- };
- /**
- * @class
- */
- var Dropdown = function (_Component2) {
- _inherits(Dropdown, _Component2);
- function Dropdown(el, options) {
- _classCallCheck(this, Dropdown);
- var _this9 = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this, Dropdown, el, options));
- _this9.el.M_Dropdown = _this9;
- Dropdown._dropdowns.push(_this9);
- _this9.id = M.getIdFromTrigger(el);
- _this9.dropdownEl = document.getElementById(_this9.id);
- _this9.$dropdownEl = $(_this9.dropdownEl);
- /**
- * Options for the dropdown
- * @member Dropdown#options
- * @prop {String} [alignment='left'] - Edge which the dropdown is aligned to
- * @prop {Boolean} [autoFocus=true] - Automatically focus dropdown el for keyboard
- * @prop {Boolean} [constrainWidth=true] - Constrain width to width of the button
- * @prop {Element} container - Container element to attach dropdown to (optional)
- * @prop {Boolean} [coverTrigger=true] - Place dropdown over trigger
- * @prop {Boolean} [closeOnClick=true] - Close on click of dropdown item
- * @prop {Boolean} [hover=false] - Open dropdown on hover
- * @prop {Number} [inDuration=150] - Duration of open animation in ms
- * @prop {Number} [outDuration=250] - Duration of close animation in ms
- * @prop {Function} onOpenStart - Function called when dropdown starts opening
- * @prop {Function} onOpenEnd - Function called when dropdown finishes opening
- * @prop {Function} onCloseStart - Function called when dropdown starts closing
- * @prop {Function} onCloseEnd - Function called when dropdown finishes closing
- */
- _this9.options = $.extend({}, Dropdown.defaults, options);
- /**
- * Describes open/close state of dropdown
- * @type {Boolean}
- */
- _this9.isOpen = false;
- /**
- * Describes if dropdown content is scrollable
- * @type {Boolean}
- */
- _this9.isScrollable = false;
- /**
- * Describes if touch moving on dropdown content
- * @type {Boolean}
- */
- _this9.isTouchMoving = false;
- _this9.focusedIndex = -1;
- _this9.filterQuery = [];
- // Move dropdown-content after dropdown-trigger
- if (!!_this9.options.container) {
- $(_this9.options.container).append(_this9.dropdownEl);
- } else {
- _this9.$el.after(_this9.dropdownEl);
- }
- _this9._makeDropdownFocusable();
- _this9._resetFilterQueryBound = _this9._resetFilterQuery.bind(_this9);
- _this9._handleDocumentClickBound = _this9._handleDocumentClick.bind(_this9);
- _this9._handleDocumentTouchmoveBound = _this9._handleDocumentTouchmove.bind(_this9);
- _this9._handleDropdownClickBound = _this9._handleDropdownClick.bind(_this9);
- _this9._handleDropdownKeydownBound = _this9._handleDropdownKeydown.bind(_this9);
- _this9._handleTriggerKeydownBound = _this9._handleTriggerKeydown.bind(_this9);
- _this9._setupEventHandlers();
- return _this9;
- }
- _createClass(Dropdown, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._resetDropdownStyles();
- this._removeEventHandlers();
- Dropdown._dropdowns.splice(Dropdown._dropdowns.indexOf(this), 1);
- this.el.M_Dropdown = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- // Trigger keydown handler
- this.el.addEventListener('keydown', this._handleTriggerKeydownBound);
- // Item click handler
- this.dropdownEl.addEventListener('click', this._handleDropdownClickBound);
- // Hover event handlers
- if (this.options.hover) {
- this._handleMouseEnterBound = this._handleMouseEnter.bind(this);
- this.el.addEventListener('mouseenter', this._handleMouseEnterBound);
- this._handleMouseLeaveBound = this._handleMouseLeave.bind(this);
- this.el.addEventListener('mouseleave', this._handleMouseLeaveBound);
- this.dropdownEl.addEventListener('mouseleave', this._handleMouseLeaveBound);
- // Click event handlers
- } else {
- this._handleClickBound = this._handleClick.bind(this);
- this.el.addEventListener('click', this._handleClickBound);
- }
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('keydown', this._handleTriggerKeydownBound);
- this.dropdownEl.removeEventListener('click', this._handleDropdownClickBound);
- if (this.options.hover) {
- this.el.removeEventListener('mouseenter', this._handleMouseEnterBound);
- this.el.removeEventListener('mouseleave', this._handleMouseLeaveBound);
- this.dropdownEl.removeEventListener('mouseleave', this._handleMouseLeaveBound);
- } else {
- this.el.removeEventListener('click', this._handleClickBound);
- }
- }
- }, {
- key: "_setupTemporaryEventHandlers",
- value: function _setupTemporaryEventHandlers() {
- // Use capture phase event handler to prevent click
- document.body.addEventListener('click', this._handleDocumentClickBound, true);
- document.body.addEventListener('touchend', this._handleDocumentClickBound);
- document.body.addEventListener('touchmove', this._handleDocumentTouchmoveBound);
- this.dropdownEl.addEventListener('keydown', this._handleDropdownKeydownBound);
- }
- }, {
- key: "_removeTemporaryEventHandlers",
- value: function _removeTemporaryEventHandlers() {
- // Use capture phase event handler to prevent click
- document.body.removeEventListener('click', this._handleDocumentClickBound, true);
- document.body.removeEventListener('touchend', this._handleDocumentClickBound);
- document.body.removeEventListener('touchmove', this._handleDocumentTouchmoveBound);
- this.dropdownEl.removeEventListener('keydown', this._handleDropdownKeydownBound);
- }
- }, {
- key: "_handleClick",
- value: function _handleClick(e) {
- e.preventDefault();
- this.open();
- }
- }, {
- key: "_handleMouseEnter",
- value: function _handleMouseEnter() {
- this.open();
- }
- }, {
- key: "_handleMouseLeave",
- value: function _handleMouseLeave(e) {
- var toEl = e.toElement || e.relatedTarget;
- var leaveToDropdownContent = !!$(toEl).closest('.dropdown-content').length;
- var leaveToActiveDropdownTrigger = false;
- var $closestTrigger = $(toEl).closest('.dropdown-trigger');
- if ($closestTrigger.length && !!$closestTrigger[0].M_Dropdown && $closestTrigger[0].M_Dropdown.isOpen) {
- leaveToActiveDropdownTrigger = true;
- }
- // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content
- if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) {
- this.close();
- }
- }
- }, {
- key: "_handleDocumentClick",
- value: function _handleDocumentClick(e) {
- var _this10 = this;
- var $target = $(e.target);
- if (this.options.closeOnClick && $target.closest('.dropdown-content').length && !this.isTouchMoving) {
- // isTouchMoving to check if scrolling on mobile.
- setTimeout(function () {
- _this10.close();
- }, 0);
- } else if ($target.closest('.dropdown-trigger').length || !$target.closest('.dropdown-content').length) {
- setTimeout(function () {
- _this10.close();
- }, 0);
- }
- this.isTouchMoving = false;
- }
- }, {
- key: "_handleTriggerKeydown",
- value: function _handleTriggerKeydown(e) {
- // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Dropdown
- if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ENTER) && !this.isOpen) {
- e.preventDefault();
- this.open();
- }
- }
- /**
- * Handle Document Touchmove
- * @param {Event} e
- */
- }, {
- key: "_handleDocumentTouchmove",
- value: function _handleDocumentTouchmove(e) {
- var $target = $(e.target);
- if ($target.closest('.dropdown-content').length) {
- this.isTouchMoving = true;
- }
- }
- /**
- * Handle Dropdown Click
- * @param {Event} e
- */
- }, {
- key: "_handleDropdownClick",
- value: function _handleDropdownClick(e) {
- // onItemClick callback
- if (typeof this.options.onItemClick === 'function') {
- var itemEl = $(e.target).closest('li')[0];
- this.options.onItemClick.call(this, itemEl);
- }
- }
- /**
- * Handle Dropdown Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleDropdownKeydown",
- value: function _handleDropdownKeydown(e) {
- if (e.which === M.keys.TAB) {
- e.preventDefault();
- this.close();
- // Navigate down dropdown list
- } else if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) && this.isOpen) {
- e.preventDefault();
- var direction = e.which === M.keys.ARROW_DOWN ? 1 : -1;
- var newFocusedIndex = this.focusedIndex;
- var foundNewIndex = false;
- do {
- newFocusedIndex = newFocusedIndex + direction;
- if (!!this.dropdownEl.children[newFocusedIndex] && this.dropdownEl.children[newFocusedIndex].tabIndex !== -1) {
- foundNewIndex = true;
- break;
- }
- } while (newFocusedIndex < this.dropdownEl.children.length && newFocusedIndex >= 0);
- if (foundNewIndex) {
- this.focusedIndex = newFocusedIndex;
- this._focusFocusedItem();
- }
- // ENTER selects choice on focused item
- } else if (e.which === M.keys.ENTER && this.isOpen) {
- // Search for <a> and <button>
- var focusedElement = this.dropdownEl.children[this.focusedIndex];
- var $activatableElement = $(focusedElement).find('a, button').first();
- // Click a or button tag if exists, otherwise click li tag
- !!$activatableElement.length ? $activatableElement[0].click() : focusedElement.click();
- // Close dropdown on ESC
- } else if (e.which === M.keys.ESC && this.isOpen) {
- e.preventDefault();
- this.close();
- }
- // CASE WHEN USER TYPE LETTERS
- var letter = String.fromCharCode(e.which).toLowerCase(),
- nonLetters = [9, 13, 27, 38, 40];
- if (letter && nonLetters.indexOf(e.which) === -1) {
- this.filterQuery.push(letter);
- var string = this.filterQuery.join(''),
- newOptionEl = $(this.dropdownEl).find('li').filter(function (el) {
- return $(el).text().toLowerCase().indexOf(string) === 0;
- })[0];
- if (newOptionEl) {
- this.focusedIndex = $(newOptionEl).index();
- this._focusFocusedItem();
- }
- }
- this.filterTimeout = setTimeout(this._resetFilterQueryBound, 1000);
- }
- /**
- * Setup dropdown
- */
- }, {
- key: "_resetFilterQuery",
- value: function _resetFilterQuery() {
- this.filterQuery = [];
- }
- }, {
- key: "_resetDropdownStyles",
- value: function _resetDropdownStyles() {
- this.$dropdownEl.css({
- display: '',
- width: '',
- height: '',
- left: '',
- top: '',
- 'transform-origin': '',
- transform: '',
- opacity: ''
- });
- }
- }, {
- key: "_makeDropdownFocusable",
- value: function _makeDropdownFocusable() {
- // Needed for arrow key navigation
- this.dropdownEl.tabIndex = 0;
- // Only set tabindex if it hasn't been set by user
- $(this.dropdownEl).children().each(function (el) {
- if (!el.getAttribute('tabindex')) {
- el.setAttribute('tabindex', 0);
- }
- });
- }
- }, {
- key: "_focusFocusedItem",
- value: function _focusFocusedItem() {
- if (this.focusedIndex >= 0 && this.focusedIndex < this.dropdownEl.children.length && this.options.autoFocus) {
- this.dropdownEl.children[this.focusedIndex].focus();
- }
- }
- }, {
- key: "_getDropdownPosition",
- value: function _getDropdownPosition() {
- var offsetParentBRect = this.el.offsetParent.getBoundingClientRect();
- var triggerBRect = this.el.getBoundingClientRect();
- var dropdownBRect = this.dropdownEl.getBoundingClientRect();
- var idealHeight = dropdownBRect.height;
- var idealWidth = dropdownBRect.width;
- var idealXPos = triggerBRect.left - dropdownBRect.left;
- var idealYPos = triggerBRect.top - dropdownBRect.top;
- var dropdownBounds = {
- left: idealXPos,
- top: idealYPos,
- height: idealHeight,
- width: idealWidth
- };
- // Countainer here will be closest ancestor with overflow: hidden
- var closestOverflowParent = !!this.dropdownEl.offsetParent ? this.dropdownEl.offsetParent : this.dropdownEl.parentNode;
- var alignments = M.checkPossibleAlignments(this.el, closestOverflowParent, dropdownBounds, this.options.coverTrigger ? 0 : triggerBRect.height);
- var verticalAlignment = 'top';
- var horizontalAlignment = this.options.alignment;
- idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;
- // Reset isScrollable
- this.isScrollable = false;
- if (!alignments.top) {
- if (alignments.bottom) {
- verticalAlignment = 'bottom';
- } else {
- this.isScrollable = true;
- // Determine which side has most space and cutoff at correct height
- if (alignments.spaceOnTop > alignments.spaceOnBottom) {
- verticalAlignment = 'bottom';
- idealHeight += alignments.spaceOnTop;
- idealYPos -= alignments.spaceOnTop;
- } else {
- idealHeight += alignments.spaceOnBottom;
- }
- }
- }
- // If preferred horizontal alignment is possible
- if (!alignments[horizontalAlignment]) {
- var oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';
- if (alignments[oppositeAlignment]) {
- horizontalAlignment = oppositeAlignment;
- } else {
- // Determine which side has most space and cutoff at correct height
- if (alignments.spaceOnLeft > alignments.spaceOnRight) {
- horizontalAlignment = 'right';
- idealWidth += alignments.spaceOnLeft;
- idealXPos -= alignments.spaceOnLeft;
- } else {
- horizontalAlignment = 'left';
- idealWidth += alignments.spaceOnRight;
- }
- }
- }
- if (verticalAlignment === 'bottom') {
- idealYPos = idealYPos - dropdownBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);
- }
- if (horizontalAlignment === 'right') {
- idealXPos = idealXPos - dropdownBRect.width + triggerBRect.width;
- }
- return {
- x: idealXPos,
- y: idealYPos,
- verticalAlignment: verticalAlignment,
- horizontalAlignment: horizontalAlignment,
- height: idealHeight,
- width: idealWidth
- };
- }
- /**
- * Animate in dropdown
- */
- }, {
- key: "_animateIn",
- value: function _animateIn() {
- var _this11 = this;
- anim.remove(this.dropdownEl);
- anim({
- targets: this.dropdownEl,
- opacity: {
- value: [0, 1],
- easing: 'easeOutQuad'
- },
- scaleX: [0.3, 1],
- scaleY: [0.3, 1],
- duration: this.options.inDuration,
- easing: 'easeOutQuint',
- complete: function (anim) {
- if (_this11.options.autoFocus) {
- _this11.dropdownEl.focus();
- }
- // onOpenEnd callback
- if (typeof _this11.options.onOpenEnd === 'function') {
- var elem = anim.animatables[0].target;
- _this11.options.onOpenEnd.call(elem, _this11.el);
- }
- }
- });
- }
- /**
- * Animate out dropdown
- */
- }, {
- key: "_animateOut",
- value: function _animateOut() {
- var _this12 = this;
- anim.remove(this.dropdownEl);
- anim({
- targets: this.dropdownEl,
- opacity: {
- value: 0,
- easing: 'easeOutQuint'
- },
- scaleX: 0.3,
- scaleY: 0.3,
- duration: this.options.outDuration,
- easing: 'easeOutQuint',
- complete: function (anim) {
- _this12._resetDropdownStyles();
- // onCloseEnd callback
- if (typeof _this12.options.onCloseEnd === 'function') {
- var elem = anim.animatables[0].target;
- _this12.options.onCloseEnd.call(_this12, _this12.el);
- }
- }
- });
- }
- /**
- * Place dropdown
- */
- }, {
- key: "_placeDropdown",
- value: function _placeDropdown() {
- // Set width before calculating positionInfo
- var idealWidth = this.options.constrainWidth ? this.el.getBoundingClientRect().width : this.dropdownEl.getBoundingClientRect().width;
- this.dropdownEl.style.width = idealWidth + 'px';
- var positionInfo = this._getDropdownPosition();
- this.dropdownEl.style.left = positionInfo.x + 'px';
- this.dropdownEl.style.top = positionInfo.y + 'px';
- this.dropdownEl.style.height = positionInfo.height + 'px';
- this.dropdownEl.style.width = positionInfo.width + 'px';
- this.dropdownEl.style.transformOrigin = (positionInfo.horizontalAlignment === 'left' ? '0' : '100%') + " " + (positionInfo.verticalAlignment === 'top' ? '0' : '100%');
- }
- /**
- * Open Dropdown
- */
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen) {
- return;
- }
- this.isOpen = true;
- // onOpenStart callback
- if (typeof this.options.onOpenStart === 'function') {
- this.options.onOpenStart.call(this, this.el);
- }
- // Reset styles
- this._resetDropdownStyles();
- this.dropdownEl.style.display = 'block';
- this._placeDropdown();
- this._animateIn();
- this._setupTemporaryEventHandlers();
- }
- /**
- * Close Dropdown
- */
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- this.isOpen = false;
- this.focusedIndex = -1;
- // onCloseStart callback
- if (typeof this.options.onCloseStart === 'function') {
- this.options.onCloseStart.call(this, this.el);
- }
- this._animateOut();
- this._removeTemporaryEventHandlers();
- if (this.options.autoFocus) {
- this.el.focus();
- }
- }
- /**
- * Recalculate dimensions
- */
- }, {
- key: "recalculateDimensions",
- value: function recalculateDimensions() {
- if (this.isOpen) {
- this.$dropdownEl.css({
- width: '',
- height: '',
- left: '',
- top: '',
- 'transform-origin': ''
- });
- this._placeDropdown();
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Dropdown.__proto__ || Object.getPrototypeOf(Dropdown), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Dropdown;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Dropdown;
- }(Component);
- /**
- * @static
- * @memberof Dropdown
- */
- Dropdown._dropdowns = [];
- window.M.Dropdown = Dropdown;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Dropdown, 'dropdown', 'M_Dropdown');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- opacity: 0.5,
- inDuration: 250,
- outDuration: 250,
- onOpenStart: null,
- onOpenEnd: null,
- onCloseStart: null,
- onCloseEnd: null,
- preventScrolling: true,
- dismissible: true,
- startingTop: '4%',
- endingTop: '10%'
- };
- /**
- * @class
- *
- */
- var Modal = function (_Component3) {
- _inherits(Modal, _Component3);
- /**
- * Construct Modal instance and set up overlay
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Modal(el, options) {
- _classCallCheck(this, Modal);
- var _this13 = _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, Modal, el, options));
- _this13.el.M_Modal = _this13;
- /**
- * Options for the modal
- * @member Modal#options
- * @prop {Number} [opacity=0.5] - Opacity of the modal overlay
- * @prop {Number} [inDuration=250] - Length in ms of enter transition
- * @prop {Number} [outDuration=250] - Length in ms of exit transition
- * @prop {Function} onOpenStart - Callback function called before modal is opened
- * @prop {Function} onOpenEnd - Callback function called after modal is opened
- * @prop {Function} onCloseStart - Callback function called before modal is closed
- * @prop {Function} onCloseEnd - Callback function called after modal is closed
- * @prop {Boolean} [dismissible=true] - Allow modal to be dismissed by keyboard or overlay click
- * @prop {String} [startingTop='4%'] - startingTop
- * @prop {String} [endingTop='10%'] - endingTop
- */
- _this13.options = $.extend({}, Modal.defaults, options);
- /**
- * Describes open/close state of modal
- * @type {Boolean}
- */
- _this13.isOpen = false;
- _this13.id = _this13.$el.attr('id');
- _this13._openingTrigger = undefined;
- _this13.$overlay = $('<div class="modal-overlay"></div>');
- _this13.el.tabIndex = 0;
- _this13._nthModalOpened = 0;
- Modal._count++;
- _this13._setupEventHandlers();
- return _this13;
- }
- _createClass(Modal, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- Modal._count--;
- this._removeEventHandlers();
- this.el.removeAttribute('style');
- this.$overlay.remove();
- this.el.M_Modal = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleOverlayClickBound = this._handleOverlayClick.bind(this);
- this._handleModalCloseClickBound = this._handleModalCloseClick.bind(this);
- if (Modal._count === 1) {
- document.body.addEventListener('click', this._handleTriggerClick);
- }
- this.$overlay[0].addEventListener('click', this._handleOverlayClickBound);
- this.el.addEventListener('click', this._handleModalCloseClickBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- if (Modal._count === 0) {
- document.body.removeEventListener('click', this._handleTriggerClick);
- }
- this.$overlay[0].removeEventListener('click', this._handleOverlayClickBound);
- this.el.removeEventListener('click', this._handleModalCloseClickBound);
- }
- /**
- * Handle Trigger Click
- * @param {Event} e
- */
- }, {
- key: "_handleTriggerClick",
- value: function _handleTriggerClick(e) {
- var $trigger = $(e.target).closest('.modal-trigger');
- if ($trigger.length) {
- var modalId = M.getIdFromTrigger($trigger[0]);
- var modalInstance = document.getElementById(modalId).M_Modal;
- if (modalInstance) {
- modalInstance.open($trigger);
- }
- e.preventDefault();
- }
- }
- /**
- * Handle Overlay Click
- */
- }, {
- key: "_handleOverlayClick",
- value: function _handleOverlayClick() {
- if (this.options.dismissible) {
- this.close();
- }
- }
- /**
- * Handle Modal Close Click
- * @param {Event} e
- */
- }, {
- key: "_handleModalCloseClick",
- value: function _handleModalCloseClick(e) {
- var $closeTrigger = $(e.target).closest('.modal-close');
- if ($closeTrigger.length) {
- this.close();
- }
- }
- /**
- * Handle Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleKeydown",
- value: function _handleKeydown(e) {
- // ESC key
- if (e.keyCode === 27 && this.options.dismissible) {
- this.close();
- }
- }
- /**
- * Handle Focus
- * @param {Event} e
- */
- }, {
- key: "_handleFocus",
- value: function _handleFocus(e) {
- // Only trap focus if this modal is the last model opened (prevents loops in nested modals).
- if (!this.el.contains(e.target) && this._nthModalOpened === Modal._modalsOpen) {
- this.el.focus();
- }
- }
- /**
- * Animate in modal
- */
- }, {
- key: "_animateIn",
- value: function _animateIn() {
- var _this14 = this;
- // Set initial styles
- $.extend(this.el.style, {
- display: 'block',
- opacity: 0
- });
- $.extend(this.$overlay[0].style, {
- display: 'block',
- opacity: 0
- });
- // Animate overlay
- anim({
- targets: this.$overlay[0],
- opacity: this.options.opacity,
- duration: this.options.inDuration,
- easing: 'easeOutQuad'
- });
- // Define modal animation options
- var enterAnimOptions = {
- targets: this.el,
- duration: this.options.inDuration,
- easing: 'easeOutCubic',
- // Handle modal onOpenEnd callback
- complete: function () {
- if (typeof _this14.options.onOpenEnd === 'function') {
- _this14.options.onOpenEnd.call(_this14, _this14.el, _this14._openingTrigger);
- }
- }
- };
- // Bottom sheet animation
- if (this.el.classList.contains('bottom-sheet')) {
- $.extend(enterAnimOptions, {
- bottom: 0,
- opacity: 1
- });
- anim(enterAnimOptions);
- // Normal modal animation
- } else {
- $.extend(enterAnimOptions, {
- top: [this.options.startingTop, this.options.endingTop],
- opacity: 1,
- scaleX: [0.8, 1],
- scaleY: [0.8, 1]
- });
- anim(enterAnimOptions);
- }
- }
- /**
- * Animate out modal
- */
- }, {
- key: "_animateOut",
- value: function _animateOut() {
- var _this15 = this;
- // Animate overlay
- anim({
- targets: this.$overlay[0],
- opacity: 0,
- duration: this.options.outDuration,
- easing: 'easeOutQuart'
- });
- // Define modal animation options
- var exitAnimOptions = {
- targets: this.el,
- duration: this.options.outDuration,
- easing: 'easeOutCubic',
- // Handle modal ready callback
- complete: function () {
- _this15.el.style.display = 'none';
- _this15.$overlay.remove();
- // Call onCloseEnd callback
- if (typeof _this15.options.onCloseEnd === 'function') {
- _this15.options.onCloseEnd.call(_this15, _this15.el);
- }
- }
- };
- // Bottom sheet animation
- if (this.el.classList.contains('bottom-sheet')) {
- $.extend(exitAnimOptions, {
- bottom: '-100%',
- opacity: 0
- });
- anim(exitAnimOptions);
- // Normal modal animation
- } else {
- $.extend(exitAnimOptions, {
- top: [this.options.endingTop, this.options.startingTop],
- opacity: 0,
- scaleX: 0.8,
- scaleY: 0.8
- });
- anim(exitAnimOptions);
- }
- }
- /**
- * Open Modal
- * @param {cash} [$trigger]
- */
- }, {
- key: "open",
- value: function open($trigger) {
- if (this.isOpen) {
- return;
- }
- this.isOpen = true;
- Modal._modalsOpen++;
- this._nthModalOpened = Modal._modalsOpen;
- // Set Z-Index based on number of currently open modals
- this.$overlay[0].style.zIndex = 1000 + Modal._modalsOpen * 2;
- this.el.style.zIndex = 1000 + Modal._modalsOpen * 2 + 1;
- // Set opening trigger, undefined indicates modal was opened by javascript
- this._openingTrigger = !!$trigger ? $trigger[0] : undefined;
- // onOpenStart callback
- if (typeof this.options.onOpenStart === 'function') {
- this.options.onOpenStart.call(this, this.el, this._openingTrigger);
- }
- if (this.options.preventScrolling) {
- document.body.style.overflow = 'hidden';
- }
- this.el.classList.add('open');
- this.el.insertAdjacentElement('afterend', this.$overlay[0]);
- if (this.options.dismissible) {
- this._handleKeydownBound = this._handleKeydown.bind(this);
- this._handleFocusBound = this._handleFocus.bind(this);
- document.addEventListener('keydown', this._handleKeydownBound);
- document.addEventListener('focus', this._handleFocusBound, true);
- }
- anim.remove(this.el);
- anim.remove(this.$overlay[0]);
- this._animateIn();
- // Focus modal
- this.el.focus();
- return this;
- }
- /**
- * Close Modal
- */
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- this.isOpen = false;
- Modal._modalsOpen--;
- this._nthModalOpened = 0;
- // Call onCloseStart callback
- if (typeof this.options.onCloseStart === 'function') {
- this.options.onCloseStart.call(this, this.el);
- }
- this.el.classList.remove('open');
- // Enable body scrolling only if there are no more modals open.
- if (Modal._modalsOpen === 0) {
- document.body.style.overflow = '';
- }
- if (this.options.dismissible) {
- document.removeEventListener('keydown', this._handleKeydownBound);
- document.removeEventListener('focus', this._handleFocusBound, true);
- }
- anim.remove(this.el);
- anim.remove(this.$overlay[0]);
- this._animateOut();
- return this;
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Modal.__proto__ || Object.getPrototypeOf(Modal), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Modal;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Modal;
- }(Component);
- /**
- * @static
- * @memberof Modal
- */
- Modal._modalsOpen = 0;
- /**
- * @static
- * @memberof Modal
- */
- Modal._count = 0;
- M.Modal = Modal;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Modal, 'modal', 'M_Modal');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- inDuration: 275,
- outDuration: 200,
- onOpenStart: null,
- onOpenEnd: null,
- onCloseStart: null,
- onCloseEnd: null
- };
- /**
- * @class
- *
- */
- var Materialbox = function (_Component4) {
- _inherits(Materialbox, _Component4);
- /**
- * Construct Materialbox instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Materialbox(el, options) {
- _classCallCheck(this, Materialbox);
- var _this16 = _possibleConstructorReturn(this, (Materialbox.__proto__ || Object.getPrototypeOf(Materialbox)).call(this, Materialbox, el, options));
- _this16.el.M_Materialbox = _this16;
- /**
- * Options for the modal
- * @member Materialbox#options
- * @prop {Number} [inDuration=275] - Length in ms of enter transition
- * @prop {Number} [outDuration=200] - Length in ms of exit transition
- * @prop {Function} onOpenStart - Callback function called before materialbox is opened
- * @prop {Function} onOpenEnd - Callback function called after materialbox is opened
- * @prop {Function} onCloseStart - Callback function called before materialbox is closed
- * @prop {Function} onCloseEnd - Callback function called after materialbox is closed
- */
- _this16.options = $.extend({}, Materialbox.defaults, options);
- _this16.overlayActive = false;
- _this16.doneAnimating = true;
- _this16.placeholder = $('<div></div>').addClass('material-placeholder');
- _this16.originalWidth = 0;
- _this16.originalHeight = 0;
- _this16.originInlineStyles = _this16.$el.attr('style');
- _this16.caption = _this16.el.getAttribute('data-caption') || '';
- // Wrap
- _this16.$el.before(_this16.placeholder);
- _this16.placeholder.append(_this16.$el);
- _this16._setupEventHandlers();
- return _this16;
- }
- _createClass(Materialbox, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.M_Materialbox = undefined;
- // Unwrap image
- $(this.placeholder).after(this.el).remove();
- this.$el.removeAttr('style');
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleMaterialboxClickBound = this._handleMaterialboxClick.bind(this);
- this.el.addEventListener('click', this._handleMaterialboxClickBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('click', this._handleMaterialboxClickBound);
- }
- /**
- * Handle Materialbox Click
- * @param {Event} e
- */
- }, {
- key: "_handleMaterialboxClick",
- value: function _handleMaterialboxClick(e) {
- // If already modal, return to original
- if (this.doneAnimating === false || this.overlayActive && this.doneAnimating) {
- this.close();
- } else {
- this.open();
- }
- }
- /**
- * Handle Window Scroll
- */
- }, {
- key: "_handleWindowScroll",
- value: function _handleWindowScroll() {
- if (this.overlayActive) {
- this.close();
- }
- }
- /**
- * Handle Window Resize
- */
- }, {
- key: "_handleWindowResize",
- value: function _handleWindowResize() {
- if (this.overlayActive) {
- this.close();
- }
- }
- /**
- * Handle Window Resize
- * @param {Event} e
- */
- }, {
- key: "_handleWindowEscape",
- value: function _handleWindowEscape(e) {
- // ESC key
- if (e.keyCode === 27 && this.doneAnimating && this.overlayActive) {
- this.close();
- }
- }
- /**
- * Find ancestors with overflow: hidden; and make visible
- */
- }, {
- key: "_makeAncestorsOverflowVisible",
- value: function _makeAncestorsOverflowVisible() {
- this.ancestorsChanged = $();
- var ancestor = this.placeholder[0].parentNode;
- while (ancestor !== null && !$(ancestor).is(document)) {
- var curr = $(ancestor);
- if (curr.css('overflow') !== 'visible') {
- curr.css('overflow', 'visible');
- if (this.ancestorsChanged === undefined) {
- this.ancestorsChanged = curr;
- } else {
- this.ancestorsChanged = this.ancestorsChanged.add(curr);
- }
- }
- ancestor = ancestor.parentNode;
- }
- }
- /**
- * Animate image in
- */
- }, {
- key: "_animateImageIn",
- value: function _animateImageIn() {
- var _this17 = this;
- var animOptions = {
- targets: this.el,
- height: [this.originalHeight, this.newHeight],
- width: [this.originalWidth, this.newWidth],
- left: M.getDocumentScrollLeft() + this.windowWidth / 2 - this.placeholder.offset().left - this.newWidth / 2,
- top: M.getDocumentScrollTop() + this.windowHeight / 2 - this.placeholder.offset().top - this.newHeight / 2,
- duration: this.options.inDuration,
- easing: 'easeOutQuad',
- complete: function () {
- _this17.doneAnimating = true;
- // onOpenEnd callback
- if (typeof _this17.options.onOpenEnd === 'function') {
- _this17.options.onOpenEnd.call(_this17, _this17.el);
- }
- }
- };
- // Override max-width or max-height if needed
- this.maxWidth = this.$el.css('max-width');
- this.maxHeight = this.$el.css('max-height');
- if (this.maxWidth !== 'none') {
- animOptions.maxWidth = this.newWidth;
- }
- if (this.maxHeight !== 'none') {
- animOptions.maxHeight = this.newHeight;
- }
- anim(animOptions);
- }
- /**
- * Animate image out
- */
- }, {
- key: "_animateImageOut",
- value: function _animateImageOut() {
- var _this18 = this;
- var animOptions = {
- targets: this.el,
- width: this.originalWidth,
- height: this.originalHeight,
- left: 0,
- top: 0,
- duration: this.options.outDuration,
- easing: 'easeOutQuad',
- complete: function () {
- _this18.placeholder.css({
- height: '',
- width: '',
- position: '',
- top: '',
- left: ''
- });
- // Revert to width or height attribute
- if (_this18.attrWidth) {
- _this18.$el.attr('width', _this18.attrWidth);
- }
- if (_this18.attrHeight) {
- _this18.$el.attr('height', _this18.attrHeight);
- }
- _this18.$el.removeAttr('style');
- _this18.originInlineStyles && _this18.$el.attr('style', _this18.originInlineStyles);
- // Remove class
- _this18.$el.removeClass('active');
- _this18.doneAnimating = true;
- // Remove overflow overrides on ancestors
- if (_this18.ancestorsChanged.length) {
- _this18.ancestorsChanged.css('overflow', '');
- }
- // onCloseEnd callback
- if (typeof _this18.options.onCloseEnd === 'function') {
- _this18.options.onCloseEnd.call(_this18, _this18.el);
- }
- }
- };
- anim(animOptions);
- }
- /**
- * Update open and close vars
- */
- }, {
- key: "_updateVars",
- value: function _updateVars() {
- this.windowWidth = window.innerWidth;
- this.windowHeight = window.innerHeight;
- this.caption = this.el.getAttribute('data-caption') || '';
- }
- /**
- * Open Materialbox
- */
- }, {
- key: "open",
- value: function open() {
- var _this19 = this;
- this._updateVars();
- this.originalWidth = this.el.getBoundingClientRect().width;
- this.originalHeight = this.el.getBoundingClientRect().height;
- // Set states
- this.doneAnimating = false;
- this.$el.addClass('active');
- this.overlayActive = true;
- // onOpenStart callback
- if (typeof this.options.onOpenStart === 'function') {
- this.options.onOpenStart.call(this, this.el);
- }
- // Set positioning for placeholder
- this.placeholder.css({
- width: this.placeholder[0].getBoundingClientRect().width + 'px',
- height: this.placeholder[0].getBoundingClientRect().height + 'px',
- position: 'relative',
- top: 0,
- left: 0
- });
- this._makeAncestorsOverflowVisible();
- // Set css on origin
- this.$el.css({
- position: 'absolute',
- 'z-index': 1000,
- 'will-change': 'left, top, width, height'
- });
- // Change from width or height attribute to css
- this.attrWidth = this.$el.attr('width');
- this.attrHeight = this.$el.attr('height');
- if (this.attrWidth) {
- this.$el.css('width', this.attrWidth + 'px');
- this.$el.removeAttr('width');
- }
- if (this.attrHeight) {
- this.$el.css('width', this.attrHeight + 'px');
- this.$el.removeAttr('height');
- }
- // Add overlay
- this.$overlay = $('<div id="materialbox-overlay"></div>').css({
- opacity: 0
- }).one('click', function () {
- if (_this19.doneAnimating) {
- _this19.close();
- }
- });
- // Put before in origin image to preserve z-index layering.
- this.$el.before(this.$overlay);
- // Set dimensions if needed
- var overlayOffset = this.$overlay[0].getBoundingClientRect();
- this.$overlay.css({
- width: this.windowWidth + 'px',
- height: this.windowHeight + 'px',
- left: -1 * overlayOffset.left + 'px',
- top: -1 * overlayOffset.top + 'px'
- });
- anim.remove(this.el);
- anim.remove(this.$overlay[0]);
- // Animate Overlay
- anim({
- targets: this.$overlay[0],
- opacity: 1,
- duration: this.options.inDuration,
- easing: 'easeOutQuad'
- });
- // Add and animate caption if it exists
- if (this.caption !== '') {
- if (this.$photocaption) {
- anim.remove(this.$photoCaption[0]);
- }
- this.$photoCaption = $('<div class="materialbox-caption"></div>');
- this.$photoCaption.text(this.caption);
- $('body').append(this.$photoCaption);
- this.$photoCaption.css({ display: 'inline' });
- anim({
- targets: this.$photoCaption[0],
- opacity: 1,
- duration: this.options.inDuration,
- easing: 'easeOutQuad'
- });
- }
- // Resize Image
- var ratio = 0;
- var widthPercent = this.originalWidth / this.windowWidth;
- var heightPercent = this.originalHeight / this.windowHeight;
- this.newWidth = 0;
- this.newHeight = 0;
- if (widthPercent > heightPercent) {
- ratio = this.originalHeight / this.originalWidth;
- this.newWidth = this.windowWidth * 0.9;
- this.newHeight = this.windowWidth * 0.9 * ratio;
- } else {
- ratio = this.originalWidth / this.originalHeight;
- this.newWidth = this.windowHeight * 0.9 * ratio;
- this.newHeight = this.windowHeight * 0.9;
- }
- this._animateImageIn();
- // Handle Exit triggers
- this._handleWindowScrollBound = this._handleWindowScroll.bind(this);
- this._handleWindowResizeBound = this._handleWindowResize.bind(this);
- this._handleWindowEscapeBound = this._handleWindowEscape.bind(this);
- window.addEventListener('scroll', this._handleWindowScrollBound);
- window.addEventListener('resize', this._handleWindowResizeBound);
- window.addEventListener('keyup', this._handleWindowEscapeBound);
- }
- /**
- * Close Materialbox
- */
- }, {
- key: "close",
- value: function close() {
- var _this20 = this;
- this._updateVars();
- this.doneAnimating = false;
- // onCloseStart callback
- if (typeof this.options.onCloseStart === 'function') {
- this.options.onCloseStart.call(this, this.el);
- }
- anim.remove(this.el);
- anim.remove(this.$overlay[0]);
- if (this.caption !== '') {
- anim.remove(this.$photoCaption[0]);
- }
- // disable exit handlers
- window.removeEventListener('scroll', this._handleWindowScrollBound);
- window.removeEventListener('resize', this._handleWindowResizeBound);
- window.removeEventListener('keyup', this._handleWindowEscapeBound);
- anim({
- targets: this.$overlay[0],
- opacity: 0,
- duration: this.options.outDuration,
- easing: 'easeOutQuad',
- complete: function () {
- _this20.overlayActive = false;
- _this20.$overlay.remove();
- }
- });
- this._animateImageOut();
- // Remove Caption + reset css settings on image
- if (this.caption !== '') {
- anim({
- targets: this.$photoCaption[0],
- opacity: 0,
- duration: this.options.outDuration,
- easing: 'easeOutQuad',
- complete: function () {
- _this20.$photoCaption.remove();
- }
- });
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Materialbox.__proto__ || Object.getPrototypeOf(Materialbox), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Materialbox;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Materialbox;
- }(Component);
- M.Materialbox = Materialbox;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Materialbox, 'materialbox', 'M_Materialbox');
- }
- })(cash, M.anime);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- responsiveThreshold: 0 // breakpoint for swipeable
- };
- var Parallax = function (_Component5) {
- _inherits(Parallax, _Component5);
- function Parallax(el, options) {
- _classCallCheck(this, Parallax);
- var _this21 = _possibleConstructorReturn(this, (Parallax.__proto__ || Object.getPrototypeOf(Parallax)).call(this, Parallax, el, options));
- _this21.el.M_Parallax = _this21;
- /**
- * Options for the Parallax
- * @member Parallax#options
- * @prop {Number} responsiveThreshold
- */
- _this21.options = $.extend({}, Parallax.defaults, options);
- _this21._enabled = window.innerWidth > _this21.options.responsiveThreshold;
- _this21.$img = _this21.$el.find('img').first();
- _this21.$img.each(function () {
- var el = this;
- if (el.complete) $(el).trigger('load');
- });
- _this21._updateParallax();
- _this21._setupEventHandlers();
- _this21._setupStyles();
- Parallax._parallaxes.push(_this21);
- return _this21;
- }
- _createClass(Parallax, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- Parallax._parallaxes.splice(Parallax._parallaxes.indexOf(this), 1);
- this.$img[0].style.transform = '';
- this._removeEventHandlers();
- this.$el[0].M_Parallax = undefined;
- }
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleImageLoadBound = this._handleImageLoad.bind(this);
- this.$img[0].addEventListener('load', this._handleImageLoadBound);
- if (Parallax._parallaxes.length === 0) {
- Parallax._handleScrollThrottled = M.throttle(Parallax._handleScroll, 5);
- window.addEventListener('scroll', Parallax._handleScrollThrottled);
- Parallax._handleWindowResizeThrottled = M.throttle(Parallax._handleWindowResize, 5);
- window.addEventListener('resize', Parallax._handleWindowResizeThrottled);
- }
- }
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.$img[0].removeEventListener('load', this._handleImageLoadBound);
- if (Parallax._parallaxes.length === 0) {
- window.removeEventListener('scroll', Parallax._handleScrollThrottled);
- window.removeEventListener('resize', Parallax._handleWindowResizeThrottled);
- }
- }
- }, {
- key: "_setupStyles",
- value: function _setupStyles() {
- this.$img[0].style.opacity = 1;
- }
- }, {
- key: "_handleImageLoad",
- value: function _handleImageLoad() {
- this._updateParallax();
- }
- }, {
- key: "_updateParallax",
- value: function _updateParallax() {
- var containerHeight = this.$el.height() > 0 ? this.el.parentNode.offsetHeight : 500;
- var imgHeight = this.$img[0].offsetHeight;
- var parallaxDist = imgHeight - containerHeight;
- var bottom = this.$el.offset().top + containerHeight;
- var top = this.$el.offset().top;
- var scrollTop = M.getDocumentScrollTop();
- var windowHeight = window.innerHeight;
- var windowBottom = scrollTop + windowHeight;
- var percentScrolled = (windowBottom - top) / (containerHeight + windowHeight);
- var parallax = parallaxDist * percentScrolled;
- if (!this._enabled) {
- this.$img[0].style.transform = '';
- } else if (bottom > scrollTop && top < scrollTop + windowHeight) {
- this.$img[0].style.transform = "translate3D(-50%, " + parallax + "px, 0)";
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Parallax.__proto__ || Object.getPrototypeOf(Parallax), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Parallax;
- }
- }, {
- key: "_handleScroll",
- value: function _handleScroll() {
- for (var i = 0; i < Parallax._parallaxes.length; i++) {
- var parallaxInstance = Parallax._parallaxes[i];
- parallaxInstance._updateParallax.call(parallaxInstance);
- }
- }
- }, {
- key: "_handleWindowResize",
- value: function _handleWindowResize() {
- for (var i = 0; i < Parallax._parallaxes.length; i++) {
- var parallaxInstance = Parallax._parallaxes[i];
- parallaxInstance._enabled = window.innerWidth > parallaxInstance.options.responsiveThreshold;
- }
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Parallax;
- }(Component);
- /**
- * @static
- * @memberof Parallax
- */
- Parallax._parallaxes = [];
- M.Parallax = Parallax;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Parallax, 'parallax', 'M_Parallax');
- }
- })(cash);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- duration: 300,
- onShow: null,
- swipeable: false,
- responsiveThreshold: Infinity // breakpoint for swipeable
- };
- /**
- * @class
- *
- */
- var Tabs = function (_Component6) {
- _inherits(Tabs, _Component6);
- /**
- * Construct Tabs instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Tabs(el, options) {
- _classCallCheck(this, Tabs);
- var _this22 = _possibleConstructorReturn(this, (Tabs.__proto__ || Object.getPrototypeOf(Tabs)).call(this, Tabs, el, options));
- _this22.el.M_Tabs = _this22;
- /**
- * Options for the Tabs
- * @member Tabs#options
- * @prop {Number} duration
- * @prop {Function} onShow
- * @prop {Boolean} swipeable
- * @prop {Number} responsiveThreshold
- */
- _this22.options = $.extend({}, Tabs.defaults, options);
- // Setup
- _this22.$tabLinks = _this22.$el.children('li.tab').children('a');
- _this22.index = 0;
- _this22._setupActiveTabLink();
- // Setup tabs content
- if (_this22.options.swipeable) {
- _this22._setupSwipeableTabs();
- } else {
- _this22._setupNormalTabs();
- }
- // Setup tabs indicator after content to ensure accurate widths
- _this22._setTabsAndTabWidth();
- _this22._createIndicator();
- _this22._setupEventHandlers();
- return _this22;
- }
- _createClass(Tabs, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this._indicator.parentNode.removeChild(this._indicator);
- if (this.options.swipeable) {
- this._teardownSwipeableTabs();
- } else {
- this._teardownNormalTabs();
- }
- this.$el[0].M_Tabs = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleWindowResizeBound = this._handleWindowResize.bind(this);
- window.addEventListener('resize', this._handleWindowResizeBound);
- this._handleTabClickBound = this._handleTabClick.bind(this);
- this.el.addEventListener('click', this._handleTabClickBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- window.removeEventListener('resize', this._handleWindowResizeBound);
- this.el.removeEventListener('click', this._handleTabClickBound);
- }
- /**
- * Handle window Resize
- */
- }, {
- key: "_handleWindowResize",
- value: function _handleWindowResize() {
- this._setTabsAndTabWidth();
- if (this.tabWidth !== 0 && this.tabsWidth !== 0) {
- this._indicator.style.left = this._calcLeftPos(this.$activeTabLink) + 'px';
- this._indicator.style.right = this._calcRightPos(this.$activeTabLink) + 'px';
- }
- }
- /**
- * Handle tab click
- * @param {Event} e
- */
- }, {
- key: "_handleTabClick",
- value: function _handleTabClick(e) {
- var _this23 = this;
- var tab = $(e.target).closest('li.tab');
- var tabLink = $(e.target).closest('a');
- // Handle click on tab link only
- if (!tabLink.length || !tabLink.parent().hasClass('tab')) {
- return;
- }
- if (tab.hasClass('disabled')) {
- e.preventDefault();
- return;
- }
- // Act as regular link if target attribute is specified.
- if (!!tabLink.attr('target')) {
- return;
- }
- // Make the old tab inactive.
- this.$activeTabLink.removeClass('active');
- var $oldContent = this.$content;
- // Update the variables with the new link and content
- this.$activeTabLink = tabLink;
- this.$content = $(M.escapeHash(tabLink[0].hash));
- this.$tabLinks = this.$el.children('li.tab').children('a');
- // Make the tab active.
- this.$activeTabLink.addClass('active');
- var prevIndex = this.index;
- this.index = Math.max(this.$tabLinks.index(tabLink), 0);
- // Swap content
- if (this.options.swipeable) {
- if (this._tabsCarousel) {
- this._tabsCarousel.set(this.index, function () {
- if (typeof _this23.options.onShow === 'function') {
- _this23.options.onShow.call(_this23, _this23.$content[0]);
- }
- });
- }
- } else {
- if (this.$content.length) {
- this.$content[0].style.display = 'block';
- this.$content.addClass('active');
- if (typeof this.options.onShow === 'function') {
- this.options.onShow.call(this, this.$content[0]);
- }
- if ($oldContent.length && !$oldContent.is(this.$content)) {
- $oldContent[0].style.display = 'none';
- $oldContent.removeClass('active');
- }
- }
- }
- // Update widths after content is swapped (scrollbar bugfix)
- this._setTabsAndTabWidth();
- // Update indicator
- this._animateIndicator(prevIndex);
- // Prevent the anchor's default click action
- e.preventDefault();
- }
- /**
- * Generate elements for tab indicator.
- */
- }, {
- key: "_createIndicator",
- value: function _createIndicator() {
- var _this24 = this;
- var indicator = document.createElement('li');
- indicator.classList.add('indicator');
- this.el.appendChild(indicator);
- this._indicator = indicator;
- setTimeout(function () {
- _this24._indicator.style.left = _this24._calcLeftPos(_this24.$activeTabLink) + 'px';
- _this24._indicator.style.right = _this24._calcRightPos(_this24.$activeTabLink) + 'px';
- }, 0);
- }
- /**
- * Setup first active tab link.
- */
- }, {
- key: "_setupActiveTabLink",
- value: function _setupActiveTabLink() {
- // If the location.hash matches one of the links, use that as the active tab.
- this.$activeTabLink = $(this.$tabLinks.filter('[href="' + location.hash + '"]'));
- // If no match is found, use the first link or any with class 'active' as the initial active tab.
- if (this.$activeTabLink.length === 0) {
- this.$activeTabLink = this.$el.children('li.tab').children('a.active').first();
- }
- if (this.$activeTabLink.length === 0) {
- this.$activeTabLink = this.$el.children('li.tab').children('a').first();
- }
- this.$tabLinks.removeClass('active');
- this.$activeTabLink[0].classList.add('active');
- this.index = Math.max(this.$tabLinks.index(this.$activeTabLink), 0);
- if (this.$activeTabLink.length) {
- this.$content = $(M.escapeHash(this.$activeTabLink[0].hash));
- this.$content.addClass('active');
- }
- }
- /**
- * Setup swipeable tabs
- */
- }, {
- key: "_setupSwipeableTabs",
- value: function _setupSwipeableTabs() {
- var _this25 = this;
- // Change swipeable according to responsive threshold
- if (window.innerWidth > this.options.responsiveThreshold) {
- this.options.swipeable = false;
- }
- var $tabsContent = $();
- this.$tabLinks.each(function (link) {
- var $currContent = $(M.escapeHash(link.hash));
- $currContent.addClass('carousel-item');
- $tabsContent = $tabsContent.add($currContent);
- });
- var $tabsWrapper = $('<div class="tabs-content carousel carousel-slider"></div>');
- $tabsContent.first().before($tabsWrapper);
- $tabsWrapper.append($tabsContent);
- $tabsContent[0].style.display = '';
- // Keep active tab index to set initial carousel slide
- var activeTabIndex = this.$activeTabLink.closest('.tab').index();
- this._tabsCarousel = M.Carousel.init($tabsWrapper[0], {
- fullWidth: true,
- noWrap: true,
- onCycleTo: function (item) {
- var prevIndex = _this25.index;
- _this25.index = $(item).index();
- _this25.$activeTabLink.removeClass('active');
- _this25.$activeTabLink = _this25.$tabLinks.eq(_this25.index);
- _this25.$activeTabLink.addClass('active');
- _this25._animateIndicator(prevIndex);
- if (typeof _this25.options.onShow === 'function') {
- _this25.options.onShow.call(_this25, _this25.$content[0]);
- }
- }
- });
- // Set initial carousel slide to active tab
- this._tabsCarousel.set(activeTabIndex);
- }
- /**
- * Teardown normal tabs.
- */
- }, {
- key: "_teardownSwipeableTabs",
- value: function _teardownSwipeableTabs() {
- var $tabsWrapper = this._tabsCarousel.$el;
- this._tabsCarousel.destroy();
- // Unwrap
- $tabsWrapper.after($tabsWrapper.children());
- $tabsWrapper.remove();
- }
- /**
- * Setup normal tabs.
- */
- }, {
- key: "_setupNormalTabs",
- value: function _setupNormalTabs() {
- // Hide Tabs Content
- this.$tabLinks.not(this.$activeTabLink).each(function (link) {
- if (!!link.hash) {
- var $currContent = $(M.escapeHash(link.hash));
- if ($currContent.length) {
- $currContent[0].style.display = 'none';
- }
- }
- });
- }
- /**
- * Teardown normal tabs.
- */
- }, {
- key: "_teardownNormalTabs",
- value: function _teardownNormalTabs() {
- // show Tabs Content
- this.$tabLinks.each(function (link) {
- if (!!link.hash) {
- var $currContent = $(M.escapeHash(link.hash));
- if ($currContent.length) {
- $currContent[0].style.display = '';
- }
- }
- });
- }
- /**
- * set tabs and tab width
- */
- }, {
- key: "_setTabsAndTabWidth",
- value: function _setTabsAndTabWidth() {
- this.tabsWidth = this.$el.width();
- this.tabWidth = Math.max(this.tabsWidth, this.el.scrollWidth) / this.$tabLinks.length;
- }
- /**
- * Finds right attribute for indicator based on active tab.
- * @param {cash} el
- */
- }, {
- key: "_calcRightPos",
- value: function _calcRightPos(el) {
- return Math.ceil(this.tabsWidth - el.position().left - el[0].getBoundingClientRect().width);
- }
- /**
- * Finds left attribute for indicator based on active tab.
- * @param {cash} el
- */
- }, {
- key: "_calcLeftPos",
- value: function _calcLeftPos(el) {
- return Math.floor(el.position().left);
- }
- }, {
- key: "updateTabIndicator",
- value: function updateTabIndicator() {
- this._setTabsAndTabWidth();
- this._animateIndicator(this.index);
- }
- /**
- * Animates Indicator to active tab.
- * @param {Number} prevIndex
- */
- }, {
- key: "_animateIndicator",
- value: function _animateIndicator(prevIndex) {
- var leftDelay = 0,
- rightDelay = 0;
- if (this.index - prevIndex >= 0) {
- leftDelay = 90;
- } else {
- rightDelay = 90;
- }
- // Animate
- var animOptions = {
- targets: this._indicator,
- left: {
- value: this._calcLeftPos(this.$activeTabLink),
- delay: leftDelay
- },
- right: {
- value: this._calcRightPos(this.$activeTabLink),
- delay: rightDelay
- },
- duration: this.options.duration,
- easing: 'easeOutQuad'
- };
- anim.remove(this._indicator);
- anim(animOptions);
- }
- /**
- * Select tab.
- * @param {String} tabId
- */
- }, {
- key: "select",
- value: function select(tabId) {
- var tab = this.$tabLinks.filter('[href="#' + tabId + '"]');
- if (tab.length) {
- tab.trigger('click');
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Tabs.__proto__ || Object.getPrototypeOf(Tabs), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Tabs;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Tabs;
- }(Component);
- window.M.Tabs = Tabs;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Tabs, 'tabs', 'M_Tabs');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- exitDelay: 200,
- enterDelay: 0,
- html: null,
- margin: 5,
- inDuration: 250,
- outDuration: 200,
- position: 'bottom',
- transitionMovement: 10
- };
- /**
- * @class
- *
- */
- var Tooltip = function (_Component7) {
- _inherits(Tooltip, _Component7);
- /**
- * Construct Tooltip instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Tooltip(el, options) {
- _classCallCheck(this, Tooltip);
- var _this26 = _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).call(this, Tooltip, el, options));
- _this26.el.M_Tooltip = _this26;
- _this26.options = $.extend({}, Tooltip.defaults, options);
- _this26.isOpen = false;
- _this26.isHovered = false;
- _this26.isFocused = false;
- _this26._appendTooltipEl();
- _this26._setupEventHandlers();
- return _this26;
- }
- _createClass(Tooltip, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- $(this.tooltipEl).remove();
- this._removeEventHandlers();
- this.el.M_Tooltip = undefined;
- }
- }, {
- key: "_appendTooltipEl",
- value: function _appendTooltipEl() {
- var tooltipEl = document.createElement('div');
- tooltipEl.classList.add('material-tooltip');
- this.tooltipEl = tooltipEl;
- var tooltipContentEl = document.createElement('div');
- tooltipContentEl.classList.add('tooltip-content');
- tooltipContentEl.innerHTML = this.options.html;
- tooltipEl.appendChild(tooltipContentEl);
- document.body.appendChild(tooltipEl);
- }
- }, {
- key: "_updateTooltipContent",
- value: function _updateTooltipContent() {
- this.tooltipEl.querySelector('.tooltip-content').innerHTML = this.options.html;
- }
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleMouseEnterBound = this._handleMouseEnter.bind(this);
- this._handleMouseLeaveBound = this._handleMouseLeave.bind(this);
- this._handleFocusBound = this._handleFocus.bind(this);
- this._handleBlurBound = this._handleBlur.bind(this);
- this.el.addEventListener('mouseenter', this._handleMouseEnterBound);
- this.el.addEventListener('mouseleave', this._handleMouseLeaveBound);
- this.el.addEventListener('focus', this._handleFocusBound, true);
- this.el.addEventListener('blur', this._handleBlurBound, true);
- }
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('mouseenter', this._handleMouseEnterBound);
- this.el.removeEventListener('mouseleave', this._handleMouseLeaveBound);
- this.el.removeEventListener('focus', this._handleFocusBound, true);
- this.el.removeEventListener('blur', this._handleBlurBound, true);
- }
- }, {
- key: "open",
- value: function open(isManual) {
- if (this.isOpen) {
- return;
- }
- isManual = isManual === undefined ? true : undefined; // Default value true
- this.isOpen = true;
- // Update tooltip content with HTML attribute options
- this.options = $.extend({}, this.options, this._getAttributeOptions());
- this._updateTooltipContent();
- this._setEnterDelayTimeout(isManual);
- }
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- this.isHovered = false;
- this.isFocused = false;
- this.isOpen = false;
- this._setExitDelayTimeout();
- }
- /**
- * Create timeout which delays when the tooltip closes
- */
- }, {
- key: "_setExitDelayTimeout",
- value: function _setExitDelayTimeout() {
- var _this27 = this;
- clearTimeout(this._exitDelayTimeout);
- this._exitDelayTimeout = setTimeout(function () {
- if (_this27.isHovered || _this27.isFocused) {
- return;
- }
- _this27._animateOut();
- }, this.options.exitDelay);
- }
- /**
- * Create timeout which delays when the toast closes
- */
- }, {
- key: "_setEnterDelayTimeout",
- value: function _setEnterDelayTimeout(isManual) {
- var _this28 = this;
- clearTimeout(this._enterDelayTimeout);
- this._enterDelayTimeout = setTimeout(function () {
- if (!_this28.isHovered && !_this28.isFocused && !isManual) {
- return;
- }
- _this28._animateIn();
- }, this.options.enterDelay);
- }
- }, {
- key: "_positionTooltip",
- value: function _positionTooltip() {
- var origin = this.el,
- tooltip = this.tooltipEl,
- originHeight = origin.offsetHeight,
- originWidth = origin.offsetWidth,
- tooltipHeight = tooltip.offsetHeight,
- tooltipWidth = tooltip.offsetWidth,
- newCoordinates = void 0,
- margin = this.options.margin,
- targetTop = void 0,
- targetLeft = void 0;
- this.xMovement = 0, this.yMovement = 0;
- targetTop = origin.getBoundingClientRect().top + M.getDocumentScrollTop();
- targetLeft = origin.getBoundingClientRect().left + M.getDocumentScrollLeft();
- if (this.options.position === 'top') {
- targetTop += -tooltipHeight - margin;
- targetLeft += originWidth / 2 - tooltipWidth / 2;
- this.yMovement = -this.options.transitionMovement;
- } else if (this.options.position === 'right') {
- targetTop += originHeight / 2 - tooltipHeight / 2;
- targetLeft += originWidth + margin;
- this.xMovement = this.options.transitionMovement;
- } else if (this.options.position === 'left') {
- targetTop += originHeight / 2 - tooltipHeight / 2;
- targetLeft += -tooltipWidth - margin;
- this.xMovement = -this.options.transitionMovement;
- } else {
- targetTop += originHeight + margin;
- targetLeft += originWidth / 2 - tooltipWidth / 2;
- this.yMovement = this.options.transitionMovement;
- }
- newCoordinates = this._repositionWithinScreen(targetLeft, targetTop, tooltipWidth, tooltipHeight);
- $(tooltip).css({
- top: newCoordinates.y + 'px',
- left: newCoordinates.x + 'px'
- });
- }
- }, {
- key: "_repositionWithinScreen",
- value: function _repositionWithinScreen(x, y, width, height) {
- var scrollLeft = M.getDocumentScrollLeft();
- var scrollTop = M.getDocumentScrollTop();
- var newX = x - scrollLeft;
- var newY = y - scrollTop;
- var bounding = {
- left: newX,
- top: newY,
- width: width,
- height: height
- };
- var offset = this.options.margin + this.options.transitionMovement;
- var edges = M.checkWithinContainer(document.body, bounding, offset);
- if (edges.left) {
- newX = offset;
- } else if (edges.right) {
- newX -= newX + width - window.innerWidth;
- }
- if (edges.top) {
- newY = offset;
- } else if (edges.bottom) {
- newY -= newY + height - window.innerHeight;
- }
- return {
- x: newX + scrollLeft,
- y: newY + scrollTop
- };
- }
- }, {
- key: "_animateIn",
- value: function _animateIn() {
- this._positionTooltip();
- this.tooltipEl.style.visibility = 'visible';
- anim.remove(this.tooltipEl);
- anim({
- targets: this.tooltipEl,
- opacity: 1,
- translateX: this.xMovement,
- translateY: this.yMovement,
- duration: this.options.inDuration,
- easing: 'easeOutCubic'
- });
- }
- }, {
- key: "_animateOut",
- value: function _animateOut() {
- anim.remove(this.tooltipEl);
- anim({
- targets: this.tooltipEl,
- opacity: 0,
- translateX: 0,
- translateY: 0,
- duration: this.options.outDuration,
- easing: 'easeOutCubic'
- });
- }
- }, {
- key: "_handleMouseEnter",
- value: function _handleMouseEnter() {
- this.isHovered = true;
- this.isFocused = false; // Allows close of tooltip when opened by focus.
- this.open(false);
- }
- }, {
- key: "_handleMouseLeave",
- value: function _handleMouseLeave() {
- this.isHovered = false;
- this.isFocused = false; // Allows close of tooltip when opened by focus.
- this.close();
- }
- }, {
- key: "_handleFocus",
- value: function _handleFocus() {
- if (M.tabPressed) {
- this.isFocused = true;
- this.open(false);
- }
- }
- }, {
- key: "_handleBlur",
- value: function _handleBlur() {
- this.isFocused = false;
- this.close();
- }
- }, {
- key: "_getAttributeOptions",
- value: function _getAttributeOptions() {
- var attributeOptions = {};
- var tooltipTextOption = this.el.getAttribute('data-tooltip');
- var positionOption = this.el.getAttribute('data-position');
- if (tooltipTextOption) {
- attributeOptions.html = tooltipTextOption;
- }
- if (positionOption) {
- attributeOptions.position = positionOption;
- }
- return attributeOptions;
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Tooltip.__proto__ || Object.getPrototypeOf(Tooltip), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Tooltip;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Tooltip;
- }(Component);
- M.Tooltip = Tooltip;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Tooltip, 'tooltip', 'M_Tooltip');
- }
- })(cash, M.anime);
- ; /*!
- * Waves v0.6.4
- * http://fian.my.id/Waves
- *
- * Copyright 2014 Alfiana E. Sibuea and other contributors
- * Released under the MIT license
- * https://github.com/fians/Waves/blob/master/LICENSE
- */
- ;(function (window) {
- 'use strict';
- var Waves = Waves || {};
- var $$ = document.querySelectorAll.bind(document);
- // Find exact position of element
- function isWindow(obj) {
- return obj !== null && obj === obj.window;
- }
- function getWindow(elem) {
- return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
- }
- function offset(elem) {
- var docElem,
- win,
- box = { top: 0, left: 0 },
- doc = elem && elem.ownerDocument;
- docElem = doc.documentElement;
- if (typeof elem.getBoundingClientRect !== typeof undefined) {
- box = elem.getBoundingClientRect();
- }
- win = getWindow(doc);
- return {
- top: box.top + win.pageYOffset - docElem.clientTop,
- left: box.left + win.pageXOffset - docElem.clientLeft
- };
- }
- function convertStyle(obj) {
- var style = '';
- for (var a in obj) {
- if (obj.hasOwnProperty(a)) {
- style += a + ':' + obj[a] + ';';
- }
- }
- return style;
- }
- var Effect = {
- // Effect delay
- duration: 750,
- show: function (e, element) {
- // Disable right click
- if (e.button === 2) {
- return false;
- }
- var el = element || this;
- // Create ripple
- var ripple = document.createElement('div');
- ripple.className = 'waves-ripple';
- el.appendChild(ripple);
- // Get click coordinate and element witdh
- var pos = offset(el);
- var relativeY = e.pageY - pos.top;
- var relativeX = e.pageX - pos.left;
- var scale = 'scale(' + el.clientWidth / 100 * 10 + ')';
- // Support for touch devices
- if ('touches' in e) {
- relativeY = e.touches[0].pageY - pos.top;
- relativeX = e.touches[0].pageX - pos.left;
- }
- // Attach data to element
- ripple.setAttribute('data-hold', Date.now());
- ripple.setAttribute('data-scale', scale);
- ripple.setAttribute('data-x', relativeX);
- ripple.setAttribute('data-y', relativeY);
- // Set ripple position
- var rippleStyle = {
- 'top': relativeY + 'px',
- 'left': relativeX + 'px'
- };
- ripple.className = ripple.className + ' waves-notransition';
- ripple.setAttribute('style', convertStyle(rippleStyle));
- ripple.className = ripple.className.replace('waves-notransition', '');
- // Scale the ripple
- rippleStyle['-webkit-transform'] = scale;
- rippleStyle['-moz-transform'] = scale;
- rippleStyle['-ms-transform'] = scale;
- rippleStyle['-o-transform'] = scale;
- rippleStyle.transform = scale;
- rippleStyle.opacity = '1';
- rippleStyle['-webkit-transition-duration'] = Effect.duration + 'ms';
- rippleStyle['-moz-transition-duration'] = Effect.duration + 'ms';
- rippleStyle['-o-transition-duration'] = Effect.duration + 'ms';
- rippleStyle['transition-duration'] = Effect.duration + 'ms';
- rippleStyle['-webkit-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
- rippleStyle['-moz-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
- rippleStyle['-o-transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
- rippleStyle['transition-timing-function'] = 'cubic-bezier(0.250, 0.460, 0.450, 0.940)';
- ripple.setAttribute('style', convertStyle(rippleStyle));
- },
- hide: function (e) {
- TouchHandler.touchup(e);
- var el = this;
- var width = el.clientWidth * 1.4;
- // Get first ripple
- var ripple = null;
- var ripples = el.getElementsByClassName('waves-ripple');
- if (ripples.length > 0) {
- ripple = ripples[ripples.length - 1];
- } else {
- return false;
- }
- var relativeX = ripple.getAttribute('data-x');
- var relativeY = ripple.getAttribute('data-y');
- var scale = ripple.getAttribute('data-scale');
- // Get delay beetween mousedown and mouse leave
- var diff = Date.now() - Number(ripple.getAttribute('data-hold'));
- var delay = 350 - diff;
- if (delay < 0) {
- delay = 0;
- }
- // Fade out ripple after delay
- setTimeout(function () {
- var style = {
- 'top': relativeY + 'px',
- 'left': relativeX + 'px',
- 'opacity': '0',
- // Duration
- '-webkit-transition-duration': Effect.duration + 'ms',
- '-moz-transition-duration': Effect.duration + 'ms',
- '-o-transition-duration': Effect.duration + 'ms',
- 'transition-duration': Effect.duration + 'ms',
- '-webkit-transform': scale,
- '-moz-transform': scale,
- '-ms-transform': scale,
- '-o-transform': scale,
- 'transform': scale
- };
- ripple.setAttribute('style', convertStyle(style));
- setTimeout(function () {
- try {
- el.removeChild(ripple);
- } catch (e) {
- return false;
- }
- }, Effect.duration);
- }, delay);
- },
- // Little hack to make <input> can perform waves effect
- wrapInput: function (elements) {
- for (var a = 0; a < elements.length; a++) {
- var el = elements[a];
- if (el.tagName.toLowerCase() === 'input') {
- var parent = el.parentNode;
- // If input already have parent just pass through
- if (parent.tagName.toLowerCase() === 'i' && parent.className.indexOf('waves-effect') !== -1) {
- continue;
- }
- // Put element class and style to the specified parent
- var wrapper = document.createElement('i');
- wrapper.className = el.className + ' waves-input-wrapper';
- var elementStyle = el.getAttribute('style');
- if (!elementStyle) {
- elementStyle = '';
- }
- wrapper.setAttribute('style', elementStyle);
- el.className = 'waves-button-input';
- el.removeAttribute('style');
- // Put element as child
- parent.replaceChild(wrapper, el);
- wrapper.appendChild(el);
- }
- }
- }
- };
- /**
- * Disable mousedown event for 500ms during and after touch
- */
- var TouchHandler = {
- /* uses an integer rather than bool so there's no issues with
- * needing to clear timeouts if another touch event occurred
- * within the 500ms. Cannot mouseup between touchstart and
- * touchend, nor in the 500ms after touchend. */
- touches: 0,
- allowEvent: function (e) {
- var allow = true;
- if (e.type === 'touchstart') {
- TouchHandler.touches += 1; //push
- } else if (e.type === 'touchend' || e.type === 'touchcancel') {
- setTimeout(function () {
- if (TouchHandler.touches > 0) {
- TouchHandler.touches -= 1; //pop after 500ms
- }
- }, 500);
- } else if (e.type === 'mousedown' && TouchHandler.touches > 0) {
- allow = false;
- }
- return allow;
- },
- touchup: function (e) {
- TouchHandler.allowEvent(e);
- }
- };
- /**
- * Delegated click handler for .waves-effect element.
- * returns null when .waves-effect element not in "click tree"
- */
- function getWavesEffectElement(e) {
- if (TouchHandler.allowEvent(e) === false) {
- return null;
- }
- var element = null;
- var target = e.target || e.srcElement;
- while (target.parentNode !== null) {
- if (!(target instanceof SVGElement) && target.className.indexOf('waves-effect') !== -1) {
- element = target;
- break;
- }
- target = target.parentNode;
- }
- return element;
- }
- /**
- * Bubble the click and show effect if .waves-effect elem was found
- */
- function showEffect(e) {
- var element = getWavesEffectElement(e);
- if (element !== null) {
- Effect.show(e, element);
- if ('ontouchstart' in window) {
- element.addEventListener('touchend', Effect.hide, false);
- element.addEventListener('touchcancel', Effect.hide, false);
- }
- element.addEventListener('mouseup', Effect.hide, false);
- element.addEventListener('mouseleave', Effect.hide, false);
- element.addEventListener('dragend', Effect.hide, false);
- }
- }
- Waves.displayEffect = function (options) {
- options = options || {};
- if ('duration' in options) {
- Effect.duration = options.duration;
- }
- //Wrap input inside <i> tag
- Effect.wrapInput($$('.waves-effect'));
- if ('ontouchstart' in window) {
- document.body.addEventListener('touchstart', showEffect, false);
- }
- document.body.addEventListener('mousedown', showEffect, false);
- };
- /**
- * Attach Waves to an input element (or any element which doesn't
- * bubble mouseup/mousedown events).
- * Intended to be used with dynamically loaded forms/inputs, or
- * where the user doesn't want a delegated click handler.
- */
- Waves.attach = function (element) {
- //FUTURE: automatically add waves classes and allow users
- // to specify them with an options param? Eg. light/classic/button
- if (element.tagName.toLowerCase() === 'input') {
- Effect.wrapInput([element]);
- element = element.parentNode;
- }
- if ('ontouchstart' in window) {
- element.addEventListener('touchstart', showEffect, false);
- }
- element.addEventListener('mousedown', showEffect, false);
- };
- window.Waves = Waves;
- document.addEventListener('DOMContentLoaded', function () {
- Waves.displayEffect();
- }, false);
- })(window);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- html: '',
- displayLength: 4000,
- inDuration: 300,
- outDuration: 375,
- classes: '',
- completeCallback: null,
- activationPercent: 0.8
- };
- var Toast = function () {
- function Toast(options) {
- _classCallCheck(this, Toast);
- /**
- * Options for the toast
- * @member Toast#options
- */
- this.options = $.extend({}, Toast.defaults, options);
- this.message = this.options.html;
- /**
- * Describes current pan state toast
- * @type {Boolean}
- */
- this.panning = false;
- /**
- * Time remaining until toast is removed
- */
- this.timeRemaining = this.options.displayLength;
- if (Toast._toasts.length === 0) {
- Toast._createContainer();
- }
- // Create new toast
- Toast._toasts.push(this);
- var toastElement = this._createToast();
- toastElement.M_Toast = this;
- this.el = toastElement;
- this.$el = $(toastElement);
- this._animateIn();
- this._setTimer();
- }
- _createClass(Toast, [{
- key: "_createToast",
- /**
- * Create toast and append it to toast container
- */
- value: function _createToast() {
- var toast = document.createElement('div');
- toast.classList.add('toast');
- // Add custom classes onto toast
- if (!!this.options.classes.length) {
- $(toast).addClass(this.options.classes);
- }
- // Set content
- if (typeof HTMLElement === 'object' ? this.message instanceof HTMLElement : this.message && typeof this.message === 'object' && this.message !== null && this.message.nodeType === 1 && typeof this.message.nodeName === 'string') {
- toast.appendChild(this.message);
- // Check if it is jQuery object
- } else if (!!this.message.jquery) {
- $(toast).append(this.message[0]);
- // Insert as html;
- } else {
- toast.innerHTML = this.message;
- }
- // Append toasft
- Toast._container.appendChild(toast);
- return toast;
- }
- /**
- * Animate in toast
- */
- }, {
- key: "_animateIn",
- value: function _animateIn() {
- // Animate toast in
- anim({
- targets: this.el,
- top: 0,
- opacity: 1,
- duration: this.options.inDuration,
- easing: 'easeOutCubic'
- });
- }
- /**
- * Create setInterval which automatically removes toast when timeRemaining >= 0
- * has been reached
- */
- }, {
- key: "_setTimer",
- value: function _setTimer() {
- var _this29 = this;
- if (this.timeRemaining !== Infinity) {
- this.counterInterval = setInterval(function () {
- // If toast is not being dragged, decrease its time remaining
- if (!_this29.panning) {
- _this29.timeRemaining -= 20;
- }
- // Animate toast out
- if (_this29.timeRemaining <= 0) {
- _this29.dismiss();
- }
- }, 20);
- }
- }
- /**
- * Dismiss toast with animation
- */
- }, {
- key: "dismiss",
- value: function dismiss() {
- var _this30 = this;
- window.clearInterval(this.counterInterval);
- var activationDistance = this.el.offsetWidth * this.options.activationPercent;
- if (this.wasSwiped) {
- this.el.style.transition = 'transform .05s, opacity .05s';
- this.el.style.transform = "translateX(" + activationDistance + "px)";
- this.el.style.opacity = 0;
- }
- anim({
- targets: this.el,
- opacity: 0,
- marginTop: -40,
- duration: this.options.outDuration,
- easing: 'easeOutExpo',
- complete: function () {
- // Call the optional callback
- if (typeof _this30.options.completeCallback === 'function') {
- _this30.options.completeCallback();
- }
- // Remove toast from DOM
- _this30.$el.remove();
- Toast._toasts.splice(Toast._toasts.indexOf(_this30), 1);
- if (Toast._toasts.length === 0) {
- Toast._removeContainer();
- }
- }
- });
- }
- }], [{
- key: "getInstance",
- /**
- * Get Instance
- */
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Toast;
- }
- /**
- * Append toast container and add event handlers
- */
- }, {
- key: "_createContainer",
- value: function _createContainer() {
- var container = document.createElement('div');
- container.setAttribute('id', 'toast-container');
- // Add event handler
- container.addEventListener('touchstart', Toast._onDragStart);
- container.addEventListener('touchmove', Toast._onDragMove);
- container.addEventListener('touchend', Toast._onDragEnd);
- container.addEventListener('mousedown', Toast._onDragStart);
- document.addEventListener('mousemove', Toast._onDragMove);
- document.addEventListener('mouseup', Toast._onDragEnd);
- document.body.appendChild(container);
- Toast._container = container;
- }
- /**
- * Remove toast container and event handlers
- */
- }, {
- key: "_removeContainer",
- value: function _removeContainer() {
- // Add event handler
- document.removeEventListener('mousemove', Toast._onDragMove);
- document.removeEventListener('mouseup', Toast._onDragEnd);
- $(Toast._container).remove();
- Toast._container = null;
- }
- /**
- * Begin drag handler
- * @param {Event} e
- */
- }, {
- key: "_onDragStart",
- value: function _onDragStart(e) {
- if (e.target && $(e.target).closest('.toast').length) {
- var $toast = $(e.target).closest('.toast');
- var toast = $toast[0].M_Toast;
- toast.panning = true;
- Toast._draggedToast = toast;
- toast.el.classList.add('panning');
- toast.el.style.transition = '';
- toast.startingXPos = Toast._xPos(e);
- toast.time = Date.now();
- toast.xPos = Toast._xPos(e);
- }
- }
- /**
- * Drag move handler
- * @param {Event} e
- */
- }, {
- key: "_onDragMove",
- value: function _onDragMove(e) {
- if (!!Toast._draggedToast) {
- e.preventDefault();
- var toast = Toast._draggedToast;
- toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));
- toast.xPos = Toast._xPos(e);
- toast.velocityX = toast.deltaX / (Date.now() - toast.time);
- toast.time = Date.now();
- var totalDeltaX = toast.xPos - toast.startingXPos;
- var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;
- toast.el.style.transform = "translateX(" + totalDeltaX + "px)";
- toast.el.style.opacity = 1 - Math.abs(totalDeltaX / activationDistance);
- }
- }
- /**
- * End drag handler
- */
- }, {
- key: "_onDragEnd",
- value: function _onDragEnd() {
- if (!!Toast._draggedToast) {
- var toast = Toast._draggedToast;
- toast.panning = false;
- toast.el.classList.remove('panning');
- var totalDeltaX = toast.xPos - toast.startingXPos;
- var activationDistance = toast.el.offsetWidth * toast.options.activationPercent;
- var shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;
- // Remove toast
- if (shouldBeDismissed) {
- toast.wasSwiped = true;
- toast.dismiss();
- // Animate toast back to original position
- } else {
- toast.el.style.transition = 'transform .2s, opacity .2s';
- toast.el.style.transform = '';
- toast.el.style.opacity = '';
- }
- Toast._draggedToast = null;
- }
- }
- /**
- * Get x position of mouse or touch event
- * @param {Event} e
- */
- }, {
- key: "_xPos",
- value: function _xPos(e) {
- if (e.targetTouches && e.targetTouches.length >= 1) {
- return e.targetTouches[0].clientX;
- }
- // mouse event
- return e.clientX;
- }
- /**
- * Remove all toasts
- */
- }, {
- key: "dismissAll",
- value: function dismissAll() {
- for (var toastIndex in Toast._toasts) {
- Toast._toasts[toastIndex].dismiss();
- }
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Toast;
- }();
- /**
- * @static
- * @memberof Toast
- * @type {Array.<Toast>}
- */
- Toast._toasts = [];
- /**
- * @static
- * @memberof Toast
- */
- Toast._container = null;
- /**
- * @static
- * @memberof Toast
- * @type {Toast}
- */
- Toast._draggedToast = null;
- M.Toast = Toast;
- M.toast = function (options) {
- return new Toast(options);
- };
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- edge: 'left',
- draggable: true,
- inDuration: 250,
- outDuration: 200,
- onOpenStart: null,
- onOpenEnd: null,
- onCloseStart: null,
- onCloseEnd: null,
- preventScrolling: true
- };
- /**
- * @class
- */
- var Sidenav = function (_Component8) {
- _inherits(Sidenav, _Component8);
- /**
- * Construct Sidenav instance and set up overlay
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Sidenav(el, options) {
- _classCallCheck(this, Sidenav);
- var _this31 = _possibleConstructorReturn(this, (Sidenav.__proto__ || Object.getPrototypeOf(Sidenav)).call(this, Sidenav, el, options));
- _this31.el.M_Sidenav = _this31;
- _this31.id = _this31.$el.attr('id');
- /**
- * Options for the Sidenav
- * @member Sidenav#options
- * @prop {String} [edge='left'] - Side of screen on which Sidenav appears
- * @prop {Boolean} [draggable=true] - Allow swipe gestures to open/close Sidenav
- * @prop {Number} [inDuration=250] - Length in ms of enter transition
- * @prop {Number} [outDuration=200] - Length in ms of exit transition
- * @prop {Function} onOpenStart - Function called when sidenav starts entering
- * @prop {Function} onOpenEnd - Function called when sidenav finishes entering
- * @prop {Function} onCloseStart - Function called when sidenav starts exiting
- * @prop {Function} onCloseEnd - Function called when sidenav finishes exiting
- */
- _this31.options = $.extend({}, Sidenav.defaults, options);
- /**
- * Describes open/close state of Sidenav
- * @type {Boolean}
- */
- _this31.isOpen = false;
- /**
- * Describes if Sidenav is fixed
- * @type {Boolean}
- */
- _this31.isFixed = _this31.el.classList.contains('sidenav-fixed');
- /**
- * Describes if Sidenav is being draggeed
- * @type {Boolean}
- */
- _this31.isDragged = false;
- // Window size variables for window resize checks
- _this31.lastWindowWidth = window.innerWidth;
- _this31.lastWindowHeight = window.innerHeight;
- _this31._createOverlay();
- _this31._createDragTarget();
- _this31._setupEventHandlers();
- _this31._setupClasses();
- _this31._setupFixed();
- Sidenav._sidenavs.push(_this31);
- return _this31;
- }
- _createClass(Sidenav, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this._enableBodyScrolling();
- this._overlay.parentNode.removeChild(this._overlay);
- this.dragTarget.parentNode.removeChild(this.dragTarget);
- this.el.M_Sidenav = undefined;
- this.el.style.transform = '';
- var index = Sidenav._sidenavs.indexOf(this);
- if (index >= 0) {
- Sidenav._sidenavs.splice(index, 1);
- }
- }
- }, {
- key: "_createOverlay",
- value: function _createOverlay() {
- var overlay = document.createElement('div');
- this._closeBound = this.close.bind(this);
- overlay.classList.add('sidenav-overlay');
- overlay.addEventListener('click', this._closeBound);
- document.body.appendChild(overlay);
- this._overlay = overlay;
- }
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- if (Sidenav._sidenavs.length === 0) {
- document.body.addEventListener('click', this._handleTriggerClick);
- }
- this._handleDragTargetDragBound = this._handleDragTargetDrag.bind(this);
- this._handleDragTargetReleaseBound = this._handleDragTargetRelease.bind(this);
- this._handleCloseDragBound = this._handleCloseDrag.bind(this);
- this._handleCloseReleaseBound = this._handleCloseRelease.bind(this);
- this._handleCloseTriggerClickBound = this._handleCloseTriggerClick.bind(this);
- this.dragTarget.addEventListener('touchmove', this._handleDragTargetDragBound);
- this.dragTarget.addEventListener('touchend', this._handleDragTargetReleaseBound);
- this._overlay.addEventListener('touchmove', this._handleCloseDragBound);
- this._overlay.addEventListener('touchend', this._handleCloseReleaseBound);
- this.el.addEventListener('touchmove', this._handleCloseDragBound);
- this.el.addEventListener('touchend', this._handleCloseReleaseBound);
- this.el.addEventListener('click', this._handleCloseTriggerClickBound);
- // Add resize for side nav fixed
- if (this.isFixed) {
- this._handleWindowResizeBound = this._handleWindowResize.bind(this);
- window.addEventListener('resize', this._handleWindowResizeBound);
- }
- }
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- if (Sidenav._sidenavs.length === 1) {
- document.body.removeEventListener('click', this._handleTriggerClick);
- }
- this.dragTarget.removeEventListener('touchmove', this._handleDragTargetDragBound);
- this.dragTarget.removeEventListener('touchend', this._handleDragTargetReleaseBound);
- this._overlay.removeEventListener('touchmove', this._handleCloseDragBound);
- this._overlay.removeEventListener('touchend', this._handleCloseReleaseBound);
- this.el.removeEventListener('touchmove', this._handleCloseDragBound);
- this.el.removeEventListener('touchend', this._handleCloseReleaseBound);
- this.el.removeEventListener('click', this._handleCloseTriggerClickBound);
- // Remove resize for side nav fixed
- if (this.isFixed) {
- window.removeEventListener('resize', this._handleWindowResizeBound);
- }
- }
- /**
- * Handle Trigger Click
- * @param {Event} e
- */
- }, {
- key: "_handleTriggerClick",
- value: function _handleTriggerClick(e) {
- var $trigger = $(e.target).closest('.sidenav-trigger');
- if (e.target && $trigger.length) {
- var sidenavId = M.getIdFromTrigger($trigger[0]);
- var sidenavInstance = document.getElementById(sidenavId).M_Sidenav;
- if (sidenavInstance) {
- sidenavInstance.open($trigger);
- }
- e.preventDefault();
- }
- }
- /**
- * Set variables needed at the beggining of drag
- * and stop any current transition.
- * @param {Event} e
- */
- }, {
- key: "_startDrag",
- value: function _startDrag(e) {
- var clientX = e.targetTouches[0].clientX;
- this.isDragged = true;
- this._startingXpos = clientX;
- this._xPos = this._startingXpos;
- this._time = Date.now();
- this._width = this.el.getBoundingClientRect().width;
- this._overlay.style.display = 'block';
- this._initialScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();
- this._verticallyScrolling = false;
- anim.remove(this.el);
- anim.remove(this._overlay);
- }
- /**
- * Set variables needed at each drag move update tick
- * @param {Event} e
- */
- }, {
- key: "_dragMoveUpdate",
- value: function _dragMoveUpdate(e) {
- var clientX = e.targetTouches[0].clientX;
- var currentScrollTop = this.isOpen ? this.el.scrollTop : M.getDocumentScrollTop();
- this.deltaX = Math.abs(this._xPos - clientX);
- this._xPos = clientX;
- this.velocityX = this.deltaX / (Date.now() - this._time);
- this._time = Date.now();
- if (this._initialScrollTop !== currentScrollTop) {
- this._verticallyScrolling = true;
- }
- }
- /**
- * Handles Dragging of Sidenav
- * @param {Event} e
- */
- }, {
- key: "_handleDragTargetDrag",
- value: function _handleDragTargetDrag(e) {
- // Check if draggable
- if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {
- return;
- }
- // If not being dragged, set initial drag start variables
- if (!this.isDragged) {
- this._startDrag(e);
- }
- // Run touchmove updates
- this._dragMoveUpdate(e);
- // Calculate raw deltaX
- var totalDeltaX = this._xPos - this._startingXpos;
- // dragDirection is the attempted user drag direction
- var dragDirection = totalDeltaX > 0 ? 'right' : 'left';
- // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction
- totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));
- if (this.options.edge === dragDirection) {
- totalDeltaX = 0;
- }
- /**
- * transformX is the drag displacement
- * transformPrefix is the initial transform placement
- * Invert values if Sidenav is right edge
- */
- var transformX = totalDeltaX;
- var transformPrefix = 'translateX(-100%)';
- if (this.options.edge === 'right') {
- transformPrefix = 'translateX(100%)';
- transformX = -transformX;
- }
- // Calculate open/close percentage of sidenav, with open = 1 and close = 0
- this.percentOpen = Math.min(1, totalDeltaX / this._width);
- // Set transform and opacity styles
- this.el.style.transform = transformPrefix + " translateX(" + transformX + "px)";
- this._overlay.style.opacity = this.percentOpen;
- }
- /**
- * Handle Drag Target Release
- */
- }, {
- key: "_handleDragTargetRelease",
- value: function _handleDragTargetRelease() {
- if (this.isDragged) {
- if (this.percentOpen > 0.2) {
- this.open();
- } else {
- this._animateOut();
- }
- this.isDragged = false;
- this._verticallyScrolling = false;
- }
- }
- /**
- * Handle Close Drag
- * @param {Event} e
- */
- }, {
- key: "_handleCloseDrag",
- value: function _handleCloseDrag(e) {
- if (this.isOpen) {
- // Check if draggable
- if (!this.options.draggable || this._isCurrentlyFixed() || this._verticallyScrolling) {
- return;
- }
- // If not being dragged, set initial drag start variables
- if (!this.isDragged) {
- this._startDrag(e);
- }
- // Run touchmove updates
- this._dragMoveUpdate(e);
- // Calculate raw deltaX
- var totalDeltaX = this._xPos - this._startingXpos;
- // dragDirection is the attempted user drag direction
- var dragDirection = totalDeltaX > 0 ? 'right' : 'left';
- // Don't allow totalDeltaX to exceed Sidenav width or be dragged in the opposite direction
- totalDeltaX = Math.min(this._width, Math.abs(totalDeltaX));
- if (this.options.edge !== dragDirection) {
- totalDeltaX = 0;
- }
- var transformX = -totalDeltaX;
- if (this.options.edge === 'right') {
- transformX = -transformX;
- }
- // Calculate open/close percentage of sidenav, with open = 1 and close = 0
- this.percentOpen = Math.min(1, 1 - totalDeltaX / this._width);
- // Set transform and opacity styles
- this.el.style.transform = "translateX(" + transformX + "px)";
- this._overlay.style.opacity = this.percentOpen;
- }
- }
- /**
- * Handle Close Release
- */
- }, {
- key: "_handleCloseRelease",
- value: function _handleCloseRelease() {
- if (this.isOpen && this.isDragged) {
- if (this.percentOpen > 0.8) {
- this._animateIn();
- } else {
- this.close();
- }
- this.isDragged = false;
- this._verticallyScrolling = false;
- }
- }
- /**
- * Handles closing of Sidenav when element with class .sidenav-close
- */
- }, {
- key: "_handleCloseTriggerClick",
- value: function _handleCloseTriggerClick(e) {
- var $closeTrigger = $(e.target).closest('.sidenav-close');
- if ($closeTrigger.length && !this._isCurrentlyFixed()) {
- this.close();
- }
- }
- /**
- * Handle Window Resize
- */
- }, {
- key: "_handleWindowResize",
- value: function _handleWindowResize() {
- // Only handle horizontal resizes
- if (this.lastWindowWidth !== window.innerWidth) {
- if (window.innerWidth > 992) {
- this.open();
- } else {
- this.close();
- }
- }
- this.lastWindowWidth = window.innerWidth;
- this.lastWindowHeight = window.innerHeight;
- }
- }, {
- key: "_setupClasses",
- value: function _setupClasses() {
- if (this.options.edge === 'right') {
- this.el.classList.add('right-aligned');
- this.dragTarget.classList.add('right-aligned');
- }
- }
- }, {
- key: "_removeClasses",
- value: function _removeClasses() {
- this.el.classList.remove('right-aligned');
- this.dragTarget.classList.remove('right-aligned');
- }
- }, {
- key: "_setupFixed",
- value: function _setupFixed() {
- if (this._isCurrentlyFixed()) {
- this.open();
- }
- }
- }, {
- key: "_isCurrentlyFixed",
- value: function _isCurrentlyFixed() {
- return this.isFixed && window.innerWidth > 992;
- }
- }, {
- key: "_createDragTarget",
- value: function _createDragTarget() {
- var dragTarget = document.createElement('div');
- dragTarget.classList.add('drag-target');
- document.body.appendChild(dragTarget);
- this.dragTarget = dragTarget;
- }
- }, {
- key: "_preventBodyScrolling",
- value: function _preventBodyScrolling() {
- var body = document.body;
- body.style.overflow = 'hidden';
- }
- }, {
- key: "_enableBodyScrolling",
- value: function _enableBodyScrolling() {
- var body = document.body;
- body.style.overflow = '';
- }
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen === true) {
- return;
- }
- this.isOpen = true;
- // Run onOpenStart callback
- if (typeof this.options.onOpenStart === 'function') {
- this.options.onOpenStart.call(this, this.el);
- }
- // Handle fixed Sidenav
- if (this._isCurrentlyFixed()) {
- anim.remove(this.el);
- anim({
- targets: this.el,
- translateX: 0,
- duration: 0,
- easing: 'easeOutQuad'
- });
- this._enableBodyScrolling();
- this._overlay.style.display = 'none';
- // Handle non-fixed Sidenav
- } else {
- if (this.options.preventScrolling) {
- this._preventBodyScrolling();
- }
- if (!this.isDragged || this.percentOpen != 1) {
- this._animateIn();
- }
- }
- }
- }, {
- key: "close",
- value: function close() {
- if (this.isOpen === false) {
- return;
- }
- this.isOpen = false;
- // Run onCloseStart callback
- if (typeof this.options.onCloseStart === 'function') {
- this.options.onCloseStart.call(this, this.el);
- }
- // Handle fixed Sidenav
- if (this._isCurrentlyFixed()) {
- var transformX = this.options.edge === 'left' ? '-105%' : '105%';
- this.el.style.transform = "translateX(" + transformX + ")";
- // Handle non-fixed Sidenav
- } else {
- this._enableBodyScrolling();
- if (!this.isDragged || this.percentOpen != 0) {
- this._animateOut();
- } else {
- this._overlay.style.display = 'none';
- }
- }
- }
- }, {
- key: "_animateIn",
- value: function _animateIn() {
- this._animateSidenavIn();
- this._animateOverlayIn();
- }
- }, {
- key: "_animateSidenavIn",
- value: function _animateSidenavIn() {
- var _this32 = this;
- var slideOutPercent = this.options.edge === 'left' ? -1 : 1;
- if (this.isDragged) {
- slideOutPercent = this.options.edge === 'left' ? slideOutPercent + this.percentOpen : slideOutPercent - this.percentOpen;
- }
- anim.remove(this.el);
- anim({
- targets: this.el,
- translateX: [slideOutPercent * 100 + "%", 0],
- duration: this.options.inDuration,
- easing: 'easeOutQuad',
- complete: function () {
- // Run onOpenEnd callback
- if (typeof _this32.options.onOpenEnd === 'function') {
- _this32.options.onOpenEnd.call(_this32, _this32.el);
- }
- }
- });
- }
- }, {
- key: "_animateOverlayIn",
- value: function _animateOverlayIn() {
- var start = 0;
- if (this.isDragged) {
- start = this.percentOpen;
- } else {
- $(this._overlay).css({
- display: 'block'
- });
- }
- anim.remove(this._overlay);
- anim({
- targets: this._overlay,
- opacity: [start, 1],
- duration: this.options.inDuration,
- easing: 'easeOutQuad'
- });
- }
- }, {
- key: "_animateOut",
- value: function _animateOut() {
- this._animateSidenavOut();
- this._animateOverlayOut();
- }
- }, {
- key: "_animateSidenavOut",
- value: function _animateSidenavOut() {
- var _this33 = this;
- var endPercent = this.options.edge === 'left' ? -1 : 1;
- var slideOutPercent = 0;
- if (this.isDragged) {
- slideOutPercent = this.options.edge === 'left' ? endPercent + this.percentOpen : endPercent - this.percentOpen;
- }
- anim.remove(this.el);
- anim({
- targets: this.el,
- translateX: [slideOutPercent * 100 + "%", endPercent * 105 + "%"],
- duration: this.options.outDuration,
- easing: 'easeOutQuad',
- complete: function () {
- // Run onOpenEnd callback
- if (typeof _this33.options.onCloseEnd === 'function') {
- _this33.options.onCloseEnd.call(_this33, _this33.el);
- }
- }
- });
- }
- }, {
- key: "_animateOverlayOut",
- value: function _animateOverlayOut() {
- var _this34 = this;
- anim.remove(this._overlay);
- anim({
- targets: this._overlay,
- opacity: 0,
- duration: this.options.outDuration,
- easing: 'easeOutQuad',
- complete: function () {
- $(_this34._overlay).css('display', 'none');
- }
- });
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Sidenav.__proto__ || Object.getPrototypeOf(Sidenav), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Sidenav;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Sidenav;
- }(Component);
- /**
- * @static
- * @memberof Sidenav
- * @type {Array.<Sidenav>}
- */
- Sidenav._sidenavs = [];
- window.M.Sidenav = Sidenav;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Sidenav, 'sidenav', 'M_Sidenav');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- throttle: 100,
- scrollOffset: 200, // offset - 200 allows elements near bottom of page to scroll
- activeClass: 'active',
- getActiveElement: function (id) {
- return 'a[href="#' + id + '"]';
- }
- };
- /**
- * @class
- *
- */
- var ScrollSpy = function (_Component9) {
- _inherits(ScrollSpy, _Component9);
- /**
- * Construct ScrollSpy instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function ScrollSpy(el, options) {
- _classCallCheck(this, ScrollSpy);
- var _this35 = _possibleConstructorReturn(this, (ScrollSpy.__proto__ || Object.getPrototypeOf(ScrollSpy)).call(this, ScrollSpy, el, options));
- _this35.el.M_ScrollSpy = _this35;
- /**
- * Options for the modal
- * @member Modal#options
- * @prop {Number} [throttle=100] - Throttle of scroll handler
- * @prop {Number} [scrollOffset=200] - Offset for centering element when scrolled to
- * @prop {String} [activeClass='active'] - Class applied to active elements
- * @prop {Function} [getActiveElement] - Used to find active element
- */
- _this35.options = $.extend({}, ScrollSpy.defaults, options);
- // setup
- ScrollSpy._elements.push(_this35);
- ScrollSpy._count++;
- ScrollSpy._increment++;
- _this35.tickId = -1;
- _this35.id = ScrollSpy._increment;
- _this35._setupEventHandlers();
- _this35._handleWindowScroll();
- return _this35;
- }
- _createClass(ScrollSpy, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- ScrollSpy._elements.splice(ScrollSpy._elements.indexOf(this), 1);
- ScrollSpy._elementsInView.splice(ScrollSpy._elementsInView.indexOf(this), 1);
- ScrollSpy._visibleElements.splice(ScrollSpy._visibleElements.indexOf(this.$el), 1);
- ScrollSpy._count--;
- this._removeEventHandlers();
- $(this.options.getActiveElement(this.$el.attr('id'))).removeClass(this.options.activeClass);
- this.el.M_ScrollSpy = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- var throttledResize = M.throttle(this._handleWindowScroll, 200);
- this._handleThrottledResizeBound = throttledResize.bind(this);
- this._handleWindowScrollBound = this._handleWindowScroll.bind(this);
- if (ScrollSpy._count === 1) {
- window.addEventListener('scroll', this._handleWindowScrollBound);
- window.addEventListener('resize', this._handleThrottledResizeBound);
- document.body.addEventListener('click', this._handleTriggerClick);
- }
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- if (ScrollSpy._count === 0) {
- window.removeEventListener('scroll', this._handleWindowScrollBound);
- window.removeEventListener('resize', this._handleThrottledResizeBound);
- document.body.removeEventListener('click', this._handleTriggerClick);
- }
- }
- /**
- * Handle Trigger Click
- * @param {Event} e
- */
- }, {
- key: "_handleTriggerClick",
- value: function _handleTriggerClick(e) {
- var $trigger = $(e.target);
- for (var i = ScrollSpy._elements.length - 1; i >= 0; i--) {
- var scrollspy = ScrollSpy._elements[i];
- if ($trigger.is('a[href="#' + scrollspy.$el.attr('id') + '"]')) {
- e.preventDefault();
- var offset = scrollspy.$el.offset().top + 1;
- anim({
- targets: [document.documentElement, document.body],
- scrollTop: offset - scrollspy.options.scrollOffset,
- duration: 400,
- easing: 'easeOutCubic'
- });
- break;
- }
- }
- }
- /**
- * Handle Window Scroll
- */
- }, {
- key: "_handleWindowScroll",
- value: function _handleWindowScroll() {
- // unique tick id
- ScrollSpy._ticks++;
- // viewport rectangle
- var top = M.getDocumentScrollTop(),
- left = M.getDocumentScrollLeft(),
- right = left + window.innerWidth,
- bottom = top + window.innerHeight;
- // determine which elements are in view
- var intersections = ScrollSpy._findElements(top, right, bottom, left);
- for (var i = 0; i < intersections.length; i++) {
- var scrollspy = intersections[i];
- var lastTick = scrollspy.tickId;
- if (lastTick < 0) {
- // entered into view
- scrollspy._enter();
- }
- // update tick id
- scrollspy.tickId = ScrollSpy._ticks;
- }
- for (var _i = 0; _i < ScrollSpy._elementsInView.length; _i++) {
- var _scrollspy = ScrollSpy._elementsInView[_i];
- var _lastTick = _scrollspy.tickId;
- if (_lastTick >= 0 && _lastTick !== ScrollSpy._ticks) {
- // exited from view
- _scrollspy._exit();
- _scrollspy.tickId = -1;
- }
- }
- // remember elements in view for next tick
- ScrollSpy._elementsInView = intersections;
- }
- /**
- * Find elements that are within the boundary
- * @param {number} top
- * @param {number} right
- * @param {number} bottom
- * @param {number} left
- * @return {Array.<ScrollSpy>} A collection of elements
- */
- }, {
- key: "_enter",
- value: function _enter() {
- ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (value) {
- return value.height() != 0;
- });
- if (ScrollSpy._visibleElements[0]) {
- $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).removeClass(this.options.activeClass);
- if (ScrollSpy._visibleElements[0][0].M_ScrollSpy && this.id < ScrollSpy._visibleElements[0][0].M_ScrollSpy.id) {
- ScrollSpy._visibleElements.unshift(this.$el);
- } else {
- ScrollSpy._visibleElements.push(this.$el);
- }
- } else {
- ScrollSpy._visibleElements.push(this.$el);
- }
- $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).addClass(this.options.activeClass);
- }
- }, {
- key: "_exit",
- value: function _exit() {
- var _this36 = this;
- ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (value) {
- return value.height() != 0;
- });
- if (ScrollSpy._visibleElements[0]) {
- $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).removeClass(this.options.activeClass);
- ScrollSpy._visibleElements = ScrollSpy._visibleElements.filter(function (el) {
- return el.attr('id') != _this36.$el.attr('id');
- });
- if (ScrollSpy._visibleElements[0]) {
- // Check if empty
- $(this.options.getActiveElement(ScrollSpy._visibleElements[0].attr('id'))).addClass(this.options.activeClass);
- }
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(ScrollSpy.__proto__ || Object.getPrototypeOf(ScrollSpy), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_ScrollSpy;
- }
- }, {
- key: "_findElements",
- value: function _findElements(top, right, bottom, left) {
- var hits = [];
- for (var i = 0; i < ScrollSpy._elements.length; i++) {
- var scrollspy = ScrollSpy._elements[i];
- var currTop = top + scrollspy.options.scrollOffset || 200;
- if (scrollspy.$el.height() > 0) {
- var elTop = scrollspy.$el.offset().top,
- elLeft = scrollspy.$el.offset().left,
- elRight = elLeft + scrollspy.$el.width(),
- elBottom = elTop + scrollspy.$el.height();
- var isIntersect = !(elLeft > right || elRight < left || elTop > bottom || elBottom < currTop);
- if (isIntersect) {
- hits.push(scrollspy);
- }
- }
- }
- return hits;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return ScrollSpy;
- }(Component);
- /**
- * @static
- * @memberof ScrollSpy
- * @type {Array.<ScrollSpy>}
- */
- ScrollSpy._elements = [];
- /**
- * @static
- * @memberof ScrollSpy
- * @type {Array.<ScrollSpy>}
- */
- ScrollSpy._elementsInView = [];
- /**
- * @static
- * @memberof ScrollSpy
- * @type {Array.<cash>}
- */
- ScrollSpy._visibleElements = [];
- /**
- * @static
- * @memberof ScrollSpy
- */
- ScrollSpy._count = 0;
- /**
- * @static
- * @memberof ScrollSpy
- */
- ScrollSpy._increment = 0;
- /**
- * @static
- * @memberof ScrollSpy
- */
- ScrollSpy._ticks = 0;
- M.ScrollSpy = ScrollSpy;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(ScrollSpy, 'scrollSpy', 'M_ScrollSpy');
- }
- })(cash, M.anime);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- data: {}, // Autocomplete data set
- limit: Infinity, // Limit of results the autocomplete shows
- onAutocomplete: null, // Callback for when autocompleted
- minLength: 1, // Min characters before autocomplete starts
- sortFunction: function (a, b, inputString) {
- // Sort function for sorting autocomplete results
- return a.indexOf(inputString) - b.indexOf(inputString);
- }
- };
- /**
- * @class
- *
- */
- var Autocomplete = function (_Component10) {
- _inherits(Autocomplete, _Component10);
- /**
- * Construct Autocomplete instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Autocomplete(el, options) {
- _classCallCheck(this, Autocomplete);
- var _this37 = _possibleConstructorReturn(this, (Autocomplete.__proto__ || Object.getPrototypeOf(Autocomplete)).call(this, Autocomplete, el, options));
- _this37.el.M_Autocomplete = _this37;
- /**
- * Options for the autocomplete
- * @member Autocomplete#options
- * @prop {Number} duration
- * @prop {Number} dist
- * @prop {number} shift
- * @prop {number} padding
- * @prop {Boolean} fullWidth
- * @prop {Boolean} indicators
- * @prop {Boolean} noWrap
- * @prop {Function} onCycleTo
- */
- _this37.options = $.extend({}, Autocomplete.defaults, options);
- // Setup
- _this37.isOpen = false;
- _this37.count = 0;
- _this37.activeIndex = -1;
- _this37.oldVal;
- _this37.$inputField = _this37.$el.closest('.input-field');
- _this37.$active = $();
- _this37._mousedown = false;
- _this37._setupDropdown();
- _this37._setupEventHandlers();
- return _this37;
- }
- _createClass(Autocomplete, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this._removeDropdown();
- this.el.M_Autocomplete = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleInputBlurBound = this._handleInputBlur.bind(this);
- this._handleInputKeyupAndFocusBound = this._handleInputKeyupAndFocus.bind(this);
- this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
- this._handleInputClickBound = this._handleInputClick.bind(this);
- this._handleContainerMousedownAndTouchstartBound = this._handleContainerMousedownAndTouchstart.bind(this);
- this._handleContainerMouseupAndTouchendBound = this._handleContainerMouseupAndTouchend.bind(this);
- this.el.addEventListener('blur', this._handleInputBlurBound);
- this.el.addEventListener('keyup', this._handleInputKeyupAndFocusBound);
- this.el.addEventListener('focus', this._handleInputKeyupAndFocusBound);
- this.el.addEventListener('keydown', this._handleInputKeydownBound);
- this.el.addEventListener('click', this._handleInputClickBound);
- this.container.addEventListener('mousedown', this._handleContainerMousedownAndTouchstartBound);
- this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);
- if (typeof window.ontouchstart !== 'undefined') {
- this.container.addEventListener('touchstart', this._handleContainerMousedownAndTouchstartBound);
- this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchendBound);
- }
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('blur', this._handleInputBlurBound);
- this.el.removeEventListener('keyup', this._handleInputKeyupAndFocusBound);
- this.el.removeEventListener('focus', this._handleInputKeyupAndFocusBound);
- this.el.removeEventListener('keydown', this._handleInputKeydownBound);
- this.el.removeEventListener('click', this._handleInputClickBound);
- this.container.removeEventListener('mousedown', this._handleContainerMousedownAndTouchstartBound);
- this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchendBound);
- if (typeof window.ontouchstart !== 'undefined') {
- this.container.removeEventListener('touchstart', this._handleContainerMousedownAndTouchstartBound);
- this.container.removeEventListener('touchend', this._handleContainerMouseupAndTouchendBound);
- }
- }
- /**
- * Setup dropdown
- */
- }, {
- key: "_setupDropdown",
- value: function _setupDropdown() {
- var _this38 = this;
- this.container = document.createElement('ul');
- this.container.id = "autocomplete-options-" + M.guid();
- $(this.container).addClass('autocomplete-content dropdown-content');
- this.$inputField.append(this.container);
- this.el.setAttribute('data-target', this.container.id);
- this.dropdown = M.Dropdown.init(this.el, {
- autoFocus: false,
- closeOnClick: false,
- coverTrigger: false,
- onItemClick: function (itemEl) {
- _this38.selectOption($(itemEl));
- }
- });
- // Sketchy removal of dropdown click handler
- this.el.removeEventListener('click', this.dropdown._handleClickBound);
- }
- /**
- * Remove dropdown
- */
- }, {
- key: "_removeDropdown",
- value: function _removeDropdown() {
- this.container.parentNode.removeChild(this.container);
- }
- /**
- * Handle Input Blur
- */
- }, {
- key: "_handleInputBlur",
- value: function _handleInputBlur() {
- if (!this._mousedown) {
- this.close();
- this._resetAutocomplete();
- }
- }
- /**
- * Handle Input Keyup and Focus
- * @param {Event} e
- */
- }, {
- key: "_handleInputKeyupAndFocus",
- value: function _handleInputKeyupAndFocus(e) {
- if (e.type === 'keyup') {
- Autocomplete._keydown = false;
- }
- this.count = 0;
- var val = this.el.value.toLowerCase();
- // Don't capture enter or arrow key usage.
- if (e.keyCode === 13 || e.keyCode === 38 || e.keyCode === 40) {
- return;
- }
- // Check if the input isn't empty
- // Check if focus triggered by tab
- if (this.oldVal !== val && (M.tabPressed || e.type !== 'focus')) {
- this.open();
- }
- // Update oldVal
- this.oldVal = val;
- }
- /**
- * Handle Input Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleInputKeydown",
- value: function _handleInputKeydown(e) {
- Autocomplete._keydown = true;
- // Arrow keys and enter key usage
- var keyCode = e.keyCode,
- liElement = void 0,
- numItems = $(this.container).children('li').length;
- // select element on Enter
- if (keyCode === M.keys.ENTER && this.activeIndex >= 0) {
- liElement = $(this.container).children('li').eq(this.activeIndex);
- if (liElement.length) {
- this.selectOption(liElement);
- e.preventDefault();
- }
- return;
- }
- // Capture up and down key
- if (keyCode === M.keys.ARROW_UP || keyCode === M.keys.ARROW_DOWN) {
- e.preventDefault();
- if (keyCode === M.keys.ARROW_UP && this.activeIndex > 0) {
- this.activeIndex--;
- }
- if (keyCode === M.keys.ARROW_DOWN && this.activeIndex < numItems - 1) {
- this.activeIndex++;
- }
- this.$active.removeClass('active');
- if (this.activeIndex >= 0) {
- this.$active = $(this.container).children('li').eq(this.activeIndex);
- this.$active.addClass('active');
- }
- }
- }
- /**
- * Handle Input Click
- * @param {Event} e
- */
- }, {
- key: "_handleInputClick",
- value: function _handleInputClick(e) {
- this.open();
- }
- /**
- * Handle Container Mousedown and Touchstart
- * @param {Event} e
- */
- }, {
- key: "_handleContainerMousedownAndTouchstart",
- value: function _handleContainerMousedownAndTouchstart(e) {
- this._mousedown = true;
- }
- /**
- * Handle Container Mouseup and Touchend
- * @param {Event} e
- */
- }, {
- key: "_handleContainerMouseupAndTouchend",
- value: function _handleContainerMouseupAndTouchend(e) {
- this._mousedown = false;
- }
- /**
- * Highlight partial match
- */
- }, {
- key: "_highlight",
- value: function _highlight(string, $el) {
- var img = $el.find('img');
- var matchStart = $el.text().toLowerCase().indexOf('' + string.toLowerCase() + ''),
- matchEnd = matchStart + string.length - 1,
- beforeMatch = $el.text().slice(0, matchStart),
- matchText = $el.text().slice(matchStart, matchEnd + 1),
- afterMatch = $el.text().slice(matchEnd + 1);
- $el.html("<span>" + beforeMatch + "<span class='highlight'>" + matchText + "</span>" + afterMatch + "</span>");
- if (img.length) {
- $el.prepend(img);
- }
- }
- /**
- * Reset current element position
- */
- }, {
- key: "_resetCurrentElement",
- value: function _resetCurrentElement() {
- this.activeIndex = -1;
- this.$active.removeClass('active');
- }
- /**
- * Reset autocomplete elements
- */
- }, {
- key: "_resetAutocomplete",
- value: function _resetAutocomplete() {
- $(this.container).empty();
- this._resetCurrentElement();
- this.oldVal = null;
- this.isOpen = false;
- this._mousedown = false;
- }
- /**
- * Select autocomplete option
- * @param {Element} el Autocomplete option list item element
- */
- }, {
- key: "selectOption",
- value: function selectOption(el) {
- var text = el.text().trim();
- this.el.value = text;
- this.$el.trigger('change');
- this._resetAutocomplete();
- this.close();
- // Handle onAutocomplete callback.
- if (typeof this.options.onAutocomplete === 'function') {
- this.options.onAutocomplete.call(this, text);
- }
- }
- /**
- * Render dropdown content
- * @param {Object} data data set
- * @param {String} val current input value
- */
- }, {
- key: "_renderDropdown",
- value: function _renderDropdown(data, val) {
- var _this39 = this;
- this._resetAutocomplete();
- var matchingData = [];
- // Gather all matching data
- for (var key in data) {
- if (data.hasOwnProperty(key) && key.toLowerCase().indexOf(val) !== -1) {
- // Break if past limit
- if (this.count >= this.options.limit) {
- break;
- }
- var entry = {
- data: data[key],
- key: key
- };
- matchingData.push(entry);
- this.count++;
- }
- }
- // Sort
- if (this.options.sortFunction) {
- var sortFunctionBound = function (a, b) {
- return _this39.options.sortFunction(a.key.toLowerCase(), b.key.toLowerCase(), val.toLowerCase());
- };
- matchingData.sort(sortFunctionBound);
- }
- // Render
- for (var i = 0; i < matchingData.length; i++) {
- var _entry = matchingData[i];
- var $autocompleteOption = $('<li></li>');
- if (!!_entry.data) {
- $autocompleteOption.append("<img src=\"" + _entry.data + "\" class=\"right circle\"><span>" + _entry.key + "</span>");
- } else {
- $autocompleteOption.append('<span>' + _entry.key + '</span>');
- }
- $(this.container).append($autocompleteOption);
- this._highlight(val, $autocompleteOption);
- }
- }
- /**
- * Open Autocomplete Dropdown
- */
- }, {
- key: "open",
- value: function open() {
- var val = this.el.value.toLowerCase();
- this._resetAutocomplete();
- if (val.length >= this.options.minLength) {
- this.isOpen = true;
- this._renderDropdown(this.options.data, val);
- }
- // Open dropdown
- if (!this.dropdown.isOpen) {
- this.dropdown.open();
- } else {
- // Recalculate dropdown when its already open
- this.dropdown.recalculateDimensions();
- }
- }
- /**
- * Close Autocomplete Dropdown
- */
- }, {
- key: "close",
- value: function close() {
- this.dropdown.close();
- }
- /**
- * Update Data
- * @param {Object} data
- */
- }, {
- key: "updateData",
- value: function updateData(data) {
- var val = this.el.value.toLowerCase();
- this.options.data = data;
- if (this.isOpen) {
- this._renderDropdown(data, val);
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Autocomplete.__proto__ || Object.getPrototypeOf(Autocomplete), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Autocomplete;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Autocomplete;
- }(Component);
- /**
- * @static
- * @memberof Autocomplete
- */
- Autocomplete._keydown = false;
- M.Autocomplete = Autocomplete;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Autocomplete, 'autocomplete', 'M_Autocomplete');
- }
- })(cash);
- ;(function ($) {
- // Function to update labels of text fields
- M.updateTextFields = function () {
- var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea';
- $(input_selector).each(function (element, index) {
- var $this = $(this);
- if (element.value.length > 0 || $(element).is(':focus') || element.autofocus || $this.attr('placeholder') !== null) {
- $this.siblings('label').addClass('active');
- } else if (element.validity) {
- $this.siblings('label').toggleClass('active', element.validity.badInput === true);
- } else {
- $this.siblings('label').removeClass('active');
- }
- });
- };
- M.validate_field = function (object) {
- var hasLength = object.attr('data-length') !== null;
- var lenAttr = parseInt(object.attr('data-length'));
- var len = object[0].value.length;
- if (len === 0 && object[0].validity.badInput === false && !object.is(':required')) {
- if (object.hasClass('validate')) {
- object.removeClass('valid');
- object.removeClass('invalid');
- }
- } else {
- if (object.hasClass('validate')) {
- // Check for character counter attributes
- if (object.is(':valid') && hasLength && len <= lenAttr || object.is(':valid') && !hasLength) {
- object.removeClass('invalid');
- object.addClass('valid');
- } else {
- object.removeClass('valid');
- object.addClass('invalid');
- }
- }
- }
- };
- M.textareaAutoResize = function ($textarea) {
- // Wrap if native element
- if ($textarea instanceof Element) {
- $textarea = $($textarea);
- }
- if (!$textarea.length) {
- console.error('No textarea element found');
- return;
- }
- // Textarea Auto Resize
- var hiddenDiv = $('.hiddendiv').first();
- if (!hiddenDiv.length) {
- hiddenDiv = $('<div class="hiddendiv common"></div>');
- $('body').append(hiddenDiv);
- }
- // Set font properties of hiddenDiv
- var fontFamily = $textarea.css('font-family');
- var fontSize = $textarea.css('font-size');
- var lineHeight = $textarea.css('line-height');
- // Firefox can't handle padding shorthand.
- var paddingTop = $textarea.css('padding-top');
- var paddingRight = $textarea.css('padding-right');
- var paddingBottom = $textarea.css('padding-bottom');
- var paddingLeft = $textarea.css('padding-left');
- if (fontSize) {
- hiddenDiv.css('font-size', fontSize);
- }
- if (fontFamily) {
- hiddenDiv.css('font-family', fontFamily);
- }
- if (lineHeight) {
- hiddenDiv.css('line-height', lineHeight);
- }
- if (paddingTop) {
- hiddenDiv.css('padding-top', paddingTop);
- }
- if (paddingRight) {
- hiddenDiv.css('padding-right', paddingRight);
- }
- if (paddingBottom) {
- hiddenDiv.css('padding-bottom', paddingBottom);
- }
- if (paddingLeft) {
- hiddenDiv.css('padding-left', paddingLeft);
- }
- // Set original-height, if none
- if (!$textarea.data('original-height')) {
- $textarea.data('original-height', $textarea.height());
- }
- if ($textarea.attr('wrap') === 'off') {
- hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre');
- }
- hiddenDiv.text($textarea[0].value + '\n');
- var content = hiddenDiv.html().replace(/\n/g, '<br>');
- hiddenDiv.html(content);
- // When textarea is hidden, width goes crazy.
- // Approximate with half of window size
- if ($textarea[0].offsetWidth > 0 && $textarea[0].offsetHeight > 0) {
- hiddenDiv.css('width', $textarea.width() + 'px');
- } else {
- hiddenDiv.css('width', window.innerWidth / 2 + 'px');
- }
- /**
- * Resize if the new height is greater than the
- * original height of the textarea
- */
- if ($textarea.data('original-height') <= hiddenDiv.innerHeight()) {
- $textarea.css('height', hiddenDiv.innerHeight() + 'px');
- } else if ($textarea[0].value.length < $textarea.data('previous-length')) {
- /**
- * In case the new height is less than original height, it
- * means the textarea has less text than before
- * So we set the height to the original one
- */
- $textarea.css('height', $textarea.data('original-height') + 'px');
- }
- $textarea.data('previous-length', $textarea[0].value.length);
- };
- $(document).ready(function () {
- // Text based inputs
- var input_selector = 'input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea';
- // Add active if form auto complete
- $(document).on('change', input_selector, function () {
- if (this.value.length !== 0 || $(this).attr('placeholder') !== null) {
- $(this).siblings('label').addClass('active');
- }
- M.validate_field($(this));
- });
- // Add active if input element has been pre-populated on document ready
- $(document).ready(function () {
- M.updateTextFields();
- });
- // HTML DOM FORM RESET handling
- $(document).on('reset', function (e) {
- var formReset = $(e.target);
- if (formReset.is('form')) {
- formReset.find(input_selector).removeClass('valid').removeClass('invalid');
- formReset.find(input_selector).each(function (e) {
- if (this.value.length) {
- $(this).siblings('label').removeClass('active');
- }
- });
- // Reset select (after native reset)
- setTimeout(function () {
- formReset.find('select').each(function () {
- // check if initialized
- if (this.M_FormSelect) {
- $(this).trigger('change');
- }
- });
- }, 0);
- }
- });
- /**
- * Add active when element has focus
- * @param {Event} e
- */
- document.addEventListener('focus', function (e) {
- if ($(e.target).is(input_selector)) {
- $(e.target).siblings('label, .prefix').addClass('active');
- }
- }, true);
- /**
- * Remove active when element is blurred
- * @param {Event} e
- */
- document.addEventListener('blur', function (e) {
- var $inputElement = $(e.target);
- if ($inputElement.is(input_selector)) {
- var selector = '.prefix';
- if ($inputElement[0].value.length === 0 && $inputElement[0].validity.badInput !== true && $inputElement.attr('placeholder') === null) {
- selector += ', label';
- }
- $inputElement.siblings(selector).removeClass('active');
- M.validate_field($inputElement);
- }
- }, true);
- // Radio and Checkbox focus class
- var radio_checkbox = 'input[type=radio], input[type=checkbox]';
- $(document).on('keyup', radio_checkbox, function (e) {
- // TAB, check if tabbing to radio or checkbox.
- if (e.which === M.keys.TAB) {
- $(this).addClass('tabbed');
- var $this = $(this);
- $this.one('blur', function (e) {
- $(this).removeClass('tabbed');
- });
- return;
- }
- });
- var text_area_selector = '.materialize-textarea';
- $(text_area_selector).each(function () {
- var $textarea = $(this);
- /**
- * Resize textarea on document load after storing
- * the original height and the original length
- */
- $textarea.data('original-height', $textarea.height());
- $textarea.data('previous-length', this.value.length);
- M.textareaAutoResize($textarea);
- });
- $(document).on('keyup', text_area_selector, function () {
- M.textareaAutoResize($(this));
- });
- $(document).on('keydown', text_area_selector, function () {
- M.textareaAutoResize($(this));
- });
- // File Input Path
- $(document).on('change', '.file-field input[type="file"]', function () {
- var file_field = $(this).closest('.file-field');
- var path_input = file_field.find('input.file-path');
- var files = $(this)[0].files;
- var file_names = [];
- for (var i = 0; i < files.length; i++) {
- file_names.push(files[i].name);
- }
- path_input[0].value = file_names.join(', ');
- path_input.trigger('change');
- });
- }); // End of $(document).ready
- })(cash);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- indicators: true,
- height: 400,
- duration: 500,
- interval: 6000
- };
- /**
- * @class
- *
- */
- var Slider = function (_Component11) {
- _inherits(Slider, _Component11);
- /**
- * Construct Slider instance and set up overlay
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Slider(el, options) {
- _classCallCheck(this, Slider);
- var _this40 = _possibleConstructorReturn(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).call(this, Slider, el, options));
- _this40.el.M_Slider = _this40;
- /**
- * Options for the modal
- * @member Slider#options
- * @prop {Boolean} [indicators=true] - Show indicators
- * @prop {Number} [height=400] - height of slider
- * @prop {Number} [duration=500] - Length in ms of slide transition
- * @prop {Number} [interval=6000] - Length in ms of slide interval
- */
- _this40.options = $.extend({}, Slider.defaults, options);
- // setup
- _this40.$slider = _this40.$el.find('.slides');
- _this40.$slides = _this40.$slider.children('li');
- _this40.activeIndex = _this40.$slides.filter(function (item) {
- return $(item).hasClass('active');
- }).first().index();
- if (_this40.activeIndex != -1) {
- _this40.$active = _this40.$slides.eq(_this40.activeIndex);
- }
- _this40._setSliderHeight();
- // Set initial positions of captions
- _this40.$slides.find('.caption').each(function (el) {
- _this40._animateCaptionIn(el, 0);
- });
- // Move img src into background-image
- _this40.$slides.find('img').each(function (el) {
- var placeholderBase64 = 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
- if ($(el).attr('src') !== placeholderBase64) {
- $(el).css('background-image', 'url("' + $(el).attr('src') + '")');
- $(el).attr('src', placeholderBase64);
- }
- });
- _this40._setupIndicators();
- // Show active slide
- if (_this40.$active) {
- _this40.$active.css('display', 'block');
- } else {
- _this40.$slides.first().addClass('active');
- anim({
- targets: _this40.$slides.first()[0],
- opacity: 1,
- duration: _this40.options.duration,
- easing: 'easeOutQuad'
- });
- _this40.activeIndex = 0;
- _this40.$active = _this40.$slides.eq(_this40.activeIndex);
- // Update indicators
- if (_this40.options.indicators) {
- _this40.$indicators.eq(_this40.activeIndex).addClass('active');
- }
- }
- // Adjust height to current slide
- _this40.$active.find('img').each(function (el) {
- anim({
- targets: _this40.$active.find('.caption')[0],
- opacity: 1,
- translateX: 0,
- translateY: 0,
- duration: _this40.options.duration,
- easing: 'easeOutQuad'
- });
- });
- _this40._setupEventHandlers();
- // auto scroll
- _this40.start();
- return _this40;
- }
- _createClass(Slider, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this.pause();
- this._removeIndicators();
- this._removeEventHandlers();
- this.el.M_Slider = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- var _this41 = this;
- this._handleIntervalBound = this._handleInterval.bind(this);
- this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this);
- if (this.options.indicators) {
- this.$indicators.each(function (el) {
- el.addEventListener('click', _this41._handleIndicatorClickBound);
- });
- }
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- var _this42 = this;
- if (this.options.indicators) {
- this.$indicators.each(function (el) {
- el.removeEventListener('click', _this42._handleIndicatorClickBound);
- });
- }
- }
- /**
- * Handle indicator click
- * @param {Event} e
- */
- }, {
- key: "_handleIndicatorClick",
- value: function _handleIndicatorClick(e) {
- var currIndex = $(e.target).index();
- this.set(currIndex);
- }
- /**
- * Handle Interval
- */
- }, {
- key: "_handleInterval",
- value: function _handleInterval() {
- var newActiveIndex = this.$slider.find('.active').index();
- if (this.$slides.length === newActiveIndex + 1) newActiveIndex = 0;
- // loop to start
- else newActiveIndex += 1;
- this.set(newActiveIndex);
- }
- /**
- * Animate in caption
- * @param {Element} caption
- * @param {Number} duration
- */
- }, {
- key: "_animateCaptionIn",
- value: function _animateCaptionIn(caption, duration) {
- var animOptions = {
- targets: caption,
- opacity: 0,
- duration: duration,
- easing: 'easeOutQuad'
- };
- if ($(caption).hasClass('center-align')) {
- animOptions.translateY = -100;
- } else if ($(caption).hasClass('right-align')) {
- animOptions.translateX = 100;
- } else if ($(caption).hasClass('left-align')) {
- animOptions.translateX = -100;
- }
- anim(animOptions);
- }
- /**
- * Set height of slider
- */
- }, {
- key: "_setSliderHeight",
- value: function _setSliderHeight() {
- // If fullscreen, do nothing
- if (!this.$el.hasClass('fullscreen')) {
- if (this.options.indicators) {
- // Add height if indicators are present
- this.$el.css('height', this.options.height + 40 + 'px');
- } else {
- this.$el.css('height', this.options.height + 'px');
- }
- this.$slider.css('height', this.options.height + 'px');
- }
- }
- /**
- * Setup indicators
- */
- }, {
- key: "_setupIndicators",
- value: function _setupIndicators() {
- var _this43 = this;
- if (this.options.indicators) {
- this.$indicators = $('<ul class="indicators"></ul>');
- this.$slides.each(function (el, index) {
- var $indicator = $('<li class="indicator-item"></li>');
- _this43.$indicators.append($indicator[0]);
- });
- this.$el.append(this.$indicators[0]);
- this.$indicators = this.$indicators.children('li.indicator-item');
- }
- }
- /**
- * Remove indicators
- */
- }, {
- key: "_removeIndicators",
- value: function _removeIndicators() {
- this.$el.find('ul.indicators').remove();
- }
- /**
- * Cycle to nth item
- * @param {Number} index
- */
- }, {
- key: "set",
- value: function set(index) {
- var _this44 = this;
- // Wrap around indices.
- if (index >= this.$slides.length) index = 0;else if (index < 0) index = this.$slides.length - 1;
- // Only do if index changes
- if (this.activeIndex != index) {
- this.$active = this.$slides.eq(this.activeIndex);
- var $caption = this.$active.find('.caption');
- this.$active.removeClass('active');
- anim({
- targets: this.$active[0],
- opacity: 0,
- duration: this.options.duration,
- easing: 'easeOutQuad',
- complete: function () {
- _this44.$slides.not('.active').each(function (el) {
- anim({
- targets: el,
- opacity: 0,
- translateX: 0,
- translateY: 0,
- duration: 0,
- easing: 'easeOutQuad'
- });
- });
- }
- });
- this._animateCaptionIn($caption[0], this.options.duration);
- // Update indicators
- if (this.options.indicators) {
- this.$indicators.eq(this.activeIndex).removeClass('active');
- this.$indicators.eq(index).addClass('active');
- }
- anim({
- targets: this.$slides.eq(index)[0],
- opacity: 1,
- duration: this.options.duration,
- easing: 'easeOutQuad'
- });
- anim({
- targets: this.$slides.eq(index).find('.caption')[0],
- opacity: 1,
- translateX: 0,
- translateY: 0,
- duration: this.options.duration,
- delay: this.options.duration,
- easing: 'easeOutQuad'
- });
- this.$slides.eq(index).addClass('active');
- this.activeIndex = index;
- // Reset interval
- this.start();
- }
- }
- /**
- * Pause slider interval
- */
- }, {
- key: "pause",
- value: function pause() {
- clearInterval(this.interval);
- }
- /**
- * Start slider interval
- */
- }, {
- key: "start",
- value: function start() {
- clearInterval(this.interval);
- this.interval = setInterval(this._handleIntervalBound, this.options.duration + this.options.interval);
- }
- /**
- * Move to next slide
- */
- }, {
- key: "next",
- value: function next() {
- var newIndex = this.activeIndex + 1;
- // Wrap around indices.
- if (newIndex >= this.$slides.length) newIndex = 0;else if (newIndex < 0) newIndex = this.$slides.length - 1;
- this.set(newIndex);
- }
- /**
- * Move to previous slide
- */
- }, {
- key: "prev",
- value: function prev() {
- var newIndex = this.activeIndex - 1;
- // Wrap around indices.
- if (newIndex >= this.$slides.length) newIndex = 0;else if (newIndex < 0) newIndex = this.$slides.length - 1;
- this.set(newIndex);
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Slider.__proto__ || Object.getPrototypeOf(Slider), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Slider;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Slider;
- }(Component);
- M.Slider = Slider;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Slider, 'slider', 'M_Slider');
- }
- })(cash, M.anime);
- ;(function ($, anim) {
- $(document).on('click', '.card', function (e) {
- if ($(this).children('.card-reveal').length) {
- var $card = $(e.target).closest('.card');
- if ($card.data('initialOverflow') === undefined) {
- $card.data('initialOverflow', $card.css('overflow') === undefined ? '' : $card.css('overflow'));
- }
- var $cardReveal = $(this).find('.card-reveal');
- if ($(e.target).is($('.card-reveal .card-title')) || $(e.target).is($('.card-reveal .card-title i'))) {
- // Make Reveal animate down and display none
- anim({
- targets: $cardReveal[0],
- translateY: 0,
- duration: 225,
- easing: 'easeInOutQuad',
- complete: function (anim) {
- var el = anim.animatables[0].target;
- $(el).css({ display: 'none' });
- $card.css('overflow', $card.data('initialOverflow'));
- }
- });
- } else if ($(e.target).is($('.card .activator')) || $(e.target).is($('.card .activator i'))) {
- $card.css('overflow', 'hidden');
- $cardReveal.css({ display: 'block' });
- anim({
- targets: $cardReveal[0],
- translateY: '-100%',
- duration: 300,
- easing: 'easeInOutQuad'
- });
- }
- }
- });
- })(cash, M.anime);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- data: [],
- placeholder: '',
- secondaryPlaceholder: '',
- autocompleteOptions: {},
- limit: Infinity,
- onChipAdd: null,
- onChipSelect: null,
- onChipDelete: null
- };
- /**
- * @typedef {Object} chip
- * @property {String} tag chip tag string
- * @property {String} [image] chip avatar image string
- */
- /**
- * @class
- *
- */
- var Chips = function (_Component12) {
- _inherits(Chips, _Component12);
- /**
- * Construct Chips instance and set up overlay
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Chips(el, options) {
- _classCallCheck(this, Chips);
- var _this45 = _possibleConstructorReturn(this, (Chips.__proto__ || Object.getPrototypeOf(Chips)).call(this, Chips, el, options));
- _this45.el.M_Chips = _this45;
- /**
- * Options for the modal
- * @member Chips#options
- * @prop {Array} data
- * @prop {String} placeholder
- * @prop {String} secondaryPlaceholder
- * @prop {Object} autocompleteOptions
- */
- _this45.options = $.extend({}, Chips.defaults, options);
- _this45.$el.addClass('chips input-field');
- _this45.chipsData = [];
- _this45.$chips = $();
- _this45._setupInput();
- _this45.hasAutocomplete = Object.keys(_this45.options.autocompleteOptions).length > 0;
- // Set input id
- if (!_this45.$input.attr('id')) {
- _this45.$input.attr('id', M.guid());
- }
- // Render initial chips
- if (_this45.options.data.length) {
- _this45.chipsData = _this45.options.data;
- _this45._renderChips(_this45.chipsData);
- }
- // Setup autocomplete if needed
- if (_this45.hasAutocomplete) {
- _this45._setupAutocomplete();
- }
- _this45._setPlaceholder();
- _this45._setupLabel();
- _this45._setupEventHandlers();
- return _this45;
- }
- _createClass(Chips, [{
- key: "getData",
- /**
- * Get Chips Data
- */
- value: function getData() {
- return this.chipsData;
- }
- /**
- * Teardown component
- */
- }, {
- key: "destroy",
- value: function destroy() {
- this._removeEventHandlers();
- this.$chips.remove();
- this.el.M_Chips = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleChipClickBound = this._handleChipClick.bind(this);
- this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
- this._handleInputFocusBound = this._handleInputFocus.bind(this);
- this._handleInputBlurBound = this._handleInputBlur.bind(this);
- this.el.addEventListener('click', this._handleChipClickBound);
- document.addEventListener('keydown', Chips._handleChipsKeydown);
- document.addEventListener('keyup', Chips._handleChipsKeyup);
- this.el.addEventListener('blur', Chips._handleChipsBlur, true);
- this.$input[0].addEventListener('focus', this._handleInputFocusBound);
- this.$input[0].addEventListener('blur', this._handleInputBlurBound);
- this.$input[0].addEventListener('keydown', this._handleInputKeydownBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('click', this._handleChipClickBound);
- document.removeEventListener('keydown', Chips._handleChipsKeydown);
- document.removeEventListener('keyup', Chips._handleChipsKeyup);
- this.el.removeEventListener('blur', Chips._handleChipsBlur, true);
- this.$input[0].removeEventListener('focus', this._handleInputFocusBound);
- this.$input[0].removeEventListener('blur', this._handleInputBlurBound);
- this.$input[0].removeEventListener('keydown', this._handleInputKeydownBound);
- }
- /**
- * Handle Chip Click
- * @param {Event} e
- */
- }, {
- key: "_handleChipClick",
- value: function _handleChipClick(e) {
- var $chip = $(e.target).closest('.chip');
- var clickedClose = $(e.target).is('.close');
- if ($chip.length) {
- var index = $chip.index();
- if (clickedClose) {
- // delete chip
- this.deleteChip(index);
- this.$input[0].focus();
- } else {
- // select chip
- this.selectChip(index);
- }
- // Default handle click to focus on input
- } else {
- this.$input[0].focus();
- }
- }
- /**
- * Handle Chips Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleInputFocus",
- /**
- * Handle Input Focus
- */
- value: function _handleInputFocus() {
- this.$el.addClass('focus');
- }
- /**
- * Handle Input Blur
- */
- }, {
- key: "_handleInputBlur",
- value: function _handleInputBlur() {
- this.$el.removeClass('focus');
- }
- /**
- * Handle Input Keydown
- * @param {Event} e
- */
- }, {
- key: "_handleInputKeydown",
- value: function _handleInputKeydown(e) {
- Chips._keydown = true;
- // enter
- if (e.keyCode === 13) {
- // Override enter if autocompleting.
- if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {
- return;
- }
- e.preventDefault();
- this.addChip({
- tag: this.$input[0].value
- });
- this.$input[0].value = '';
- // delete or left
- } else if ((e.keyCode === 8 || e.keyCode === 37) && this.$input[0].value === '' && this.chipsData.length) {
- e.preventDefault();
- this.selectChip(this.chipsData.length - 1);
- }
- }
- /**
- * Render Chip
- * @param {chip} chip
- * @return {Element}
- */
- }, {
- key: "_renderChip",
- value: function _renderChip(chip) {
- if (!chip.tag) {
- return;
- }
- var renderedChip = document.createElement('div');
- var closeIcon = document.createElement('i');
- renderedChip.classList.add('chip');
- renderedChip.textContent = chip.tag;
- renderedChip.setAttribute('tabindex', 0);
- $(closeIcon).addClass('material-icons close');
- closeIcon.textContent = 'close';
- // attach image if needed
- if (chip.image) {
- var img = document.createElement('img');
- img.setAttribute('src', chip.image);
- renderedChip.insertBefore(img, renderedChip.firstChild);
- }
- renderedChip.appendChild(closeIcon);
- return renderedChip;
- }
- /**
- * Render Chips
- */
- }, {
- key: "_renderChips",
- value: function _renderChips() {
- this.$chips.remove();
- for (var i = 0; i < this.chipsData.length; i++) {
- var chipEl = this._renderChip(this.chipsData[i]);
- this.$el.append(chipEl);
- this.$chips.add(chipEl);
- }
- // move input to end
- this.$el.append(this.$input[0]);
- }
- /**
- * Setup Autocomplete
- */
- }, {
- key: "_setupAutocomplete",
- value: function _setupAutocomplete() {
- var _this46 = this;
- this.options.autocompleteOptions.onAutocomplete = function (val) {
- _this46.addChip({
- tag: val
- });
- _this46.$input[0].value = '';
- _this46.$input[0].focus();
- };
- this.autocomplete = M.Autocomplete.init(this.$input[0], this.options.autocompleteOptions);
- }
- /**
- * Setup Input
- */
- }, {
- key: "_setupInput",
- value: function _setupInput() {
- this.$input = this.$el.find('input');
- if (!this.$input.length) {
- this.$input = $('<input></input>');
- this.$el.append(this.$input);
- }
- this.$input.addClass('input');
- }
- /**
- * Setup Label
- */
- }, {
- key: "_setupLabel",
- value: function _setupLabel() {
- this.$label = this.$el.find('label');
- if (this.$label.length) {
- this.$label.setAttribute('for', this.$input.attr('id'));
- }
- }
- /**
- * Set placeholder
- */
- }, {
- key: "_setPlaceholder",
- value: function _setPlaceholder() {
- if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {
- $(this.$input).prop('placeholder', this.options.placeholder);
- } else if ((this.chipsData === undefined || !!this.chipsData.length) && this.options.secondaryPlaceholder) {
- $(this.$input).prop('placeholder', this.options.secondaryPlaceholder);
- }
- }
- /**
- * Check if chip is valid
- * @param {chip} chip
- */
- }, {
- key: "_isValid",
- value: function _isValid(chip) {
- if (chip.hasOwnProperty('tag') && chip.tag !== '') {
- var exists = false;
- for (var i = 0; i < this.chipsData.length; i++) {
- if (this.chipsData[i].tag === chip.tag) {
- exists = true;
- break;
- }
- }
- return !exists;
- }
- return false;
- }
- /**
- * Add chip
- * @param {chip} chip
- */
- }, {
- key: "addChip",
- value: function addChip(chip) {
- if (!this._isValid(chip) || this.chipsData.length >= this.options.limit) {
- return;
- }
- var renderedChip = this._renderChip(chip);
- this.$chips.add(renderedChip);
- this.chipsData.push(chip);
- $(this.$input).before(renderedChip);
- this._setPlaceholder();
- // fire chipAdd callback
- if (typeof this.options.onChipAdd === 'function') {
- this.options.onChipAdd.call(this, this.$el, renderedChip);
- }
- }
- /**
- * Delete chip
- * @param {Number} chip
- */
- }, {
- key: "deleteChip",
- value: function deleteChip(chipIndex) {
- var $chip = this.$chips.eq(chipIndex);
- this.$chips.eq(chipIndex).remove();
- this.$chips = this.$chips.filter(function (el) {
- return $(el).index() >= 0;
- });
- this.chipsData.splice(chipIndex, 1);
- this._setPlaceholder();
- // fire chipDelete callback
- if (typeof this.options.onChipDelete === 'function') {
- this.options.onChipDelete.call(this, this.$el, $chip[0]);
- }
- }
- /**
- * Select chip
- * @param {Number} chip
- */
- }, {
- key: "selectChip",
- value: function selectChip(chipIndex) {
- var $chip = this.$chips.eq(chipIndex);
- this._selectedChip = $chip;
- $chip[0].focus();
- // fire chipSelect callback
- if (typeof this.options.onChipSelect === 'function') {
- this.options.onChipSelect.call(this, this.$el, $chip[0]);
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Chips.__proto__ || Object.getPrototypeOf(Chips), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Chips;
- }
- }, {
- key: "_handleChipsKeydown",
- value: function _handleChipsKeydown(e) {
- Chips._keydown = true;
- var $chips = $(e.target).closest('.chips');
- var chipsKeydown = e.target && $chips.length;
- // Don't handle keydown inputs on input and textarea
- if ($(e.target).is('input, textarea') || !chipsKeydown) {
- return;
- }
- var currChips = $chips[0].M_Chips;
- // backspace and delete
- if (e.keyCode === 8 || e.keyCode === 46) {
- e.preventDefault();
- var selectIndex = currChips.chipsData.length;
- if (currChips._selectedChip) {
- var index = currChips._selectedChip.index();
- currChips.deleteChip(index);
- currChips._selectedChip = null;
- // Make sure selectIndex doesn't go negative
- selectIndex = Math.max(index - 1, 0);
- }
- if (currChips.chipsData.length) {
- currChips.selectChip(selectIndex);
- }
- // left arrow key
- } else if (e.keyCode === 37) {
- if (currChips._selectedChip) {
- var _selectIndex = currChips._selectedChip.index() - 1;
- if (_selectIndex < 0) {
- return;
- }
- currChips.selectChip(_selectIndex);
- }
- // right arrow key
- } else if (e.keyCode === 39) {
- if (currChips._selectedChip) {
- var _selectIndex2 = currChips._selectedChip.index() + 1;
- if (_selectIndex2 >= currChips.chipsData.length) {
- currChips.$input[0].focus();
- } else {
- currChips.selectChip(_selectIndex2);
- }
- }
- }
- }
- /**
- * Handle Chips Keyup
- * @param {Event} e
- */
- }, {
- key: "_handleChipsKeyup",
- value: function _handleChipsKeyup(e) {
- Chips._keydown = false;
- }
- /**
- * Handle Chips Blur
- * @param {Event} e
- */
- }, {
- key: "_handleChipsBlur",
- value: function _handleChipsBlur(e) {
- if (!Chips._keydown) {
- var $chips = $(e.target).closest('.chips');
- var currChips = $chips[0].M_Chips;
- currChips._selectedChip = null;
- }
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Chips;
- }(Component);
- /**
- * @static
- * @memberof Chips
- */
- Chips._keydown = false;
- M.Chips = Chips;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Chips, 'chips', 'M_Chips');
- }
- $(document).ready(function () {
- // Handle removal of static chips.
- $(document.body).on('click', '.chip .close', function () {
- var $chips = $(this).closest('.chips');
- if ($chips.length && $chips[0].M_Chips) {
- return;
- }
- $(this).closest('.chip').remove();
- });
- });
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- top: 0,
- bottom: Infinity,
- offset: 0,
- onPositionChange: null
- };
- /**
- * @class
- *
- */
- var Pushpin = function (_Component13) {
- _inherits(Pushpin, _Component13);
- /**
- * Construct Pushpin instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Pushpin(el, options) {
- _classCallCheck(this, Pushpin);
- var _this47 = _possibleConstructorReturn(this, (Pushpin.__proto__ || Object.getPrototypeOf(Pushpin)).call(this, Pushpin, el, options));
- _this47.el.M_Pushpin = _this47;
- /**
- * Options for the modal
- * @member Pushpin#options
- */
- _this47.options = $.extend({}, Pushpin.defaults, options);
- _this47.originalOffset = _this47.el.offsetTop;
- Pushpin._pushpins.push(_this47);
- _this47._setupEventHandlers();
- _this47._updatePosition();
- return _this47;
- }
- _createClass(Pushpin, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this.el.style.top = null;
- this._removePinClasses();
- this._removeEventHandlers();
- // Remove pushpin Inst
- var index = Pushpin._pushpins.indexOf(this);
- Pushpin._pushpins.splice(index, 1);
- }
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- document.addEventListener('scroll', Pushpin._updateElements);
- }
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- document.removeEventListener('scroll', Pushpin._updateElements);
- }
- }, {
- key: "_updatePosition",
- value: function _updatePosition() {
- var scrolled = M.getDocumentScrollTop() + this.options.offset;
- if (this.options.top <= scrolled && this.options.bottom >= scrolled && !this.el.classList.contains('pinned')) {
- this._removePinClasses();
- this.el.style.top = this.options.offset + "px";
- this.el.classList.add('pinned');
- // onPositionChange callback
- if (typeof this.options.onPositionChange === 'function') {
- this.options.onPositionChange.call(this, 'pinned');
- }
- }
- // Add pin-top (when scrolled position is above top)
- if (scrolled < this.options.top && !this.el.classList.contains('pin-top')) {
- this._removePinClasses();
- this.el.style.top = 0;
- this.el.classList.add('pin-top');
- // onPositionChange callback
- if (typeof this.options.onPositionChange === 'function') {
- this.options.onPositionChange.call(this, 'pin-top');
- }
- }
- // Add pin-bottom (when scrolled position is below bottom)
- if (scrolled > this.options.bottom && !this.el.classList.contains('pin-bottom')) {
- this._removePinClasses();
- this.el.classList.add('pin-bottom');
- this.el.style.top = this.options.bottom - this.originalOffset + "px";
- // onPositionChange callback
- if (typeof this.options.onPositionChange === 'function') {
- this.options.onPositionChange.call(this, 'pin-bottom');
- }
- }
- }
- }, {
- key: "_removePinClasses",
- value: function _removePinClasses() {
- // IE 11 bug (can't remove multiple classes in one line)
- this.el.classList.remove('pin-top');
- this.el.classList.remove('pinned');
- this.el.classList.remove('pin-bottom');
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Pushpin.__proto__ || Object.getPrototypeOf(Pushpin), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Pushpin;
- }
- }, {
- key: "_updateElements",
- value: function _updateElements() {
- for (var elIndex in Pushpin._pushpins) {
- var pInstance = Pushpin._pushpins[elIndex];
- pInstance._updatePosition();
- }
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Pushpin;
- }(Component);
- /**
- * @static
- * @memberof Pushpin
- */
- Pushpin._pushpins = [];
- M.Pushpin = Pushpin;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Pushpin, 'pushpin', 'M_Pushpin');
- }
- })(cash);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {
- direction: 'top',
- hoverEnabled: true,
- toolbarEnabled: false
- };
- $.fn.reverse = [].reverse;
- /**
- * @class
- *
- */
- var FloatingActionButton = function (_Component14) {
- _inherits(FloatingActionButton, _Component14);
- /**
- * Construct FloatingActionButton instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function FloatingActionButton(el, options) {
- _classCallCheck(this, FloatingActionButton);
- var _this48 = _possibleConstructorReturn(this, (FloatingActionButton.__proto__ || Object.getPrototypeOf(FloatingActionButton)).call(this, FloatingActionButton, el, options));
- _this48.el.M_FloatingActionButton = _this48;
- /**
- * Options for the fab
- * @member FloatingActionButton#options
- * @prop {Boolean} [direction] - Direction fab menu opens
- * @prop {Boolean} [hoverEnabled=true] - Enable hover vs click
- * @prop {Boolean} [toolbarEnabled=false] - Enable toolbar transition
- */
- _this48.options = $.extend({}, FloatingActionButton.defaults, options);
- _this48.isOpen = false;
- _this48.$anchor = _this48.$el.children('a').first();
- _this48.$menu = _this48.$el.children('ul').first();
- _this48.$floatingBtns = _this48.$el.find('ul .btn-floating');
- _this48.$floatingBtnsReverse = _this48.$el.find('ul .btn-floating').reverse();
- _this48.offsetY = 0;
- _this48.offsetX = 0;
- _this48.$el.addClass("direction-" + _this48.options.direction);
- if (_this48.options.direction === 'top') {
- _this48.offsetY = 40;
- } else if (_this48.options.direction === 'right') {
- _this48.offsetX = -40;
- } else if (_this48.options.direction === 'bottom') {
- _this48.offsetY = -40;
- } else {
- _this48.offsetX = 40;
- }
- _this48._setupEventHandlers();
- return _this48;
- }
- _createClass(FloatingActionButton, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.M_FloatingActionButton = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleFABClickBound = this._handleFABClick.bind(this);
- this._handleOpenBound = this.open.bind(this);
- this._handleCloseBound = this.close.bind(this);
- if (this.options.hoverEnabled && !this.options.toolbarEnabled) {
- this.el.addEventListener('mouseenter', this._handleOpenBound);
- this.el.addEventListener('mouseleave', this._handleCloseBound);
- } else {
- this.el.addEventListener('click', this._handleFABClickBound);
- }
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- if (this.options.hoverEnabled && !this.options.toolbarEnabled) {
- this.el.removeEventListener('mouseenter', this._handleOpenBound);
- this.el.removeEventListener('mouseleave', this._handleCloseBound);
- } else {
- this.el.removeEventListener('click', this._handleFABClickBound);
- }
- }
- /**
- * Handle FAB Click
- */
- }, {
- key: "_handleFABClick",
- value: function _handleFABClick() {
- if (this.isOpen) {
- this.close();
- } else {
- this.open();
- }
- }
- /**
- * Handle Document Click
- * @param {Event} e
- */
- }, {
- key: "_handleDocumentClick",
- value: function _handleDocumentClick(e) {
- if (!$(e.target).closest(this.$menu).length) {
- this.close();
- }
- }
- /**
- * Open FAB
- */
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen) {
- return;
- }
- if (this.options.toolbarEnabled) {
- this._animateInToolbar();
- } else {
- this._animateInFAB();
- }
- this.isOpen = true;
- }
- /**
- * Close FAB
- */
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- if (this.options.toolbarEnabled) {
- window.removeEventListener('scroll', this._handleCloseBound, true);
- document.body.removeEventListener('click', this._handleDocumentClickBound, true);
- this._animateOutToolbar();
- } else {
- this._animateOutFAB();
- }
- this.isOpen = false;
- }
- /**
- * Classic FAB Menu open
- */
- }, {
- key: "_animateInFAB",
- value: function _animateInFAB() {
- var _this49 = this;
- this.$el.addClass('active');
- var time = 0;
- this.$floatingBtnsReverse.each(function (el) {
- anim({
- targets: el,
- opacity: 1,
- scale: [0.4, 1],
- translateY: [_this49.offsetY, 0],
- translateX: [_this49.offsetX, 0],
- duration: 275,
- delay: time,
- easing: 'easeInOutQuad'
- });
- time += 40;
- });
- }
- /**
- * Classic FAB Menu close
- */
- }, {
- key: "_animateOutFAB",
- value: function _animateOutFAB() {
- var _this50 = this;
- this.$floatingBtnsReverse.each(function (el) {
- anim.remove(el);
- anim({
- targets: el,
- opacity: 0,
- scale: 0.4,
- translateY: _this50.offsetY,
- translateX: _this50.offsetX,
- duration: 175,
- easing: 'easeOutQuad',
- complete: function () {
- _this50.$el.removeClass('active');
- }
- });
- });
- }
- /**
- * Toolbar transition Menu open
- */
- }, {
- key: "_animateInToolbar",
- value: function _animateInToolbar() {
- var _this51 = this;
- var scaleFactor = void 0;
- var windowWidth = window.innerWidth;
- var windowHeight = window.innerHeight;
- var btnRect = this.el.getBoundingClientRect();
- var backdrop = $('<div class="fab-backdrop"></div>');
- var fabColor = this.$anchor.css('background-color');
- this.$anchor.append(backdrop);
- this.offsetX = btnRect.left - windowWidth / 2 + btnRect.width / 2;
- this.offsetY = windowHeight - btnRect.bottom;
- scaleFactor = windowWidth / backdrop[0].clientWidth;
- this.btnBottom = btnRect.bottom;
- this.btnLeft = btnRect.left;
- this.btnWidth = btnRect.width;
- // Set initial state
- this.$el.addClass('active');
- this.$el.css({
- 'text-align': 'center',
- width: '100%',
- bottom: 0,
- left: 0,
- transform: 'translateX(' + this.offsetX + 'px)',
- transition: 'none'
- });
- this.$anchor.css({
- transform: 'translateY(' + -this.offsetY + 'px)',
- transition: 'none'
- });
- backdrop.css({
- 'background-color': fabColor
- });
- setTimeout(function () {
- _this51.$el.css({
- transform: '',
- transition: 'transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s'
- });
- _this51.$anchor.css({
- overflow: 'visible',
- transform: '',
- transition: 'transform .2s'
- });
- setTimeout(function () {
- _this51.$el.css({
- overflow: 'hidden',
- 'background-color': fabColor
- });
- backdrop.css({
- transform: 'scale(' + scaleFactor + ')',
- transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'
- });
- _this51.$menu.children('li').children('a').css({
- opacity: 1
- });
- // Scroll to close.
- _this51._handleDocumentClickBound = _this51._handleDocumentClick.bind(_this51);
- window.addEventListener('scroll', _this51._handleCloseBound, true);
- document.body.addEventListener('click', _this51._handleDocumentClickBound, true);
- }, 100);
- }, 0);
- }
- /**
- * Toolbar transition Menu close
- */
- }, {
- key: "_animateOutToolbar",
- value: function _animateOutToolbar() {
- var _this52 = this;
- var windowWidth = window.innerWidth;
- var windowHeight = window.innerHeight;
- var backdrop = this.$el.find('.fab-backdrop');
- var fabColor = this.$anchor.css('background-color');
- this.offsetX = this.btnLeft - windowWidth / 2 + this.btnWidth / 2;
- this.offsetY = windowHeight - this.btnBottom;
- // Hide backdrop
- this.$el.removeClass('active');
- this.$el.css({
- 'background-color': 'transparent',
- transition: 'none'
- });
- this.$anchor.css({
- transition: 'none'
- });
- backdrop.css({
- transform: 'scale(0)',
- 'background-color': fabColor
- });
- this.$menu.children('li').children('a').css({
- opacity: ''
- });
- setTimeout(function () {
- backdrop.remove();
- // Set initial state.
- _this52.$el.css({
- 'text-align': '',
- width: '',
- bottom: '',
- left: '',
- overflow: '',
- 'background-color': '',
- transform: 'translate3d(' + -_this52.offsetX + 'px,0,0)'
- });
- _this52.$anchor.css({
- overflow: '',
- transform: 'translate3d(0,' + _this52.offsetY + 'px,0)'
- });
- setTimeout(function () {
- _this52.$el.css({
- transform: 'translate3d(0,0,0)',
- transition: 'transform .2s'
- });
- _this52.$anchor.css({
- transform: 'translate3d(0,0,0)',
- transition: 'transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)'
- });
- }, 20);
- }, 200);
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(FloatingActionButton.__proto__ || Object.getPrototypeOf(FloatingActionButton), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_FloatingActionButton;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return FloatingActionButton;
- }(Component);
- M.FloatingActionButton = FloatingActionButton;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(FloatingActionButton, 'floatingActionButton', 'M_FloatingActionButton');
- }
- })(cash, M.anime);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- // Close when date is selected
- autoClose: false,
- // the default output format for the input field value
- format: 'mmm dd, yyyy',
- // Used to create date object from current input string
- parse: null,
- // The initial date to view when first opened
- defaultDate: null,
- // Make the `defaultDate` the initial selected value
- setDefaultDate: false,
- disableWeekends: false,
- disableDayFn: null,
- // First day of week (0: Sunday, 1: Monday etc)
- firstDay: 0,
- // The earliest date that can be selected
- minDate: null,
- // Thelatest date that can be selected
- maxDate: null,
- // Number of years either side, or array of upper/lower range
- yearRange: 10,
- // used internally (don't config outside)
- minYear: 0,
- maxYear: 9999,
- minMonth: undefined,
- maxMonth: undefined,
- startRange: null,
- endRange: null,
- isRTL: false,
- // Render the month after year in the calendar title
- showMonthAfterYear: false,
- // Render days of the calendar grid that fall in the next or previous month
- showDaysInNextAndPreviousMonths: false,
- // Specify a DOM element to render the calendar in
- container: null,
- // Show clear button
- showClearBtn: false,
- // internationalization
- i18n: {
- cancel: 'Cancel',
- clear: 'Clear',
- done: 'Ok',
- previousMonth: '‹',
- nextMonth: '›',
- months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
- weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
- weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']
- },
- // events array
- events: [],
- // callback function
- onSelect: null,
- onOpen: null,
- onClose: null,
- onDraw: null
- };
- /**
- * @class
- *
- */
- var Datepicker = function (_Component15) {
- _inherits(Datepicker, _Component15);
- /**
- * Construct Datepicker instance and set up overlay
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Datepicker(el, options) {
- _classCallCheck(this, Datepicker);
- var _this53 = _possibleConstructorReturn(this, (Datepicker.__proto__ || Object.getPrototypeOf(Datepicker)).call(this, Datepicker, el, options));
- _this53.el.M_Datepicker = _this53;
- _this53.options = $.extend({}, Datepicker.defaults, options);
- // make sure i18n defaults are not lost when only few i18n option properties are passed
- if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {
- _this53.options.i18n = $.extend({}, Datepicker.defaults.i18n, options.i18n);
- }
- // Remove time component from minDate and maxDate options
- if (_this53.options.minDate) _this53.options.minDate.setHours(0, 0, 0, 0);
- if (_this53.options.maxDate) _this53.options.maxDate.setHours(0, 0, 0, 0);
- _this53.id = M.guid();
- _this53._setupVariables();
- _this53._insertHTMLIntoDOM();
- _this53._setupModal();
- _this53._setupEventHandlers();
- if (!_this53.options.defaultDate) {
- _this53.options.defaultDate = new Date(Date.parse(_this53.el.value));
- }
- var defDate = _this53.options.defaultDate;
- if (Datepicker._isDate(defDate)) {
- if (_this53.options.setDefaultDate) {
- _this53.setDate(defDate, true);
- _this53.setInputValue();
- } else {
- _this53.gotoDate(defDate);
- }
- } else {
- _this53.gotoDate(new Date());
- }
- /**
- * Describes open/close state of datepicker
- * @type {Boolean}
- */
- _this53.isOpen = false;
- return _this53;
- }
- _createClass(Datepicker, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.modal.destroy();
- $(this.modalEl).remove();
- this.destroySelects();
- this.el.M_Datepicker = undefined;
- }
- }, {
- key: "destroySelects",
- value: function destroySelects() {
- var oldYearSelect = this.calendarEl.querySelector('.orig-select-year');
- if (oldYearSelect) {
- M.FormSelect.getInstance(oldYearSelect).destroy();
- }
- var oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');
- if (oldMonthSelect) {
- M.FormSelect.getInstance(oldMonthSelect).destroy();
- }
- }
- }, {
- key: "_insertHTMLIntoDOM",
- value: function _insertHTMLIntoDOM() {
- if (this.options.showClearBtn) {
- $(this.clearBtn).css({ visibility: '' });
- this.clearBtn.innerHTML = this.options.i18n.clear;
- }
- this.doneBtn.innerHTML = this.options.i18n.done;
- this.cancelBtn.innerHTML = this.options.i18n.cancel;
- if (this.options.container) {
- this.$modalEl.appendTo(this.options.container);
- } else {
- this.$modalEl.insertBefore(this.el);
- }
- }
- }, {
- key: "_setupModal",
- value: function _setupModal() {
- var _this54 = this;
- this.modalEl.id = 'modal-' + this.id;
- this.modal = M.Modal.init(this.modalEl, {
- onCloseEnd: function () {
- _this54.isOpen = false;
- }
- });
- }
- }, {
- key: "toString",
- value: function toString(format) {
- var _this55 = this;
- format = format || this.options.format;
- if (!Datepicker._isDate(this.date)) {
- return '';
- }
- var formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);
- var formattedDate = formatArray.map(function (label) {
- if (_this55.formats[label]) {
- return _this55.formats[label]();
- }
- return label;
- }).join('');
- return formattedDate;
- }
- }, {
- key: "setDate",
- value: function setDate(date, preventOnSelect) {
- if (!date) {
- this.date = null;
- this._renderDateDisplay();
- return this.draw();
- }
- if (typeof date === 'string') {
- date = new Date(Date.parse(date));
- }
- if (!Datepicker._isDate(date)) {
- return;
- }
- var min = this.options.minDate,
- max = this.options.maxDate;
- if (Datepicker._isDate(min) && date < min) {
- date = min;
- } else if (Datepicker._isDate(max) && date > max) {
- date = max;
- }
- this.date = new Date(date.getTime());
- this._renderDateDisplay();
- Datepicker._setToStartOfDay(this.date);
- this.gotoDate(this.date);
- if (!preventOnSelect && typeof this.options.onSelect === 'function') {
- this.options.onSelect.call(this, this.date);
- }
- }
- }, {
- key: "setInputValue",
- value: function setInputValue() {
- this.el.value = this.toString();
- this.$el.trigger('change', { firedBy: this });
- }
- }, {
- key: "_renderDateDisplay",
- value: function _renderDateDisplay() {
- var displayDate = Datepicker._isDate(this.date) ? this.date : new Date();
- var i18n = this.options.i18n;
- var day = i18n.weekdaysShort[displayDate.getDay()];
- var month = i18n.monthsShort[displayDate.getMonth()];
- var date = displayDate.getDate();
- this.yearTextEl.innerHTML = displayDate.getFullYear();
- this.dateTextEl.innerHTML = day + ", " + month + " " + date;
- }
- /**
- * change view to a specific date
- */
- }, {
- key: "gotoDate",
- value: function gotoDate(date) {
- var newCalendar = true;
- if (!Datepicker._isDate(date)) {
- return;
- }
- if (this.calendars) {
- var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),
- lastVisibleDate = new Date(this.calendars[this.calendars.length - 1].year, this.calendars[this.calendars.length - 1].month, 1),
- visibleDate = date.getTime();
- // get the end of the month
- lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);
- lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);
- newCalendar = visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;
- }
- if (newCalendar) {
- this.calendars = [{
- month: date.getMonth(),
- year: date.getFullYear()
- }];
- }
- this.adjustCalendars();
- }
- }, {
- key: "adjustCalendars",
- value: function adjustCalendars() {
- this.calendars[0] = this.adjustCalendar(this.calendars[0]);
- this.draw();
- }
- }, {
- key: "adjustCalendar",
- value: function adjustCalendar(calendar) {
- if (calendar.month < 0) {
- calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);
- calendar.month += 12;
- }
- if (calendar.month > 11) {
- calendar.year += Math.floor(Math.abs(calendar.month) / 12);
- calendar.month -= 12;
- }
- return calendar;
- }
- }, {
- key: "nextMonth",
- value: function nextMonth() {
- this.calendars[0].month++;
- this.adjustCalendars();
- }
- }, {
- key: "prevMonth",
- value: function prevMonth() {
- this.calendars[0].month--;
- this.adjustCalendars();
- }
- }, {
- key: "render",
- value: function render(year, month, randId) {
- var opts = this.options,
- now = new Date(),
- days = Datepicker._getDaysInMonth(year, month),
- before = new Date(year, month, 1).getDay(),
- data = [],
- row = [];
- Datepicker._setToStartOfDay(now);
- if (opts.firstDay > 0) {
- before -= opts.firstDay;
- if (before < 0) {
- before += 7;
- }
- }
- var previousMonth = month === 0 ? 11 : month - 1,
- nextMonth = month === 11 ? 0 : month + 1,
- yearOfPreviousMonth = month === 0 ? year - 1 : year,
- yearOfNextMonth = month === 11 ? year + 1 : year,
- daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);
- var cells = days + before,
- after = cells;
- while (after > 7) {
- after -= 7;
- }
- cells += 7 - after;
- var isWeekSelected = false;
- for (var i = 0, r = 0; i < cells; i++) {
- var day = new Date(year, month, 1 + (i - before)),
- isSelected = Datepicker._isDate(this.date) ? Datepicker._compareDates(day, this.date) : false,
- isToday = Datepicker._compareDates(day, now),
- hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false,
- isEmpty = i < before || i >= days + before,
- dayNumber = 1 + (i - before),
- monthNumber = month,
- yearNumber = year,
- isStartRange = opts.startRange && Datepicker._compareDates(opts.startRange, day),
- isEndRange = opts.endRange && Datepicker._compareDates(opts.endRange, day),
- isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,
- isDisabled = opts.minDate && day < opts.minDate || opts.maxDate && day > opts.maxDate || opts.disableWeekends && Datepicker._isWeekend(day) || opts.disableDayFn && opts.disableDayFn(day);
- if (isEmpty) {
- if (i < before) {
- dayNumber = daysInPreviousMonth + dayNumber;
- monthNumber = previousMonth;
- yearNumber = yearOfPreviousMonth;
- } else {
- dayNumber = dayNumber - days;
- monthNumber = nextMonth;
- yearNumber = yearOfNextMonth;
- }
- }
- var dayConfig = {
- day: dayNumber,
- month: monthNumber,
- year: yearNumber,
- hasEvent: hasEvent,
- isSelected: isSelected,
- isToday: isToday,
- isDisabled: isDisabled,
- isEmpty: isEmpty,
- isStartRange: isStartRange,
- isEndRange: isEndRange,
- isInRange: isInRange,
- showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths
- };
- row.push(this.renderDay(dayConfig));
- if (++r === 7) {
- data.push(this.renderRow(row, opts.isRTL, isWeekSelected));
- row = [];
- r = 0;
- isWeekSelected = false;
- }
- }
- return this.renderTable(opts, data, randId);
- }
- }, {
- key: "renderDay",
- value: function renderDay(opts) {
- var arr = [];
- var ariaSelected = 'false';
- if (opts.isEmpty) {
- if (opts.showDaysInNextAndPreviousMonths) {
- arr.push('is-outside-current-month');
- arr.push('is-selection-disabled');
- } else {
- return '<td class="is-empty"></td>';
- }
- }
- if (opts.isDisabled) {
- arr.push('is-disabled');
- }
- if (opts.isToday) {
- arr.push('is-today');
- }
- if (opts.isSelected) {
- arr.push('is-selected');
- ariaSelected = 'true';
- }
- if (opts.hasEvent) {
- arr.push('has-event');
- }
- if (opts.isInRange) {
- arr.push('is-inrange');
- }
- if (opts.isStartRange) {
- arr.push('is-startrange');
- }
- if (opts.isEndRange) {
- arr.push('is-endrange');
- }
- return "<td data-day=\"" + opts.day + "\" class=\"" + arr.join(' ') + "\" aria-selected=\"" + ariaSelected + "\">" + ("<button class=\"datepicker-day-button\" type=\"button\" data-year=\"" + opts.year + "\" data-month=\"" + opts.month + "\" data-day=\"" + opts.day + "\">" + opts.day + "</button>") + '</td>';
- }
- }, {
- key: "renderRow",
- value: function renderRow(days, isRTL, isRowSelected) {
- return '<tr class="datepicker-row' + (isRowSelected ? ' is-selected' : '') + '">' + (isRTL ? days.reverse() : days).join('') + '</tr>';
- }
- }, {
- key: "renderTable",
- value: function renderTable(opts, data, randId) {
- return '<div class="datepicker-table-wrapper"><table cellpadding="0" cellspacing="0" class="datepicker-table" role="grid" aria-labelledby="' + randId + '">' + this.renderHead(opts) + this.renderBody(data) + '</table></div>';
- }
- }, {
- key: "renderHead",
- value: function renderHead(opts) {
- var i = void 0,
- arr = [];
- for (i = 0; i < 7; i++) {
- arr.push("<th scope=\"col\"><abbr title=\"" + this.renderDayName(opts, i) + "\">" + this.renderDayName(opts, i, true) + "</abbr></th>");
- }
- return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';
- }
- }, {
- key: "renderBody",
- value: function renderBody(rows) {
- return '<tbody>' + rows.join('') + '</tbody>';
- }
- }, {
- key: "renderTitle",
- value: function renderTitle(instance, c, year, month, refYear, randId) {
- var i = void 0,
- j = void 0,
- arr = void 0,
- opts = this.options,
- isMinYear = year === opts.minYear,
- isMaxYear = year === opts.maxYear,
- html = '<div id="' + randId + '" class="datepicker-controls" role="heading" aria-live="assertive">',
- monthHtml = void 0,
- yearHtml = void 0,
- prev = true,
- next = true;
- for (arr = [], i = 0; i < 12; i++) {
- arr.push('<option value="' + (year === refYear ? i - c : 12 + i - c) + '"' + (i === month ? ' selected="selected"' : '') + (isMinYear && i < opts.minMonth || isMaxYear && i > opts.maxMonth ? 'disabled="disabled"' : '') + '>' + opts.i18n.months[i] + '</option>');
- }
- monthHtml = '<select class="datepicker-select orig-select-month" tabindex="-1">' + arr.join('') + '</select>';
- if ($.isArray(opts.yearRange)) {
- i = opts.yearRange[0];
- j = opts.yearRange[1] + 1;
- } else {
- i = year - opts.yearRange;
- j = 1 + year + opts.yearRange;
- }
- for (arr = []; i < j && i <= opts.maxYear; i++) {
- if (i >= opts.minYear) {
- arr.push("<option value=\"" + i + "\" " + (i === year ? 'selected="selected"' : '') + ">" + i + "</option>");
- }
- }
- yearHtml = "<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">" + arr.join('') + "</select>";
- var leftArrow = '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/><path d="M0-.5h24v24H0z" fill="none"/></svg>';
- html += "<button class=\"month-prev" + (prev ? '' : ' is-disabled') + "\" type=\"button\">" + leftArrow + "</button>";
- html += '<div class="selects-container">';
- if (opts.showMonthAfterYear) {
- html += yearHtml + monthHtml;
- } else {
- html += monthHtml + yearHtml;
- }
- html += '</div>';
- if (isMinYear && (month === 0 || opts.minMonth >= month)) {
- prev = false;
- }
- if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {
- next = false;
- }
- var rightArrow = '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/><path d="M0-.25h24v24H0z" fill="none"/></svg>';
- html += "<button class=\"month-next" + (next ? '' : ' is-disabled') + "\" type=\"button\">" + rightArrow + "</button>";
- return html += '</div>';
- }
- /**
- * refresh the HTML
- */
- }, {
- key: "draw",
- value: function draw(force) {
- if (!this.isOpen && !force) {
- return;
- }
- var opts = this.options,
- minYear = opts.minYear,
- maxYear = opts.maxYear,
- minMonth = opts.minMonth,
- maxMonth = opts.maxMonth,
- html = '',
- randId = void 0;
- if (this._y <= minYear) {
- this._y = minYear;
- if (!isNaN(minMonth) && this._m < minMonth) {
- this._m = minMonth;
- }
- }
- if (this._y >= maxYear) {
- this._y = maxYear;
- if (!isNaN(maxMonth) && this._m > maxMonth) {
- this._m = maxMonth;
- }
- }
- randId = 'datepicker-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);
- for (var c = 0; c < 1; c++) {
- this._renderDateDisplay();
- html += this.renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId);
- }
- this.destroySelects();
- this.calendarEl.innerHTML = html;
- // Init Materialize Select
- var yearSelect = this.calendarEl.querySelector('.orig-select-year');
- var monthSelect = this.calendarEl.querySelector('.orig-select-month');
- M.FormSelect.init(yearSelect, {
- classes: 'select-year',
- dropdownOptions: { container: document.body, constrainWidth: false }
- });
- M.FormSelect.init(monthSelect, {
- classes: 'select-month',
- dropdownOptions: { container: document.body, constrainWidth: false }
- });
- // Add change handlers for select
- yearSelect.addEventListener('change', this._handleYearChange.bind(this));
- monthSelect.addEventListener('change', this._handleMonthChange.bind(this));
- if (typeof this.options.onDraw === 'function') {
- this.options.onDraw(this);
- }
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
- this._handleInputClickBound = this._handleInputClick.bind(this);
- this._handleInputChangeBound = this._handleInputChange.bind(this);
- this._handleCalendarClickBound = this._handleCalendarClick.bind(this);
- this._finishSelectionBound = this._finishSelection.bind(this);
- this._handleMonthChange = this._handleMonthChange.bind(this);
- this._closeBound = this.close.bind(this);
- this.el.addEventListener('click', this._handleInputClickBound);
- this.el.addEventListener('keydown', this._handleInputKeydownBound);
- this.el.addEventListener('change', this._handleInputChangeBound);
- this.calendarEl.addEventListener('click', this._handleCalendarClickBound);
- this.doneBtn.addEventListener('click', this._finishSelectionBound);
- this.cancelBtn.addEventListener('click', this._closeBound);
- if (this.options.showClearBtn) {
- this._handleClearClickBound = this._handleClearClick.bind(this);
- this.clearBtn.addEventListener('click', this._handleClearClickBound);
- }
- }
- }, {
- key: "_setupVariables",
- value: function _setupVariables() {
- var _this56 = this;
- this.$modalEl = $(Datepicker._template);
- this.modalEl = this.$modalEl[0];
- this.calendarEl = this.modalEl.querySelector('.datepicker-calendar');
- this.yearTextEl = this.modalEl.querySelector('.year-text');
- this.dateTextEl = this.modalEl.querySelector('.date-text');
- if (this.options.showClearBtn) {
- this.clearBtn = this.modalEl.querySelector('.datepicker-clear');
- }
- this.doneBtn = this.modalEl.querySelector('.datepicker-done');
- this.cancelBtn = this.modalEl.querySelector('.datepicker-cancel');
- this.formats = {
- d: function () {
- return _this56.date.getDate();
- },
- dd: function () {
- var d = _this56.date.getDate();
- return (d < 10 ? '0' : '') + d;
- },
- ddd: function () {
- return _this56.options.i18n.weekdaysShort[_this56.date.getDay()];
- },
- dddd: function () {
- return _this56.options.i18n.weekdays[_this56.date.getDay()];
- },
- m: function () {
- return _this56.date.getMonth() + 1;
- },
- mm: function () {
- var m = _this56.date.getMonth() + 1;
- return (m < 10 ? '0' : '') + m;
- },
- mmm: function () {
- return _this56.options.i18n.monthsShort[_this56.date.getMonth()];
- },
- mmmm: function () {
- return _this56.options.i18n.months[_this56.date.getMonth()];
- },
- yy: function () {
- return ('' + _this56.date.getFullYear()).slice(2);
- },
- yyyy: function () {
- return _this56.date.getFullYear();
- }
- };
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('click', this._handleInputClickBound);
- this.el.removeEventListener('keydown', this._handleInputKeydownBound);
- this.el.removeEventListener('change', this._handleInputChangeBound);
- this.calendarEl.removeEventListener('click', this._handleCalendarClickBound);
- }
- }, {
- key: "_handleInputClick",
- value: function _handleInputClick() {
- this.open();
- }
- }, {
- key: "_handleInputKeydown",
- value: function _handleInputKeydown(e) {
- if (e.which === M.keys.ENTER) {
- e.preventDefault();
- this.open();
- }
- }
- }, {
- key: "_handleCalendarClick",
- value: function _handleCalendarClick(e) {
- if (!this.isOpen) {
- return;
- }
- var $target = $(e.target);
- if (!$target.hasClass('is-disabled')) {
- if ($target.hasClass('datepicker-day-button') && !$target.hasClass('is-empty') && !$target.parent().hasClass('is-disabled')) {
- this.setDate(new Date(e.target.getAttribute('data-year'), e.target.getAttribute('data-month'), e.target.getAttribute('data-day')));
- if (this.options.autoClose) {
- this._finishSelection();
- }
- } else if ($target.closest('.month-prev').length) {
- this.prevMonth();
- } else if ($target.closest('.month-next').length) {
- this.nextMonth();
- }
- }
- }
- }, {
- key: "_handleClearClick",
- value: function _handleClearClick() {
- this.date = null;
- this.setInputValue();
- this.close();
- }
- }, {
- key: "_handleMonthChange",
- value: function _handleMonthChange(e) {
- this.gotoMonth(e.target.value);
- }
- }, {
- key: "_handleYearChange",
- value: function _handleYearChange(e) {
- this.gotoYear(e.target.value);
- }
- /**
- * change view to a specific month (zero-index, e.g. 0: January)
- */
- }, {
- key: "gotoMonth",
- value: function gotoMonth(month) {
- if (!isNaN(month)) {
- this.calendars[0].month = parseInt(month, 10);
- this.adjustCalendars();
- }
- }
- /**
- * change view to a specific full year (e.g. "2012")
- */
- }, {
- key: "gotoYear",
- value: function gotoYear(year) {
- if (!isNaN(year)) {
- this.calendars[0].year = parseInt(year, 10);
- this.adjustCalendars();
- }
- }
- }, {
- key: "_handleInputChange",
- value: function _handleInputChange(e) {
- var date = void 0;
- // Prevent change event from being fired when triggered by the plugin
- if (e.firedBy === this) {
- return;
- }
- if (this.options.parse) {
- date = this.options.parse(this.el.value, this.options.format);
- } else {
- date = new Date(Date.parse(this.el.value));
- }
- if (Datepicker._isDate(date)) {
- this.setDate(date);
- }
- }
- }, {
- key: "renderDayName",
- value: function renderDayName(opts, day, abbr) {
- day += opts.firstDay;
- while (day >= 7) {
- day -= 7;
- }
- return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];
- }
- /**
- * Set input value to the selected date and close Datepicker
- */
- }, {
- key: "_finishSelection",
- value: function _finishSelection() {
- this.setInputValue();
- this.close();
- }
- /**
- * Open Datepicker
- */
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen) {
- return;
- }
- this.isOpen = true;
- if (typeof this.options.onOpen === 'function') {
- this.options.onOpen.call(this);
- }
- this.draw();
- this.modal.open();
- return this;
- }
- /**
- * Close Datepicker
- */
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- this.isOpen = false;
- if (typeof this.options.onClose === 'function') {
- this.options.onClose.call(this);
- }
- this.modal.close();
- return this;
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Datepicker.__proto__ || Object.getPrototypeOf(Datepicker), "init", this).call(this, this, els, options);
- }
- }, {
- key: "_isDate",
- value: function _isDate(obj) {
- return (/Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime())
- );
- }
- }, {
- key: "_isWeekend",
- value: function _isWeekend(date) {
- var day = date.getDay();
- return day === 0 || day === 6;
- }
- }, {
- key: "_setToStartOfDay",
- value: function _setToStartOfDay(date) {
- if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);
- }
- }, {
- key: "_getDaysInMonth",
- value: function _getDaysInMonth(year, month) {
- return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
- }
- }, {
- key: "_isLeapYear",
- value: function _isLeapYear(year) {
- // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951
- return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
- }
- }, {
- key: "_compareDates",
- value: function _compareDates(a, b) {
- // weak date comparison (use setToStartOfDay(date) to ensure correct result)
- return a.getTime() === b.getTime();
- }
- }, {
- key: "_setToStartOfDay",
- value: function _setToStartOfDay(date) {
- if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Datepicker;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Datepicker;
- }(Component);
- Datepicker._template = ['<div class= "modal datepicker-modal">', '<div class="modal-content datepicker-container">', '<div class="datepicker-date-display">', '<span class="year-text"></span>', '<span class="date-text"></span>', '</div>', '<div class="datepicker-calendar-container">', '<div class="datepicker-calendar"></div>', '<div class="datepicker-footer">', '<button class="btn-flat datepicker-clear waves-effect" style="visibility: hidden;" type="button"></button>', '<div class="confirmation-btns">', '<button class="btn-flat datepicker-cancel waves-effect" type="button"></button>', '<button class="btn-flat datepicker-done waves-effect" type="button"></button>', '</div>', '</div>', '</div>', '</div>', '</div>'].join('');
- M.Datepicker = Datepicker;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Datepicker, 'datepicker', 'M_Datepicker');
- }
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- dialRadius: 135,
- outerRadius: 105,
- innerRadius: 70,
- tickRadius: 20,
- duration: 350,
- container: null,
- defaultTime: 'now', // default time, 'now' or '13:14' e.g.
- fromNow: 0, // Millisecond offset from the defaultTime
- showClearBtn: false,
- // internationalization
- i18n: {
- cancel: 'Cancel',
- clear: 'Clear',
- done: 'Ok'
- },
- autoClose: false, // auto close when minute is selected
- twelveHour: true, // change to 12 hour AM/PM clock from 24 hour
- vibrate: true, // vibrate the device when dragging clock hand
- // Callbacks
- onOpenStart: null,
- onOpenEnd: null,
- onCloseStart: null,
- onCloseEnd: null,
- onSelect: null
- };
- /**
- * @class
- *
- */
- var Timepicker = function (_Component16) {
- _inherits(Timepicker, _Component16);
- function Timepicker(el, options) {
- _classCallCheck(this, Timepicker);
- var _this57 = _possibleConstructorReturn(this, (Timepicker.__proto__ || Object.getPrototypeOf(Timepicker)).call(this, Timepicker, el, options));
- _this57.el.M_Timepicker = _this57;
- _this57.options = $.extend({}, Timepicker.defaults, options);
- _this57.id = M.guid();
- _this57._insertHTMLIntoDOM();
- _this57._setupModal();
- _this57._setupVariables();
- _this57._setupEventHandlers();
- _this57._clockSetup();
- _this57._pickerSetup();
- return _this57;
- }
- _createClass(Timepicker, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.modal.destroy();
- $(this.modalEl).remove();
- this.el.M_Timepicker = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleInputKeydownBound = this._handleInputKeydown.bind(this);
- this._handleInputClickBound = this._handleInputClick.bind(this);
- this._handleClockClickStartBound = this._handleClockClickStart.bind(this);
- this._handleDocumentClickMoveBound = this._handleDocumentClickMove.bind(this);
- this._handleDocumentClickEndBound = this._handleDocumentClickEnd.bind(this);
- this.el.addEventListener('click', this._handleInputClickBound);
- this.el.addEventListener('keydown', this._handleInputKeydownBound);
- this.plate.addEventListener('mousedown', this._handleClockClickStartBound);
- this.plate.addEventListener('touchstart', this._handleClockClickStartBound);
- $(this.spanHours).on('click', this.showView.bind(this, 'hours'));
- $(this.spanMinutes).on('click', this.showView.bind(this, 'minutes'));
- }
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('click', this._handleInputClickBound);
- this.el.removeEventListener('keydown', this._handleInputKeydownBound);
- }
- }, {
- key: "_handleInputClick",
- value: function _handleInputClick() {
- this.open();
- }
- }, {
- key: "_handleInputKeydown",
- value: function _handleInputKeydown(e) {
- if (e.which === M.keys.ENTER) {
- e.preventDefault();
- this.open();
- }
- }
- }, {
- key: "_handleClockClickStart",
- value: function _handleClockClickStart(e) {
- e.preventDefault();
- var clockPlateBR = this.plate.getBoundingClientRect();
- var offset = { x: clockPlateBR.left, y: clockPlateBR.top };
- this.x0 = offset.x + this.options.dialRadius;
- this.y0 = offset.y + this.options.dialRadius;
- this.moved = false;
- var clickPos = Timepicker._Pos(e);
- this.dx = clickPos.x - this.x0;
- this.dy = clickPos.y - this.y0;
- // Set clock hands
- this.setHand(this.dx, this.dy, false);
- // Mousemove on document
- document.addEventListener('mousemove', this._handleDocumentClickMoveBound);
- document.addEventListener('touchmove', this._handleDocumentClickMoveBound);
- // Mouseup on document
- document.addEventListener('mouseup', this._handleDocumentClickEndBound);
- document.addEventListener('touchend', this._handleDocumentClickEndBound);
- }
- }, {
- key: "_handleDocumentClickMove",
- value: function _handleDocumentClickMove(e) {
- e.preventDefault();
- var clickPos = Timepicker._Pos(e);
- var x = clickPos.x - this.x0;
- var y = clickPos.y - this.y0;
- this.moved = true;
- this.setHand(x, y, false, true);
- }
- }, {
- key: "_handleDocumentClickEnd",
- value: function _handleDocumentClickEnd(e) {
- var _this58 = this;
- e.preventDefault();
- document.removeEventListener('mouseup', this._handleDocumentClickEndBound);
- document.removeEventListener('touchend', this._handleDocumentClickEndBound);
- var clickPos = Timepicker._Pos(e);
- var x = clickPos.x - this.x0;
- var y = clickPos.y - this.y0;
- if (this.moved && x === this.dx && y === this.dy) {
- this.setHand(x, y);
- }
- if (this.currentView === 'hours') {
- this.showView('minutes', this.options.duration / 2);
- } else if (this.options.autoClose) {
- $(this.minutesView).addClass('timepicker-dial-out');
- setTimeout(function () {
- _this58.done();
- }, this.options.duration / 2);
- }
- if (typeof this.options.onSelect === 'function') {
- this.options.onSelect.call(this, this.hours, this.minutes);
- }
- // Unbind mousemove event
- document.removeEventListener('mousemove', this._handleDocumentClickMoveBound);
- document.removeEventListener('touchmove', this._handleDocumentClickMoveBound);
- }
- }, {
- key: "_insertHTMLIntoDOM",
- value: function _insertHTMLIntoDOM() {
- this.$modalEl = $(Timepicker._template);
- this.modalEl = this.$modalEl[0];
- this.modalEl.id = 'modal-' + this.id;
- // Append popover to input by default
- var containerEl = document.querySelector(this.options.container);
- if (this.options.container && !!containerEl) {
- this.$modalEl.appendTo(containerEl);
- } else {
- this.$modalEl.insertBefore(this.el);
- }
- }
- }, {
- key: "_setupModal",
- value: function _setupModal() {
- var _this59 = this;
- this.modal = M.Modal.init(this.modalEl, {
- onOpenStart: this.options.onOpenStart,
- onOpenEnd: this.options.onOpenEnd,
- onCloseStart: this.options.onCloseStart,
- onCloseEnd: function () {
- if (typeof _this59.options.onCloseEnd === 'function') {
- _this59.options.onCloseEnd.call(_this59);
- }
- _this59.isOpen = false;
- }
- });
- }
- }, {
- key: "_setupVariables",
- value: function _setupVariables() {
- this.currentView = 'hours';
- this.vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null;
- this._canvas = this.modalEl.querySelector('.timepicker-canvas');
- this.plate = this.modalEl.querySelector('.timepicker-plate');
- this.hoursView = this.modalEl.querySelector('.timepicker-hours');
- this.minutesView = this.modalEl.querySelector('.timepicker-minutes');
- this.spanHours = this.modalEl.querySelector('.timepicker-span-hours');
- this.spanMinutes = this.modalEl.querySelector('.timepicker-span-minutes');
- this.spanAmPm = this.modalEl.querySelector('.timepicker-span-am-pm');
- this.footer = this.modalEl.querySelector('.timepicker-footer');
- this.amOrPm = 'PM';
- }
- }, {
- key: "_pickerSetup",
- value: function _pickerSetup() {
- var $clearBtn = $("<button class=\"btn-flat timepicker-clear waves-effect\" style=\"visibility: hidden;\" type=\"button\" tabindex=\"" + (this.options.twelveHour ? '3' : '1') + "\">" + this.options.i18n.clear + "</button>").appendTo(this.footer).on('click', this.clear.bind(this));
- if (this.options.showClearBtn) {
- $clearBtn.css({ visibility: '' });
- }
- var confirmationBtnsContainer = $('<div class="confirmation-btns"></div>');
- $('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="' + (this.options.twelveHour ? '3' : '1') + '">' + this.options.i18n.cancel + '</button>').appendTo(confirmationBtnsContainer).on('click', this.close.bind(this));
- $('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="' + (this.options.twelveHour ? '3' : '1') + '">' + this.options.i18n.done + '</button>').appendTo(confirmationBtnsContainer).on('click', this.done.bind(this));
- confirmationBtnsContainer.appendTo(this.footer);
- }
- }, {
- key: "_clockSetup",
- value: function _clockSetup() {
- if (this.options.twelveHour) {
- this.$amBtn = $('<div class="am-btn">AM</div>');
- this.$pmBtn = $('<div class="pm-btn">PM</div>');
- this.$amBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm);
- this.$pmBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm);
- }
- this._buildHoursView();
- this._buildMinutesView();
- this._buildSVGClock();
- }
- }, {
- key: "_buildSVGClock",
- value: function _buildSVGClock() {
- // Draw clock hands and others
- var dialRadius = this.options.dialRadius;
- var tickRadius = this.options.tickRadius;
- var diameter = dialRadius * 2;
- var svg = Timepicker._createSVGEl('svg');
- svg.setAttribute('class', 'timepicker-svg');
- svg.setAttribute('width', diameter);
- svg.setAttribute('height', diameter);
- var g = Timepicker._createSVGEl('g');
- g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');
- var bearing = Timepicker._createSVGEl('circle');
- bearing.setAttribute('class', 'timepicker-canvas-bearing');
- bearing.setAttribute('cx', 0);
- bearing.setAttribute('cy', 0);
- bearing.setAttribute('r', 4);
- var hand = Timepicker._createSVGEl('line');
- hand.setAttribute('x1', 0);
- hand.setAttribute('y1', 0);
- var bg = Timepicker._createSVGEl('circle');
- bg.setAttribute('class', 'timepicker-canvas-bg');
- bg.setAttribute('r', tickRadius);
- g.appendChild(hand);
- g.appendChild(bg);
- g.appendChild(bearing);
- svg.appendChild(g);
- this._canvas.appendChild(svg);
- this.hand = hand;
- this.bg = bg;
- this.bearing = bearing;
- this.g = g;
- }
- }, {
- key: "_buildHoursView",
- value: function _buildHoursView() {
- var $tick = $('<div class="timepicker-tick"></div>');
- // Hours view
- if (this.options.twelveHour) {
- for (var i = 1; i < 13; i += 1) {
- var tick = $tick.clone();
- var radian = i / 6 * Math.PI;
- var radius = this.options.outerRadius;
- tick.css({
- left: this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px',
- top: this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px'
- });
- tick.html(i === 0 ? '00' : i);
- this.hoursView.appendChild(tick[0]);
- // tick.on(mousedownEvent, mousedown);
- }
- } else {
- for (var _i2 = 0; _i2 < 24; _i2 += 1) {
- var _tick = $tick.clone();
- var _radian = _i2 / 6 * Math.PI;
- var inner = _i2 > 0 && _i2 < 13;
- var _radius = inner ? this.options.innerRadius : this.options.outerRadius;
- _tick.css({
- left: this.options.dialRadius + Math.sin(_radian) * _radius - this.options.tickRadius + 'px',
- top: this.options.dialRadius - Math.cos(_radian) * _radius - this.options.tickRadius + 'px'
- });
- _tick.html(_i2 === 0 ? '00' : _i2);
- this.hoursView.appendChild(_tick[0]);
- // tick.on(mousedownEvent, mousedown);
- }
- }
- }
- }, {
- key: "_buildMinutesView",
- value: function _buildMinutesView() {
- var $tick = $('<div class="timepicker-tick"></div>');
- // Minutes view
- for (var i = 0; i < 60; i += 5) {
- var tick = $tick.clone();
- var radian = i / 30 * Math.PI;
- tick.css({
- left: this.options.dialRadius + Math.sin(radian) * this.options.outerRadius - this.options.tickRadius + 'px',
- top: this.options.dialRadius - Math.cos(radian) * this.options.outerRadius - this.options.tickRadius + 'px'
- });
- tick.html(Timepicker._addLeadingZero(i));
- this.minutesView.appendChild(tick[0]);
- }
- }
- }, {
- key: "_handleAmPmClick",
- value: function _handleAmPmClick(e) {
- var $btnClicked = $(e.target);
- this.amOrPm = $btnClicked.hasClass('am-btn') ? 'AM' : 'PM';
- this._updateAmPmView();
- }
- }, {
- key: "_updateAmPmView",
- value: function _updateAmPmView() {
- if (this.options.twelveHour) {
- this.$amBtn.toggleClass('text-primary', this.amOrPm === 'AM');
- this.$pmBtn.toggleClass('text-primary', this.amOrPm === 'PM');
- }
- }
- }, {
- key: "_updateTimeFromInput",
- value: function _updateTimeFromInput() {
- // Get the time
- var value = ((this.el.value || this.options.defaultTime || '') + '').split(':');
- if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {
- if (value[1].toUpperCase().indexOf('AM') > 0) {
- this.amOrPm = 'AM';
- } else {
- this.amOrPm = 'PM';
- }
- value[1] = value[1].replace('AM', '').replace('PM', '');
- }
- if (value[0] === 'now') {
- var now = new Date(+new Date() + this.options.fromNow);
- value = [now.getHours(), now.getMinutes()];
- if (this.options.twelveHour) {
- this.amOrPm = value[0] >= 12 && value[0] < 24 ? 'PM' : 'AM';
- }
- }
- this.hours = +value[0] || 0;
- this.minutes = +value[1] || 0;
- this.spanHours.innerHTML = this.hours;
- this.spanMinutes.innerHTML = Timepicker._addLeadingZero(this.minutes);
- this._updateAmPmView();
- }
- }, {
- key: "showView",
- value: function showView(view, delay) {
- if (view === 'minutes' && $(this.hoursView).css('visibility') === 'visible') {
- // raiseCallback(this.options.beforeHourSelect);
- }
- var isHours = view === 'hours',
- nextView = isHours ? this.hoursView : this.minutesView,
- hideView = isHours ? this.minutesView : this.hoursView;
- this.currentView = view;
- $(this.spanHours).toggleClass('text-primary', isHours);
- $(this.spanMinutes).toggleClass('text-primary', !isHours);
- // Transition view
- hideView.classList.add('timepicker-dial-out');
- $(nextView).css('visibility', 'visible').removeClass('timepicker-dial-out');
- // Reset clock hand
- this.resetClock(delay);
- // After transitions ended
- clearTimeout(this.toggleViewTimer);
- this.toggleViewTimer = setTimeout(function () {
- $(hideView).css('visibility', 'hidden');
- }, this.options.duration);
- }
- }, {
- key: "resetClock",
- value: function resetClock(delay) {
- var view = this.currentView,
- value = this[view],
- isHours = view === 'hours',
- unit = Math.PI / (isHours ? 6 : 30),
- radian = value * unit,
- radius = isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,
- x = Math.sin(radian) * radius,
- y = -Math.cos(radian) * radius,
- self = this;
- if (delay) {
- $(this.canvas).addClass('timepicker-canvas-out');
- setTimeout(function () {
- $(self.canvas).removeClass('timepicker-canvas-out');
- self.setHand(x, y);
- }, delay);
- } else {
- this.setHand(x, y);
- }
- }
- }, {
- key: "setHand",
- value: function setHand(x, y, roundBy5) {
- var _this60 = this;
- var radian = Math.atan2(x, -y),
- isHours = this.currentView === 'hours',
- unit = Math.PI / (isHours || roundBy5 ? 6 : 30),
- z = Math.sqrt(x * x + y * y),
- inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2,
- radius = inner ? this.options.innerRadius : this.options.outerRadius;
- if (this.options.twelveHour) {
- radius = this.options.outerRadius;
- }
- // Radian should in range [0, 2PI]
- if (radian < 0) {
- radian = Math.PI * 2 + radian;
- }
- // Get the round value
- var value = Math.round(radian / unit);
- // Get the round radian
- radian = value * unit;
- // Correct the hours or minutes
- if (this.options.twelveHour) {
- if (isHours) {
- if (value === 0) value = 12;
- } else {
- if (roundBy5) value *= 5;
- if (value === 60) value = 0;
- }
- } else {
- if (isHours) {
- if (value === 12) {
- value = 0;
- }
- value = inner ? value === 0 ? 12 : value : value === 0 ? 0 : value + 12;
- } else {
- if (roundBy5) {
- value *= 5;
- }
- if (value === 60) {
- value = 0;
- }
- }
- }
- // Once hours or minutes changed, vibrate the device
- if (this[this.currentView] !== value) {
- if (this.vibrate && this.options.vibrate) {
- // Do not vibrate too frequently
- if (!this.vibrateTimer) {
- navigator[this.vibrate](10);
- this.vibrateTimer = setTimeout(function () {
- _this60.vibrateTimer = null;
- }, 100);
- }
- }
- }
- this[this.currentView] = value;
- if (isHours) {
- this['spanHours'].innerHTML = value;
- } else {
- this['spanMinutes'].innerHTML = Timepicker._addLeadingZero(value);
- }
- // Set clock hand and others' position
- var cx1 = Math.sin(radian) * (radius - this.options.tickRadius),
- cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),
- cx2 = Math.sin(radian) * radius,
- cy2 = -Math.cos(radian) * radius;
- this.hand.setAttribute('x2', cx1);
- this.hand.setAttribute('y2', cy1);
- this.bg.setAttribute('cx', cx2);
- this.bg.setAttribute('cy', cy2);
- }
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen) {
- return;
- }
- this.isOpen = true;
- this._updateTimeFromInput();
- this.showView('hours');
- this.modal.open();
- }
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- this.isOpen = false;
- this.modal.close();
- }
- /**
- * Finish timepicker selection.
- */
- }, {
- key: "done",
- value: function done(e, clearValue) {
- // Set input value
- var last = this.el.value;
- var value = clearValue ? '' : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);
- this.time = value;
- if (!clearValue && this.options.twelveHour) {
- value = value + " " + this.amOrPm;
- }
- this.el.value = value;
- // Trigger change event
- if (value !== last) {
- this.$el.trigger('change');
- }
- this.close();
- this.el.focus();
- }
- }, {
- key: "clear",
- value: function clear() {
- this.done(null, true);
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Timepicker.__proto__ || Object.getPrototypeOf(Timepicker), "init", this).call(this, this, els, options);
- }
- }, {
- key: "_addLeadingZero",
- value: function _addLeadingZero(num) {
- return (num < 10 ? '0' : '') + num;
- }
- }, {
- key: "_createSVGEl",
- value: function _createSVGEl(name) {
- var svgNS = 'http://www.w3.org/2000/svg';
- return document.createElementNS(svgNS, name);
- }
- /**
- * @typedef {Object} Point
- * @property {number} x The X Coordinate
- * @property {number} y The Y Coordinate
- */
- /**
- * Get x position of mouse or touch event
- * @param {Event} e
- * @return {Point} x and y location
- */
- }, {
- key: "_Pos",
- value: function _Pos(e) {
- if (e.targetTouches && e.targetTouches.length >= 1) {
- return { x: e.targetTouches[0].clientX, y: e.targetTouches[0].clientY };
- }
- // mouse event
- return { x: e.clientX, y: e.clientY };
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Timepicker;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Timepicker;
- }(Component);
- Timepicker._template = ['<div class= "modal timepicker-modal">', '<div class="modal-content timepicker-container">', '<div class="timepicker-digital-display">', '<div class="timepicker-text-container">', '<div class="timepicker-display-column">', '<span class="timepicker-span-hours text-primary"></span>', ':', '<span class="timepicker-span-minutes"></span>', '</div>', '<div class="timepicker-display-column timepicker-display-am-pm">', '<div class="timepicker-span-am-pm"></div>', '</div>', '</div>', '</div>', '<div class="timepicker-analog-display">', '<div class="timepicker-plate">', '<div class="timepicker-canvas"></div>', '<div class="timepicker-dial timepicker-hours"></div>', '<div class="timepicker-dial timepicker-minutes timepicker-dial-out"></div>', '</div>', '<div class="timepicker-footer"></div>', '</div>', '</div>', '</div>'].join('');
- M.Timepicker = Timepicker;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Timepicker, 'timepicker', 'M_Timepicker');
- }
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {};
- /**
- * @class
- *
- */
- var CharacterCounter = function (_Component17) {
- _inherits(CharacterCounter, _Component17);
- /**
- * Construct CharacterCounter instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function CharacterCounter(el, options) {
- _classCallCheck(this, CharacterCounter);
- var _this61 = _possibleConstructorReturn(this, (CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter)).call(this, CharacterCounter, el, options));
- _this61.el.M_CharacterCounter = _this61;
- /**
- * Options for the character counter
- */
- _this61.options = $.extend({}, CharacterCounter.defaults, options);
- _this61.isInvalid = false;
- _this61.isValidLength = false;
- _this61._setupCounter();
- _this61._setupEventHandlers();
- return _this61;
- }
- _createClass(CharacterCounter, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.CharacterCounter = undefined;
- this._removeCounter();
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleUpdateCounterBound = this.updateCounter.bind(this);
- this.el.addEventListener('focus', this._handleUpdateCounterBound, true);
- this.el.addEventListener('input', this._handleUpdateCounterBound, true);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('focus', this._handleUpdateCounterBound, true);
- this.el.removeEventListener('input', this._handleUpdateCounterBound, true);
- }
- /**
- * Setup counter element
- */
- }, {
- key: "_setupCounter",
- value: function _setupCounter() {
- this.counterEl = document.createElement('span');
- $(this.counterEl).addClass('character-counter').css({
- float: 'right',
- 'font-size': '12px',
- height: 1
- });
- this.$el.parent().append(this.counterEl);
- }
- /**
- * Remove counter element
- */
- }, {
- key: "_removeCounter",
- value: function _removeCounter() {
- $(this.counterEl).remove();
- }
- /**
- * Update counter
- */
- }, {
- key: "updateCounter",
- value: function updateCounter() {
- var maxLength = +this.$el.attr('data-length'),
- actualLength = this.el.value.length;
- this.isValidLength = actualLength <= maxLength;
- var counterString = actualLength;
- if (maxLength) {
- counterString += '/' + maxLength;
- this._validateInput();
- }
- $(this.counterEl).html(counterString);
- }
- /**
- * Add validation classes
- */
- }, {
- key: "_validateInput",
- value: function _validateInput() {
- if (this.isValidLength && this.isInvalid) {
- this.isInvalid = false;
- this.$el.removeClass('invalid');
- } else if (!this.isValidLength && !this.isInvalid) {
- this.isInvalid = true;
- this.$el.removeClass('valid');
- this.$el.addClass('invalid');
- }
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_CharacterCounter;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return CharacterCounter;
- }(Component);
- M.CharacterCounter = CharacterCounter;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(CharacterCounter, 'characterCounter', 'M_CharacterCounter');
- }
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- duration: 200, // ms
- dist: -100, // zoom scale TODO: make this more intuitive as an option
- shift: 0, // spacing for center image
- padding: 0, // Padding between non center items
- numVisible: 5, // Number of visible items in carousel
- fullWidth: false, // Change to full width styles
- indicators: false, // Toggle indicators
- noWrap: false, // Don't wrap around and cycle through items.
- onCycleTo: null // Callback for when a new slide is cycled to.
- };
- /**
- * @class
- *
- */
- var Carousel = function (_Component18) {
- _inherits(Carousel, _Component18);
- /**
- * Construct Carousel instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Carousel(el, options) {
- _classCallCheck(this, Carousel);
- var _this62 = _possibleConstructorReturn(this, (Carousel.__proto__ || Object.getPrototypeOf(Carousel)).call(this, Carousel, el, options));
- _this62.el.M_Carousel = _this62;
- /**
- * Options for the carousel
- * @member Carousel#options
- * @prop {Number} duration
- * @prop {Number} dist
- * @prop {Number} shift
- * @prop {Number} padding
- * @prop {Number} numVisible
- * @prop {Boolean} fullWidth
- * @prop {Boolean} indicators
- * @prop {Boolean} noWrap
- * @prop {Function} onCycleTo
- */
- _this62.options = $.extend({}, Carousel.defaults, options);
- // Setup
- _this62.hasMultipleSlides = _this62.$el.find('.carousel-item').length > 1;
- _this62.showIndicators = _this62.options.indicators && _this62.hasMultipleSlides;
- _this62.noWrap = _this62.options.noWrap || !_this62.hasMultipleSlides;
- _this62.pressed = false;
- _this62.dragged = false;
- _this62.offset = _this62.target = 0;
- _this62.images = [];
- _this62.itemWidth = _this62.$el.find('.carousel-item').first().innerWidth();
- _this62.itemHeight = _this62.$el.find('.carousel-item').first().innerHeight();
- _this62.dim = _this62.itemWidth * 2 + _this62.options.padding || 1; // Make sure dim is non zero for divisions.
- _this62._autoScrollBound = _this62._autoScroll.bind(_this62);
- _this62._trackBound = _this62._track.bind(_this62);
- // Full Width carousel setup
- if (_this62.options.fullWidth) {
- _this62.options.dist = 0;
- _this62._setCarouselHeight();
- // Offset fixed items when indicators.
- if (_this62.showIndicators) {
- _this62.$el.find('.carousel-fixed-item').addClass('with-indicators');
- }
- }
- // Iterate through slides
- _this62.$indicators = $('<ul class="indicators"></ul>');
- _this62.$el.find('.carousel-item').each(function (el, i) {
- _this62.images.push(el);
- if (_this62.showIndicators) {
- var $indicator = $('<li class="indicator-item"></li>');
- // Add active to first by default.
- if (i === 0) {
- $indicator[0].classList.add('active');
- }
- _this62.$indicators.append($indicator);
- }
- });
- if (_this62.showIndicators) {
- _this62.$el.append(_this62.$indicators);
- }
- _this62.count = _this62.images.length;
- // Cap numVisible at count
- _this62.options.numVisible = Math.min(_this62.count, _this62.options.numVisible);
- // Setup cross browser string
- _this62.xform = 'transform';
- ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) {
- var e = prefix + 'Transform';
- if (typeof document.body.style[e] !== 'undefined') {
- _this62.xform = e;
- return false;
- }
- return true;
- });
- _this62._setupEventHandlers();
- _this62._scroll(_this62.offset);
- return _this62;
- }
- _createClass(Carousel, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.M_Carousel = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- var _this63 = this;
- this._handleCarouselTapBound = this._handleCarouselTap.bind(this);
- this._handleCarouselDragBound = this._handleCarouselDrag.bind(this);
- this._handleCarouselReleaseBound = this._handleCarouselRelease.bind(this);
- this._handleCarouselClickBound = this._handleCarouselClick.bind(this);
- if (typeof window.ontouchstart !== 'undefined') {
- this.el.addEventListener('touchstart', this._handleCarouselTapBound);
- this.el.addEventListener('touchmove', this._handleCarouselDragBound);
- this.el.addEventListener('touchend', this._handleCarouselReleaseBound);
- }
- this.el.addEventListener('mousedown', this._handleCarouselTapBound);
- this.el.addEventListener('mousemove', this._handleCarouselDragBound);
- this.el.addEventListener('mouseup', this._handleCarouselReleaseBound);
- this.el.addEventListener('mouseleave', this._handleCarouselReleaseBound);
- this.el.addEventListener('click', this._handleCarouselClickBound);
- if (this.showIndicators && this.$indicators) {
- this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this);
- this.$indicators.find('.indicator-item').each(function (el, i) {
- el.addEventListener('click', _this63._handleIndicatorClickBound);
- });
- }
- // Resize
- var throttledResize = M.throttle(this._handleResize, 200);
- this._handleThrottledResizeBound = throttledResize.bind(this);
- window.addEventListener('resize', this._handleThrottledResizeBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- var _this64 = this;
- if (typeof window.ontouchstart !== 'undefined') {
- this.el.removeEventListener('touchstart', this._handleCarouselTapBound);
- this.el.removeEventListener('touchmove', this._handleCarouselDragBound);
- this.el.removeEventListener('touchend', this._handleCarouselReleaseBound);
- }
- this.el.removeEventListener('mousedown', this._handleCarouselTapBound);
- this.el.removeEventListener('mousemove', this._handleCarouselDragBound);
- this.el.removeEventListener('mouseup', this._handleCarouselReleaseBound);
- this.el.removeEventListener('mouseleave', this._handleCarouselReleaseBound);
- this.el.removeEventListener('click', this._handleCarouselClickBound);
- if (this.showIndicators && this.$indicators) {
- this.$indicators.find('.indicator-item').each(function (el, i) {
- el.removeEventListener('click', _this64._handleIndicatorClickBound);
- });
- }
- window.removeEventListener('resize', this._handleThrottledResizeBound);
- }
- /**
- * Handle Carousel Tap
- * @param {Event} e
- */
- }, {
- key: "_handleCarouselTap",
- value: function _handleCarouselTap(e) {
- // Fixes firefox draggable image bug
- if (e.type === 'mousedown' && $(e.target).is('img')) {
- e.preventDefault();
- }
- this.pressed = true;
- this.dragged = false;
- this.verticalDragged = false;
- this.reference = this._xpos(e);
- this.referenceY = this._ypos(e);
- this.velocity = this.amplitude = 0;
- this.frame = this.offset;
- this.timestamp = Date.now();
- clearInterval(this.ticker);
- this.ticker = setInterval(this._trackBound, 100);
- }
- /**
- * Handle Carousel Drag
- * @param {Event} e
- */
- }, {
- key: "_handleCarouselDrag",
- value: function _handleCarouselDrag(e) {
- var x = void 0,
- y = void 0,
- delta = void 0,
- deltaY = void 0;
- if (this.pressed) {
- x = this._xpos(e);
- y = this._ypos(e);
- delta = this.reference - x;
- deltaY = Math.abs(this.referenceY - y);
- if (deltaY < 30 && !this.verticalDragged) {
- // If vertical scrolling don't allow dragging.
- if (delta > 2 || delta < -2) {
- this.dragged = true;
- this.reference = x;
- this._scroll(this.offset + delta);
- }
- } else if (this.dragged) {
- // If dragging don't allow vertical scroll.
- e.preventDefault();
- e.stopPropagation();
- return false;
- } else {
- // Vertical scrolling.
- this.verticalDragged = true;
- }
- }
- if (this.dragged) {
- // If dragging don't allow vertical scroll.
- e.preventDefault();
- e.stopPropagation();
- return false;
- }
- }
- /**
- * Handle Carousel Release
- * @param {Event} e
- */
- }, {
- key: "_handleCarouselRelease",
- value: function _handleCarouselRelease(e) {
- if (this.pressed) {
- this.pressed = false;
- } else {
- return;
- }
- clearInterval(this.ticker);
- this.target = this.offset;
- if (this.velocity > 10 || this.velocity < -10) {
- this.amplitude = 0.9 * this.velocity;
- this.target = this.offset + this.amplitude;
- }
- this.target = Math.round(this.target / this.dim) * this.dim;
- // No wrap of items.
- if (this.noWrap) {
- if (this.target >= this.dim * (this.count - 1)) {
- this.target = this.dim * (this.count - 1);
- } else if (this.target < 0) {
- this.target = 0;
- }
- }
- this.amplitude = this.target - this.offset;
- this.timestamp = Date.now();
- requestAnimationFrame(this._autoScrollBound);
- if (this.dragged) {
- e.preventDefault();
- e.stopPropagation();
- }
- return false;
- }
- /**
- * Handle Carousel CLick
- * @param {Event} e
- */
- }, {
- key: "_handleCarouselClick",
- value: function _handleCarouselClick(e) {
- // Disable clicks if carousel was dragged.
- if (this.dragged) {
- e.preventDefault();
- e.stopPropagation();
- return false;
- } else if (!this.options.fullWidth) {
- var clickedIndex = $(e.target).closest('.carousel-item').index();
- var diff = this._wrap(this.center) - clickedIndex;
- // Disable clicks if carousel was shifted by click
- if (diff !== 0) {
- e.preventDefault();
- e.stopPropagation();
- }
- this._cycleTo(clickedIndex);
- }
- }
- /**
- * Handle Indicator CLick
- * @param {Event} e
- */
- }, {
- key: "_handleIndicatorClick",
- value: function _handleIndicatorClick(e) {
- e.stopPropagation();
- var indicator = $(e.target).closest('.indicator-item');
- if (indicator.length) {
- this._cycleTo(indicator.index());
- }
- }
- /**
- * Handle Throttle Resize
- * @param {Event} e
- */
- }, {
- key: "_handleResize",
- value: function _handleResize(e) {
- if (this.options.fullWidth) {
- this.itemWidth = this.$el.find('.carousel-item').first().innerWidth();
- this.imageHeight = this.$el.find('.carousel-item.active').height();
- this.dim = this.itemWidth * 2 + this.options.padding;
- this.offset = this.center * 2 * this.itemWidth;
- this.target = this.offset;
- this._setCarouselHeight(true);
- } else {
- this._scroll();
- }
- }
- /**
- * Set carousel height based on first slide
- * @param {Booleam} imageOnly - true for image slides
- */
- }, {
- key: "_setCarouselHeight",
- value: function _setCarouselHeight(imageOnly) {
- var _this65 = this;
- var firstSlide = this.$el.find('.carousel-item.active').length ? this.$el.find('.carousel-item.active').first() : this.$el.find('.carousel-item').first();
- var firstImage = firstSlide.find('img').first();
- if (firstImage.length) {
- if (firstImage[0].complete) {
- // If image won't trigger the load event
- var imageHeight = firstImage.height();
- if (imageHeight > 0) {
- this.$el.css('height', imageHeight + 'px');
- } else {
- // If image still has no height, use the natural dimensions to calculate
- var naturalWidth = firstImage[0].naturalWidth;
- var naturalHeight = firstImage[0].naturalHeight;
- var adjustedHeight = this.$el.width() / naturalWidth * naturalHeight;
- this.$el.css('height', adjustedHeight + 'px');
- }
- } else {
- // Get height when image is loaded normally
- firstImage.one('load', function (el, i) {
- _this65.$el.css('height', el.offsetHeight + 'px');
- });
- }
- } else if (!imageOnly) {
- var slideHeight = firstSlide.height();
- this.$el.css('height', slideHeight + 'px');
- }
- }
- /**
- * Get x position from event
- * @param {Event} e
- */
- }, {
- key: "_xpos",
- value: function _xpos(e) {
- // touch event
- if (e.targetTouches && e.targetTouches.length >= 1) {
- return e.targetTouches[0].clientX;
- }
- // mouse event
- return e.clientX;
- }
- /**
- * Get y position from event
- * @param {Event} e
- */
- }, {
- key: "_ypos",
- value: function _ypos(e) {
- // touch event
- if (e.targetTouches && e.targetTouches.length >= 1) {
- return e.targetTouches[0].clientY;
- }
- // mouse event
- return e.clientY;
- }
- /**
- * Wrap index
- * @param {Number} x
- */
- }, {
- key: "_wrap",
- value: function _wrap(x) {
- return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + x % this.count) : x;
- }
- /**
- * Tracks scrolling information
- */
- }, {
- key: "_track",
- value: function _track() {
- var now = void 0,
- elapsed = void 0,
- delta = void 0,
- v = void 0;
- now = Date.now();
- elapsed = now - this.timestamp;
- this.timestamp = now;
- delta = this.offset - this.frame;
- this.frame = this.offset;
- v = 1000 * delta / (1 + elapsed);
- this.velocity = 0.8 * v + 0.2 * this.velocity;
- }
- /**
- * Auto scrolls to nearest carousel item.
- */
- }, {
- key: "_autoScroll",
- value: function _autoScroll() {
- var elapsed = void 0,
- delta = void 0;
- if (this.amplitude) {
- elapsed = Date.now() - this.timestamp;
- delta = this.amplitude * Math.exp(-elapsed / this.options.duration);
- if (delta > 2 || delta < -2) {
- this._scroll(this.target - delta);
- requestAnimationFrame(this._autoScrollBound);
- } else {
- this._scroll(this.target);
- }
- }
- }
- /**
- * Scroll to target
- * @param {Number} x
- */
- }, {
- key: "_scroll",
- value: function _scroll(x) {
- var _this66 = this;
- // Track scrolling state
- if (!this.$el.hasClass('scrolling')) {
- this.el.classList.add('scrolling');
- }
- if (this.scrollingTimeout != null) {
- window.clearTimeout(this.scrollingTimeout);
- }
- this.scrollingTimeout = window.setTimeout(function () {
- _this66.$el.removeClass('scrolling');
- }, this.options.duration);
- // Start actual scroll
- var i = void 0,
- half = void 0,
- delta = void 0,
- dir = void 0,
- tween = void 0,
- el = void 0,
- alignment = void 0,
- zTranslation = void 0,
- tweenedOpacity = void 0,
- centerTweenedOpacity = void 0;
- var lastCenter = this.center;
- var numVisibleOffset = 1 / this.options.numVisible;
- this.offset = typeof x === 'number' ? x : this.offset;
- this.center = Math.floor((this.offset + this.dim / 2) / this.dim);
- delta = this.offset - this.center * this.dim;
- dir = delta < 0 ? 1 : -1;
- tween = -dir * delta * 2 / this.dim;
- half = this.count >> 1;
- if (this.options.fullWidth) {
- alignment = 'translateX(0)';
- centerTweenedOpacity = 1;
- } else {
- alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) ';
- alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)';
- centerTweenedOpacity = 1 - numVisibleOffset * tween;
- }
- // Set indicator active
- if (this.showIndicators) {
- var diff = this.center % this.count;
- var activeIndicator = this.$indicators.find('.indicator-item.active');
- if (activeIndicator.index() !== diff) {
- activeIndicator.removeClass('active');
- this.$indicators.find('.indicator-item').eq(diff)[0].classList.add('active');
- }
- }
- // center
- // Don't show wrapped items.
- if (!this.noWrap || this.center >= 0 && this.center < this.count) {
- el = this.images[this._wrap(this.center)];
- // Add active class to center item.
- if (!$(el).hasClass('active')) {
- this.$el.find('.carousel-item').removeClass('active');
- el.classList.add('active');
- }
- var transformString = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween * i + "px) translateZ(" + this.options.dist * tween + "px)";
- this._updateItemStyle(el, centerTweenedOpacity, 0, transformString);
- }
- for (i = 1; i <= half; ++i) {
- // right side
- if (this.options.fullWidth) {
- zTranslation = this.options.dist;
- tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;
- } else {
- zTranslation = this.options.dist * (i * 2 + tween * dir);
- tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir);
- }
- // Don't show wrapped items.
- if (!this.noWrap || this.center + i < this.count) {
- el = this.images[this._wrap(this.center + i)];
- var _transformString = alignment + " translateX(" + (this.options.shift + (this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)";
- this._updateItemStyle(el, tweenedOpacity, -i, _transformString);
- }
- // left side
- if (this.options.fullWidth) {
- zTranslation = this.options.dist;
- tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;
- } else {
- zTranslation = this.options.dist * (i * 2 - tween * dir);
- tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir);
- }
- // Don't show wrapped items.
- if (!this.noWrap || this.center - i >= 0) {
- el = this.images[this._wrap(this.center - i)];
- var _transformString2 = alignment + " translateX(" + (-this.options.shift + (-this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)";
- this._updateItemStyle(el, tweenedOpacity, -i, _transformString2);
- }
- }
- // center
- // Don't show wrapped items.
- if (!this.noWrap || this.center >= 0 && this.center < this.count) {
- el = this.images[this._wrap(this.center)];
- var _transformString3 = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween + "px) translateZ(" + this.options.dist * tween + "px)";
- this._updateItemStyle(el, centerTweenedOpacity, 0, _transformString3);
- }
- // onCycleTo callback
- var $currItem = this.$el.find('.carousel-item').eq(this._wrap(this.center));
- if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') {
- this.options.onCycleTo.call(this, $currItem[0], this.dragged);
- }
- // One time callback
- if (typeof this.oneTimeCallback === 'function') {
- this.oneTimeCallback.call(this, $currItem[0], this.dragged);
- this.oneTimeCallback = null;
- }
- }
- /**
- * Cycle to target
- * @param {Element} el
- * @param {Number} opacity
- * @param {Number} zIndex
- * @param {String} transform
- */
- }, {
- key: "_updateItemStyle",
- value: function _updateItemStyle(el, opacity, zIndex, transform) {
- el.style[this.xform] = transform;
- el.style.zIndex = zIndex;
- el.style.opacity = opacity;
- el.style.visibility = 'visible';
- }
- /**
- * Cycle to target
- * @param {Number} n
- * @param {Function} callback
- */
- }, {
- key: "_cycleTo",
- value: function _cycleTo(n, callback) {
- var diff = this.center % this.count - n;
- // Account for wraparound.
- if (!this.noWrap) {
- if (diff < 0) {
- if (Math.abs(diff + this.count) < Math.abs(diff)) {
- diff += this.count;
- }
- } else if (diff > 0) {
- if (Math.abs(diff - this.count) < diff) {
- diff -= this.count;
- }
- }
- }
- this.target = this.dim * Math.round(this.offset / this.dim);
- // Next
- if (diff < 0) {
- this.target += this.dim * Math.abs(diff);
- // Prev
- } else if (diff > 0) {
- this.target -= this.dim * diff;
- }
- // Set one time callback
- if (typeof callback === 'function') {
- this.oneTimeCallback = callback;
- }
- // Scroll
- if (this.offset !== this.target) {
- this.amplitude = this.target - this.offset;
- this.timestamp = Date.now();
- requestAnimationFrame(this._autoScrollBound);
- }
- }
- /**
- * Cycle to next item
- * @param {Number} [n]
- */
- }, {
- key: "next",
- value: function next(n) {
- if (n === undefined || isNaN(n)) {
- n = 1;
- }
- var index = this.center + n;
- if (index >= this.count || index < 0) {
- if (this.noWrap) {
- return;
- }
- index = this._wrap(index);
- }
- this._cycleTo(index);
- }
- /**
- * Cycle to previous item
- * @param {Number} [n]
- */
- }, {
- key: "prev",
- value: function prev(n) {
- if (n === undefined || isNaN(n)) {
- n = 1;
- }
- var index = this.center - n;
- if (index >= this.count || index < 0) {
- if (this.noWrap) {
- return;
- }
- index = this._wrap(index);
- }
- this._cycleTo(index);
- }
- /**
- * Cycle to nth item
- * @param {Number} [n]
- * @param {Function} callback
- */
- }, {
- key: "set",
- value: function set(n, callback) {
- if (n === undefined || isNaN(n)) {
- n = 0;
- }
- if (n > this.count || n < 0) {
- if (this.noWrap) {
- return;
- }
- n = this._wrap(n);
- }
- this._cycleTo(n, callback);
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Carousel.__proto__ || Object.getPrototypeOf(Carousel), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Carousel;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Carousel;
- }(Component);
- M.Carousel = Carousel;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Carousel, 'carousel', 'M_Carousel');
- }
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- onOpen: undefined,
- onClose: undefined
- };
- /**
- * @class
- *
- */
- var TapTarget = function (_Component19) {
- _inherits(TapTarget, _Component19);
- /**
- * Construct TapTarget instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function TapTarget(el, options) {
- _classCallCheck(this, TapTarget);
- var _this67 = _possibleConstructorReturn(this, (TapTarget.__proto__ || Object.getPrototypeOf(TapTarget)).call(this, TapTarget, el, options));
- _this67.el.M_TapTarget = _this67;
- /**
- * Options for the select
- * @member TapTarget#options
- * @prop {Function} onOpen - Callback function called when feature discovery is opened
- * @prop {Function} onClose - Callback function called when feature discovery is closed
- */
- _this67.options = $.extend({}, TapTarget.defaults, options);
- _this67.isOpen = false;
- // setup
- _this67.$origin = $('#' + _this67.$el.attr('data-target'));
- _this67._setup();
- _this67._calculatePositioning();
- _this67._setupEventHandlers();
- return _this67;
- }
- _createClass(TapTarget, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this.el.TapTarget = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleDocumentClickBound = this._handleDocumentClick.bind(this);
- this._handleTargetClickBound = this._handleTargetClick.bind(this);
- this._handleOriginClickBound = this._handleOriginClick.bind(this);
- this.el.addEventListener('click', this._handleTargetClickBound);
- this.originEl.addEventListener('click', this._handleOriginClickBound);
- // Resize
- var throttledResize = M.throttle(this._handleResize, 200);
- this._handleThrottledResizeBound = throttledResize.bind(this);
- window.addEventListener('resize', this._handleThrottledResizeBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('click', this._handleTargetClickBound);
- this.originEl.removeEventListener('click', this._handleOriginClickBound);
- window.removeEventListener('resize', this._handleThrottledResizeBound);
- }
- /**
- * Handle Target Click
- * @param {Event} e
- */
- }, {
- key: "_handleTargetClick",
- value: function _handleTargetClick(e) {
- this.open();
- }
- /**
- * Handle Origin Click
- * @param {Event} e
- */
- }, {
- key: "_handleOriginClick",
- value: function _handleOriginClick(e) {
- this.close();
- }
- /**
- * Handle Resize
- * @param {Event} e
- */
- }, {
- key: "_handleResize",
- value: function _handleResize(e) {
- this._calculatePositioning();
- }
- /**
- * Handle Resize
- * @param {Event} e
- */
- }, {
- key: "_handleDocumentClick",
- value: function _handleDocumentClick(e) {
- if (!$(e.target).closest('.tap-target-wrapper').length) {
- this.close();
- e.preventDefault();
- e.stopPropagation();
- }
- }
- /**
- * Setup Tap Target
- */
- }, {
- key: "_setup",
- value: function _setup() {
- // Creating tap target
- this.wrapper = this.$el.parent()[0];
- this.waveEl = $(this.wrapper).find('.tap-target-wave')[0];
- this.originEl = $(this.wrapper).find('.tap-target-origin')[0];
- this.contentEl = this.$el.find('.tap-target-content')[0];
- // Creating wrapper
- if (!$(this.wrapper).hasClass('.tap-target-wrapper')) {
- this.wrapper = document.createElement('div');
- this.wrapper.classList.add('tap-target-wrapper');
- this.$el.before($(this.wrapper));
- this.wrapper.append(this.el);
- }
- // Creating content
- if (!this.contentEl) {
- this.contentEl = document.createElement('div');
- this.contentEl.classList.add('tap-target-content');
- this.$el.append(this.contentEl);
- }
- // Creating foreground wave
- if (!this.waveEl) {
- this.waveEl = document.createElement('div');
- this.waveEl.classList.add('tap-target-wave');
- // Creating origin
- if (!this.originEl) {
- this.originEl = this.$origin.clone(true, true);
- this.originEl.addClass('tap-target-origin');
- this.originEl.removeAttr('id');
- this.originEl.removeAttr('style');
- this.originEl = this.originEl[0];
- this.waveEl.append(this.originEl);
- }
- this.wrapper.append(this.waveEl);
- }
- }
- /**
- * Calculate positioning
- */
- }, {
- key: "_calculatePositioning",
- value: function _calculatePositioning() {
- // Element or parent is fixed position?
- var isFixed = this.$origin.css('position') === 'fixed';
- if (!isFixed) {
- var parents = this.$origin.parents();
- for (var i = 0; i < parents.length; i++) {
- isFixed = $(parents[i]).css('position') == 'fixed';
- if (isFixed) {
- break;
- }
- }
- }
- // Calculating origin
- var originWidth = this.$origin.outerWidth();
- var originHeight = this.$origin.outerHeight();
- var originTop = isFixed ? this.$origin.offset().top - M.getDocumentScrollTop() : this.$origin.offset().top;
- var originLeft = isFixed ? this.$origin.offset().left - M.getDocumentScrollLeft() : this.$origin.offset().left;
- // Calculating screen
- var windowWidth = window.innerWidth;
- var windowHeight = window.innerHeight;
- var centerX = windowWidth / 2;
- var centerY = windowHeight / 2;
- var isLeft = originLeft <= centerX;
- var isRight = originLeft > centerX;
- var isTop = originTop <= centerY;
- var isBottom = originTop > centerY;
- var isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75;
- // Calculating tap target
- var tapTargetWidth = this.$el.outerWidth();
- var tapTargetHeight = this.$el.outerHeight();
- var tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2;
- var tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2;
- var tapTargetPosition = isFixed ? 'fixed' : 'absolute';
- // Calculating content
- var tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth;
- var tapTargetTextHeight = tapTargetHeight / 2;
- var tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0;
- var tapTargetTextBottom = 0;
- var tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0;
- var tapTargetTextRight = 0;
- var tapTargetTextPadding = originWidth;
- var tapTargetTextAlign = isBottom ? 'bottom' : 'top';
- // Calculating wave
- var tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2;
- var tapTargetWaveHeight = tapTargetWaveWidth;
- var tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2;
- var tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2;
- // Setting tap target
- var tapTargetWrapperCssObj = {};
- tapTargetWrapperCssObj.top = isTop ? tapTargetTop + 'px' : '';
- tapTargetWrapperCssObj.right = isRight ? windowWidth - tapTargetLeft - tapTargetWidth + 'px' : '';
- tapTargetWrapperCssObj.bottom = isBottom ? windowHeight - tapTargetTop - tapTargetHeight + 'px' : '';
- tapTargetWrapperCssObj.left = isLeft ? tapTargetLeft + 'px' : '';
- tapTargetWrapperCssObj.position = tapTargetPosition;
- $(this.wrapper).css(tapTargetWrapperCssObj);
- // Setting content
- $(this.contentEl).css({
- width: tapTargetTextWidth + 'px',
- height: tapTargetTextHeight + 'px',
- top: tapTargetTextTop + 'px',
- right: tapTargetTextRight + 'px',
- bottom: tapTargetTextBottom + 'px',
- left: tapTargetTextLeft + 'px',
- padding: tapTargetTextPadding + 'px',
- verticalAlign: tapTargetTextAlign
- });
- // Setting wave
- $(this.waveEl).css({
- top: tapTargetWaveTop + 'px',
- left: tapTargetWaveLeft + 'px',
- width: tapTargetWaveWidth + 'px',
- height: tapTargetWaveHeight + 'px'
- });
- }
- /**
- * Open TapTarget
- */
- }, {
- key: "open",
- value: function open() {
- if (this.isOpen) {
- return;
- }
- // onOpen callback
- if (typeof this.options.onOpen === 'function') {
- this.options.onOpen.call(this, this.$origin[0]);
- }
- this.isOpen = true;
- this.wrapper.classList.add('open');
- document.body.addEventListener('click', this._handleDocumentClickBound, true);
- document.body.addEventListener('touchend', this._handleDocumentClickBound);
- }
- /**
- * Close Tap Target
- */
- }, {
- key: "close",
- value: function close() {
- if (!this.isOpen) {
- return;
- }
- // onClose callback
- if (typeof this.options.onClose === 'function') {
- this.options.onClose.call(this, this.$origin[0]);
- }
- this.isOpen = false;
- this.wrapper.classList.remove('open');
- document.body.removeEventListener('click', this._handleDocumentClickBound, true);
- document.body.removeEventListener('touchend', this._handleDocumentClickBound);
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(TapTarget.__proto__ || Object.getPrototypeOf(TapTarget), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_TapTarget;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return TapTarget;
- }(Component);
- M.TapTarget = TapTarget;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(TapTarget, 'tapTarget', 'M_TapTarget');
- }
- })(cash);
- ;(function ($) {
- 'use strict';
- var _defaults = {
- classes: '',
- dropdownOptions: {}
- };
- /**
- * @class
- *
- */
- var FormSelect = function (_Component20) {
- _inherits(FormSelect, _Component20);
- /**
- * Construct FormSelect instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function FormSelect(el, options) {
- _classCallCheck(this, FormSelect);
- // Don't init if browser default version
- var _this68 = _possibleConstructorReturn(this, (FormSelect.__proto__ || Object.getPrototypeOf(FormSelect)).call(this, FormSelect, el, options));
- if (_this68.$el.hasClass('browser-default')) {
- return _possibleConstructorReturn(_this68);
- }
- _this68.el.M_FormSelect = _this68;
- /**
- * Options for the select
- * @member FormSelect#options
- */
- _this68.options = $.extend({}, FormSelect.defaults, options);
- _this68.isMultiple = _this68.$el.prop('multiple');
- // Setup
- _this68.el.tabIndex = -1;
- _this68._keysSelected = {};
- _this68._valueDict = {}; // Maps key to original and generated option element.
- _this68._setupDropdown();
- _this68._setupEventHandlers();
- return _this68;
- }
- _createClass(FormSelect, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this._removeDropdown();
- this.el.M_FormSelect = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- var _this69 = this;
- this._handleSelectChangeBound = this._handleSelectChange.bind(this);
- this._handleOptionClickBound = this._handleOptionClick.bind(this);
- this._handleInputClickBound = this._handleInputClick.bind(this);
- $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) {
- el.addEventListener('click', _this69._handleOptionClickBound);
- });
- this.el.addEventListener('change', this._handleSelectChangeBound);
- this.input.addEventListener('click', this._handleInputClickBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- var _this70 = this;
- $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) {
- el.removeEventListener('click', _this70._handleOptionClickBound);
- });
- this.el.removeEventListener('change', this._handleSelectChangeBound);
- this.input.removeEventListener('click', this._handleInputClickBound);
- }
- /**
- * Handle Select Change
- * @param {Event} e
- */
- }, {
- key: "_handleSelectChange",
- value: function _handleSelectChange(e) {
- this._setValueToInput();
- }
- /**
- * Handle Option Click
- * @param {Event} e
- */
- }, {
- key: "_handleOptionClick",
- value: function _handleOptionClick(e) {
- e.preventDefault();
- var option = $(e.target).closest('li')[0];
- var key = option.id;
- if (!$(option).hasClass('disabled') && !$(option).hasClass('optgroup') && key.length) {
- var selected = true;
- if (this.isMultiple) {
- // Deselect placeholder option if still selected.
- var placeholderOption = $(this.dropdownOptions).find('li.disabled.selected');
- if (placeholderOption.length) {
- placeholderOption.removeClass('selected');
- placeholderOption.find('input[type="checkbox"]').prop('checked', false);
- this._toggleEntryFromArray(placeholderOption[0].id);
- }
- selected = this._toggleEntryFromArray(key);
- } else {
- $(this.dropdownOptions).find('li').removeClass('selected');
- $(option).toggleClass('selected', selected);
- }
- // Set selected on original select option
- // Only trigger if selected state changed
- var prevSelected = $(this._valueDict[key].el).prop('selected');
- if (prevSelected !== selected) {
- $(this._valueDict[key].el).prop('selected', selected);
- this.$el.trigger('change');
- }
- }
- e.stopPropagation();
- }
- /**
- * Handle Input Click
- */
- }, {
- key: "_handleInputClick",
- value: function _handleInputClick() {
- if (this.dropdown && this.dropdown.isOpen) {
- this._setValueToInput();
- this._setSelectedStates();
- }
- }
- /**
- * Setup dropdown
- */
- }, {
- key: "_setupDropdown",
- value: function _setupDropdown() {
- var _this71 = this;
- this.wrapper = document.createElement('div');
- $(this.wrapper).addClass('select-wrapper ' + this.options.classes);
- this.$el.before($(this.wrapper));
- this.wrapper.appendChild(this.el);
- if (this.el.disabled) {
- this.wrapper.classList.add('disabled');
- }
- // Create dropdown
- this.$selectOptions = this.$el.children('option, optgroup');
- this.dropdownOptions = document.createElement('ul');
- this.dropdownOptions.id = "select-options-" + M.guid();
- $(this.dropdownOptions).addClass('dropdown-content select-dropdown ' + (this.isMultiple ? 'multiple-select-dropdown' : ''));
- // Create dropdown structure.
- if (this.$selectOptions.length) {
- this.$selectOptions.each(function (el) {
- if ($(el).is('option')) {
- // Direct descendant option.
- var optionEl = void 0;
- if (_this71.isMultiple) {
- optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'multiple');
- } else {
- optionEl = _this71._appendOptionWithIcon(_this71.$el, el);
- }
- _this71._addOptionToValueDict(el, optionEl);
- } else if ($(el).is('optgroup')) {
- // Optgroup.
- var selectOptions = $(el).children('option');
- $(_this71.dropdownOptions).append($('<li class="optgroup"><span>' + el.getAttribute('label') + '</span></li>')[0]);
- selectOptions.each(function (el) {
- var optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'optgroup-option');
- _this71._addOptionToValueDict(el, optionEl);
- });
- }
- });
- }
- this.$el.after(this.dropdownOptions);
- // Add input dropdown
- this.input = document.createElement('input');
- $(this.input).addClass('select-dropdown dropdown-trigger');
- this.input.setAttribute('type', 'text');
- this.input.setAttribute('readonly', 'true');
- this.input.setAttribute('data-target', this.dropdownOptions.id);
- if (this.el.disabled) {
- $(this.input).prop('disabled', 'true');
- }
- this.$el.before(this.input);
- this._setValueToInput();
- // Add caret
- var dropdownIcon = $('<svg class="caret" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5 5 5-5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');
- this.$el.before(dropdownIcon[0]);
- // Initialize dropdown
- if (!this.el.disabled) {
- var dropdownOptions = $.extend({}, this.options.dropdownOptions);
- // Add callback for centering selected option when dropdown content is scrollable
- dropdownOptions.onOpenEnd = function (el) {
- var selectedOption = $(_this71.dropdownOptions).find('.selected').first();
- if (_this71.dropdown.isScrollable && selectedOption.length) {
- var scrollOffset = selectedOption[0].getBoundingClientRect().top - _this71.dropdownOptions.getBoundingClientRect().top; // scroll to selected option
- scrollOffset -= _this71.dropdownOptions.clientHeight / 2; // center in dropdown
- _this71.dropdownOptions.scrollTop = scrollOffset;
- }
- };
- if (this.isMultiple) {
- dropdownOptions.closeOnClick = false;
- }
- this.dropdown = M.Dropdown.init(this.input, dropdownOptions);
- }
- // Add initial selections
- this._setSelectedStates();
- }
- /**
- * Add option to value dict
- * @param {Element} el original option element
- * @param {Element} optionEl generated option element
- */
- }, {
- key: "_addOptionToValueDict",
- value: function _addOptionToValueDict(el, optionEl) {
- var index = Object.keys(this._valueDict).length;
- var key = this.dropdownOptions.id + index;
- var obj = {};
- optionEl.id = key;
- obj.el = el;
- obj.optionEl = optionEl;
- this._valueDict[key] = obj;
- }
- /**
- * Remove dropdown
- */
- }, {
- key: "_removeDropdown",
- value: function _removeDropdown() {
- $(this.wrapper).find('.caret').remove();
- $(this.input).remove();
- $(this.dropdownOptions).remove();
- $(this.wrapper).before(this.$el);
- $(this.wrapper).remove();
- }
- /**
- * Setup dropdown
- * @param {Element} select select element
- * @param {Element} option option element from select
- * @param {String} type
- * @return {Element} option element added
- */
- }, {
- key: "_appendOptionWithIcon",
- value: function _appendOptionWithIcon(select, option, type) {
- // Add disabled attr if disabled
- var disabledClass = option.disabled ? 'disabled ' : '';
- var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : '';
- var multipleCheckbox = this.isMultiple ? "<label><input type=\"checkbox\"" + disabledClass + "\"/><span>" + option.innerHTML + "</span></label>" : option.innerHTML;
- var liEl = $('<li></li>');
- var spanEl = $('<span></span>');
- spanEl.html(multipleCheckbox);
- liEl.addClass(disabledClass + " " + optgroupClass);
- liEl.append(spanEl);
- // add icons
- var iconUrl = option.getAttribute('data-icon');
- if (!!iconUrl) {
- var imgEl = $("<img alt=\"\" src=\"" + iconUrl + "\">");
- liEl.prepend(imgEl);
- }
- // Check for multiple type.
- $(this.dropdownOptions).append(liEl[0]);
- return liEl[0];
- }
- /**
- * Toggle entry from option
- * @param {String} key Option key
- * @return {Boolean} if entry was added or removed
- */
- }, {
- key: "_toggleEntryFromArray",
- value: function _toggleEntryFromArray(key) {
- var notAdded = !this._keysSelected.hasOwnProperty(key);
- var $optionLi = $(this._valueDict[key].optionEl);
- if (notAdded) {
- this._keysSelected[key] = true;
- } else {
- delete this._keysSelected[key];
- }
- $optionLi.toggleClass('selected', notAdded);
- // Set checkbox checked value
- $optionLi.find('input[type="checkbox"]').prop('checked', notAdded);
- // use notAdded instead of true (to detect if the option is selected or not)
- $optionLi.prop('selected', notAdded);
- return notAdded;
- }
- /**
- * Set text value to input
- */
- }, {
- key: "_setValueToInput",
- value: function _setValueToInput() {
- var values = [];
- var options = this.$el.find('option');
- options.each(function (el) {
- if ($(el).prop('selected')) {
- var text = $(el).text();
- values.push(text);
- }
- });
- if (!values.length) {
- var firstDisabled = this.$el.find('option:disabled').eq(0);
- if (firstDisabled.length && firstDisabled[0].value === '') {
- values.push(firstDisabled.text());
- }
- }
- this.input.value = values.join(', ');
- }
- /**
- * Set selected state of dropdown to match actual select element
- */
- }, {
- key: "_setSelectedStates",
- value: function _setSelectedStates() {
- this._keysSelected = {};
- for (var key in this._valueDict) {
- var option = this._valueDict[key];
- var optionIsSelected = $(option.el).prop('selected');
- $(option.optionEl).find('input[type="checkbox"]').prop('checked', optionIsSelected);
- if (optionIsSelected) {
- this._activateOption($(this.dropdownOptions), $(option.optionEl));
- this._keysSelected[key] = true;
- } else {
- $(option.optionEl).removeClass('selected');
- }
- }
- }
- /**
- * Make option as selected and scroll to selected position
- * @param {jQuery} collection Select options jQuery element
- * @param {Element} newOption element of the new option
- */
- }, {
- key: "_activateOption",
- value: function _activateOption(collection, newOption) {
- if (newOption) {
- if (!this.isMultiple) {
- collection.find('li.selected').removeClass('selected');
- }
- var option = $(newOption);
- option.addClass('selected');
- }
- }
- /**
- * Get Selected Values
- * @return {Array} Array of selected values
- */
- }, {
- key: "getSelectedValues",
- value: function getSelectedValues() {
- var selectedValues = [];
- for (var key in this._keysSelected) {
- selectedValues.push(this._valueDict[key].el.value);
- }
- return selectedValues;
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(FormSelect.__proto__ || Object.getPrototypeOf(FormSelect), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_FormSelect;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return FormSelect;
- }(Component);
- M.FormSelect = FormSelect;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(FormSelect, 'formSelect', 'M_FormSelect');
- }
- })(cash);
- ;(function ($, anim) {
- 'use strict';
- var _defaults = {};
- /**
- * @class
- *
- */
- var Range = function (_Component21) {
- _inherits(Range, _Component21);
- /**
- * Construct Range instance
- * @constructor
- * @param {Element} el
- * @param {Object} options
- */
- function Range(el, options) {
- _classCallCheck(this, Range);
- var _this72 = _possibleConstructorReturn(this, (Range.__proto__ || Object.getPrototypeOf(Range)).call(this, Range, el, options));
- _this72.el.M_Range = _this72;
- /**
- * Options for the range
- * @member Range#options
- */
- _this72.options = $.extend({}, Range.defaults, options);
- _this72._mousedown = false;
- // Setup
- _this72._setupThumb();
- _this72._setupEventHandlers();
- return _this72;
- }
- _createClass(Range, [{
- key: "destroy",
- /**
- * Teardown component
- */
- value: function destroy() {
- this._removeEventHandlers();
- this._removeThumb();
- this.el.M_Range = undefined;
- }
- /**
- * Setup Event Handlers
- */
- }, {
- key: "_setupEventHandlers",
- value: function _setupEventHandlers() {
- this._handleRangeChangeBound = this._handleRangeChange.bind(this);
- this._handleRangeMousedownTouchstartBound = this._handleRangeMousedownTouchstart.bind(this);
- this._handleRangeInputMousemoveTouchmoveBound = this._handleRangeInputMousemoveTouchmove.bind(this);
- this._handleRangeMouseupTouchendBound = this._handleRangeMouseupTouchend.bind(this);
- this._handleRangeBlurMouseoutTouchleaveBound = this._handleRangeBlurMouseoutTouchleave.bind(this);
- this.el.addEventListener('change', this._handleRangeChangeBound);
- this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstartBound);
- this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstartBound);
- this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.addEventListener('mouseup', this._handleRangeMouseupTouchendBound);
- this.el.addEventListener('touchend', this._handleRangeMouseupTouchendBound);
- this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound);
- this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound);
- this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound);
- }
- /**
- * Remove Event Handlers
- */
- }, {
- key: "_removeEventHandlers",
- value: function _removeEventHandlers() {
- this.el.removeEventListener('change', this._handleRangeChangeBound);
- this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstartBound);
- this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstartBound);
- this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound);
- this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchendBound);
- this.el.removeEventListener('touchend', this._handleRangeMouseupTouchendBound);
- this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound);
- this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound);
- this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound);
- }
- /**
- * Handle Range Change
- * @param {Event} e
- */
- }, {
- key: "_handleRangeChange",
- value: function _handleRangeChange() {
- $(this.value).html(this.$el.val());
- if (!$(this.thumb).hasClass('active')) {
- this._showRangeBubble();
- }
- var offsetLeft = this._calcRangeOffset();
- $(this.thumb).addClass('active').css('left', offsetLeft + 'px');
- }
- /**
- * Handle Range Mousedown and Touchstart
- * @param {Event} e
- */
- }, {
- key: "_handleRangeMousedownTouchstart",
- value: function _handleRangeMousedownTouchstart(e) {
- // Set indicator value
- $(this.value).html(this.$el.val());
- this._mousedown = true;
- this.$el.addClass('active');
- if (!$(this.thumb).hasClass('active')) {
- this._showRangeBubble();
- }
- if (e.type !== 'input') {
- var offsetLeft = this._calcRangeOffset();
- $(this.thumb).addClass('active').css('left', offsetLeft + 'px');
- }
- }
- /**
- * Handle Range Input, Mousemove and Touchmove
- */
- }, {
- key: "_handleRangeInputMousemoveTouchmove",
- value: function _handleRangeInputMousemoveTouchmove() {
- if (this._mousedown) {
- if (!$(this.thumb).hasClass('active')) {
- this._showRangeBubble();
- }
- var offsetLeft = this._calcRangeOffset();
- $(this.thumb).addClass('active').css('left', offsetLeft + 'px');
- $(this.value).html(this.$el.val());
- }
- }
- /**
- * Handle Range Mouseup and Touchend
- */
- }, {
- key: "_handleRangeMouseupTouchend",
- value: function _handleRangeMouseupTouchend() {
- this._mousedown = false;
- this.$el.removeClass('active');
- }
- /**
- * Handle Range Blur, Mouseout and Touchleave
- */
- }, {
- key: "_handleRangeBlurMouseoutTouchleave",
- value: function _handleRangeBlurMouseoutTouchleave() {
- if (!this._mousedown) {
- var paddingLeft = parseInt(this.$el.css('padding-left'));
- var marginLeft = 7 + paddingLeft + 'px';
- if ($(this.thumb).hasClass('active')) {
- anim.remove(this.thumb);
- anim({
- targets: this.thumb,
- height: 0,
- width: 0,
- top: 10,
- easing: 'easeOutQuad',
- marginLeft: marginLeft,
- duration: 100
- });
- }
- $(this.thumb).removeClass('active');
- }
- }
- /**
- * Setup dropdown
- */
- }, {
- key: "_setupThumb",
- value: function _setupThumb() {
- this.thumb = document.createElement('span');
- this.value = document.createElement('span');
- $(this.thumb).addClass('thumb');
- $(this.value).addClass('value');
- $(this.thumb).append(this.value);
- this.$el.after(this.thumb);
- }
- /**
- * Remove dropdown
- */
- }, {
- key: "_removeThumb",
- value: function _removeThumb() {
- $(this.thumb).remove();
- }
- /**
- * morph thumb into bubble
- */
- }, {
- key: "_showRangeBubble",
- value: function _showRangeBubble() {
- var paddingLeft = parseInt($(this.thumb).parent().css('padding-left'));
- var marginLeft = -7 + paddingLeft + 'px'; // TODO: fix magic number?
- anim.remove(this.thumb);
- anim({
- targets: this.thumb,
- height: 30,
- width: 30,
- top: -30,
- marginLeft: marginLeft,
- duration: 300,
- easing: 'easeOutQuint'
- });
- }
- /**
- * Calculate the offset of the thumb
- * @return {Number} offset in pixels
- */
- }, {
- key: "_calcRangeOffset",
- value: function _calcRangeOffset() {
- var width = this.$el.width() - 15;
- var max = parseFloat(this.$el.attr('max')) || 100; // Range default max
- var min = parseFloat(this.$el.attr('min')) || 0; // Range default min
- var percent = (parseFloat(this.$el.val()) - min) / (max - min);
- return percent * width;
- }
- }], [{
- key: "init",
- value: function init(els, options) {
- return _get(Range.__proto__ || Object.getPrototypeOf(Range), "init", this).call(this, this, els, options);
- }
- /**
- * Get Instance
- */
- }, {
- key: "getInstance",
- value: function getInstance(el) {
- var domElem = !!el.jquery ? el[0] : el;
- return domElem.M_Range;
- }
- }, {
- key: "defaults",
- get: function () {
- return _defaults;
- }
- }]);
- return Range;
- }(Component);
- M.Range = Range;
- if (M.jQueryLoaded) {
- M.initializeJqueryWrapper(Range, 'range', 'M_Range');
- }
- Range.init($('input[type=range]'));
- })(cash, M.anime);
|