index.iife.js 243 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671
  1. var VueDemi = (function (VueDemi, Vue, VueCompositionAPI) {
  2. if (VueDemi.install) {
  3. return VueDemi
  4. }
  5. if (!Vue) {
  6. console.error('[vue-demi] no Vue instance found, please be sure to import `vue` before `vue-demi`.')
  7. return VueDemi
  8. }
  9. // Vue 2.7
  10. if (Vue.version.slice(0, 4) === '2.7.') {
  11. for (var key in Vue) {
  12. VueDemi[key] = Vue[key]
  13. }
  14. VueDemi.isVue2 = true
  15. VueDemi.isVue3 = false
  16. VueDemi.install = function () {}
  17. VueDemi.Vue = Vue
  18. VueDemi.Vue2 = Vue
  19. VueDemi.version = Vue.version
  20. VueDemi.warn = Vue.util.warn
  21. function createApp(rootComponent, rootProps) {
  22. var vm
  23. var provide = {}
  24. var app = {
  25. config: Vue.config,
  26. use: Vue.use.bind(Vue),
  27. mixin: Vue.mixin.bind(Vue),
  28. component: Vue.component.bind(Vue),
  29. provide: function (key, value) {
  30. provide[key] = value
  31. return this
  32. },
  33. directive: function (name, dir) {
  34. if (dir) {
  35. Vue.directive(name, dir)
  36. return app
  37. } else {
  38. return Vue.directive(name)
  39. }
  40. },
  41. mount: function (el, hydrating) {
  42. if (!vm) {
  43. vm = new Vue(Object.assign({ propsData: rootProps }, rootComponent, { provide: Object.assign(provide, rootComponent.provide) }))
  44. vm.$mount(el, hydrating)
  45. return vm
  46. } else {
  47. return vm
  48. }
  49. },
  50. unmount: function () {
  51. if (vm) {
  52. vm.$destroy()
  53. vm = undefined
  54. }
  55. },
  56. }
  57. return app
  58. }
  59. VueDemi.createApp = createApp
  60. }
  61. // Vue 2.6.x
  62. else if (Vue.version.slice(0, 2) === '2.') {
  63. if (VueCompositionAPI) {
  64. for (var key in VueCompositionAPI) {
  65. VueDemi[key] = VueCompositionAPI[key]
  66. }
  67. VueDemi.isVue2 = true
  68. VueDemi.isVue3 = false
  69. VueDemi.install = function () {}
  70. VueDemi.Vue = Vue
  71. VueDemi.Vue2 = Vue
  72. VueDemi.version = Vue.version
  73. } else {
  74. console.error('[vue-demi] no VueCompositionAPI instance found, please be sure to import `@vue/composition-api` before `vue-demi`.')
  75. }
  76. }
  77. // Vue 3
  78. else if (Vue.version.slice(0, 2) === '3.') {
  79. for (var key in Vue) {
  80. VueDemi[key] = Vue[key]
  81. }
  82. VueDemi.isVue2 = false
  83. VueDemi.isVue3 = true
  84. VueDemi.install = function () {}
  85. VueDemi.Vue = Vue
  86. VueDemi.Vue2 = undefined
  87. VueDemi.version = Vue.version
  88. VueDemi.set = function (target, key, val) {
  89. if (Array.isArray(target)) {
  90. target.length = Math.max(target.length, key)
  91. target.splice(key, 1, val)
  92. return val
  93. }
  94. target[key] = val
  95. return val
  96. }
  97. VueDemi.del = function (target, key) {
  98. if (Array.isArray(target)) {
  99. target.splice(key, 1)
  100. return
  101. }
  102. delete target[key]
  103. }
  104. } else {
  105. console.error('[vue-demi] Vue version ' + Vue.version + ' is unsupported.')
  106. }
  107. return VueDemi
  108. })(
  109. (this.VueDemi = this.VueDemi || (typeof VueDemi !== 'undefined' ? VueDemi : {})),
  110. this.Vue || (typeof Vue !== 'undefined' ? Vue : undefined),
  111. this.VueCompositionAPI || (typeof VueCompositionAPI !== 'undefined' ? VueCompositionAPI : undefined)
  112. );
  113. ;
  114. ;(function (exports, shared, vueDemi) {
  115. 'use strict';
  116. function computedAsync(evaluationCallback, initialState, optionsOrRef) {
  117. let options;
  118. if (vueDemi.isRef(optionsOrRef)) {
  119. options = {
  120. evaluating: optionsOrRef
  121. };
  122. } else {
  123. options = optionsOrRef || {};
  124. }
  125. const {
  126. lazy = false,
  127. evaluating = void 0,
  128. shallow = true,
  129. onError = shared.noop
  130. } = options;
  131. const started = vueDemi.ref(!lazy);
  132. const current = shallow ? vueDemi.shallowRef(initialState) : vueDemi.ref(initialState);
  133. let counter = 0;
  134. vueDemi.watchEffect(async (onInvalidate) => {
  135. if (!started.value)
  136. return;
  137. counter++;
  138. const counterAtBeginning = counter;
  139. let hasFinished = false;
  140. if (evaluating) {
  141. Promise.resolve().then(() => {
  142. evaluating.value = true;
  143. });
  144. }
  145. try {
  146. const result = await evaluationCallback((cancelCallback) => {
  147. onInvalidate(() => {
  148. if (evaluating)
  149. evaluating.value = false;
  150. if (!hasFinished)
  151. cancelCallback();
  152. });
  153. });
  154. if (counterAtBeginning === counter)
  155. current.value = result;
  156. } catch (e) {
  157. onError(e);
  158. } finally {
  159. if (evaluating && counterAtBeginning === counter)
  160. evaluating.value = false;
  161. hasFinished = true;
  162. }
  163. });
  164. if (lazy) {
  165. return vueDemi.computed(() => {
  166. started.value = true;
  167. return current.value;
  168. });
  169. } else {
  170. return current;
  171. }
  172. }
  173. function computedInject(key, options, defaultSource, treatDefaultAsFactory) {
  174. let source = vueDemi.inject(key);
  175. if (defaultSource)
  176. source = vueDemi.inject(key, defaultSource);
  177. if (treatDefaultAsFactory)
  178. source = vueDemi.inject(key, defaultSource, treatDefaultAsFactory);
  179. if (typeof options === "function") {
  180. return vueDemi.computed((ctx) => options(source, ctx));
  181. } else {
  182. return vueDemi.computed({
  183. get: (ctx) => options.get(source, ctx),
  184. set: options.set
  185. });
  186. }
  187. }
  188. var __defProp$p = Object.defineProperty;
  189. var __defProps$c = Object.defineProperties;
  190. var __getOwnPropDescs$c = Object.getOwnPropertyDescriptors;
  191. var __getOwnPropSymbols$s = Object.getOwnPropertySymbols;
  192. var __hasOwnProp$s = Object.prototype.hasOwnProperty;
  193. var __propIsEnum$s = Object.prototype.propertyIsEnumerable;
  194. var __defNormalProp$p = (obj, key, value) => key in obj ? __defProp$p(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  195. var __spreadValues$p = (a, b) => {
  196. for (var prop in b || (b = {}))
  197. if (__hasOwnProp$s.call(b, prop))
  198. __defNormalProp$p(a, prop, b[prop]);
  199. if (__getOwnPropSymbols$s)
  200. for (var prop of __getOwnPropSymbols$s(b)) {
  201. if (__propIsEnum$s.call(b, prop))
  202. __defNormalProp$p(a, prop, b[prop]);
  203. }
  204. return a;
  205. };
  206. var __spreadProps$c = (a, b) => __defProps$c(a, __getOwnPropDescs$c(b));
  207. function createReusableTemplate() {
  208. if (!vueDemi.isVue3 && !vueDemi.version.startsWith("2.7.")) {
  209. if (process.env.NODE_ENV !== "production")
  210. throw new Error("[VueUse] createReusableTemplate only works in Vue 2.7 or above.");
  211. return;
  212. }
  213. const render = vueDemi.shallowRef();
  214. const define = /* #__PURE__ */ vueDemi.defineComponent({
  215. setup(_, { slots }) {
  216. return () => {
  217. render.value = slots.default;
  218. };
  219. }
  220. });
  221. const reuse = /* #__PURE__ */ vueDemi.defineComponent({
  222. inheritAttrs: false,
  223. setup(_, { attrs, slots }) {
  224. return () => {
  225. var _a;
  226. if (!render.value && process.env.NODE_ENV !== "production")
  227. throw new Error("[VueUse] Failed to find the definition of reusable template");
  228. return (_a = render.value) == null ? void 0 : _a.call(render, __spreadProps$c(__spreadValues$p({}, attrs), { $slots: slots }));
  229. };
  230. }
  231. });
  232. return shared.makeDestructurable(
  233. { define, reuse },
  234. [define, reuse]
  235. );
  236. }
  237. function createTemplatePromise(options = {}) {
  238. if (!vueDemi.isVue3) {
  239. if (process.env.NODE_ENV !== "production")
  240. throw new Error("[VueUse] createTemplatePromise only works in Vue 3 or above.");
  241. return;
  242. }
  243. let index = 0;
  244. const instances = vueDemi.ref([]);
  245. function create(...args) {
  246. const props = vueDemi.shallowReactive({
  247. key: index++,
  248. args,
  249. promise: void 0,
  250. resolve: () => {
  251. },
  252. reject: () => {
  253. },
  254. isResolving: false,
  255. options
  256. });
  257. instances.value.push(props);
  258. props.promise = new Promise((_resolve, _reject) => {
  259. props.resolve = (v) => {
  260. props.isResolving = true;
  261. return _resolve(v);
  262. };
  263. props.reject = _reject;
  264. }).finally(() => {
  265. props.promise = void 0;
  266. const index2 = instances.value.indexOf(props);
  267. if (index2 !== -1)
  268. instances.value.splice(index2, 1);
  269. });
  270. return props.promise;
  271. }
  272. function start(...args) {
  273. if (options.singleton && instances.value.length > 0)
  274. return instances.value[0].promise;
  275. return create(...args);
  276. }
  277. const component = /* #__PURE__ */ vueDemi.defineComponent((_, { slots }) => {
  278. const renderList = () => instances.value.map((props) => {
  279. var _a;
  280. return vueDemi.h(vueDemi.Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));
  281. });
  282. if (options.transition)
  283. return () => vueDemi.h(vueDemi.TransitionGroup, options.transition, renderList);
  284. return renderList;
  285. });
  286. component.start = start;
  287. return component;
  288. }
  289. function createUnrefFn(fn) {
  290. return function(...args) {
  291. return fn.apply(this, args.map((i) => shared.toValue(i)));
  292. };
  293. }
  294. function unrefElement(elRef) {
  295. var _a;
  296. const plain = shared.toValue(elRef);
  297. return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
  298. }
  299. const defaultWindow = shared.isClient ? window : void 0;
  300. const defaultDocument = shared.isClient ? window.document : void 0;
  301. const defaultNavigator = shared.isClient ? window.navigator : void 0;
  302. const defaultLocation = shared.isClient ? window.location : void 0;
  303. function useEventListener(...args) {
  304. let target;
  305. let events;
  306. let listeners;
  307. let options;
  308. if (typeof args[0] === "string" || Array.isArray(args[0])) {
  309. [events, listeners, options] = args;
  310. target = defaultWindow;
  311. } else {
  312. [target, events, listeners, options] = args;
  313. }
  314. if (!target)
  315. return shared.noop;
  316. if (!Array.isArray(events))
  317. events = [events];
  318. if (!Array.isArray(listeners))
  319. listeners = [listeners];
  320. const cleanups = [];
  321. const cleanup = () => {
  322. cleanups.forEach((fn) => fn());
  323. cleanups.length = 0;
  324. };
  325. const register = (el, event, listener, options2) => {
  326. el.addEventListener(event, listener, options2);
  327. return () => el.removeEventListener(event, listener, options2);
  328. };
  329. const stopWatch = vueDemi.watch(
  330. () => [unrefElement(target), shared.toValue(options)],
  331. ([el, options2]) => {
  332. cleanup();
  333. if (!el)
  334. return;
  335. cleanups.push(
  336. ...events.flatMap((event) => {
  337. return listeners.map((listener) => register(el, event, listener, options2));
  338. })
  339. );
  340. },
  341. { immediate: true, flush: "post" }
  342. );
  343. const stop = () => {
  344. stopWatch();
  345. cleanup();
  346. };
  347. shared.tryOnScopeDispose(stop);
  348. return stop;
  349. }
  350. let _iOSWorkaround = false;
  351. function onClickOutside(target, handler, options = {}) {
  352. const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;
  353. if (!window)
  354. return;
  355. if (shared.isIOS && !_iOSWorkaround) {
  356. _iOSWorkaround = true;
  357. Array.from(window.document.body.children).forEach((el) => el.addEventListener("click", shared.noop));
  358. }
  359. let shouldListen = true;
  360. const shouldIgnore = (event) => {
  361. return ignore.some((target2) => {
  362. if (typeof target2 === "string") {
  363. return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));
  364. } else {
  365. const el = unrefElement(target2);
  366. return el && (event.target === el || event.composedPath().includes(el));
  367. }
  368. });
  369. };
  370. const listener = (event) => {
  371. const el = unrefElement(target);
  372. if (!el || el === event.target || event.composedPath().includes(el))
  373. return;
  374. if (event.detail === 0)
  375. shouldListen = !shouldIgnore(event);
  376. if (!shouldListen) {
  377. shouldListen = true;
  378. return;
  379. }
  380. handler(event);
  381. };
  382. const cleanup = [
  383. useEventListener(window, "click", listener, { passive: true, capture }),
  384. useEventListener(window, "pointerdown", (e) => {
  385. const el = unrefElement(target);
  386. if (el)
  387. shouldListen = !e.composedPath().includes(el) && !shouldIgnore(e);
  388. }, { passive: true }),
  389. detectIframe && useEventListener(window, "blur", (event) => {
  390. var _a;
  391. const el = unrefElement(target);
  392. if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === "IFRAME" && !(el == null ? void 0 : el.contains(window.document.activeElement)))
  393. handler(event);
  394. })
  395. ].filter(Boolean);
  396. const stop = () => cleanup.forEach((fn) => fn());
  397. return stop;
  398. }
  399. var __defProp$o = Object.defineProperty;
  400. var __defProps$b = Object.defineProperties;
  401. var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
  402. var __getOwnPropSymbols$r = Object.getOwnPropertySymbols;
  403. var __hasOwnProp$r = Object.prototype.hasOwnProperty;
  404. var __propIsEnum$r = Object.prototype.propertyIsEnumerable;
  405. var __defNormalProp$o = (obj, key, value) => key in obj ? __defProp$o(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  406. var __spreadValues$o = (a, b) => {
  407. for (var prop in b || (b = {}))
  408. if (__hasOwnProp$r.call(b, prop))
  409. __defNormalProp$o(a, prop, b[prop]);
  410. if (__getOwnPropSymbols$r)
  411. for (var prop of __getOwnPropSymbols$r(b)) {
  412. if (__propIsEnum$r.call(b, prop))
  413. __defNormalProp$o(a, prop, b[prop]);
  414. }
  415. return a;
  416. };
  417. var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
  418. function createKeyPredicate(keyFilter) {
  419. if (typeof keyFilter === "function")
  420. return keyFilter;
  421. else if (typeof keyFilter === "string")
  422. return (event) => event.key === keyFilter;
  423. else if (Array.isArray(keyFilter))
  424. return (event) => keyFilter.includes(event.key);
  425. return () => true;
  426. }
  427. function onKeyStroke(...args) {
  428. let key;
  429. let handler;
  430. let options = {};
  431. if (args.length === 3) {
  432. key = args[0];
  433. handler = args[1];
  434. options = args[2];
  435. } else if (args.length === 2) {
  436. if (typeof args[1] === "object") {
  437. key = true;
  438. handler = args[0];
  439. options = args[1];
  440. } else {
  441. key = args[0];
  442. handler = args[1];
  443. }
  444. } else {
  445. key = true;
  446. handler = args[0];
  447. }
  448. const {
  449. target = defaultWindow,
  450. eventName = "keydown",
  451. passive = false,
  452. dedupe = false
  453. } = options;
  454. const predicate = createKeyPredicate(key);
  455. const listener = (e) => {
  456. if (e.repeat && shared.toValue(dedupe))
  457. return;
  458. if (predicate(e))
  459. handler(e);
  460. };
  461. return useEventListener(target, eventName, listener, passive);
  462. }
  463. function onKeyDown(key, handler, options = {}) {
  464. return onKeyStroke(key, handler, __spreadProps$b(__spreadValues$o({}, options), { eventName: "keydown" }));
  465. }
  466. function onKeyPressed(key, handler, options = {}) {
  467. return onKeyStroke(key, handler, __spreadProps$b(__spreadValues$o({}, options), { eventName: "keypress" }));
  468. }
  469. function onKeyUp(key, handler, options = {}) {
  470. return onKeyStroke(key, handler, __spreadProps$b(__spreadValues$o({}, options), { eventName: "keyup" }));
  471. }
  472. const DEFAULT_DELAY = 500;
  473. function onLongPress(target, handler, options) {
  474. var _a, _b;
  475. const elementRef = vueDemi.computed(() => unrefElement(target));
  476. let timeout;
  477. function clear() {
  478. if (timeout) {
  479. clearTimeout(timeout);
  480. timeout = void 0;
  481. }
  482. }
  483. function onDown(ev) {
  484. var _a2, _b2, _c, _d;
  485. if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)
  486. return;
  487. clear();
  488. if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)
  489. ev.preventDefault();
  490. if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)
  491. ev.stopPropagation();
  492. timeout = setTimeout(
  493. () => handler(ev),
  494. (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY
  495. );
  496. }
  497. const listenerOptions = {
  498. capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,
  499. once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once
  500. };
  501. useEventListener(elementRef, "pointerdown", onDown, listenerOptions);
  502. useEventListener(elementRef, "pointerup", clear, listenerOptions);
  503. useEventListener(elementRef, "pointerleave", clear, listenerOptions);
  504. }
  505. function isFocusedElementEditable() {
  506. const { activeElement, body } = document;
  507. if (!activeElement)
  508. return false;
  509. if (activeElement === body)
  510. return false;
  511. switch (activeElement.tagName) {
  512. case "INPUT":
  513. case "TEXTAREA":
  514. return true;
  515. }
  516. return activeElement.hasAttribute("contenteditable");
  517. }
  518. function isTypedCharValid({
  519. keyCode,
  520. metaKey,
  521. ctrlKey,
  522. altKey
  523. }) {
  524. if (metaKey || ctrlKey || altKey)
  525. return false;
  526. if (keyCode >= 48 && keyCode <= 57)
  527. return true;
  528. if (keyCode >= 65 && keyCode <= 90)
  529. return true;
  530. if (keyCode >= 97 && keyCode <= 122)
  531. return true;
  532. return false;
  533. }
  534. function onStartTyping(callback, options = {}) {
  535. const { document: document2 = defaultDocument } = options;
  536. const keydown = (event) => {
  537. !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);
  538. };
  539. if (document2)
  540. useEventListener(document2, "keydown", keydown, { passive: true });
  541. }
  542. function templateRef(key, initialValue = null) {
  543. const instance = vueDemi.getCurrentInstance();
  544. let _trigger = () => {
  545. };
  546. const element = vueDemi.customRef((track, trigger) => {
  547. _trigger = trigger;
  548. return {
  549. get() {
  550. var _a, _b;
  551. track();
  552. return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;
  553. },
  554. set() {
  555. }
  556. };
  557. });
  558. shared.tryOnMounted(_trigger);
  559. vueDemi.onUpdated(_trigger);
  560. return element;
  561. }
  562. function useActiveElement(options = {}) {
  563. var _a;
  564. const { window = defaultWindow } = options;
  565. const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;
  566. const activeElement = shared.computedWithControl(
  567. () => null,
  568. () => document == null ? void 0 : document.activeElement
  569. );
  570. if (window) {
  571. useEventListener(window, "blur", (event) => {
  572. if (event.relatedTarget !== null)
  573. return;
  574. activeElement.trigger();
  575. }, true);
  576. useEventListener(window, "focus", activeElement.trigger, true);
  577. }
  578. return activeElement;
  579. }
  580. function useMounted() {
  581. const isMounted = vueDemi.ref(false);
  582. if (vueDemi.getCurrentInstance()) {
  583. vueDemi.onMounted(() => {
  584. isMounted.value = true;
  585. });
  586. }
  587. return isMounted;
  588. }
  589. function useSupported(callback) {
  590. const isMounted = useMounted();
  591. return vueDemi.computed(() => {
  592. isMounted.value;
  593. return Boolean(callback());
  594. });
  595. }
  596. function useRafFn(fn, options = {}) {
  597. const {
  598. immediate = true,
  599. window = defaultWindow
  600. } = options;
  601. const isActive = vueDemi.ref(false);
  602. let previousFrameTimestamp = 0;
  603. let rafId = null;
  604. function loop(timestamp) {
  605. if (!isActive.value || !window)
  606. return;
  607. const delta = timestamp - previousFrameTimestamp;
  608. fn({ delta, timestamp });
  609. previousFrameTimestamp = timestamp;
  610. rafId = window.requestAnimationFrame(loop);
  611. }
  612. function resume() {
  613. if (!isActive.value && window) {
  614. isActive.value = true;
  615. rafId = window.requestAnimationFrame(loop);
  616. }
  617. }
  618. function pause() {
  619. isActive.value = false;
  620. if (rafId != null && window) {
  621. window.cancelAnimationFrame(rafId);
  622. rafId = null;
  623. }
  624. }
  625. if (immediate)
  626. resume();
  627. shared.tryOnScopeDispose(pause);
  628. return {
  629. isActive: vueDemi.readonly(isActive),
  630. pause,
  631. resume
  632. };
  633. }
  634. function useAnimate(target, keyframes, options) {
  635. let config;
  636. let animateOptions;
  637. if (shared.isObject(options)) {
  638. config = options;
  639. animateOptions = shared.objectOmit(options, ["window", "immediate", "commitStyles", "persist", "onReady", "onError"]);
  640. } else {
  641. config = { duration: options };
  642. animateOptions = options;
  643. }
  644. const {
  645. window = defaultWindow,
  646. immediate = true,
  647. commitStyles,
  648. persist,
  649. playbackRate: _playbackRate = 1,
  650. onReady,
  651. onError = (e) => {
  652. console.error(e);
  653. }
  654. } = config;
  655. const isSupported = useSupported(() => window && HTMLElement && "animate" in HTMLElement.prototype);
  656. const animate = vueDemi.shallowRef(void 0);
  657. const store = vueDemi.shallowReactive({
  658. startTime: null,
  659. currentTime: null,
  660. timeline: null,
  661. playbackRate: _playbackRate,
  662. pending: false,
  663. playState: immediate ? "idle" : "paused",
  664. replaceState: "active"
  665. });
  666. const pending = vueDemi.computed(() => store.pending);
  667. const playState = vueDemi.computed(() => store.playState);
  668. const replaceState = vueDemi.computed(() => store.replaceState);
  669. const startTime = vueDemi.computed({
  670. get() {
  671. return store.startTime;
  672. },
  673. set(value) {
  674. store.startTime = value;
  675. if (animate.value)
  676. animate.value.startTime = value;
  677. }
  678. });
  679. const currentTime = vueDemi.computed({
  680. get() {
  681. return store.currentTime;
  682. },
  683. set(value) {
  684. store.currentTime = value;
  685. if (animate.value) {
  686. animate.value.currentTime = value;
  687. syncResume();
  688. }
  689. }
  690. });
  691. const timeline = vueDemi.computed({
  692. get() {
  693. return store.timeline;
  694. },
  695. set(value) {
  696. store.timeline = value;
  697. if (animate.value)
  698. animate.value.timeline = value;
  699. }
  700. });
  701. const playbackRate = vueDemi.computed({
  702. get() {
  703. return store.playbackRate;
  704. },
  705. set(value) {
  706. store.playbackRate = value;
  707. if (animate.value)
  708. animate.value.playbackRate = value;
  709. }
  710. });
  711. const play = () => {
  712. if (animate.value) {
  713. try {
  714. animate.value.play();
  715. syncResume();
  716. } catch (e) {
  717. syncPause();
  718. onError(e);
  719. }
  720. } else {
  721. update();
  722. }
  723. };
  724. const pause = () => {
  725. var _a;
  726. try {
  727. (_a = animate.value) == null ? void 0 : _a.pause();
  728. syncPause();
  729. } catch (e) {
  730. onError(e);
  731. }
  732. };
  733. const reverse = () => {
  734. var _a;
  735. !animate.value && update();
  736. try {
  737. (_a = animate.value) == null ? void 0 : _a.reverse();
  738. syncResume();
  739. } catch (e) {
  740. syncPause();
  741. onError(e);
  742. }
  743. };
  744. const finish = () => {
  745. var _a;
  746. try {
  747. (_a = animate.value) == null ? void 0 : _a.finish();
  748. syncPause();
  749. } catch (e) {
  750. onError(e);
  751. }
  752. };
  753. const cancel = () => {
  754. var _a;
  755. try {
  756. (_a = animate.value) == null ? void 0 : _a.cancel();
  757. syncPause();
  758. } catch (e) {
  759. onError(e);
  760. }
  761. };
  762. vueDemi.watch(() => unrefElement(target), (el) => {
  763. el && update();
  764. });
  765. vueDemi.watch(() => keyframes, (value) => {
  766. !animate.value && update();
  767. if (!unrefElement(target) && animate.value) {
  768. animate.value.effect = new KeyframeEffect(
  769. unrefElement(target),
  770. shared.toValue(value),
  771. animateOptions
  772. );
  773. }
  774. }, { deep: true });
  775. shared.tryOnMounted(() => {
  776. vueDemi.nextTick(() => update(true));
  777. });
  778. shared.tryOnScopeDispose(cancel);
  779. function update(init) {
  780. const el = unrefElement(target);
  781. if (!isSupported.value || !el)
  782. return;
  783. animate.value = el.animate(shared.toValue(keyframes), animateOptions);
  784. if (commitStyles)
  785. animate.value.commitStyles();
  786. if (persist)
  787. animate.value.persist();
  788. if (_playbackRate !== 1)
  789. animate.value.playbackRate = _playbackRate;
  790. if (init && !immediate)
  791. animate.value.pause();
  792. else
  793. syncResume();
  794. onReady == null ? void 0 : onReady(animate.value);
  795. }
  796. useEventListener(animate, "cancel", syncPause);
  797. useEventListener(animate, "finish", syncPause);
  798. useEventListener(animate, "remove", syncPause);
  799. const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {
  800. if (!animate.value)
  801. return;
  802. store.pending = animate.value.pending;
  803. store.playState = animate.value.playState;
  804. store.replaceState = animate.value.replaceState;
  805. store.startTime = animate.value.startTime;
  806. store.currentTime = animate.value.currentTime;
  807. store.timeline = animate.value.timeline;
  808. store.playbackRate = animate.value.playbackRate;
  809. }, { immediate: false });
  810. function syncResume() {
  811. if (isSupported.value)
  812. resumeRef();
  813. }
  814. function syncPause() {
  815. if (isSupported.value && window)
  816. window.requestAnimationFrame(pauseRef);
  817. }
  818. return {
  819. isSupported,
  820. animate,
  821. // actions
  822. play,
  823. pause,
  824. reverse,
  825. finish,
  826. cancel,
  827. // state
  828. pending,
  829. playState,
  830. replaceState,
  831. startTime,
  832. currentTime,
  833. timeline,
  834. playbackRate
  835. };
  836. }
  837. function useAsyncQueue(tasks, options = {}) {
  838. const {
  839. interrupt = true,
  840. onError = shared.noop,
  841. onFinished = shared.noop
  842. } = options;
  843. const promiseState = {
  844. pending: "pending",
  845. rejected: "rejected",
  846. fulfilled: "fulfilled"
  847. };
  848. const initialResult = Array.from(new Array(tasks.length), () => ({ state: promiseState.pending, data: null }));
  849. const result = vueDemi.reactive(initialResult);
  850. const activeIndex = vueDemi.ref(-1);
  851. if (!tasks || tasks.length === 0) {
  852. onFinished();
  853. return {
  854. activeIndex,
  855. result
  856. };
  857. }
  858. function updateResult(state, res) {
  859. activeIndex.value++;
  860. result[activeIndex.value].data = res;
  861. result[activeIndex.value].state = state;
  862. }
  863. tasks.reduce((prev, curr) => {
  864. return prev.then((prevRes) => {
  865. var _a;
  866. if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {
  867. onFinished();
  868. return;
  869. }
  870. return curr(prevRes).then((currentRes) => {
  871. updateResult(promiseState.fulfilled, currentRes);
  872. activeIndex.value === tasks.length - 1 && onFinished();
  873. return currentRes;
  874. });
  875. }).catch((e) => {
  876. updateResult(promiseState.rejected, e);
  877. onError();
  878. return e;
  879. });
  880. }, Promise.resolve());
  881. return {
  882. activeIndex,
  883. result
  884. };
  885. }
  886. var __defProp$n = Object.defineProperty;
  887. var __defProps$a = Object.defineProperties;
  888. var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
  889. var __getOwnPropSymbols$q = Object.getOwnPropertySymbols;
  890. var __hasOwnProp$q = Object.prototype.hasOwnProperty;
  891. var __propIsEnum$q = Object.prototype.propertyIsEnumerable;
  892. var __defNormalProp$n = (obj, key, value) => key in obj ? __defProp$n(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  893. var __spreadValues$n = (a, b) => {
  894. for (var prop in b || (b = {}))
  895. if (__hasOwnProp$q.call(b, prop))
  896. __defNormalProp$n(a, prop, b[prop]);
  897. if (__getOwnPropSymbols$q)
  898. for (var prop of __getOwnPropSymbols$q(b)) {
  899. if (__propIsEnum$q.call(b, prop))
  900. __defNormalProp$n(a, prop, b[prop]);
  901. }
  902. return a;
  903. };
  904. var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
  905. function useAsyncState(promise, initialState, options) {
  906. const {
  907. immediate = true,
  908. delay = 0,
  909. onError = shared.noop,
  910. onSuccess = shared.noop,
  911. resetOnExecute = true,
  912. shallow = true,
  913. throwError
  914. } = options != null ? options : {};
  915. const state = shallow ? vueDemi.shallowRef(initialState) : vueDemi.ref(initialState);
  916. const isReady = vueDemi.ref(false);
  917. const isLoading = vueDemi.ref(false);
  918. const error = vueDemi.shallowRef(void 0);
  919. async function execute(delay2 = 0, ...args) {
  920. if (resetOnExecute)
  921. state.value = initialState;
  922. error.value = void 0;
  923. isReady.value = false;
  924. isLoading.value = true;
  925. if (delay2 > 0)
  926. await shared.promiseTimeout(delay2);
  927. const _promise = typeof promise === "function" ? promise(...args) : promise;
  928. try {
  929. const data = await _promise;
  930. state.value = data;
  931. isReady.value = true;
  932. onSuccess(data);
  933. } catch (e) {
  934. error.value = e;
  935. onError(e);
  936. if (throwError)
  937. throw e;
  938. } finally {
  939. isLoading.value = false;
  940. }
  941. return state.value;
  942. }
  943. if (immediate)
  944. execute(delay);
  945. const shell = {
  946. state,
  947. isReady,
  948. isLoading,
  949. error,
  950. execute
  951. };
  952. function waitUntilIsLoaded() {
  953. return new Promise((resolve, reject) => {
  954. shared.until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);
  955. });
  956. }
  957. return __spreadProps$a(__spreadValues$n({}, shell), {
  958. then(onFulfilled, onRejected) {
  959. return waitUntilIsLoaded().then(onFulfilled, onRejected);
  960. }
  961. });
  962. }
  963. const defaults = {
  964. array: (v) => JSON.stringify(v),
  965. object: (v) => JSON.stringify(v),
  966. set: (v) => JSON.stringify(Array.from(v)),
  967. map: (v) => JSON.stringify(Object.fromEntries(v)),
  968. null: () => ""
  969. };
  970. function getDefaultSerialization(target) {
  971. if (!target)
  972. return defaults.null;
  973. if (target instanceof Map)
  974. return defaults.map;
  975. else if (target instanceof Set)
  976. return defaults.set;
  977. else if (Array.isArray(target))
  978. return defaults.array;
  979. else
  980. return defaults.object;
  981. }
  982. function useBase64(target, options) {
  983. const base64 = vueDemi.ref("");
  984. const promise = vueDemi.ref();
  985. function execute() {
  986. if (!shared.isClient)
  987. return;
  988. promise.value = new Promise((resolve, reject) => {
  989. try {
  990. const _target = shared.toValue(target);
  991. if (_target == null) {
  992. resolve("");
  993. } else if (typeof _target === "string") {
  994. resolve(blobToBase64(new Blob([_target], { type: "text/plain" })));
  995. } else if (_target instanceof Blob) {
  996. resolve(blobToBase64(_target));
  997. } else if (_target instanceof ArrayBuffer) {
  998. resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));
  999. } else if (_target instanceof HTMLCanvasElement) {
  1000. resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));
  1001. } else if (_target instanceof HTMLImageElement) {
  1002. const img = _target.cloneNode(false);
  1003. img.crossOrigin = "Anonymous";
  1004. imgLoaded(img).then(() => {
  1005. const canvas = document.createElement("canvas");
  1006. const ctx = canvas.getContext("2d");
  1007. canvas.width = img.width;
  1008. canvas.height = img.height;
  1009. ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
  1010. resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));
  1011. }).catch(reject);
  1012. } else if (typeof _target === "object") {
  1013. const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);
  1014. const serialized = _serializeFn(_target);
  1015. return resolve(blobToBase64(new Blob([serialized], { type: "application/json" })));
  1016. } else {
  1017. reject(new Error("target is unsupported types"));
  1018. }
  1019. } catch (error) {
  1020. reject(error);
  1021. }
  1022. });
  1023. promise.value.then((res) => base64.value = res);
  1024. return promise.value;
  1025. }
  1026. if (vueDemi.isRef(target) || typeof target === "function")
  1027. vueDemi.watch(target, execute, { immediate: true });
  1028. else
  1029. execute();
  1030. return {
  1031. base64,
  1032. promise,
  1033. execute
  1034. };
  1035. }
  1036. function imgLoaded(img) {
  1037. return new Promise((resolve, reject) => {
  1038. if (!img.complete) {
  1039. img.onload = () => {
  1040. resolve();
  1041. };
  1042. img.onerror = reject;
  1043. } else {
  1044. resolve();
  1045. }
  1046. });
  1047. }
  1048. function blobToBase64(blob) {
  1049. return new Promise((resolve, reject) => {
  1050. const fr = new FileReader();
  1051. fr.onload = (e) => {
  1052. resolve(e.target.result);
  1053. };
  1054. fr.onerror = reject;
  1055. fr.readAsDataURL(blob);
  1056. });
  1057. }
  1058. function useBattery({ navigator = defaultNavigator } = {}) {
  1059. const events = ["chargingchange", "chargingtimechange", "dischargingtimechange", "levelchange"];
  1060. const isSupported = useSupported(() => navigator && "getBattery" in navigator);
  1061. const charging = vueDemi.ref(false);
  1062. const chargingTime = vueDemi.ref(0);
  1063. const dischargingTime = vueDemi.ref(0);
  1064. const level = vueDemi.ref(1);
  1065. let battery;
  1066. function updateBatteryInfo() {
  1067. charging.value = this.charging;
  1068. chargingTime.value = this.chargingTime || 0;
  1069. dischargingTime.value = this.dischargingTime || 0;
  1070. level.value = this.level;
  1071. }
  1072. if (isSupported.value) {
  1073. navigator.getBattery().then((_battery) => {
  1074. battery = _battery;
  1075. updateBatteryInfo.call(battery);
  1076. for (const event of events)
  1077. useEventListener(battery, event, updateBatteryInfo, { passive: true });
  1078. });
  1079. }
  1080. return {
  1081. isSupported,
  1082. charging,
  1083. chargingTime,
  1084. dischargingTime,
  1085. level
  1086. };
  1087. }
  1088. function useBluetooth(options) {
  1089. let {
  1090. acceptAllDevices = false
  1091. } = options || {};
  1092. const {
  1093. filters = void 0,
  1094. optionalServices = void 0,
  1095. navigator = defaultNavigator
  1096. } = options || {};
  1097. const isSupported = useSupported(() => navigator && "bluetooth" in navigator);
  1098. const device = vueDemi.shallowRef(void 0);
  1099. const error = vueDemi.shallowRef(null);
  1100. vueDemi.watch(device, () => {
  1101. connectToBluetoothGATTServer();
  1102. });
  1103. async function requestDevice() {
  1104. if (!isSupported.value)
  1105. return;
  1106. error.value = null;
  1107. if (filters && filters.length > 0)
  1108. acceptAllDevices = false;
  1109. try {
  1110. device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({
  1111. acceptAllDevices,
  1112. filters,
  1113. optionalServices
  1114. }));
  1115. } catch (err) {
  1116. error.value = err;
  1117. }
  1118. }
  1119. const server = vueDemi.ref();
  1120. const isConnected = vueDemi.computed(() => {
  1121. var _a;
  1122. return ((_a = server.value) == null ? void 0 : _a.connected) || false;
  1123. });
  1124. async function connectToBluetoothGATTServer() {
  1125. error.value = null;
  1126. if (device.value && device.value.gatt) {
  1127. device.value.addEventListener("gattserverdisconnected", () => {
  1128. });
  1129. try {
  1130. server.value = await device.value.gatt.connect();
  1131. } catch (err) {
  1132. error.value = err;
  1133. }
  1134. }
  1135. }
  1136. shared.tryOnMounted(() => {
  1137. var _a;
  1138. if (device.value)
  1139. (_a = device.value.gatt) == null ? void 0 : _a.connect();
  1140. });
  1141. shared.tryOnScopeDispose(() => {
  1142. var _a;
  1143. if (device.value)
  1144. (_a = device.value.gatt) == null ? void 0 : _a.disconnect();
  1145. });
  1146. return {
  1147. isSupported,
  1148. isConnected,
  1149. // Device:
  1150. device,
  1151. requestDevice,
  1152. // Server:
  1153. server,
  1154. // Errors:
  1155. error
  1156. };
  1157. }
  1158. function useMediaQuery(query, options = {}) {
  1159. const { window = defaultWindow } = options;
  1160. const isSupported = useSupported(() => window && "matchMedia" in window && typeof window.matchMedia === "function");
  1161. let mediaQuery;
  1162. const matches = vueDemi.ref(false);
  1163. const cleanup = () => {
  1164. if (!mediaQuery)
  1165. return;
  1166. if ("removeEventListener" in mediaQuery)
  1167. mediaQuery.removeEventListener("change", update);
  1168. else
  1169. mediaQuery.removeListener(update);
  1170. };
  1171. const update = () => {
  1172. if (!isSupported.value)
  1173. return;
  1174. cleanup();
  1175. mediaQuery = window.matchMedia(shared.toRef(query).value);
  1176. matches.value = !!(mediaQuery == null ? void 0 : mediaQuery.matches);
  1177. if (!mediaQuery)
  1178. return;
  1179. if ("addEventListener" in mediaQuery)
  1180. mediaQuery.addEventListener("change", update);
  1181. else
  1182. mediaQuery.addListener(update);
  1183. };
  1184. vueDemi.watchEffect(update);
  1185. shared.tryOnScopeDispose(() => cleanup());
  1186. return matches;
  1187. }
  1188. const breakpointsTailwind = {
  1189. "sm": 640,
  1190. "md": 768,
  1191. "lg": 1024,
  1192. "xl": 1280,
  1193. "2xl": 1536
  1194. };
  1195. const breakpointsBootstrapV5 = {
  1196. sm: 576,
  1197. md: 768,
  1198. lg: 992,
  1199. xl: 1200,
  1200. xxl: 1400
  1201. };
  1202. const breakpointsVuetify = {
  1203. xs: 600,
  1204. sm: 960,
  1205. md: 1264,
  1206. lg: 1904
  1207. };
  1208. const breakpointsAntDesign = {
  1209. xs: 480,
  1210. sm: 576,
  1211. md: 768,
  1212. lg: 992,
  1213. xl: 1200,
  1214. xxl: 1600
  1215. };
  1216. const breakpointsQuasar = {
  1217. xs: 600,
  1218. sm: 1024,
  1219. md: 1440,
  1220. lg: 1920
  1221. };
  1222. const breakpointsSematic = {
  1223. mobileS: 320,
  1224. mobileM: 375,
  1225. mobileL: 425,
  1226. tablet: 768,
  1227. laptop: 1024,
  1228. laptopL: 1440,
  1229. desktop4K: 2560
  1230. };
  1231. const breakpointsMasterCss = {
  1232. "3xs": 360,
  1233. "2xs": 480,
  1234. "xs": 600,
  1235. "sm": 768,
  1236. "md": 1024,
  1237. "lg": 1280,
  1238. "xl": 1440,
  1239. "2xl": 1600,
  1240. "3xl": 1920,
  1241. "4xl": 2560
  1242. };
  1243. function useBreakpoints(breakpoints, options = {}) {
  1244. function getValue(k, delta) {
  1245. let v = breakpoints[k];
  1246. if (delta != null)
  1247. v = shared.increaseWithUnit(v, delta);
  1248. if (typeof v === "number")
  1249. v = `${v}px`;
  1250. return v;
  1251. }
  1252. const { window = defaultWindow } = options;
  1253. function match(query) {
  1254. if (!window)
  1255. return false;
  1256. return window.matchMedia(query).matches;
  1257. }
  1258. const greaterOrEqual = (k) => {
  1259. return useMediaQuery(`(min-width: ${getValue(k)})`, options);
  1260. };
  1261. const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {
  1262. Object.defineProperty(shortcuts, k, {
  1263. get: () => greaterOrEqual(k),
  1264. enumerable: true,
  1265. configurable: true
  1266. });
  1267. return shortcuts;
  1268. }, {});
  1269. return Object.assign(shortcutMethods, {
  1270. greater(k) {
  1271. return useMediaQuery(`(min-width: ${getValue(k, 0.1)})`, options);
  1272. },
  1273. greaterOrEqual,
  1274. smaller(k) {
  1275. return useMediaQuery(`(max-width: ${getValue(k, -0.1)})`, options);
  1276. },
  1277. smallerOrEqual(k) {
  1278. return useMediaQuery(`(max-width: ${getValue(k)})`, options);
  1279. },
  1280. between(a, b) {
  1281. return useMediaQuery(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);
  1282. },
  1283. isGreater(k) {
  1284. return match(`(min-width: ${getValue(k, 0.1)})`);
  1285. },
  1286. isGreaterOrEqual(k) {
  1287. return match(`(min-width: ${getValue(k)})`);
  1288. },
  1289. isSmaller(k) {
  1290. return match(`(max-width: ${getValue(k, -0.1)})`);
  1291. },
  1292. isSmallerOrEqual(k) {
  1293. return match(`(max-width: ${getValue(k)})`);
  1294. },
  1295. isInBetween(a, b) {
  1296. return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);
  1297. },
  1298. current() {
  1299. const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);
  1300. return vueDemi.computed(() => points.filter(([, v]) => v.value).map(([k]) => k));
  1301. }
  1302. });
  1303. }
  1304. function useBroadcastChannel(options) {
  1305. const {
  1306. name,
  1307. window = defaultWindow
  1308. } = options;
  1309. const isSupported = useSupported(() => window && "BroadcastChannel" in window);
  1310. const isClosed = vueDemi.ref(false);
  1311. const channel = vueDemi.ref();
  1312. const data = vueDemi.ref();
  1313. const error = vueDemi.shallowRef(null);
  1314. const post = (data2) => {
  1315. if (channel.value)
  1316. channel.value.postMessage(data2);
  1317. };
  1318. const close = () => {
  1319. if (channel.value)
  1320. channel.value.close();
  1321. isClosed.value = true;
  1322. };
  1323. if (isSupported.value) {
  1324. shared.tryOnMounted(() => {
  1325. error.value = null;
  1326. channel.value = new BroadcastChannel(name);
  1327. channel.value.addEventListener("message", (e) => {
  1328. data.value = e.data;
  1329. }, { passive: true });
  1330. channel.value.addEventListener("messageerror", (e) => {
  1331. error.value = e;
  1332. }, { passive: true });
  1333. channel.value.addEventListener("close", () => {
  1334. isClosed.value = true;
  1335. });
  1336. });
  1337. }
  1338. shared.tryOnScopeDispose(() => {
  1339. close();
  1340. });
  1341. return {
  1342. isSupported,
  1343. channel,
  1344. data,
  1345. post,
  1346. close,
  1347. error,
  1348. isClosed
  1349. };
  1350. }
  1351. var __defProp$m = Object.defineProperty;
  1352. var __getOwnPropSymbols$p = Object.getOwnPropertySymbols;
  1353. var __hasOwnProp$p = Object.prototype.hasOwnProperty;
  1354. var __propIsEnum$p = Object.prototype.propertyIsEnumerable;
  1355. var __defNormalProp$m = (obj, key, value) => key in obj ? __defProp$m(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  1356. var __spreadValues$m = (a, b) => {
  1357. for (var prop in b || (b = {}))
  1358. if (__hasOwnProp$p.call(b, prop))
  1359. __defNormalProp$m(a, prop, b[prop]);
  1360. if (__getOwnPropSymbols$p)
  1361. for (var prop of __getOwnPropSymbols$p(b)) {
  1362. if (__propIsEnum$p.call(b, prop))
  1363. __defNormalProp$m(a, prop, b[prop]);
  1364. }
  1365. return a;
  1366. };
  1367. const WRITABLE_PROPERTIES = [
  1368. "hash",
  1369. "host",
  1370. "hostname",
  1371. "href",
  1372. "pathname",
  1373. "port",
  1374. "protocol",
  1375. "search"
  1376. ];
  1377. function useBrowserLocation({ window = defaultWindow } = {}) {
  1378. const refs = Object.fromEntries(
  1379. WRITABLE_PROPERTIES.map((key) => [key, vueDemi.ref()])
  1380. );
  1381. for (const [key, ref2] of shared.objectEntries(refs)) {
  1382. vueDemi.watch(ref2, (value) => {
  1383. if (!(window == null ? void 0 : window.location) || window.location[key] === value)
  1384. return;
  1385. window.location[key] = value;
  1386. });
  1387. }
  1388. const buildState = (trigger) => {
  1389. var _a;
  1390. const { state: state2, length } = (window == null ? void 0 : window.history) || {};
  1391. const { origin } = (window == null ? void 0 : window.location) || {};
  1392. for (const key of WRITABLE_PROPERTIES)
  1393. refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];
  1394. return vueDemi.reactive(__spreadValues$m({
  1395. trigger,
  1396. state: state2,
  1397. length,
  1398. origin
  1399. }, refs));
  1400. };
  1401. const state = vueDemi.ref(buildState("load"));
  1402. if (window) {
  1403. useEventListener(window, "popstate", () => state.value = buildState("popstate"), { passive: true });
  1404. useEventListener(window, "hashchange", () => state.value = buildState("hashchange"), { passive: true });
  1405. }
  1406. return state;
  1407. }
  1408. function useCached(refValue, comparator = (a, b) => a === b, watchOptions) {
  1409. const cachedValue = vueDemi.ref(refValue.value);
  1410. vueDemi.watch(() => refValue.value, (value) => {
  1411. if (!comparator(value, cachedValue.value))
  1412. cachedValue.value = value;
  1413. }, watchOptions);
  1414. return cachedValue;
  1415. }
  1416. function useClipboard(options = {}) {
  1417. const {
  1418. navigator = defaultNavigator,
  1419. read = false,
  1420. source,
  1421. copiedDuring = 1500,
  1422. legacy = false
  1423. } = options;
  1424. const events = ["copy", "cut"];
  1425. const isClipboardApiSupported = useSupported(() => navigator && "clipboard" in navigator);
  1426. const isSupported = vueDemi.computed(() => isClipboardApiSupported.value || legacy);
  1427. const text = vueDemi.ref("");
  1428. const copied = vueDemi.ref(false);
  1429. const timeout = shared.useTimeoutFn(() => copied.value = false, copiedDuring);
  1430. function updateText() {
  1431. if (isClipboardApiSupported.value) {
  1432. navigator.clipboard.readText().then((value) => {
  1433. text.value = value;
  1434. });
  1435. } else {
  1436. text.value = legacyRead();
  1437. }
  1438. }
  1439. if (isSupported.value && read) {
  1440. for (const event of events)
  1441. useEventListener(event, updateText);
  1442. }
  1443. async function copy(value = shared.toValue(source)) {
  1444. if (isSupported.value && value != null) {
  1445. if (isClipboardApiSupported.value)
  1446. await navigator.clipboard.writeText(value);
  1447. else
  1448. legacyCopy(value);
  1449. text.value = value;
  1450. copied.value = true;
  1451. timeout.start();
  1452. }
  1453. }
  1454. function legacyCopy(value) {
  1455. const ta = document.createElement("textarea");
  1456. ta.value = value != null ? value : "";
  1457. ta.style.position = "absolute";
  1458. ta.style.opacity = "0";
  1459. document.body.appendChild(ta);
  1460. ta.select();
  1461. document.execCommand("copy");
  1462. ta.remove();
  1463. }
  1464. function legacyRead() {
  1465. var _a, _b, _c;
  1466. return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : "";
  1467. }
  1468. return {
  1469. isSupported,
  1470. text,
  1471. copied,
  1472. copy
  1473. };
  1474. }
  1475. var __defProp$l = Object.defineProperty;
  1476. var __defProps$9 = Object.defineProperties;
  1477. var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
  1478. var __getOwnPropSymbols$o = Object.getOwnPropertySymbols;
  1479. var __hasOwnProp$o = Object.prototype.hasOwnProperty;
  1480. var __propIsEnum$o = Object.prototype.propertyIsEnumerable;
  1481. var __defNormalProp$l = (obj, key, value) => key in obj ? __defProp$l(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  1482. var __spreadValues$l = (a, b) => {
  1483. for (var prop in b || (b = {}))
  1484. if (__hasOwnProp$o.call(b, prop))
  1485. __defNormalProp$l(a, prop, b[prop]);
  1486. if (__getOwnPropSymbols$o)
  1487. for (var prop of __getOwnPropSymbols$o(b)) {
  1488. if (__propIsEnum$o.call(b, prop))
  1489. __defNormalProp$l(a, prop, b[prop]);
  1490. }
  1491. return a;
  1492. };
  1493. var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
  1494. function cloneFnJSON(source) {
  1495. return JSON.parse(JSON.stringify(source));
  1496. }
  1497. function useCloned(source, options = {}) {
  1498. const cloned = vueDemi.ref({});
  1499. const {
  1500. manual,
  1501. clone = cloneFnJSON,
  1502. // watch options
  1503. deep = true,
  1504. immediate = true
  1505. } = options;
  1506. function sync() {
  1507. cloned.value = clone(shared.toValue(source));
  1508. }
  1509. if (!manual && vueDemi.isRef(source)) {
  1510. vueDemi.watch(source, sync, __spreadProps$9(__spreadValues$l({}, options), {
  1511. deep,
  1512. immediate
  1513. }));
  1514. } else {
  1515. sync();
  1516. }
  1517. return { cloned, sync };
  1518. }
  1519. const _global = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
  1520. const globalKey = "__vueuse_ssr_handlers__";
  1521. const handlers = /* @__PURE__ */ getHandlers();
  1522. function getHandlers() {
  1523. if (!(globalKey in _global))
  1524. _global[globalKey] = _global[globalKey] || {};
  1525. return _global[globalKey];
  1526. }
  1527. function getSSRHandler(key, fallback) {
  1528. return handlers[key] || fallback;
  1529. }
  1530. function setSSRHandler(key, fn) {
  1531. handlers[key] = fn;
  1532. }
  1533. function guessSerializerType(rawInit) {
  1534. return rawInit == null ? "any" : rawInit instanceof Set ? "set" : rawInit instanceof Map ? "map" : rawInit instanceof Date ? "date" : typeof rawInit === "boolean" ? "boolean" : typeof rawInit === "string" ? "string" : typeof rawInit === "object" ? "object" : !Number.isNaN(rawInit) ? "number" : "any";
  1535. }
  1536. var __defProp$k = Object.defineProperty;
  1537. var __getOwnPropSymbols$n = Object.getOwnPropertySymbols;
  1538. var __hasOwnProp$n = Object.prototype.hasOwnProperty;
  1539. var __propIsEnum$n = Object.prototype.propertyIsEnumerable;
  1540. var __defNormalProp$k = (obj, key, value) => key in obj ? __defProp$k(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  1541. var __spreadValues$k = (a, b) => {
  1542. for (var prop in b || (b = {}))
  1543. if (__hasOwnProp$n.call(b, prop))
  1544. __defNormalProp$k(a, prop, b[prop]);
  1545. if (__getOwnPropSymbols$n)
  1546. for (var prop of __getOwnPropSymbols$n(b)) {
  1547. if (__propIsEnum$n.call(b, prop))
  1548. __defNormalProp$k(a, prop, b[prop]);
  1549. }
  1550. return a;
  1551. };
  1552. const StorageSerializers = {
  1553. boolean: {
  1554. read: (v) => v === "true",
  1555. write: (v) => String(v)
  1556. },
  1557. object: {
  1558. read: (v) => JSON.parse(v),
  1559. write: (v) => JSON.stringify(v)
  1560. },
  1561. number: {
  1562. read: (v) => Number.parseFloat(v),
  1563. write: (v) => String(v)
  1564. },
  1565. any: {
  1566. read: (v) => v,
  1567. write: (v) => String(v)
  1568. },
  1569. string: {
  1570. read: (v) => v,
  1571. write: (v) => String(v)
  1572. },
  1573. map: {
  1574. read: (v) => new Map(JSON.parse(v)),
  1575. write: (v) => JSON.stringify(Array.from(v.entries()))
  1576. },
  1577. set: {
  1578. read: (v) => new Set(JSON.parse(v)),
  1579. write: (v) => JSON.stringify(Array.from(v))
  1580. },
  1581. date: {
  1582. read: (v) => new Date(v),
  1583. write: (v) => v.toISOString()
  1584. }
  1585. };
  1586. const customStorageEventName = "vueuse-storage";
  1587. function useStorage(key, defaults, storage, options = {}) {
  1588. var _a;
  1589. const {
  1590. flush = "pre",
  1591. deep = true,
  1592. listenToStorageChanges = true,
  1593. writeDefaults = true,
  1594. mergeDefaults = false,
  1595. shallow,
  1596. window = defaultWindow,
  1597. eventFilter,
  1598. onError = (e) => {
  1599. console.error(e);
  1600. }
  1601. } = options;
  1602. const data = (shallow ? vueDemi.shallowRef : vueDemi.ref)(defaults);
  1603. if (!storage) {
  1604. try {
  1605. storage = getSSRHandler("getDefaultStorage", () => {
  1606. var _a2;
  1607. return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
  1608. })();
  1609. } catch (e) {
  1610. onError(e);
  1611. }
  1612. }
  1613. if (!storage)
  1614. return data;
  1615. const rawInit = shared.toValue(defaults);
  1616. const type = guessSerializerType(rawInit);
  1617. const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
  1618. const { pause: pauseWatch, resume: resumeWatch } = shared.pausableWatch(
  1619. data,
  1620. () => write(data.value),
  1621. { flush, deep, eventFilter }
  1622. );
  1623. if (window && listenToStorageChanges) {
  1624. useEventListener(window, "storage", update);
  1625. useEventListener(window, customStorageEventName, updateFromCustomEvent);
  1626. }
  1627. update();
  1628. return data;
  1629. function write(v) {
  1630. try {
  1631. if (v == null) {
  1632. storage.removeItem(key);
  1633. } else {
  1634. const serialized = serializer.write(v);
  1635. const oldValue = storage.getItem(key);
  1636. if (oldValue !== serialized) {
  1637. storage.setItem(key, serialized);
  1638. if (window) {
  1639. window.dispatchEvent(new CustomEvent(customStorageEventName, {
  1640. detail: {
  1641. key,
  1642. oldValue,
  1643. newValue: serialized,
  1644. storageArea: storage
  1645. }
  1646. }));
  1647. }
  1648. }
  1649. }
  1650. } catch (e) {
  1651. onError(e);
  1652. }
  1653. }
  1654. function read(event) {
  1655. const rawValue = event ? event.newValue : storage.getItem(key);
  1656. if (rawValue == null) {
  1657. if (writeDefaults && rawInit !== null)
  1658. storage.setItem(key, serializer.write(rawInit));
  1659. return rawInit;
  1660. } else if (!event && mergeDefaults) {
  1661. const value = serializer.read(rawValue);
  1662. if (typeof mergeDefaults === "function")
  1663. return mergeDefaults(value, rawInit);
  1664. else if (type === "object" && !Array.isArray(value))
  1665. return __spreadValues$k(__spreadValues$k({}, rawInit), value);
  1666. return value;
  1667. } else if (typeof rawValue !== "string") {
  1668. return rawValue;
  1669. } else {
  1670. return serializer.read(rawValue);
  1671. }
  1672. }
  1673. function updateFromCustomEvent(event) {
  1674. update(event.detail);
  1675. }
  1676. function update(event) {
  1677. if (event && event.storageArea !== storage)
  1678. return;
  1679. if (event && event.key == null) {
  1680. data.value = rawInit;
  1681. return;
  1682. }
  1683. if (event && event.key !== key)
  1684. return;
  1685. pauseWatch();
  1686. try {
  1687. data.value = read(event);
  1688. } catch (e) {
  1689. onError(e);
  1690. } finally {
  1691. if (event)
  1692. vueDemi.nextTick(resumeWatch);
  1693. else
  1694. resumeWatch();
  1695. }
  1696. }
  1697. }
  1698. function usePreferredDark(options) {
  1699. return useMediaQuery("(prefers-color-scheme: dark)", options);
  1700. }
  1701. var __defProp$j = Object.defineProperty;
  1702. var __getOwnPropSymbols$m = Object.getOwnPropertySymbols;
  1703. var __hasOwnProp$m = Object.prototype.hasOwnProperty;
  1704. var __propIsEnum$m = Object.prototype.propertyIsEnumerable;
  1705. var __defNormalProp$j = (obj, key, value) => key in obj ? __defProp$j(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  1706. var __spreadValues$j = (a, b) => {
  1707. for (var prop in b || (b = {}))
  1708. if (__hasOwnProp$m.call(b, prop))
  1709. __defNormalProp$j(a, prop, b[prop]);
  1710. if (__getOwnPropSymbols$m)
  1711. for (var prop of __getOwnPropSymbols$m(b)) {
  1712. if (__propIsEnum$m.call(b, prop))
  1713. __defNormalProp$j(a, prop, b[prop]);
  1714. }
  1715. return a;
  1716. };
  1717. function useColorMode(options = {}) {
  1718. const {
  1719. selector = "html",
  1720. attribute = "class",
  1721. initialValue = "auto",
  1722. window = defaultWindow,
  1723. storage,
  1724. storageKey = "vueuse-color-scheme",
  1725. listenToStorageChanges = true,
  1726. storageRef,
  1727. emitAuto,
  1728. disableTransition = true
  1729. } = options;
  1730. const modes = __spreadValues$j({
  1731. auto: "",
  1732. light: "light",
  1733. dark: "dark"
  1734. }, options.modes || {});
  1735. const preferredDark = usePreferredDark({ window });
  1736. const system = vueDemi.computed(() => preferredDark.value ? "dark" : "light");
  1737. const store = storageRef || (storageKey == null ? shared.toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));
  1738. const state = vueDemi.computed(
  1739. () => store.value === "auto" ? system.value : store.value
  1740. );
  1741. const updateHTMLAttrs = getSSRHandler(
  1742. "updateHTMLAttrs",
  1743. (selector2, attribute2, value) => {
  1744. const el = typeof selector2 === "string" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);
  1745. if (!el)
  1746. return;
  1747. let style;
  1748. if (disableTransition) {
  1749. style = window.document.createElement("style");
  1750. style.appendChild(document.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}"));
  1751. window.document.head.appendChild(style);
  1752. }
  1753. if (attribute2 === "class") {
  1754. const current = value.split(/\s/g);
  1755. Object.values(modes).flatMap((i) => (i || "").split(/\s/g)).filter(Boolean).forEach((v) => {
  1756. if (current.includes(v))
  1757. el.classList.add(v);
  1758. else
  1759. el.classList.remove(v);
  1760. });
  1761. } else {
  1762. el.setAttribute(attribute2, value);
  1763. }
  1764. if (disableTransition) {
  1765. window.getComputedStyle(style).opacity;
  1766. document.head.removeChild(style);
  1767. }
  1768. }
  1769. );
  1770. function defaultOnChanged(mode) {
  1771. var _a;
  1772. updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);
  1773. }
  1774. function onChanged(mode) {
  1775. if (options.onChanged)
  1776. options.onChanged(mode, defaultOnChanged);
  1777. else
  1778. defaultOnChanged(mode);
  1779. }
  1780. vueDemi.watch(state, onChanged, { flush: "post", immediate: true });
  1781. shared.tryOnMounted(() => onChanged(state.value));
  1782. const auto = vueDemi.computed({
  1783. get() {
  1784. return emitAuto ? store.value : state.value;
  1785. },
  1786. set(v) {
  1787. store.value = v;
  1788. }
  1789. });
  1790. try {
  1791. return Object.assign(auto, { store, system, state });
  1792. } catch (e) {
  1793. return auto;
  1794. }
  1795. }
  1796. function useConfirmDialog(revealed = vueDemi.ref(false)) {
  1797. const confirmHook = shared.createEventHook();
  1798. const cancelHook = shared.createEventHook();
  1799. const revealHook = shared.createEventHook();
  1800. let _resolve = shared.noop;
  1801. const reveal = (data) => {
  1802. revealHook.trigger(data);
  1803. revealed.value = true;
  1804. return new Promise((resolve) => {
  1805. _resolve = resolve;
  1806. });
  1807. };
  1808. const confirm = (data) => {
  1809. revealed.value = false;
  1810. confirmHook.trigger(data);
  1811. _resolve({ data, isCanceled: false });
  1812. };
  1813. const cancel = (data) => {
  1814. revealed.value = false;
  1815. cancelHook.trigger(data);
  1816. _resolve({ data, isCanceled: true });
  1817. };
  1818. return {
  1819. isRevealed: vueDemi.computed(() => revealed.value),
  1820. reveal,
  1821. confirm,
  1822. cancel,
  1823. onReveal: revealHook.on,
  1824. onConfirm: confirmHook.on,
  1825. onCancel: cancelHook.on
  1826. };
  1827. }
  1828. var __getOwnPropSymbols$l = Object.getOwnPropertySymbols;
  1829. var __hasOwnProp$l = Object.prototype.hasOwnProperty;
  1830. var __propIsEnum$l = Object.prototype.propertyIsEnumerable;
  1831. var __objRest$3 = (source, exclude) => {
  1832. var target = {};
  1833. for (var prop in source)
  1834. if (__hasOwnProp$l.call(source, prop) && exclude.indexOf(prop) < 0)
  1835. target[prop] = source[prop];
  1836. if (source != null && __getOwnPropSymbols$l)
  1837. for (var prop of __getOwnPropSymbols$l(source)) {
  1838. if (exclude.indexOf(prop) < 0 && __propIsEnum$l.call(source, prop))
  1839. target[prop] = source[prop];
  1840. }
  1841. return target;
  1842. };
  1843. function useMutationObserver(target, callback, options = {}) {
  1844. const _a = options, { window = defaultWindow } = _a, mutationOptions = __objRest$3(_a, ["window"]);
  1845. let observer;
  1846. const isSupported = useSupported(() => window && "MutationObserver" in window);
  1847. const cleanup = () => {
  1848. if (observer) {
  1849. observer.disconnect();
  1850. observer = void 0;
  1851. }
  1852. };
  1853. const stopWatch = vueDemi.watch(
  1854. () => unrefElement(target),
  1855. (el) => {
  1856. cleanup();
  1857. if (isSupported.value && window && el) {
  1858. observer = new MutationObserver(callback);
  1859. observer.observe(el, mutationOptions);
  1860. }
  1861. },
  1862. { immediate: true }
  1863. );
  1864. const stop = () => {
  1865. cleanup();
  1866. stopWatch();
  1867. };
  1868. shared.tryOnScopeDispose(stop);
  1869. return {
  1870. isSupported,
  1871. stop
  1872. };
  1873. }
  1874. function useCssVar(prop, target, options = {}) {
  1875. const { window = defaultWindow, initialValue = "", observe = false } = options;
  1876. const variable = vueDemi.ref(initialValue);
  1877. const elRef = vueDemi.computed(() => {
  1878. var _a;
  1879. return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);
  1880. });
  1881. function updateCssVar() {
  1882. var _a;
  1883. const key = shared.toValue(prop);
  1884. const el = shared.toValue(elRef);
  1885. if (el && window) {
  1886. const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();
  1887. variable.value = value || initialValue;
  1888. }
  1889. }
  1890. if (observe) {
  1891. useMutationObserver(elRef, updateCssVar, {
  1892. attributes: true,
  1893. window
  1894. });
  1895. }
  1896. vueDemi.watch(
  1897. [elRef, () => shared.toValue(prop)],
  1898. updateCssVar,
  1899. { immediate: true }
  1900. );
  1901. vueDemi.watch(
  1902. variable,
  1903. (val) => {
  1904. var _a;
  1905. if ((_a = elRef.value) == null ? void 0 : _a.style)
  1906. elRef.value.style.setProperty(shared.toValue(prop), val);
  1907. }
  1908. );
  1909. return variable;
  1910. }
  1911. function useCurrentElement() {
  1912. const vm = vueDemi.getCurrentInstance();
  1913. const currentElement = shared.computedWithControl(
  1914. () => null,
  1915. () => vm.proxy.$el
  1916. );
  1917. vueDemi.onUpdated(currentElement.trigger);
  1918. vueDemi.onMounted(currentElement.trigger);
  1919. return currentElement;
  1920. }
  1921. function useCycleList(list, options) {
  1922. const state = vueDemi.shallowRef(getInitialValue());
  1923. const listRef = shared.toRef(list);
  1924. const index = vueDemi.computed({
  1925. get() {
  1926. var _a;
  1927. const targetList = listRef.value;
  1928. let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);
  1929. if (index2 < 0)
  1930. index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;
  1931. return index2;
  1932. },
  1933. set(v) {
  1934. set(v);
  1935. }
  1936. });
  1937. function set(i) {
  1938. const targetList = listRef.value;
  1939. const length = targetList.length;
  1940. const index2 = (i % length + length) % length;
  1941. const value = targetList[index2];
  1942. state.value = value;
  1943. return value;
  1944. }
  1945. function shift(delta = 1) {
  1946. return set(index.value + delta);
  1947. }
  1948. function next(n = 1) {
  1949. return shift(n);
  1950. }
  1951. function prev(n = 1) {
  1952. return shift(-n);
  1953. }
  1954. function getInitialValue() {
  1955. var _a, _b;
  1956. return (_b = shared.toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : shared.toValue(list)[0])) != null ? _b : void 0;
  1957. }
  1958. vueDemi.watch(listRef, () => set(index.value));
  1959. return {
  1960. state,
  1961. index,
  1962. next,
  1963. prev
  1964. };
  1965. }
  1966. var __defProp$i = Object.defineProperty;
  1967. var __defProps$8 = Object.defineProperties;
  1968. var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
  1969. var __getOwnPropSymbols$k = Object.getOwnPropertySymbols;
  1970. var __hasOwnProp$k = Object.prototype.hasOwnProperty;
  1971. var __propIsEnum$k = Object.prototype.propertyIsEnumerable;
  1972. var __defNormalProp$i = (obj, key, value) => key in obj ? __defProp$i(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  1973. var __spreadValues$i = (a, b) => {
  1974. for (var prop in b || (b = {}))
  1975. if (__hasOwnProp$k.call(b, prop))
  1976. __defNormalProp$i(a, prop, b[prop]);
  1977. if (__getOwnPropSymbols$k)
  1978. for (var prop of __getOwnPropSymbols$k(b)) {
  1979. if (__propIsEnum$k.call(b, prop))
  1980. __defNormalProp$i(a, prop, b[prop]);
  1981. }
  1982. return a;
  1983. };
  1984. var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
  1985. function useDark(options = {}) {
  1986. const {
  1987. valueDark = "dark",
  1988. valueLight = ""
  1989. } = options;
  1990. const mode = useColorMode(__spreadProps$8(__spreadValues$i({}, options), {
  1991. onChanged: (mode2, defaultHandler) => {
  1992. var _a;
  1993. if (options.onChanged)
  1994. (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === "dark", defaultHandler, mode2);
  1995. else
  1996. defaultHandler(mode2);
  1997. },
  1998. modes: {
  1999. dark: valueDark,
  2000. light: valueLight
  2001. }
  2002. }));
  2003. const isDark = vueDemi.computed({
  2004. get() {
  2005. return mode.value === "dark";
  2006. },
  2007. set(v) {
  2008. const modeVal = v ? "dark" : "light";
  2009. if (mode.system.value === modeVal)
  2010. mode.value = "auto";
  2011. else
  2012. mode.value = modeVal;
  2013. }
  2014. });
  2015. return isDark;
  2016. }
  2017. function fnBypass(v) {
  2018. return v;
  2019. }
  2020. function fnSetSource(source, value) {
  2021. return source.value = value;
  2022. }
  2023. function defaultDump(clone) {
  2024. return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass;
  2025. }
  2026. function defaultParse(clone) {
  2027. return clone ? typeof clone === "function" ? clone : cloneFnJSON : fnBypass;
  2028. }
  2029. function useManualRefHistory(source, options = {}) {
  2030. const {
  2031. clone = false,
  2032. dump = defaultDump(clone),
  2033. parse = defaultParse(clone),
  2034. setSource = fnSetSource
  2035. } = options;
  2036. function _createHistoryRecord() {
  2037. return vueDemi.markRaw({
  2038. snapshot: dump(source.value),
  2039. timestamp: shared.timestamp()
  2040. });
  2041. }
  2042. const last = vueDemi.ref(_createHistoryRecord());
  2043. const undoStack = vueDemi.ref([]);
  2044. const redoStack = vueDemi.ref([]);
  2045. const _setSource = (record) => {
  2046. setSource(source, parse(record.snapshot));
  2047. last.value = record;
  2048. };
  2049. const commit = () => {
  2050. undoStack.value.unshift(last.value);
  2051. last.value = _createHistoryRecord();
  2052. if (options.capacity && undoStack.value.length > options.capacity)
  2053. undoStack.value.splice(options.capacity, Infinity);
  2054. if (redoStack.value.length)
  2055. redoStack.value.splice(0, redoStack.value.length);
  2056. };
  2057. const clear = () => {
  2058. undoStack.value.splice(0, undoStack.value.length);
  2059. redoStack.value.splice(0, redoStack.value.length);
  2060. };
  2061. const undo = () => {
  2062. const state = undoStack.value.shift();
  2063. if (state) {
  2064. redoStack.value.unshift(last.value);
  2065. _setSource(state);
  2066. }
  2067. };
  2068. const redo = () => {
  2069. const state = redoStack.value.shift();
  2070. if (state) {
  2071. undoStack.value.unshift(last.value);
  2072. _setSource(state);
  2073. }
  2074. };
  2075. const reset = () => {
  2076. _setSource(last.value);
  2077. };
  2078. const history = vueDemi.computed(() => [last.value, ...undoStack.value]);
  2079. const canUndo = vueDemi.computed(() => undoStack.value.length > 0);
  2080. const canRedo = vueDemi.computed(() => redoStack.value.length > 0);
  2081. return {
  2082. source,
  2083. undoStack,
  2084. redoStack,
  2085. last,
  2086. history,
  2087. canUndo,
  2088. canRedo,
  2089. clear,
  2090. commit,
  2091. reset,
  2092. undo,
  2093. redo
  2094. };
  2095. }
  2096. var __defProp$h = Object.defineProperty;
  2097. var __defProps$7 = Object.defineProperties;
  2098. var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
  2099. var __getOwnPropSymbols$j = Object.getOwnPropertySymbols;
  2100. var __hasOwnProp$j = Object.prototype.hasOwnProperty;
  2101. var __propIsEnum$j = Object.prototype.propertyIsEnumerable;
  2102. var __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  2103. var __spreadValues$h = (a, b) => {
  2104. for (var prop in b || (b = {}))
  2105. if (__hasOwnProp$j.call(b, prop))
  2106. __defNormalProp$h(a, prop, b[prop]);
  2107. if (__getOwnPropSymbols$j)
  2108. for (var prop of __getOwnPropSymbols$j(b)) {
  2109. if (__propIsEnum$j.call(b, prop))
  2110. __defNormalProp$h(a, prop, b[prop]);
  2111. }
  2112. return a;
  2113. };
  2114. var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
  2115. function useRefHistory(source, options = {}) {
  2116. const {
  2117. deep = false,
  2118. flush = "pre",
  2119. eventFilter
  2120. } = options;
  2121. const {
  2122. eventFilter: composedFilter,
  2123. pause,
  2124. resume: resumeTracking,
  2125. isActive: isTracking
  2126. } = shared.pausableFilter(eventFilter);
  2127. const {
  2128. ignoreUpdates,
  2129. ignorePrevAsyncUpdates,
  2130. stop
  2131. } = shared.watchIgnorable(
  2132. source,
  2133. commit,
  2134. { deep, flush, eventFilter: composedFilter }
  2135. );
  2136. function setSource(source2, value) {
  2137. ignorePrevAsyncUpdates();
  2138. ignoreUpdates(() => {
  2139. source2.value = value;
  2140. });
  2141. }
  2142. const manualHistory = useManualRefHistory(source, __spreadProps$7(__spreadValues$h({}, options), { clone: options.clone || deep, setSource }));
  2143. const { clear, commit: manualCommit } = manualHistory;
  2144. function commit() {
  2145. ignorePrevAsyncUpdates();
  2146. manualCommit();
  2147. }
  2148. function resume(commitNow) {
  2149. resumeTracking();
  2150. if (commitNow)
  2151. commit();
  2152. }
  2153. function batch(fn) {
  2154. let canceled = false;
  2155. const cancel = () => canceled = true;
  2156. ignoreUpdates(() => {
  2157. fn(cancel);
  2158. });
  2159. if (!canceled)
  2160. commit();
  2161. }
  2162. function dispose() {
  2163. stop();
  2164. clear();
  2165. }
  2166. return __spreadProps$7(__spreadValues$h({}, manualHistory), {
  2167. isTracking,
  2168. pause,
  2169. resume,
  2170. commit,
  2171. batch,
  2172. dispose
  2173. });
  2174. }
  2175. var __defProp$g = Object.defineProperty;
  2176. var __defProps$6 = Object.defineProperties;
  2177. var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
  2178. var __getOwnPropSymbols$i = Object.getOwnPropertySymbols;
  2179. var __hasOwnProp$i = Object.prototype.hasOwnProperty;
  2180. var __propIsEnum$i = Object.prototype.propertyIsEnumerable;
  2181. var __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  2182. var __spreadValues$g = (a, b) => {
  2183. for (var prop in b || (b = {}))
  2184. if (__hasOwnProp$i.call(b, prop))
  2185. __defNormalProp$g(a, prop, b[prop]);
  2186. if (__getOwnPropSymbols$i)
  2187. for (var prop of __getOwnPropSymbols$i(b)) {
  2188. if (__propIsEnum$i.call(b, prop))
  2189. __defNormalProp$g(a, prop, b[prop]);
  2190. }
  2191. return a;
  2192. };
  2193. var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
  2194. function useDebouncedRefHistory(source, options = {}) {
  2195. const filter = options.debounce ? shared.debounceFilter(options.debounce) : void 0;
  2196. const history = useRefHistory(source, __spreadProps$6(__spreadValues$g({}, options), { eventFilter: filter }));
  2197. return __spreadValues$g({}, history);
  2198. }
  2199. function useDeviceMotion(options = {}) {
  2200. const {
  2201. window = defaultWindow,
  2202. eventFilter = shared.bypassFilter
  2203. } = options;
  2204. const acceleration = vueDemi.ref({ x: null, y: null, z: null });
  2205. const rotationRate = vueDemi.ref({ alpha: null, beta: null, gamma: null });
  2206. const interval = vueDemi.ref(0);
  2207. const accelerationIncludingGravity = vueDemi.ref({
  2208. x: null,
  2209. y: null,
  2210. z: null
  2211. });
  2212. if (window) {
  2213. const onDeviceMotion = shared.createFilterWrapper(
  2214. eventFilter,
  2215. (event) => {
  2216. acceleration.value = event.acceleration;
  2217. accelerationIncludingGravity.value = event.accelerationIncludingGravity;
  2218. rotationRate.value = event.rotationRate;
  2219. interval.value = event.interval;
  2220. }
  2221. );
  2222. useEventListener(window, "devicemotion", onDeviceMotion);
  2223. }
  2224. return {
  2225. acceleration,
  2226. accelerationIncludingGravity,
  2227. rotationRate,
  2228. interval
  2229. };
  2230. }
  2231. function useDeviceOrientation(options = {}) {
  2232. const { window = defaultWindow } = options;
  2233. const isSupported = useSupported(() => window && "DeviceOrientationEvent" in window);
  2234. const isAbsolute = vueDemi.ref(false);
  2235. const alpha = vueDemi.ref(null);
  2236. const beta = vueDemi.ref(null);
  2237. const gamma = vueDemi.ref(null);
  2238. if (window && isSupported.value) {
  2239. useEventListener(window, "deviceorientation", (event) => {
  2240. isAbsolute.value = event.absolute;
  2241. alpha.value = event.alpha;
  2242. beta.value = event.beta;
  2243. gamma.value = event.gamma;
  2244. });
  2245. }
  2246. return {
  2247. isSupported,
  2248. isAbsolute,
  2249. alpha,
  2250. beta,
  2251. gamma
  2252. };
  2253. }
  2254. function useDevicePixelRatio({
  2255. window = defaultWindow
  2256. } = {}) {
  2257. const pixelRatio = vueDemi.ref(1);
  2258. if (window) {
  2259. let observe = function() {
  2260. pixelRatio.value = window.devicePixelRatio;
  2261. cleanup();
  2262. media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);
  2263. media.addEventListener("change", observe, { once: true });
  2264. }, cleanup = function() {
  2265. media == null ? void 0 : media.removeEventListener("change", observe);
  2266. };
  2267. let media;
  2268. observe();
  2269. shared.tryOnScopeDispose(cleanup);
  2270. }
  2271. return { pixelRatio };
  2272. }
  2273. function usePermission(permissionDesc, options = {}) {
  2274. const {
  2275. controls = false,
  2276. navigator = defaultNavigator
  2277. } = options;
  2278. const isSupported = useSupported(() => navigator && "permissions" in navigator);
  2279. let permissionStatus;
  2280. const desc = typeof permissionDesc === "string" ? { name: permissionDesc } : permissionDesc;
  2281. const state = vueDemi.ref();
  2282. const onChange = () => {
  2283. if (permissionStatus)
  2284. state.value = permissionStatus.state;
  2285. };
  2286. const query = shared.createSingletonPromise(async () => {
  2287. if (!isSupported.value)
  2288. return;
  2289. if (!permissionStatus) {
  2290. try {
  2291. permissionStatus = await navigator.permissions.query(desc);
  2292. useEventListener(permissionStatus, "change", onChange);
  2293. onChange();
  2294. } catch (e) {
  2295. state.value = "prompt";
  2296. }
  2297. }
  2298. return permissionStatus;
  2299. });
  2300. query();
  2301. if (controls) {
  2302. return {
  2303. state,
  2304. isSupported,
  2305. query
  2306. };
  2307. } else {
  2308. return state;
  2309. }
  2310. }
  2311. function useDevicesList(options = {}) {
  2312. const {
  2313. navigator = defaultNavigator,
  2314. requestPermissions = false,
  2315. constraints = { audio: true, video: true },
  2316. onUpdated
  2317. } = options;
  2318. const devices = vueDemi.ref([]);
  2319. const videoInputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "videoinput"));
  2320. const audioInputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "audioinput"));
  2321. const audioOutputs = vueDemi.computed(() => devices.value.filter((i) => i.kind === "audiooutput"));
  2322. const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);
  2323. const permissionGranted = vueDemi.ref(false);
  2324. let stream;
  2325. async function update() {
  2326. if (!isSupported.value)
  2327. return;
  2328. devices.value = await navigator.mediaDevices.enumerateDevices();
  2329. onUpdated == null ? void 0 : onUpdated(devices.value);
  2330. if (stream) {
  2331. stream.getTracks().forEach((t) => t.stop());
  2332. stream = null;
  2333. }
  2334. }
  2335. async function ensurePermissions() {
  2336. if (!isSupported.value)
  2337. return false;
  2338. if (permissionGranted.value)
  2339. return true;
  2340. const { state, query } = usePermission("camera", { controls: true });
  2341. await query();
  2342. if (state.value !== "granted") {
  2343. stream = await navigator.mediaDevices.getUserMedia(constraints);
  2344. update();
  2345. permissionGranted.value = true;
  2346. } else {
  2347. permissionGranted.value = true;
  2348. }
  2349. return permissionGranted.value;
  2350. }
  2351. if (isSupported.value) {
  2352. if (requestPermissions)
  2353. ensurePermissions();
  2354. useEventListener(navigator.mediaDevices, "devicechange", update);
  2355. update();
  2356. }
  2357. return {
  2358. devices,
  2359. ensurePermissions,
  2360. permissionGranted,
  2361. videoInputs,
  2362. audioInputs,
  2363. audioOutputs,
  2364. isSupported
  2365. };
  2366. }
  2367. function useDisplayMedia(options = {}) {
  2368. var _a;
  2369. const enabled = vueDemi.ref((_a = options.enabled) != null ? _a : false);
  2370. const video = options.video;
  2371. const audio = options.audio;
  2372. const { navigator = defaultNavigator } = options;
  2373. const isSupported = useSupported(() => {
  2374. var _a2;
  2375. return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;
  2376. });
  2377. const constraint = { audio, video };
  2378. const stream = vueDemi.shallowRef();
  2379. async function _start() {
  2380. if (!isSupported.value || stream.value)
  2381. return;
  2382. stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);
  2383. return stream.value;
  2384. }
  2385. async function _stop() {
  2386. var _a2;
  2387. (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());
  2388. stream.value = void 0;
  2389. }
  2390. function stop() {
  2391. _stop();
  2392. enabled.value = false;
  2393. }
  2394. async function start() {
  2395. await _start();
  2396. if (stream.value)
  2397. enabled.value = true;
  2398. return stream.value;
  2399. }
  2400. vueDemi.watch(
  2401. enabled,
  2402. (v) => {
  2403. if (v)
  2404. _start();
  2405. else
  2406. _stop();
  2407. },
  2408. { immediate: true }
  2409. );
  2410. return {
  2411. isSupported,
  2412. stream,
  2413. start,
  2414. stop,
  2415. enabled
  2416. };
  2417. }
  2418. function useDocumentVisibility({ document = defaultDocument } = {}) {
  2419. if (!document)
  2420. return vueDemi.ref("visible");
  2421. const visibility = vueDemi.ref(document.visibilityState);
  2422. useEventListener(document, "visibilitychange", () => {
  2423. visibility.value = document.visibilityState;
  2424. });
  2425. return visibility;
  2426. }
  2427. var __defProp$f = Object.defineProperty;
  2428. var __defProps$5 = Object.defineProperties;
  2429. var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
  2430. var __getOwnPropSymbols$h = Object.getOwnPropertySymbols;
  2431. var __hasOwnProp$h = Object.prototype.hasOwnProperty;
  2432. var __propIsEnum$h = Object.prototype.propertyIsEnumerable;
  2433. var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  2434. var __spreadValues$f = (a, b) => {
  2435. for (var prop in b || (b = {}))
  2436. if (__hasOwnProp$h.call(b, prop))
  2437. __defNormalProp$f(a, prop, b[prop]);
  2438. if (__getOwnPropSymbols$h)
  2439. for (var prop of __getOwnPropSymbols$h(b)) {
  2440. if (__propIsEnum$h.call(b, prop))
  2441. __defNormalProp$f(a, prop, b[prop]);
  2442. }
  2443. return a;
  2444. };
  2445. var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
  2446. function useDraggable(target, options = {}) {
  2447. var _a, _b;
  2448. const {
  2449. pointerTypes,
  2450. preventDefault,
  2451. stopPropagation,
  2452. exact,
  2453. onMove,
  2454. onEnd,
  2455. onStart,
  2456. initialValue,
  2457. axis = "both",
  2458. draggingElement = defaultWindow,
  2459. handle: draggingHandle = target
  2460. } = options;
  2461. const position = vueDemi.ref(
  2462. (_a = shared.toValue(initialValue)) != null ? _a : { x: 0, y: 0 }
  2463. );
  2464. const pressedDelta = vueDemi.ref();
  2465. const filterEvent = (e) => {
  2466. if (pointerTypes)
  2467. return pointerTypes.includes(e.pointerType);
  2468. return true;
  2469. };
  2470. const handleEvent = (e) => {
  2471. if (shared.toValue(preventDefault))
  2472. e.preventDefault();
  2473. if (shared.toValue(stopPropagation))
  2474. e.stopPropagation();
  2475. };
  2476. const start = (e) => {
  2477. if (!filterEvent(e))
  2478. return;
  2479. if (shared.toValue(exact) && e.target !== shared.toValue(target))
  2480. return;
  2481. const rect = shared.toValue(target).getBoundingClientRect();
  2482. const pos = {
  2483. x: e.clientX - rect.left,
  2484. y: e.clientY - rect.top
  2485. };
  2486. if ((onStart == null ? void 0 : onStart(pos, e)) === false)
  2487. return;
  2488. pressedDelta.value = pos;
  2489. handleEvent(e);
  2490. };
  2491. const move = (e) => {
  2492. if (!filterEvent(e))
  2493. return;
  2494. if (!pressedDelta.value)
  2495. return;
  2496. let { x, y } = position.value;
  2497. if (axis === "x" || axis === "both")
  2498. x = e.clientX - pressedDelta.value.x;
  2499. if (axis === "y" || axis === "both")
  2500. y = e.clientY - pressedDelta.value.y;
  2501. position.value = {
  2502. x,
  2503. y
  2504. };
  2505. onMove == null ? void 0 : onMove(position.value, e);
  2506. handleEvent(e);
  2507. };
  2508. const end = (e) => {
  2509. if (!filterEvent(e))
  2510. return;
  2511. if (!pressedDelta.value)
  2512. return;
  2513. pressedDelta.value = void 0;
  2514. onEnd == null ? void 0 : onEnd(position.value, e);
  2515. handleEvent(e);
  2516. };
  2517. if (shared.isClient) {
  2518. const config = { capture: (_b = options.capture) != null ? _b : true };
  2519. useEventListener(draggingHandle, "pointerdown", start, config);
  2520. useEventListener(draggingElement, "pointermove", move, config);
  2521. useEventListener(draggingElement, "pointerup", end, config);
  2522. }
  2523. return __spreadProps$5(__spreadValues$f({}, shared.toRefs(position)), {
  2524. position,
  2525. isDragging: vueDemi.computed(() => !!pressedDelta.value),
  2526. style: vueDemi.computed(
  2527. () => `left:${position.value.x}px;top:${position.value.y}px;`
  2528. )
  2529. });
  2530. }
  2531. function useDropZone(target, onDrop) {
  2532. const isOverDropZone = vueDemi.ref(false);
  2533. let counter = 0;
  2534. if (shared.isClient) {
  2535. useEventListener(target, "dragenter", (event) => {
  2536. event.preventDefault();
  2537. counter += 1;
  2538. isOverDropZone.value = true;
  2539. });
  2540. useEventListener(target, "dragover", (event) => {
  2541. event.preventDefault();
  2542. });
  2543. useEventListener(target, "dragleave", (event) => {
  2544. event.preventDefault();
  2545. counter -= 1;
  2546. if (counter === 0)
  2547. isOverDropZone.value = false;
  2548. });
  2549. useEventListener(target, "drop", (event) => {
  2550. var _a, _b;
  2551. event.preventDefault();
  2552. counter = 0;
  2553. isOverDropZone.value = false;
  2554. const files = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);
  2555. onDrop == null ? void 0 : onDrop(files.length === 0 ? null : files);
  2556. });
  2557. }
  2558. return {
  2559. isOverDropZone
  2560. };
  2561. }
  2562. var __getOwnPropSymbols$g = Object.getOwnPropertySymbols;
  2563. var __hasOwnProp$g = Object.prototype.hasOwnProperty;
  2564. var __propIsEnum$g = Object.prototype.propertyIsEnumerable;
  2565. var __objRest$2 = (source, exclude) => {
  2566. var target = {};
  2567. for (var prop in source)
  2568. if (__hasOwnProp$g.call(source, prop) && exclude.indexOf(prop) < 0)
  2569. target[prop] = source[prop];
  2570. if (source != null && __getOwnPropSymbols$g)
  2571. for (var prop of __getOwnPropSymbols$g(source)) {
  2572. if (exclude.indexOf(prop) < 0 && __propIsEnum$g.call(source, prop))
  2573. target[prop] = source[prop];
  2574. }
  2575. return target;
  2576. };
  2577. function useResizeObserver(target, callback, options = {}) {
  2578. const _a = options, { window = defaultWindow } = _a, observerOptions = __objRest$2(_a, ["window"]);
  2579. let observer;
  2580. const isSupported = useSupported(() => window && "ResizeObserver" in window);
  2581. const cleanup = () => {
  2582. if (observer) {
  2583. observer.disconnect();
  2584. observer = void 0;
  2585. }
  2586. };
  2587. const targets = vueDemi.computed(
  2588. () => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]
  2589. );
  2590. const stopWatch = vueDemi.watch(
  2591. targets,
  2592. (els) => {
  2593. cleanup();
  2594. if (isSupported.value && window) {
  2595. observer = new ResizeObserver(callback);
  2596. for (const _el of els)
  2597. _el && observer.observe(_el, observerOptions);
  2598. }
  2599. },
  2600. { immediate: true, flush: "post", deep: true }
  2601. );
  2602. const stop = () => {
  2603. cleanup();
  2604. stopWatch();
  2605. };
  2606. shared.tryOnScopeDispose(stop);
  2607. return {
  2608. isSupported,
  2609. stop
  2610. };
  2611. }
  2612. function useElementBounding(target, options = {}) {
  2613. const {
  2614. reset = true,
  2615. windowResize = true,
  2616. windowScroll = true,
  2617. immediate = true
  2618. } = options;
  2619. const height = vueDemi.ref(0);
  2620. const bottom = vueDemi.ref(0);
  2621. const left = vueDemi.ref(0);
  2622. const right = vueDemi.ref(0);
  2623. const top = vueDemi.ref(0);
  2624. const width = vueDemi.ref(0);
  2625. const x = vueDemi.ref(0);
  2626. const y = vueDemi.ref(0);
  2627. function update() {
  2628. const el = unrefElement(target);
  2629. if (!el) {
  2630. if (reset) {
  2631. height.value = 0;
  2632. bottom.value = 0;
  2633. left.value = 0;
  2634. right.value = 0;
  2635. top.value = 0;
  2636. width.value = 0;
  2637. x.value = 0;
  2638. y.value = 0;
  2639. }
  2640. return;
  2641. }
  2642. const rect = el.getBoundingClientRect();
  2643. height.value = rect.height;
  2644. bottom.value = rect.bottom;
  2645. left.value = rect.left;
  2646. right.value = rect.right;
  2647. top.value = rect.top;
  2648. width.value = rect.width;
  2649. x.value = rect.x;
  2650. y.value = rect.y;
  2651. }
  2652. useResizeObserver(target, update);
  2653. vueDemi.watch(() => unrefElement(target), (ele) => !ele && update());
  2654. if (windowScroll)
  2655. useEventListener("scroll", update, { capture: true, passive: true });
  2656. if (windowResize)
  2657. useEventListener("resize", update, { passive: true });
  2658. shared.tryOnMounted(() => {
  2659. if (immediate)
  2660. update();
  2661. });
  2662. return {
  2663. height,
  2664. bottom,
  2665. left,
  2666. right,
  2667. top,
  2668. width,
  2669. x,
  2670. y,
  2671. update
  2672. };
  2673. }
  2674. var __defProp$e = Object.defineProperty;
  2675. var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
  2676. var __hasOwnProp$f = Object.prototype.hasOwnProperty;
  2677. var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
  2678. var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  2679. var __spreadValues$e = (a, b) => {
  2680. for (var prop in b || (b = {}))
  2681. if (__hasOwnProp$f.call(b, prop))
  2682. __defNormalProp$e(a, prop, b[prop]);
  2683. if (__getOwnPropSymbols$f)
  2684. for (var prop of __getOwnPropSymbols$f(b)) {
  2685. if (__propIsEnum$f.call(b, prop))
  2686. __defNormalProp$e(a, prop, b[prop]);
  2687. }
  2688. return a;
  2689. };
  2690. function useElementByPoint(options) {
  2691. const element = vueDemi.ref(null);
  2692. const { x, y, document = defaultDocument } = options;
  2693. const controls = useRafFn(() => {
  2694. element.value = (document == null ? void 0 : document.elementFromPoint(shared.toValue(x), shared.toValue(y))) || null;
  2695. });
  2696. return __spreadValues$e({
  2697. element
  2698. }, controls);
  2699. }
  2700. function useElementHover(el, options = {}) {
  2701. const {
  2702. delayEnter = 0,
  2703. delayLeave = 0,
  2704. window = defaultWindow
  2705. } = options;
  2706. const isHovered = vueDemi.ref(false);
  2707. let timer;
  2708. const toggle = (entering) => {
  2709. const delay = entering ? delayEnter : delayLeave;
  2710. if (timer) {
  2711. clearTimeout(timer);
  2712. timer = void 0;
  2713. }
  2714. if (delay)
  2715. timer = setTimeout(() => isHovered.value = entering, delay);
  2716. else
  2717. isHovered.value = entering;
  2718. };
  2719. if (!window)
  2720. return isHovered;
  2721. useEventListener(el, "mouseenter", () => toggle(true), { passive: true });
  2722. useEventListener(el, "mouseleave", () => toggle(false), { passive: true });
  2723. return isHovered;
  2724. }
  2725. function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {
  2726. const { window = defaultWindow, box = "content-box" } = options;
  2727. const isSVG = vueDemi.computed(() => {
  2728. var _a, _b;
  2729. return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg");
  2730. });
  2731. const width = vueDemi.ref(initialSize.width);
  2732. const height = vueDemi.ref(initialSize.height);
  2733. useResizeObserver(
  2734. target,
  2735. ([entry]) => {
  2736. const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;
  2737. if (window && isSVG.value) {
  2738. const $elem = unrefElement(target);
  2739. if ($elem) {
  2740. const styles = window.getComputedStyle($elem);
  2741. width.value = parseFloat(styles.width);
  2742. height.value = parseFloat(styles.height);
  2743. }
  2744. } else {
  2745. if (boxSize) {
  2746. const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];
  2747. width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);
  2748. height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);
  2749. } else {
  2750. width.value = entry.contentRect.width;
  2751. height.value = entry.contentRect.height;
  2752. }
  2753. }
  2754. },
  2755. options
  2756. );
  2757. vueDemi.watch(
  2758. () => unrefElement(target),
  2759. (ele) => {
  2760. width.value = ele ? initialSize.width : 0;
  2761. height.value = ele ? initialSize.height : 0;
  2762. }
  2763. );
  2764. return {
  2765. width,
  2766. height
  2767. };
  2768. }
  2769. function useIntersectionObserver(target, callback, options = {}) {
  2770. const {
  2771. root,
  2772. rootMargin = "0px",
  2773. threshold = 0.1,
  2774. window = defaultWindow,
  2775. immediate = true
  2776. } = options;
  2777. const isSupported = useSupported(() => window && "IntersectionObserver" in window);
  2778. const targets = vueDemi.computed(() => {
  2779. const _target = shared.toValue(target);
  2780. return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(shared.notNullish);
  2781. });
  2782. let cleanup = shared.noop;
  2783. const isActive = vueDemi.ref(immediate);
  2784. const stopWatch = isSupported.value ? vueDemi.watch(
  2785. () => [targets.value, unrefElement(root), isActive.value],
  2786. ([targets2, root2]) => {
  2787. cleanup();
  2788. if (!isActive.value)
  2789. return;
  2790. if (!targets2.length)
  2791. return;
  2792. const observer = new IntersectionObserver(
  2793. callback,
  2794. {
  2795. root: unrefElement(root2),
  2796. rootMargin,
  2797. threshold
  2798. }
  2799. );
  2800. targets2.forEach((el) => el && observer.observe(el));
  2801. cleanup = () => {
  2802. observer.disconnect();
  2803. cleanup = shared.noop;
  2804. };
  2805. },
  2806. { immediate, flush: "post" }
  2807. ) : shared.noop;
  2808. const stop = () => {
  2809. cleanup();
  2810. stopWatch();
  2811. isActive.value = false;
  2812. };
  2813. shared.tryOnScopeDispose(stop);
  2814. return {
  2815. isSupported,
  2816. isActive,
  2817. pause() {
  2818. cleanup();
  2819. isActive.value = false;
  2820. },
  2821. resume() {
  2822. isActive.value = true;
  2823. },
  2824. stop
  2825. };
  2826. }
  2827. function useElementVisibility(element, { window = defaultWindow, scrollTarget } = {}) {
  2828. const elementIsVisible = vueDemi.ref(false);
  2829. useIntersectionObserver(
  2830. element,
  2831. ([{ isIntersecting }]) => {
  2832. elementIsVisible.value = isIntersecting;
  2833. },
  2834. {
  2835. root: scrollTarget,
  2836. window
  2837. }
  2838. );
  2839. return elementIsVisible;
  2840. }
  2841. const events = /* @__PURE__ */ new Map();
  2842. function useEventBus(key) {
  2843. const scope = vueDemi.getCurrentScope();
  2844. function on(listener) {
  2845. var _a;
  2846. const listeners = events.get(key) || /* @__PURE__ */ new Set();
  2847. listeners.add(listener);
  2848. events.set(key, listeners);
  2849. const _off = () => off(listener);
  2850. (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);
  2851. return _off;
  2852. }
  2853. function once(listener) {
  2854. function _listener(...args) {
  2855. off(_listener);
  2856. listener(...args);
  2857. }
  2858. return on(_listener);
  2859. }
  2860. function off(listener) {
  2861. const listeners = events.get(key);
  2862. if (!listeners)
  2863. return;
  2864. listeners.delete(listener);
  2865. if (!listeners.size)
  2866. reset();
  2867. }
  2868. function reset() {
  2869. events.delete(key);
  2870. }
  2871. function emit(event, payload) {
  2872. var _a;
  2873. (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));
  2874. }
  2875. return { on, once, off, emit, reset };
  2876. }
  2877. function useEventSource(url, events = [], options = {}) {
  2878. const event = vueDemi.ref(null);
  2879. const data = vueDemi.ref(null);
  2880. const status = vueDemi.ref("CONNECTING");
  2881. const eventSource = vueDemi.ref(null);
  2882. const error = vueDemi.shallowRef(null);
  2883. const {
  2884. withCredentials = false
  2885. } = options;
  2886. const close = () => {
  2887. if (eventSource.value) {
  2888. eventSource.value.close();
  2889. eventSource.value = null;
  2890. status.value = "CLOSED";
  2891. }
  2892. };
  2893. const es = new EventSource(url, { withCredentials });
  2894. eventSource.value = es;
  2895. es.onopen = () => {
  2896. status.value = "OPEN";
  2897. error.value = null;
  2898. };
  2899. es.onerror = (e) => {
  2900. status.value = "CLOSED";
  2901. error.value = e;
  2902. };
  2903. es.onmessage = (e) => {
  2904. event.value = null;
  2905. data.value = e.data;
  2906. };
  2907. for (const event_name of events) {
  2908. useEventListener(es, event_name, (e) => {
  2909. event.value = event_name;
  2910. data.value = e.data || null;
  2911. });
  2912. }
  2913. shared.tryOnScopeDispose(() => {
  2914. close();
  2915. });
  2916. return {
  2917. eventSource,
  2918. event,
  2919. data,
  2920. status,
  2921. error,
  2922. close
  2923. };
  2924. }
  2925. function useEyeDropper(options = {}) {
  2926. const { initialValue = "" } = options;
  2927. const isSupported = useSupported(() => typeof window !== "undefined" && "EyeDropper" in window);
  2928. const sRGBHex = vueDemi.ref(initialValue);
  2929. async function open(openOptions) {
  2930. if (!isSupported.value)
  2931. return;
  2932. const eyeDropper = new window.EyeDropper();
  2933. const result = await eyeDropper.open(openOptions);
  2934. sRGBHex.value = result.sRGBHex;
  2935. return result;
  2936. }
  2937. return { isSupported, sRGBHex, open };
  2938. }
  2939. function useFavicon(newIcon = null, options = {}) {
  2940. const {
  2941. baseUrl = "",
  2942. rel = "icon",
  2943. document = defaultDocument
  2944. } = options;
  2945. const favicon = shared.toRef(newIcon);
  2946. const applyIcon = (icon) => {
  2947. document == null ? void 0 : document.head.querySelectorAll(`link[rel*="${rel}"]`).forEach((el) => el.href = `${baseUrl}${icon}`);
  2948. };
  2949. vueDemi.watch(
  2950. favicon,
  2951. (i, o) => {
  2952. if (typeof i === "string" && i !== o)
  2953. applyIcon(i);
  2954. },
  2955. { immediate: true }
  2956. );
  2957. return favicon;
  2958. }
  2959. var __defProp$d = Object.defineProperty;
  2960. var __defProps$4 = Object.defineProperties;
  2961. var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
  2962. var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
  2963. var __hasOwnProp$e = Object.prototype.hasOwnProperty;
  2964. var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
  2965. var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  2966. var __spreadValues$d = (a, b) => {
  2967. for (var prop in b || (b = {}))
  2968. if (__hasOwnProp$e.call(b, prop))
  2969. __defNormalProp$d(a, prop, b[prop]);
  2970. if (__getOwnPropSymbols$e)
  2971. for (var prop of __getOwnPropSymbols$e(b)) {
  2972. if (__propIsEnum$e.call(b, prop))
  2973. __defNormalProp$d(a, prop, b[prop]);
  2974. }
  2975. return a;
  2976. };
  2977. var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
  2978. const payloadMapping = {
  2979. json: "application/json",
  2980. text: "text/plain"
  2981. };
  2982. function isFetchOptions(obj) {
  2983. return obj && shared.containsProp(obj, "immediate", "refetch", "initialData", "timeout", "beforeFetch", "afterFetch", "onFetchError", "fetch");
  2984. }
  2985. function isAbsoluteURL(url) {
  2986. return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
  2987. }
  2988. function headersToObject(headers) {
  2989. if (typeof Headers !== "undefined" && headers instanceof Headers)
  2990. return Object.fromEntries([...headers.entries()]);
  2991. return headers;
  2992. }
  2993. function combineCallbacks(combination, ...callbacks) {
  2994. if (combination === "overwrite") {
  2995. return async (ctx) => {
  2996. const callback = callbacks[callbacks.length - 1];
  2997. if (callback)
  2998. return __spreadValues$d(__spreadValues$d({}, ctx), await callback(ctx));
  2999. return ctx;
  3000. };
  3001. } else {
  3002. return async (ctx) => {
  3003. for (const callback of callbacks) {
  3004. if (callback)
  3005. ctx = __spreadValues$d(__spreadValues$d({}, ctx), await callback(ctx));
  3006. }
  3007. return ctx;
  3008. };
  3009. }
  3010. }
  3011. function createFetch(config = {}) {
  3012. const _combination = config.combination || "chain";
  3013. const _options = config.options || {};
  3014. const _fetchOptions = config.fetchOptions || {};
  3015. function useFactoryFetch(url, ...args) {
  3016. const computedUrl = vueDemi.computed(() => {
  3017. const baseUrl = shared.toValue(config.baseUrl);
  3018. const targetUrl = shared.toValue(url);
  3019. return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;
  3020. });
  3021. let options = _options;
  3022. let fetchOptions = _fetchOptions;
  3023. if (args.length > 0) {
  3024. if (isFetchOptions(args[0])) {
  3025. options = __spreadProps$4(__spreadValues$d(__spreadValues$d({}, options), args[0]), {
  3026. beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),
  3027. afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),
  3028. onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)
  3029. });
  3030. } else {
  3031. fetchOptions = __spreadProps$4(__spreadValues$d(__spreadValues$d({}, fetchOptions), args[0]), {
  3032. headers: __spreadValues$d(__spreadValues$d({}, headersToObject(fetchOptions.headers) || {}), headersToObject(args[0].headers) || {})
  3033. });
  3034. }
  3035. }
  3036. if (args.length > 1 && isFetchOptions(args[1])) {
  3037. options = __spreadProps$4(__spreadValues$d(__spreadValues$d({}, options), args[1]), {
  3038. beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),
  3039. afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),
  3040. onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)
  3041. });
  3042. }
  3043. return useFetch(computedUrl, fetchOptions, options);
  3044. }
  3045. return useFactoryFetch;
  3046. }
  3047. function useFetch(url, ...args) {
  3048. var _a;
  3049. const supportsAbort = typeof AbortController === "function";
  3050. let fetchOptions = {};
  3051. let options = { immediate: true, refetch: false, timeout: 0 };
  3052. const config = {
  3053. method: "GET",
  3054. type: "text",
  3055. payload: void 0
  3056. };
  3057. if (args.length > 0) {
  3058. if (isFetchOptions(args[0]))
  3059. options = __spreadValues$d(__spreadValues$d({}, options), args[0]);
  3060. else
  3061. fetchOptions = args[0];
  3062. }
  3063. if (args.length > 1) {
  3064. if (isFetchOptions(args[1]))
  3065. options = __spreadValues$d(__spreadValues$d({}, options), args[1]);
  3066. }
  3067. const {
  3068. fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,
  3069. initialData,
  3070. timeout
  3071. } = options;
  3072. const responseEvent = shared.createEventHook();
  3073. const errorEvent = shared.createEventHook();
  3074. const finallyEvent = shared.createEventHook();
  3075. const isFinished = vueDemi.ref(false);
  3076. const isFetching = vueDemi.ref(false);
  3077. const aborted = vueDemi.ref(false);
  3078. const statusCode = vueDemi.ref(null);
  3079. const response = vueDemi.shallowRef(null);
  3080. const error = vueDemi.shallowRef(null);
  3081. const data = vueDemi.shallowRef(initialData || null);
  3082. const canAbort = vueDemi.computed(() => supportsAbort && isFetching.value);
  3083. let controller;
  3084. let timer;
  3085. const abort = () => {
  3086. if (supportsAbort) {
  3087. controller == null ? void 0 : controller.abort();
  3088. controller = new AbortController();
  3089. controller.signal.onabort = () => aborted.value = true;
  3090. fetchOptions = __spreadProps$4(__spreadValues$d({}, fetchOptions), {
  3091. signal: controller.signal
  3092. });
  3093. }
  3094. };
  3095. const loading = (isLoading) => {
  3096. isFetching.value = isLoading;
  3097. isFinished.value = !isLoading;
  3098. };
  3099. if (timeout)
  3100. timer = shared.useTimeoutFn(abort, timeout, { immediate: false });
  3101. const execute = async (throwOnFailed = false) => {
  3102. var _a2;
  3103. abort();
  3104. loading(true);
  3105. error.value = null;
  3106. statusCode.value = null;
  3107. aborted.value = false;
  3108. const defaultFetchOptions = {
  3109. method: config.method,
  3110. headers: {}
  3111. };
  3112. if (config.payload) {
  3113. const headers = headersToObject(defaultFetchOptions.headers);
  3114. if (config.payloadType)
  3115. headers["Content-Type"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;
  3116. const payload = shared.toValue(config.payload);
  3117. defaultFetchOptions.body = config.payloadType === "json" ? JSON.stringify(payload) : payload;
  3118. }
  3119. let isCanceled = false;
  3120. const context = {
  3121. url: shared.toValue(url),
  3122. options: __spreadValues$d(__spreadValues$d({}, defaultFetchOptions), fetchOptions),
  3123. cancel: () => {
  3124. isCanceled = true;
  3125. }
  3126. };
  3127. if (options.beforeFetch)
  3128. Object.assign(context, await options.beforeFetch(context));
  3129. if (isCanceled || !fetch) {
  3130. loading(false);
  3131. return Promise.resolve(null);
  3132. }
  3133. let responseData = null;
  3134. if (timer)
  3135. timer.start();
  3136. return new Promise((resolve, reject) => {
  3137. var _a3;
  3138. fetch(
  3139. context.url,
  3140. __spreadProps$4(__spreadValues$d(__spreadValues$d({}, defaultFetchOptions), context.options), {
  3141. headers: __spreadValues$d(__spreadValues$d({}, headersToObject(defaultFetchOptions.headers)), headersToObject((_a3 = context.options) == null ? void 0 : _a3.headers))
  3142. })
  3143. ).then(async (fetchResponse) => {
  3144. response.value = fetchResponse;
  3145. statusCode.value = fetchResponse.status;
  3146. responseData = await fetchResponse[config.type]();
  3147. if (!fetchResponse.ok) {
  3148. data.value = initialData || null;
  3149. throw new Error(fetchResponse.statusText);
  3150. }
  3151. if (options.afterFetch)
  3152. ({ data: responseData } = await options.afterFetch({ data: responseData, response: fetchResponse }));
  3153. data.value = responseData;
  3154. responseEvent.trigger(fetchResponse);
  3155. return resolve(fetchResponse);
  3156. }).catch(async (fetchError) => {
  3157. let errorData = fetchError.message || fetchError.name;
  3158. if (options.onFetchError)
  3159. ({ error: errorData } = await options.onFetchError({ data: responseData, error: fetchError, response: response.value }));
  3160. error.value = errorData;
  3161. errorEvent.trigger(fetchError);
  3162. if (throwOnFailed)
  3163. return reject(fetchError);
  3164. return resolve(null);
  3165. }).finally(() => {
  3166. loading(false);
  3167. if (timer)
  3168. timer.stop();
  3169. finallyEvent.trigger(null);
  3170. });
  3171. });
  3172. };
  3173. const refetch = shared.toRef(options.refetch);
  3174. vueDemi.watch(
  3175. [
  3176. refetch,
  3177. shared.toRef(url)
  3178. ],
  3179. ([refetch2]) => refetch2 && execute(),
  3180. { deep: true }
  3181. );
  3182. const shell = {
  3183. isFinished,
  3184. statusCode,
  3185. response,
  3186. error,
  3187. data,
  3188. isFetching,
  3189. canAbort,
  3190. aborted,
  3191. abort,
  3192. execute,
  3193. onFetchResponse: responseEvent.on,
  3194. onFetchError: errorEvent.on,
  3195. onFetchFinally: finallyEvent.on,
  3196. // method
  3197. get: setMethod("GET"),
  3198. put: setMethod("PUT"),
  3199. post: setMethod("POST"),
  3200. delete: setMethod("DELETE"),
  3201. patch: setMethod("PATCH"),
  3202. head: setMethod("HEAD"),
  3203. options: setMethod("OPTIONS"),
  3204. // type
  3205. json: setType("json"),
  3206. text: setType("text"),
  3207. blob: setType("blob"),
  3208. arrayBuffer: setType("arrayBuffer"),
  3209. formData: setType("formData")
  3210. };
  3211. function setMethod(method) {
  3212. return (payload, payloadType) => {
  3213. if (!isFetching.value) {
  3214. config.method = method;
  3215. config.payload = payload;
  3216. config.payloadType = payloadType;
  3217. if (vueDemi.isRef(config.payload)) {
  3218. vueDemi.watch(
  3219. [
  3220. refetch,
  3221. shared.toRef(config.payload)
  3222. ],
  3223. ([refetch2]) => refetch2 && execute(),
  3224. { deep: true }
  3225. );
  3226. }
  3227. const rawPayload = shared.toValue(config.payload);
  3228. if (!payloadType && rawPayload && Object.getPrototypeOf(rawPayload) === Object.prototype && !(rawPayload instanceof FormData))
  3229. config.payloadType = "json";
  3230. return __spreadProps$4(__spreadValues$d({}, shell), {
  3231. then(onFulfilled, onRejected) {
  3232. return waitUntilFinished().then(onFulfilled, onRejected);
  3233. }
  3234. });
  3235. }
  3236. return void 0;
  3237. };
  3238. }
  3239. function waitUntilFinished() {
  3240. return new Promise((resolve, reject) => {
  3241. shared.until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));
  3242. });
  3243. }
  3244. function setType(type) {
  3245. return () => {
  3246. if (!isFetching.value) {
  3247. config.type = type;
  3248. return __spreadProps$4(__spreadValues$d({}, shell), {
  3249. then(onFulfilled, onRejected) {
  3250. return waitUntilFinished().then(onFulfilled, onRejected);
  3251. }
  3252. });
  3253. }
  3254. return void 0;
  3255. };
  3256. }
  3257. if (options.immediate)
  3258. Promise.resolve().then(() => execute());
  3259. return __spreadProps$4(__spreadValues$d({}, shell), {
  3260. then(onFulfilled, onRejected) {
  3261. return waitUntilFinished().then(onFulfilled, onRejected);
  3262. }
  3263. });
  3264. }
  3265. function joinPaths(start, end) {
  3266. if (!start.endsWith("/") && !end.startsWith("/"))
  3267. return `${start}/${end}`;
  3268. return `${start}${end}`;
  3269. }
  3270. var __defProp$c = Object.defineProperty;
  3271. var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
  3272. var __hasOwnProp$d = Object.prototype.hasOwnProperty;
  3273. var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
  3274. var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  3275. var __spreadValues$c = (a, b) => {
  3276. for (var prop in b || (b = {}))
  3277. if (__hasOwnProp$d.call(b, prop))
  3278. __defNormalProp$c(a, prop, b[prop]);
  3279. if (__getOwnPropSymbols$d)
  3280. for (var prop of __getOwnPropSymbols$d(b)) {
  3281. if (__propIsEnum$d.call(b, prop))
  3282. __defNormalProp$c(a, prop, b[prop]);
  3283. }
  3284. return a;
  3285. };
  3286. const DEFAULT_OPTIONS = {
  3287. multiple: true,
  3288. accept: "*"
  3289. };
  3290. function useFileDialog(options = {}) {
  3291. const {
  3292. document = defaultDocument
  3293. } = options;
  3294. const files = vueDemi.ref(null);
  3295. const { on: onChange, trigger } = shared.createEventHook();
  3296. let input;
  3297. if (document) {
  3298. input = document.createElement("input");
  3299. input.type = "file";
  3300. input.onchange = (event) => {
  3301. const result = event.target;
  3302. files.value = result.files;
  3303. trigger(files.value);
  3304. };
  3305. }
  3306. const open = (localOptions) => {
  3307. if (!input)
  3308. return;
  3309. const _options = __spreadValues$c(__spreadValues$c(__spreadValues$c({}, DEFAULT_OPTIONS), options), localOptions);
  3310. input.multiple = _options.multiple;
  3311. input.accept = _options.accept;
  3312. if (shared.hasOwn(_options, "capture"))
  3313. input.capture = _options.capture;
  3314. input.click();
  3315. };
  3316. const reset = () => {
  3317. files.value = null;
  3318. if (input)
  3319. input.value = "";
  3320. };
  3321. return {
  3322. files: vueDemi.readonly(files),
  3323. open,
  3324. reset,
  3325. onChange
  3326. };
  3327. }
  3328. var __defProp$b = Object.defineProperty;
  3329. var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
  3330. var __hasOwnProp$c = Object.prototype.hasOwnProperty;
  3331. var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
  3332. var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  3333. var __spreadValues$b = (a, b) => {
  3334. for (var prop in b || (b = {}))
  3335. if (__hasOwnProp$c.call(b, prop))
  3336. __defNormalProp$b(a, prop, b[prop]);
  3337. if (__getOwnPropSymbols$c)
  3338. for (var prop of __getOwnPropSymbols$c(b)) {
  3339. if (__propIsEnum$c.call(b, prop))
  3340. __defNormalProp$b(a, prop, b[prop]);
  3341. }
  3342. return a;
  3343. };
  3344. function useFileSystemAccess(options = {}) {
  3345. const {
  3346. window: _window = defaultWindow,
  3347. dataType = "Text"
  3348. } = options;
  3349. const window = _window;
  3350. const isSupported = useSupported(() => window && "showSaveFilePicker" in window && "showOpenFilePicker" in window);
  3351. const fileHandle = vueDemi.ref();
  3352. const data = vueDemi.ref();
  3353. const file = vueDemi.ref();
  3354. const fileName = vueDemi.computed(() => {
  3355. var _a, _b;
  3356. return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : "";
  3357. });
  3358. const fileMIME = vueDemi.computed(() => {
  3359. var _a, _b;
  3360. return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : "";
  3361. });
  3362. const fileSize = vueDemi.computed(() => {
  3363. var _a, _b;
  3364. return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;
  3365. });
  3366. const fileLastModified = vueDemi.computed(() => {
  3367. var _a, _b;
  3368. return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;
  3369. });
  3370. async function open(_options = {}) {
  3371. if (!isSupported.value)
  3372. return;
  3373. const [handle] = await window.showOpenFilePicker(__spreadValues$b(__spreadValues$b({}, shared.toValue(options)), _options));
  3374. fileHandle.value = handle;
  3375. await updateFile();
  3376. await updateData();
  3377. }
  3378. async function create(_options = {}) {
  3379. if (!isSupported.value)
  3380. return;
  3381. fileHandle.value = await window.showSaveFilePicker(__spreadValues$b(__spreadValues$b({}, options), _options));
  3382. data.value = void 0;
  3383. await updateFile();
  3384. await updateData();
  3385. }
  3386. async function save(_options = {}) {
  3387. if (!isSupported.value)
  3388. return;
  3389. if (!fileHandle.value)
  3390. return saveAs(_options);
  3391. if (data.value) {
  3392. const writableStream = await fileHandle.value.createWritable();
  3393. await writableStream.write(data.value);
  3394. await writableStream.close();
  3395. }
  3396. await updateFile();
  3397. }
  3398. async function saveAs(_options = {}) {
  3399. if (!isSupported.value)
  3400. return;
  3401. fileHandle.value = await window.showSaveFilePicker(__spreadValues$b(__spreadValues$b({}, options), _options));
  3402. if (data.value) {
  3403. const writableStream = await fileHandle.value.createWritable();
  3404. await writableStream.write(data.value);
  3405. await writableStream.close();
  3406. }
  3407. await updateFile();
  3408. }
  3409. async function updateFile() {
  3410. var _a;
  3411. file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());
  3412. }
  3413. async function updateData() {
  3414. var _a, _b;
  3415. const type = shared.toValue(dataType);
  3416. if (type === "Text")
  3417. data.value = await ((_a = file.value) == null ? void 0 : _a.text());
  3418. else if (type === "ArrayBuffer")
  3419. data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());
  3420. else if (type === "Blob")
  3421. data.value = file.value;
  3422. }
  3423. vueDemi.watch(() => shared.toValue(dataType), updateData);
  3424. return {
  3425. isSupported,
  3426. data,
  3427. file,
  3428. fileName,
  3429. fileMIME,
  3430. fileSize,
  3431. fileLastModified,
  3432. open,
  3433. create,
  3434. save,
  3435. saveAs,
  3436. updateData
  3437. };
  3438. }
  3439. function useFocus(target, options = {}) {
  3440. const { initialValue = false } = options;
  3441. const innerFocused = vueDemi.ref(false);
  3442. const targetElement = vueDemi.computed(() => unrefElement(target));
  3443. useEventListener(targetElement, "focus", () => innerFocused.value = true);
  3444. useEventListener(targetElement, "blur", () => innerFocused.value = false);
  3445. const focused = vueDemi.computed({
  3446. get: () => innerFocused.value,
  3447. set(value) {
  3448. var _a, _b;
  3449. if (!value && innerFocused.value)
  3450. (_a = targetElement.value) == null ? void 0 : _a.blur();
  3451. else if (value && !innerFocused.value)
  3452. (_b = targetElement.value) == null ? void 0 : _b.focus();
  3453. }
  3454. });
  3455. vueDemi.watch(
  3456. targetElement,
  3457. () => {
  3458. focused.value = initialValue;
  3459. },
  3460. { immediate: true, flush: "post" }
  3461. );
  3462. return { focused };
  3463. }
  3464. function useFocusWithin(target, options = {}) {
  3465. const activeElement = useActiveElement(options);
  3466. const targetElement = vueDemi.computed(() => unrefElement(target));
  3467. const focused = vueDemi.computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);
  3468. return { focused };
  3469. }
  3470. function useFps(options) {
  3471. var _a;
  3472. const fps = vueDemi.ref(0);
  3473. if (typeof performance === "undefined")
  3474. return fps;
  3475. const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;
  3476. let last = performance.now();
  3477. let ticks = 0;
  3478. useRafFn(() => {
  3479. ticks += 1;
  3480. if (ticks >= every) {
  3481. const now = performance.now();
  3482. const diff = now - last;
  3483. fps.value = Math.round(1e3 / (diff / ticks));
  3484. last = now;
  3485. ticks = 0;
  3486. }
  3487. });
  3488. return fps;
  3489. }
  3490. const eventHandlers = [
  3491. "fullscreenchange",
  3492. "webkitfullscreenchange",
  3493. "webkitendfullscreen",
  3494. "mozfullscreenchange",
  3495. "MSFullscreenChange"
  3496. ];
  3497. function useFullscreen(target, options = {}) {
  3498. const {
  3499. document = defaultDocument,
  3500. autoExit = false
  3501. } = options;
  3502. const targetRef = vueDemi.computed(() => {
  3503. var _a;
  3504. return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.querySelector("html");
  3505. });
  3506. const isFullscreen = vueDemi.ref(false);
  3507. const requestMethod = vueDemi.computed(() => {
  3508. return [
  3509. "requestFullscreen",
  3510. "webkitRequestFullscreen",
  3511. "webkitEnterFullscreen",
  3512. "webkitEnterFullScreen",
  3513. "webkitRequestFullScreen",
  3514. "mozRequestFullScreen",
  3515. "msRequestFullscreen"
  3516. ].find((m) => document && m in document || targetRef.value && m in targetRef.value);
  3517. });
  3518. const exitMethod = vueDemi.computed(() => {
  3519. return [
  3520. "exitFullscreen",
  3521. "webkitExitFullscreen",
  3522. "webkitExitFullScreen",
  3523. "webkitCancelFullScreen",
  3524. "mozCancelFullScreen",
  3525. "msExitFullscreen"
  3526. ].find((m) => document && m in document || targetRef.value && m in targetRef.value);
  3527. });
  3528. const fullscreenEnabled = vueDemi.computed(() => {
  3529. return [
  3530. "fullScreen",
  3531. "webkitIsFullScreen",
  3532. "webkitDisplayingFullscreen",
  3533. "mozFullScreen",
  3534. "msFullscreenElement"
  3535. ].find((m) => document && m in document || targetRef.value && m in targetRef.value);
  3536. });
  3537. const fullscreenElementMethod = [
  3538. "fullscreenElement",
  3539. "webkitFullscreenElement",
  3540. "mozFullScreenElement",
  3541. "msFullscreenElement"
  3542. ].find((m) => document && m in document);
  3543. const isSupported = useSupported(
  3544. () => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0
  3545. );
  3546. const isCurrentElementFullScreen = () => {
  3547. if (fullscreenElementMethod)
  3548. return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;
  3549. return false;
  3550. };
  3551. const isElementFullScreen = () => {
  3552. if (fullscreenEnabled.value) {
  3553. if (document && document[fullscreenEnabled.value] != null) {
  3554. return document[fullscreenEnabled.value];
  3555. } else {
  3556. const target2 = targetRef.value;
  3557. if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {
  3558. return Boolean(target2[fullscreenEnabled.value]);
  3559. }
  3560. }
  3561. }
  3562. return false;
  3563. };
  3564. async function exit() {
  3565. if (!isSupported.value)
  3566. return;
  3567. if (exitMethod.value) {
  3568. if ((document == null ? void 0 : document[exitMethod.value]) != null) {
  3569. await document[exitMethod.value]();
  3570. } else {
  3571. const target2 = targetRef.value;
  3572. if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)
  3573. await target2[exitMethod.value]();
  3574. }
  3575. }
  3576. isFullscreen.value = false;
  3577. }
  3578. async function enter() {
  3579. if (!isSupported.value)
  3580. return;
  3581. if (isElementFullScreen())
  3582. await exit();
  3583. const target2 = targetRef.value;
  3584. if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {
  3585. await target2[requestMethod.value]();
  3586. isFullscreen.value = true;
  3587. }
  3588. }
  3589. async function toggle() {
  3590. await (isFullscreen.value ? exit() : enter());
  3591. }
  3592. const handlerCallback = () => {
  3593. const isElementFullScreenValue = isElementFullScreen();
  3594. if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())
  3595. isFullscreen.value = isElementFullScreenValue;
  3596. };
  3597. useEventListener(document, eventHandlers, handlerCallback, false);
  3598. useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false);
  3599. if (autoExit)
  3600. shared.tryOnScopeDispose(exit);
  3601. return {
  3602. isSupported,
  3603. isFullscreen,
  3604. enter,
  3605. exit,
  3606. toggle
  3607. };
  3608. }
  3609. function mapGamepadToXbox360Controller(gamepad) {
  3610. return vueDemi.computed(() => {
  3611. if (gamepad.value) {
  3612. return {
  3613. buttons: {
  3614. a: gamepad.value.buttons[0],
  3615. b: gamepad.value.buttons[1],
  3616. x: gamepad.value.buttons[2],
  3617. y: gamepad.value.buttons[3]
  3618. },
  3619. bumper: {
  3620. left: gamepad.value.buttons[4],
  3621. right: gamepad.value.buttons[5]
  3622. },
  3623. triggers: {
  3624. left: gamepad.value.buttons[6],
  3625. right: gamepad.value.buttons[7]
  3626. },
  3627. stick: {
  3628. left: {
  3629. horizontal: gamepad.value.axes[0],
  3630. vertical: gamepad.value.axes[1],
  3631. button: gamepad.value.buttons[10]
  3632. },
  3633. right: {
  3634. horizontal: gamepad.value.axes[2],
  3635. vertical: gamepad.value.axes[3],
  3636. button: gamepad.value.buttons[11]
  3637. }
  3638. },
  3639. dpad: {
  3640. up: gamepad.value.buttons[12],
  3641. down: gamepad.value.buttons[13],
  3642. left: gamepad.value.buttons[14],
  3643. right: gamepad.value.buttons[15]
  3644. },
  3645. back: gamepad.value.buttons[8],
  3646. start: gamepad.value.buttons[9]
  3647. };
  3648. }
  3649. return null;
  3650. });
  3651. }
  3652. function useGamepad(options = {}) {
  3653. const {
  3654. navigator = defaultNavigator
  3655. } = options;
  3656. const isSupported = useSupported(() => navigator && "getGamepads" in navigator);
  3657. const gamepads = vueDemi.ref([]);
  3658. const onConnectedHook = shared.createEventHook();
  3659. const onDisconnectedHook = shared.createEventHook();
  3660. const stateFromGamepad = (gamepad) => {
  3661. const hapticActuators = [];
  3662. const vibrationActuator = "vibrationActuator" in gamepad ? gamepad.vibrationActuator : null;
  3663. if (vibrationActuator)
  3664. hapticActuators.push(vibrationActuator);
  3665. if (gamepad.hapticActuators)
  3666. hapticActuators.push(...gamepad.hapticActuators);
  3667. return {
  3668. id: gamepad.id,
  3669. hapticActuators,
  3670. index: gamepad.index,
  3671. mapping: gamepad.mapping,
  3672. connected: gamepad.connected,
  3673. timestamp: gamepad.timestamp,
  3674. axes: gamepad.axes.map((axes) => axes),
  3675. buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))
  3676. };
  3677. };
  3678. const updateGamepadState = () => {
  3679. const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];
  3680. for (let i = 0; i < _gamepads.length; ++i) {
  3681. const gamepad = _gamepads[i];
  3682. if (gamepad) {
  3683. const index = gamepads.value.findIndex(({ index: index2 }) => index2 === gamepad.index);
  3684. if (index > -1)
  3685. gamepads.value[index] = stateFromGamepad(gamepad);
  3686. }
  3687. }
  3688. };
  3689. const { isActive, pause, resume } = useRafFn(updateGamepadState);
  3690. const onGamepadConnected = (gamepad) => {
  3691. if (!gamepads.value.some(({ index }) => index === gamepad.index)) {
  3692. gamepads.value.push(stateFromGamepad(gamepad));
  3693. onConnectedHook.trigger(gamepad.index);
  3694. }
  3695. resume();
  3696. };
  3697. const onGamepadDisconnected = (gamepad) => {
  3698. gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);
  3699. onDisconnectedHook.trigger(gamepad.index);
  3700. };
  3701. useEventListener("gamepadconnected", (e) => onGamepadConnected(e.gamepad));
  3702. useEventListener("gamepaddisconnected", (e) => onGamepadDisconnected(e.gamepad));
  3703. shared.tryOnMounted(() => {
  3704. const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];
  3705. if (_gamepads) {
  3706. for (let i = 0; i < _gamepads.length; ++i) {
  3707. const gamepad = _gamepads[i];
  3708. if (gamepad)
  3709. onGamepadConnected(gamepad);
  3710. }
  3711. }
  3712. });
  3713. pause();
  3714. return {
  3715. isSupported,
  3716. onConnected: onConnectedHook.on,
  3717. onDisconnected: onDisconnectedHook.on,
  3718. gamepads,
  3719. pause,
  3720. resume,
  3721. isActive
  3722. };
  3723. }
  3724. function useGeolocation(options = {}) {
  3725. const {
  3726. enableHighAccuracy = true,
  3727. maximumAge = 3e4,
  3728. timeout = 27e3,
  3729. navigator = defaultNavigator,
  3730. immediate = true
  3731. } = options;
  3732. const isSupported = useSupported(() => navigator && "geolocation" in navigator);
  3733. const locatedAt = vueDemi.ref(null);
  3734. const error = vueDemi.shallowRef(null);
  3735. const coords = vueDemi.ref({
  3736. accuracy: 0,
  3737. latitude: Infinity,
  3738. longitude: Infinity,
  3739. altitude: null,
  3740. altitudeAccuracy: null,
  3741. heading: null,
  3742. speed: null
  3743. });
  3744. function updatePosition(position) {
  3745. locatedAt.value = position.timestamp;
  3746. coords.value = position.coords;
  3747. error.value = null;
  3748. }
  3749. let watcher;
  3750. function resume() {
  3751. if (isSupported.value) {
  3752. watcher = navigator.geolocation.watchPosition(
  3753. updatePosition,
  3754. (err) => error.value = err,
  3755. {
  3756. enableHighAccuracy,
  3757. maximumAge,
  3758. timeout
  3759. }
  3760. );
  3761. }
  3762. }
  3763. if (immediate)
  3764. resume();
  3765. function pause() {
  3766. if (watcher && navigator)
  3767. navigator.geolocation.clearWatch(watcher);
  3768. }
  3769. shared.tryOnScopeDispose(() => {
  3770. pause();
  3771. });
  3772. return {
  3773. isSupported,
  3774. coords,
  3775. locatedAt,
  3776. error,
  3777. resume,
  3778. pause
  3779. };
  3780. }
  3781. const defaultEvents$1 = ["mousemove", "mousedown", "resize", "keydown", "touchstart", "wheel"];
  3782. const oneMinute = 6e4;
  3783. function useIdle(timeout = oneMinute, options = {}) {
  3784. const {
  3785. initialState = false,
  3786. listenForVisibilityChange = true,
  3787. events = defaultEvents$1,
  3788. window = defaultWindow,
  3789. eventFilter = shared.throttleFilter(50)
  3790. } = options;
  3791. const idle = vueDemi.ref(initialState);
  3792. const lastActive = vueDemi.ref(shared.timestamp());
  3793. let timer;
  3794. const reset = () => {
  3795. idle.value = false;
  3796. clearTimeout(timer);
  3797. timer = setTimeout(() => idle.value = true, timeout);
  3798. };
  3799. const onEvent = shared.createFilterWrapper(
  3800. eventFilter,
  3801. () => {
  3802. lastActive.value = shared.timestamp();
  3803. reset();
  3804. }
  3805. );
  3806. if (window) {
  3807. const document = window.document;
  3808. for (const event of events)
  3809. useEventListener(window, event, onEvent, { passive: true });
  3810. if (listenForVisibilityChange) {
  3811. useEventListener(document, "visibilitychange", () => {
  3812. if (!document.hidden)
  3813. onEvent();
  3814. });
  3815. }
  3816. reset();
  3817. }
  3818. return {
  3819. idle,
  3820. lastActive,
  3821. reset
  3822. };
  3823. }
  3824. var __defProp$a = Object.defineProperty;
  3825. var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
  3826. var __hasOwnProp$b = Object.prototype.hasOwnProperty;
  3827. var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
  3828. var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  3829. var __spreadValues$a = (a, b) => {
  3830. for (var prop in b || (b = {}))
  3831. if (__hasOwnProp$b.call(b, prop))
  3832. __defNormalProp$a(a, prop, b[prop]);
  3833. if (__getOwnPropSymbols$b)
  3834. for (var prop of __getOwnPropSymbols$b(b)) {
  3835. if (__propIsEnum$b.call(b, prop))
  3836. __defNormalProp$a(a, prop, b[prop]);
  3837. }
  3838. return a;
  3839. };
  3840. async function loadImage(options) {
  3841. return new Promise((resolve, reject) => {
  3842. const img = new Image();
  3843. const { src, srcset, sizes, class: clazz, loading, crossorigin } = options;
  3844. img.src = src;
  3845. if (srcset)
  3846. img.srcset = srcset;
  3847. if (sizes)
  3848. img.sizes = sizes;
  3849. if (clazz)
  3850. img.className = clazz;
  3851. if (loading)
  3852. img.loading = loading;
  3853. if (crossorigin)
  3854. img.crossOrigin = crossorigin;
  3855. img.onload = () => resolve(img);
  3856. img.onerror = reject;
  3857. });
  3858. }
  3859. function useImage(options, asyncStateOptions = {}) {
  3860. const state = useAsyncState(
  3861. () => loadImage(shared.toValue(options)),
  3862. void 0,
  3863. __spreadValues$a({
  3864. resetOnExecute: true
  3865. }, asyncStateOptions)
  3866. );
  3867. vueDemi.watch(
  3868. () => shared.toValue(options),
  3869. () => state.execute(asyncStateOptions.delay),
  3870. { deep: true }
  3871. );
  3872. return state;
  3873. }
  3874. const ARRIVED_STATE_THRESHOLD_PIXELS = 1;
  3875. function useScroll(element, options = {}) {
  3876. const {
  3877. throttle = 0,
  3878. idle = 200,
  3879. onStop = shared.noop,
  3880. onScroll = shared.noop,
  3881. offset = {
  3882. left: 0,
  3883. right: 0,
  3884. top: 0,
  3885. bottom: 0
  3886. },
  3887. eventListenerOptions = {
  3888. capture: false,
  3889. passive: true
  3890. },
  3891. behavior = "auto"
  3892. } = options;
  3893. const internalX = vueDemi.ref(0);
  3894. const internalY = vueDemi.ref(0);
  3895. const x = vueDemi.computed({
  3896. get() {
  3897. return internalX.value;
  3898. },
  3899. set(x2) {
  3900. scrollTo(x2, void 0);
  3901. }
  3902. });
  3903. const y = vueDemi.computed({
  3904. get() {
  3905. return internalY.value;
  3906. },
  3907. set(y2) {
  3908. scrollTo(void 0, y2);
  3909. }
  3910. });
  3911. function scrollTo(_x, _y) {
  3912. var _a, _b, _c;
  3913. const _element = shared.toValue(element);
  3914. if (!_element)
  3915. return;
  3916. (_c = _element instanceof Document ? document.body : _element) == null ? void 0 : _c.scrollTo({
  3917. top: (_a = shared.toValue(_y)) != null ? _a : y.value,
  3918. left: (_b = shared.toValue(_x)) != null ? _b : x.value,
  3919. behavior: shared.toValue(behavior)
  3920. });
  3921. }
  3922. const isScrolling = vueDemi.ref(false);
  3923. const arrivedState = vueDemi.reactive({
  3924. left: true,
  3925. right: false,
  3926. top: true,
  3927. bottom: false
  3928. });
  3929. const directions = vueDemi.reactive({
  3930. left: false,
  3931. right: false,
  3932. top: false,
  3933. bottom: false
  3934. });
  3935. const onScrollEnd = (e) => {
  3936. if (!isScrolling.value)
  3937. return;
  3938. isScrolling.value = false;
  3939. directions.left = false;
  3940. directions.right = false;
  3941. directions.top = false;
  3942. directions.bottom = false;
  3943. onStop(e);
  3944. };
  3945. const onScrollEndDebounced = shared.useDebounceFn(onScrollEnd, throttle + idle);
  3946. const setArrivedState = (target) => {
  3947. const el = target === document ? target.documentElement : target;
  3948. const { display, flexDirection } = getComputedStyle(el);
  3949. const scrollLeft = el.scrollLeft;
  3950. directions.left = scrollLeft < internalX.value;
  3951. directions.right = scrollLeft > internalX.value;
  3952. const left = Math.abs(scrollLeft) <= 0 + (offset.left || 0);
  3953. const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
  3954. if (display === "flex" && flexDirection === "row-reverse") {
  3955. arrivedState.left = right;
  3956. arrivedState.right = left;
  3957. } else {
  3958. arrivedState.left = left;
  3959. arrivedState.right = right;
  3960. }
  3961. internalX.value = scrollLeft;
  3962. let scrollTop = el.scrollTop;
  3963. if (target === document && !scrollTop)
  3964. scrollTop = document.body.scrollTop;
  3965. directions.top = scrollTop < internalY.value;
  3966. directions.bottom = scrollTop > internalY.value;
  3967. const top = Math.abs(scrollTop) <= 0 + (offset.top || 0);
  3968. const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
  3969. if (display === "flex" && flexDirection === "column-reverse") {
  3970. arrivedState.top = bottom;
  3971. arrivedState.bottom = top;
  3972. } else {
  3973. arrivedState.top = top;
  3974. arrivedState.bottom = bottom;
  3975. }
  3976. internalY.value = scrollTop;
  3977. };
  3978. const onScrollHandler = (e) => {
  3979. const eventTarget = e.target === document ? e.target.documentElement : e.target;
  3980. setArrivedState(eventTarget);
  3981. isScrolling.value = true;
  3982. onScrollEndDebounced(e);
  3983. onScroll(e);
  3984. };
  3985. useEventListener(
  3986. element,
  3987. "scroll",
  3988. throttle ? shared.useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,
  3989. eventListenerOptions
  3990. );
  3991. useEventListener(
  3992. element,
  3993. "scrollend",
  3994. onScrollEnd,
  3995. eventListenerOptions
  3996. );
  3997. return {
  3998. x,
  3999. y,
  4000. isScrolling,
  4001. arrivedState,
  4002. directions,
  4003. measure() {
  4004. const _element = shared.toValue(element);
  4005. if (_element)
  4006. setArrivedState(_element);
  4007. }
  4008. };
  4009. }
  4010. var __defProp$9 = Object.defineProperty;
  4011. var __defProps$3 = Object.defineProperties;
  4012. var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
  4013. var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
  4014. var __hasOwnProp$a = Object.prototype.hasOwnProperty;
  4015. var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
  4016. var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  4017. var __spreadValues$9 = (a, b) => {
  4018. for (var prop in b || (b = {}))
  4019. if (__hasOwnProp$a.call(b, prop))
  4020. __defNormalProp$9(a, prop, b[prop]);
  4021. if (__getOwnPropSymbols$a)
  4022. for (var prop of __getOwnPropSymbols$a(b)) {
  4023. if (__propIsEnum$a.call(b, prop))
  4024. __defNormalProp$9(a, prop, b[prop]);
  4025. }
  4026. return a;
  4027. };
  4028. var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
  4029. function useInfiniteScroll(element, onLoadMore, options = {}) {
  4030. var _a;
  4031. const {
  4032. direction = "bottom",
  4033. interval = 100
  4034. } = options;
  4035. const state = vueDemi.reactive(useScroll(
  4036. element,
  4037. __spreadProps$3(__spreadValues$9({}, options), {
  4038. offset: __spreadValues$9({
  4039. [direction]: (_a = options.distance) != null ? _a : 0
  4040. }, options.offset)
  4041. })
  4042. ));
  4043. const promise = vueDemi.ref();
  4044. const isLoading = vueDemi.computed(() => !!promise.value);
  4045. function checkAndLoad() {
  4046. state.measure();
  4047. const el = shared.toValue(element);
  4048. if (!el)
  4049. return;
  4050. const isNarrower = direction === "bottom" || direction === "top" ? el.scrollHeight <= el.clientHeight : el.scrollWidth <= el.clientWidth;
  4051. if (state.arrivedState[direction] || isNarrower) {
  4052. if (!promise.value) {
  4053. promise.value = Promise.all([
  4054. onLoadMore(state),
  4055. new Promise((resolve) => setTimeout(resolve, interval))
  4056. ]).finally(() => {
  4057. promise.value = null;
  4058. vueDemi.nextTick(() => checkAndLoad());
  4059. });
  4060. }
  4061. }
  4062. }
  4063. vueDemi.watch(
  4064. () => [state.arrivedState[direction], shared.toValue(element)],
  4065. checkAndLoad,
  4066. { immediate: true }
  4067. );
  4068. return {
  4069. isLoading
  4070. };
  4071. }
  4072. const defaultEvents = ["mousedown", "mouseup", "keydown", "keyup"];
  4073. function useKeyModifier(modifier, options = {}) {
  4074. const {
  4075. events = defaultEvents,
  4076. document = defaultDocument,
  4077. initial = null
  4078. } = options;
  4079. const state = vueDemi.ref(initial);
  4080. if (document) {
  4081. events.forEach((listenerEvent) => {
  4082. useEventListener(document, listenerEvent, (evt) => {
  4083. if (typeof evt.getModifierState === "function")
  4084. state.value = evt.getModifierState(modifier);
  4085. });
  4086. });
  4087. }
  4088. return state;
  4089. }
  4090. function useLocalStorage(key, initialValue, options = {}) {
  4091. const { window = defaultWindow } = options;
  4092. return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);
  4093. }
  4094. const DefaultMagicKeysAliasMap = {
  4095. ctrl: "control",
  4096. command: "meta",
  4097. cmd: "meta",
  4098. option: "alt",
  4099. up: "arrowup",
  4100. down: "arrowdown",
  4101. left: "arrowleft",
  4102. right: "arrowright"
  4103. };
  4104. function useMagicKeys(options = {}) {
  4105. const {
  4106. reactive: useReactive = false,
  4107. target = defaultWindow,
  4108. aliasMap = DefaultMagicKeysAliasMap,
  4109. passive = true,
  4110. onEventFired = shared.noop
  4111. } = options;
  4112. const current = vueDemi.reactive(/* @__PURE__ */ new Set());
  4113. const obj = {
  4114. toJSON() {
  4115. return {};
  4116. },
  4117. current
  4118. };
  4119. const refs = useReactive ? vueDemi.reactive(obj) : obj;
  4120. const metaDeps = /* @__PURE__ */ new Set();
  4121. const usedKeys = /* @__PURE__ */ new Set();
  4122. function setRefs(key, value) {
  4123. if (key in refs) {
  4124. if (useReactive)
  4125. refs[key] = value;
  4126. else
  4127. refs[key].value = value;
  4128. }
  4129. }
  4130. function reset() {
  4131. current.clear();
  4132. for (const key of usedKeys)
  4133. setRefs(key, false);
  4134. }
  4135. function updateRefs(e, value) {
  4136. var _a, _b;
  4137. const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();
  4138. const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();
  4139. const values = [code, key].filter(Boolean);
  4140. if (key) {
  4141. if (value)
  4142. current.add(key);
  4143. else
  4144. current.delete(key);
  4145. }
  4146. for (const key2 of values) {
  4147. usedKeys.add(key2);
  4148. setRefs(key2, value);
  4149. }
  4150. if (key === "meta" && !value) {
  4151. metaDeps.forEach((key2) => {
  4152. current.delete(key2);
  4153. setRefs(key2, false);
  4154. });
  4155. metaDeps.clear();
  4156. } else if (typeof e.getModifierState === "function" && e.getModifierState("Meta") && value) {
  4157. [...current, ...values].forEach((key2) => metaDeps.add(key2));
  4158. }
  4159. }
  4160. useEventListener(target, "keydown", (e) => {
  4161. updateRefs(e, true);
  4162. return onEventFired(e);
  4163. }, { passive });
  4164. useEventListener(target, "keyup", (e) => {
  4165. updateRefs(e, false);
  4166. return onEventFired(e);
  4167. }, { passive });
  4168. useEventListener("blur", reset, { passive: true });
  4169. useEventListener("focus", reset, { passive: true });
  4170. const proxy = new Proxy(
  4171. refs,
  4172. {
  4173. get(target2, prop, rec) {
  4174. if (typeof prop !== "string")
  4175. return Reflect.get(target2, prop, rec);
  4176. prop = prop.toLowerCase();
  4177. if (prop in aliasMap)
  4178. prop = aliasMap[prop];
  4179. if (!(prop in refs)) {
  4180. if (/[+_-]/.test(prop)) {
  4181. const keys = prop.split(/[+_-]/g).map((i) => i.trim());
  4182. refs[prop] = vueDemi.computed(() => keys.every((key) => shared.toValue(proxy[key])));
  4183. } else {
  4184. refs[prop] = vueDemi.ref(false);
  4185. }
  4186. }
  4187. const r = Reflect.get(target2, prop, rec);
  4188. return useReactive ? shared.toValue(r) : r;
  4189. }
  4190. }
  4191. );
  4192. return proxy;
  4193. }
  4194. var __defProp$8 = Object.defineProperty;
  4195. var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
  4196. var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
  4197. var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
  4198. var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  4199. var __spreadValues$8 = (a, b) => {
  4200. for (var prop in b || (b = {}))
  4201. if (__hasOwnProp$9.call(b, prop))
  4202. __defNormalProp$8(a, prop, b[prop]);
  4203. if (__getOwnPropSymbols$9)
  4204. for (var prop of __getOwnPropSymbols$9(b)) {
  4205. if (__propIsEnum$9.call(b, prop))
  4206. __defNormalProp$8(a, prop, b[prop]);
  4207. }
  4208. return a;
  4209. };
  4210. function usingElRef(source, cb) {
  4211. if (shared.toValue(source))
  4212. cb(shared.toValue(source));
  4213. }
  4214. function timeRangeToArray(timeRanges) {
  4215. let ranges = [];
  4216. for (let i = 0; i < timeRanges.length; ++i)
  4217. ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];
  4218. return ranges;
  4219. }
  4220. function tracksToArray(tracks) {
  4221. return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));
  4222. }
  4223. const defaultOptions = {
  4224. src: "",
  4225. tracks: []
  4226. };
  4227. function useMediaControls(target, options = {}) {
  4228. options = __spreadValues$8(__spreadValues$8({}, defaultOptions), options);
  4229. const {
  4230. document = defaultDocument
  4231. } = options;
  4232. const currentTime = vueDemi.ref(0);
  4233. const duration = vueDemi.ref(0);
  4234. const seeking = vueDemi.ref(false);
  4235. const volume = vueDemi.ref(1);
  4236. const waiting = vueDemi.ref(false);
  4237. const ended = vueDemi.ref(false);
  4238. const playing = vueDemi.ref(false);
  4239. const rate = vueDemi.ref(1);
  4240. const stalled = vueDemi.ref(false);
  4241. const buffered = vueDemi.ref([]);
  4242. const tracks = vueDemi.ref([]);
  4243. const selectedTrack = vueDemi.ref(-1);
  4244. const isPictureInPicture = vueDemi.ref(false);
  4245. const muted = vueDemi.ref(false);
  4246. const supportsPictureInPicture = document && "pictureInPictureEnabled" in document;
  4247. const sourceErrorEvent = shared.createEventHook();
  4248. const disableTrack = (track) => {
  4249. usingElRef(target, (el) => {
  4250. if (track) {
  4251. const id = typeof track === "number" ? track : track.id;
  4252. el.textTracks[id].mode = "disabled";
  4253. } else {
  4254. for (let i = 0; i < el.textTracks.length; ++i)
  4255. el.textTracks[i].mode = "disabled";
  4256. }
  4257. selectedTrack.value = -1;
  4258. });
  4259. };
  4260. const enableTrack = (track, disableTracks = true) => {
  4261. usingElRef(target, (el) => {
  4262. const id = typeof track === "number" ? track : track.id;
  4263. if (disableTracks)
  4264. disableTrack();
  4265. el.textTracks[id].mode = "showing";
  4266. selectedTrack.value = id;
  4267. });
  4268. };
  4269. const togglePictureInPicture = () => {
  4270. return new Promise((resolve, reject) => {
  4271. usingElRef(target, async (el) => {
  4272. if (supportsPictureInPicture) {
  4273. if (!isPictureInPicture.value) {
  4274. el.requestPictureInPicture().then(resolve).catch(reject);
  4275. } else {
  4276. document.exitPictureInPicture().then(resolve).catch(reject);
  4277. }
  4278. }
  4279. });
  4280. });
  4281. };
  4282. vueDemi.watchEffect(() => {
  4283. if (!document)
  4284. return;
  4285. const el = shared.toValue(target);
  4286. if (!el)
  4287. return;
  4288. const src = shared.toValue(options.src);
  4289. let sources = [];
  4290. if (!src)
  4291. return;
  4292. if (typeof src === "string")
  4293. sources = [{ src }];
  4294. else if (Array.isArray(src))
  4295. sources = src;
  4296. else if (shared.isObject(src))
  4297. sources = [src];
  4298. el.querySelectorAll("source").forEach((e) => {
  4299. e.removeEventListener("error", sourceErrorEvent.trigger);
  4300. e.remove();
  4301. });
  4302. sources.forEach(({ src: src2, type }) => {
  4303. const source = document.createElement("source");
  4304. source.setAttribute("src", src2);
  4305. source.setAttribute("type", type || "");
  4306. source.addEventListener("error", sourceErrorEvent.trigger);
  4307. el.appendChild(source);
  4308. });
  4309. el.load();
  4310. });
  4311. shared.tryOnScopeDispose(() => {
  4312. const el = shared.toValue(target);
  4313. if (!el)
  4314. return;
  4315. el.querySelectorAll("source").forEach((e) => e.removeEventListener("error", sourceErrorEvent.trigger));
  4316. });
  4317. vueDemi.watch([target, volume], () => {
  4318. const el = shared.toValue(target);
  4319. if (!el)
  4320. return;
  4321. el.volume = volume.value;
  4322. });
  4323. vueDemi.watch([target, muted], () => {
  4324. const el = shared.toValue(target);
  4325. if (!el)
  4326. return;
  4327. el.muted = muted.value;
  4328. });
  4329. vueDemi.watch([target, rate], () => {
  4330. const el = shared.toValue(target);
  4331. if (!el)
  4332. return;
  4333. el.playbackRate = rate.value;
  4334. });
  4335. vueDemi.watchEffect(() => {
  4336. if (!document)
  4337. return;
  4338. const textTracks = shared.toValue(options.tracks);
  4339. const el = shared.toValue(target);
  4340. if (!textTracks || !textTracks.length || !el)
  4341. return;
  4342. el.querySelectorAll("track").forEach((e) => e.remove());
  4343. textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {
  4344. const track = document.createElement("track");
  4345. track.default = isDefault || false;
  4346. track.kind = kind;
  4347. track.label = label;
  4348. track.src = src;
  4349. track.srclang = srcLang;
  4350. if (track.default)
  4351. selectedTrack.value = i;
  4352. el.appendChild(track);
  4353. });
  4354. });
  4355. const { ignoreUpdates: ignoreCurrentTimeUpdates } = shared.watchIgnorable(currentTime, (time) => {
  4356. const el = shared.toValue(target);
  4357. if (!el)
  4358. return;
  4359. el.currentTime = time;
  4360. });
  4361. const { ignoreUpdates: ignorePlayingUpdates } = shared.watchIgnorable(playing, (isPlaying) => {
  4362. const el = shared.toValue(target);
  4363. if (!el)
  4364. return;
  4365. isPlaying ? el.play() : el.pause();
  4366. });
  4367. useEventListener(target, "timeupdate", () => ignoreCurrentTimeUpdates(() => currentTime.value = shared.toValue(target).currentTime));
  4368. useEventListener(target, "durationchange", () => duration.value = shared.toValue(target).duration);
  4369. useEventListener(target, "progress", () => buffered.value = timeRangeToArray(shared.toValue(target).buffered));
  4370. useEventListener(target, "seeking", () => seeking.value = true);
  4371. useEventListener(target, "seeked", () => seeking.value = false);
  4372. useEventListener(target, "waiting", () => waiting.value = true);
  4373. useEventListener(target, "playing", () => {
  4374. waiting.value = false;
  4375. ended.value = false;
  4376. });
  4377. useEventListener(target, "ratechange", () => rate.value = shared.toValue(target).playbackRate);
  4378. useEventListener(target, "stalled", () => stalled.value = true);
  4379. useEventListener(target, "ended", () => ended.value = true);
  4380. useEventListener(target, "pause", () => ignorePlayingUpdates(() => playing.value = false));
  4381. useEventListener(target, "play", () => ignorePlayingUpdates(() => playing.value = true));
  4382. useEventListener(target, "enterpictureinpicture", () => isPictureInPicture.value = true);
  4383. useEventListener(target, "leavepictureinpicture", () => isPictureInPicture.value = false);
  4384. useEventListener(target, "volumechange", () => {
  4385. const el = shared.toValue(target);
  4386. if (!el)
  4387. return;
  4388. volume.value = el.volume;
  4389. muted.value = el.muted;
  4390. });
  4391. const listeners = [];
  4392. const stop = vueDemi.watch([target], () => {
  4393. const el = shared.toValue(target);
  4394. if (!el)
  4395. return;
  4396. stop();
  4397. listeners[0] = useEventListener(el.textTracks, "addtrack", () => tracks.value = tracksToArray(el.textTracks));
  4398. listeners[1] = useEventListener(el.textTracks, "removetrack", () => tracks.value = tracksToArray(el.textTracks));
  4399. listeners[2] = useEventListener(el.textTracks, "change", () => tracks.value = tracksToArray(el.textTracks));
  4400. });
  4401. shared.tryOnScopeDispose(() => listeners.forEach((listener) => listener()));
  4402. return {
  4403. currentTime,
  4404. duration,
  4405. waiting,
  4406. seeking,
  4407. ended,
  4408. stalled,
  4409. buffered,
  4410. playing,
  4411. rate,
  4412. // Volume
  4413. volume,
  4414. muted,
  4415. // Tracks
  4416. tracks,
  4417. selectedTrack,
  4418. enableTrack,
  4419. disableTrack,
  4420. // Picture in Picture
  4421. supportsPictureInPicture,
  4422. togglePictureInPicture,
  4423. isPictureInPicture,
  4424. // Events
  4425. onSourceError: sourceErrorEvent.on
  4426. };
  4427. }
  4428. function getMapVue2Compat() {
  4429. const data = vueDemi.reactive({});
  4430. return {
  4431. get: (key) => data[key],
  4432. set: (key, value) => vueDemi.set(data, key, value),
  4433. has: (key) => shared.hasOwn(data, key),
  4434. delete: (key) => vueDemi.del(data, key),
  4435. clear: () => {
  4436. Object.keys(data).forEach((key) => {
  4437. vueDemi.del(data, key);
  4438. });
  4439. }
  4440. };
  4441. }
  4442. function useMemoize(resolver, options) {
  4443. const initCache = () => {
  4444. if (options == null ? void 0 : options.cache)
  4445. return vueDemi.reactive(options.cache);
  4446. if (vueDemi.isVue2)
  4447. return getMapVue2Compat();
  4448. return vueDemi.reactive(/* @__PURE__ */ new Map());
  4449. };
  4450. const cache = initCache();
  4451. const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);
  4452. const _loadData = (key, ...args) => {
  4453. cache.set(key, resolver(...args));
  4454. return cache.get(key);
  4455. };
  4456. const loadData = (...args) => _loadData(generateKey(...args), ...args);
  4457. const deleteData = (...args) => {
  4458. cache.delete(generateKey(...args));
  4459. };
  4460. const clearData = () => {
  4461. cache.clear();
  4462. };
  4463. const memoized = (...args) => {
  4464. const key = generateKey(...args);
  4465. if (cache.has(key))
  4466. return cache.get(key);
  4467. return _loadData(key, ...args);
  4468. };
  4469. memoized.load = loadData;
  4470. memoized.delete = deleteData;
  4471. memoized.clear = clearData;
  4472. memoized.generateKey = generateKey;
  4473. memoized.cache = cache;
  4474. return memoized;
  4475. }
  4476. function useMemory(options = {}) {
  4477. const memory = vueDemi.ref();
  4478. const isSupported = useSupported(() => typeof performance !== "undefined" && "memory" in performance);
  4479. if (isSupported.value) {
  4480. const { interval = 1e3 } = options;
  4481. shared.useIntervalFn(() => {
  4482. memory.value = performance.memory;
  4483. }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });
  4484. }
  4485. return { isSupported, memory };
  4486. }
  4487. const BuiltinExtractors = {
  4488. page: (event) => [event.pageX, event.pageY],
  4489. client: (event) => [event.clientX, event.clientY],
  4490. screen: (event) => [event.screenX, event.screenY],
  4491. movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY]
  4492. };
  4493. function useMouse(options = {}) {
  4494. const {
  4495. type = "page",
  4496. touch = true,
  4497. resetOnTouchEnds = false,
  4498. initialValue = { x: 0, y: 0 },
  4499. window = defaultWindow,
  4500. target = window,
  4501. eventFilter
  4502. } = options;
  4503. const x = vueDemi.ref(initialValue.x);
  4504. const y = vueDemi.ref(initialValue.y);
  4505. const sourceType = vueDemi.ref(null);
  4506. const extractor = typeof type === "function" ? type : BuiltinExtractors[type];
  4507. const mouseHandler = (event) => {
  4508. const result = extractor(event);
  4509. if (result) {
  4510. [x.value, y.value] = result;
  4511. sourceType.value = "mouse";
  4512. }
  4513. };
  4514. const touchHandler = (event) => {
  4515. if (event.touches.length > 0) {
  4516. const result = extractor(event.touches[0]);
  4517. if (result) {
  4518. [x.value, y.value] = result;
  4519. sourceType.value = "touch";
  4520. }
  4521. }
  4522. };
  4523. const reset = () => {
  4524. x.value = initialValue.x;
  4525. y.value = initialValue.y;
  4526. };
  4527. const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);
  4528. const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);
  4529. if (target) {
  4530. useEventListener(target, "mousemove", mouseHandlerWrapper, { passive: true });
  4531. useEventListener(target, "dragover", mouseHandlerWrapper, { passive: true });
  4532. if (touch && type !== "movement") {
  4533. useEventListener(target, "touchstart", touchHandlerWrapper, { passive: true });
  4534. useEventListener(target, "touchmove", touchHandlerWrapper, { passive: true });
  4535. if (resetOnTouchEnds)
  4536. useEventListener(target, "touchend", reset, { passive: true });
  4537. }
  4538. }
  4539. return {
  4540. x,
  4541. y,
  4542. sourceType
  4543. };
  4544. }
  4545. function useMouseInElement(target, options = {}) {
  4546. const {
  4547. handleOutside = true,
  4548. window = defaultWindow
  4549. } = options;
  4550. const { x, y, sourceType } = useMouse(options);
  4551. const targetRef = vueDemi.ref(target != null ? target : window == null ? void 0 : window.document.body);
  4552. const elementX = vueDemi.ref(0);
  4553. const elementY = vueDemi.ref(0);
  4554. const elementPositionX = vueDemi.ref(0);
  4555. const elementPositionY = vueDemi.ref(0);
  4556. const elementHeight = vueDemi.ref(0);
  4557. const elementWidth = vueDemi.ref(0);
  4558. const isOutside = vueDemi.ref(true);
  4559. let stop = () => {
  4560. };
  4561. if (window) {
  4562. stop = vueDemi.watch(
  4563. [targetRef, x, y],
  4564. () => {
  4565. const el = unrefElement(targetRef);
  4566. if (!el)
  4567. return;
  4568. const {
  4569. left,
  4570. top,
  4571. width,
  4572. height
  4573. } = el.getBoundingClientRect();
  4574. elementPositionX.value = left + window.pageXOffset;
  4575. elementPositionY.value = top + window.pageYOffset;
  4576. elementHeight.value = height;
  4577. elementWidth.value = width;
  4578. const elX = x.value - elementPositionX.value;
  4579. const elY = y.value - elementPositionY.value;
  4580. isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;
  4581. if (handleOutside || !isOutside.value) {
  4582. elementX.value = elX;
  4583. elementY.value = elY;
  4584. }
  4585. },
  4586. { immediate: true }
  4587. );
  4588. useEventListener(document, "mouseleave", () => {
  4589. isOutside.value = true;
  4590. });
  4591. }
  4592. return {
  4593. x,
  4594. y,
  4595. sourceType,
  4596. elementX,
  4597. elementY,
  4598. elementPositionX,
  4599. elementPositionY,
  4600. elementHeight,
  4601. elementWidth,
  4602. isOutside,
  4603. stop
  4604. };
  4605. }
  4606. function useMousePressed(options = {}) {
  4607. const {
  4608. touch = true,
  4609. drag = true,
  4610. initialValue = false,
  4611. window = defaultWindow
  4612. } = options;
  4613. const pressed = vueDemi.ref(initialValue);
  4614. const sourceType = vueDemi.ref(null);
  4615. if (!window) {
  4616. return {
  4617. pressed,
  4618. sourceType
  4619. };
  4620. }
  4621. const onPressed = (srcType) => () => {
  4622. pressed.value = true;
  4623. sourceType.value = srcType;
  4624. };
  4625. const onReleased = () => {
  4626. pressed.value = false;
  4627. sourceType.value = null;
  4628. };
  4629. const target = vueDemi.computed(() => unrefElement(options.target) || window);
  4630. useEventListener(target, "mousedown", onPressed("mouse"), { passive: true });
  4631. useEventListener(window, "mouseleave", onReleased, { passive: true });
  4632. useEventListener(window, "mouseup", onReleased, { passive: true });
  4633. if (drag) {
  4634. useEventListener(target, "dragstart", onPressed("mouse"), { passive: true });
  4635. useEventListener(window, "drop", onReleased, { passive: true });
  4636. useEventListener(window, "dragend", onReleased, { passive: true });
  4637. }
  4638. if (touch) {
  4639. useEventListener(target, "touchstart", onPressed("touch"), { passive: true });
  4640. useEventListener(window, "touchend", onReleased, { passive: true });
  4641. useEventListener(window, "touchcancel", onReleased, { passive: true });
  4642. }
  4643. return {
  4644. pressed,
  4645. sourceType
  4646. };
  4647. }
  4648. function useNavigatorLanguage(options = {}) {
  4649. const { window = defaultWindow } = options;
  4650. const navigator = window == null ? void 0 : window.navigator;
  4651. const isSupported = useSupported(() => navigator && "language" in navigator);
  4652. const language = vueDemi.ref(navigator == null ? void 0 : navigator.language);
  4653. useEventListener(window, "languagechange", () => {
  4654. if (navigator)
  4655. language.value = navigator.language;
  4656. });
  4657. return {
  4658. isSupported,
  4659. language
  4660. };
  4661. }
  4662. function useNetwork(options = {}) {
  4663. const { window = defaultWindow } = options;
  4664. const navigator = window == null ? void 0 : window.navigator;
  4665. const isSupported = useSupported(() => navigator && "connection" in navigator);
  4666. const isOnline = vueDemi.ref(true);
  4667. const saveData = vueDemi.ref(false);
  4668. const offlineAt = vueDemi.ref(void 0);
  4669. const onlineAt = vueDemi.ref(void 0);
  4670. const downlink = vueDemi.ref(void 0);
  4671. const downlinkMax = vueDemi.ref(void 0);
  4672. const rtt = vueDemi.ref(void 0);
  4673. const effectiveType = vueDemi.ref(void 0);
  4674. const type = vueDemi.ref("unknown");
  4675. const connection = isSupported.value && navigator.connection;
  4676. function updateNetworkInformation() {
  4677. if (!navigator)
  4678. return;
  4679. isOnline.value = navigator.onLine;
  4680. offlineAt.value = isOnline.value ? void 0 : Date.now();
  4681. onlineAt.value = isOnline.value ? Date.now() : void 0;
  4682. if (connection) {
  4683. downlink.value = connection.downlink;
  4684. downlinkMax.value = connection.downlinkMax;
  4685. effectiveType.value = connection.effectiveType;
  4686. rtt.value = connection.rtt;
  4687. saveData.value = connection.saveData;
  4688. type.value = connection.type;
  4689. }
  4690. }
  4691. if (window) {
  4692. useEventListener(window, "offline", () => {
  4693. isOnline.value = false;
  4694. offlineAt.value = Date.now();
  4695. });
  4696. useEventListener(window, "online", () => {
  4697. isOnline.value = true;
  4698. onlineAt.value = Date.now();
  4699. });
  4700. }
  4701. if (connection)
  4702. useEventListener(connection, "change", updateNetworkInformation, false);
  4703. updateNetworkInformation();
  4704. return {
  4705. isSupported,
  4706. isOnline,
  4707. saveData,
  4708. offlineAt,
  4709. onlineAt,
  4710. downlink,
  4711. downlinkMax,
  4712. effectiveType,
  4713. rtt,
  4714. type
  4715. };
  4716. }
  4717. var __defProp$7 = Object.defineProperty;
  4718. var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
  4719. var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
  4720. var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
  4721. var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  4722. var __spreadValues$7 = (a, b) => {
  4723. for (var prop in b || (b = {}))
  4724. if (__hasOwnProp$8.call(b, prop))
  4725. __defNormalProp$7(a, prop, b[prop]);
  4726. if (__getOwnPropSymbols$8)
  4727. for (var prop of __getOwnPropSymbols$8(b)) {
  4728. if (__propIsEnum$8.call(b, prop))
  4729. __defNormalProp$7(a, prop, b[prop]);
  4730. }
  4731. return a;
  4732. };
  4733. function useNow(options = {}) {
  4734. const {
  4735. controls: exposeControls = false,
  4736. interval = "requestAnimationFrame"
  4737. } = options;
  4738. const now = vueDemi.ref(/* @__PURE__ */ new Date());
  4739. const update = () => now.value = /* @__PURE__ */ new Date();
  4740. const controls = interval === "requestAnimationFrame" ? useRafFn(update, { immediate: true }) : shared.useIntervalFn(update, interval, { immediate: true });
  4741. if (exposeControls) {
  4742. return __spreadValues$7({
  4743. now
  4744. }, controls);
  4745. } else {
  4746. return now;
  4747. }
  4748. }
  4749. function useObjectUrl(object) {
  4750. const url = vueDemi.ref();
  4751. const release = () => {
  4752. if (url.value)
  4753. URL.revokeObjectURL(url.value);
  4754. url.value = void 0;
  4755. };
  4756. vueDemi.watch(
  4757. () => shared.toValue(object),
  4758. (newObject) => {
  4759. release();
  4760. if (newObject)
  4761. url.value = URL.createObjectURL(newObject);
  4762. },
  4763. { immediate: true }
  4764. );
  4765. shared.tryOnScopeDispose(release);
  4766. return vueDemi.readonly(url);
  4767. }
  4768. function useClamp(value, min, max) {
  4769. if (typeof value === "function" || vueDemi.isReadonly(value))
  4770. return vueDemi.computed(() => shared.clamp(shared.toValue(value), shared.toValue(min), shared.toValue(max)));
  4771. const _value = vueDemi.ref(value);
  4772. return vueDemi.computed({
  4773. get() {
  4774. return _value.value = shared.clamp(_value.value, shared.toValue(min), shared.toValue(max));
  4775. },
  4776. set(value2) {
  4777. _value.value = shared.clamp(value2, shared.toValue(min), shared.toValue(max));
  4778. }
  4779. });
  4780. }
  4781. function useOffsetPagination(options) {
  4782. const {
  4783. total = Infinity,
  4784. pageSize = 10,
  4785. page = 1,
  4786. onPageChange = shared.noop,
  4787. onPageSizeChange = shared.noop,
  4788. onPageCountChange = shared.noop
  4789. } = options;
  4790. const currentPageSize = useClamp(pageSize, 1, Infinity);
  4791. const pageCount = vueDemi.computed(() => Math.max(
  4792. 1,
  4793. Math.ceil(shared.toValue(total) / shared.toValue(currentPageSize))
  4794. ));
  4795. const currentPage = useClamp(page, 1, pageCount);
  4796. const isFirstPage = vueDemi.computed(() => currentPage.value === 1);
  4797. const isLastPage = vueDemi.computed(() => currentPage.value === pageCount.value);
  4798. if (vueDemi.isRef(page))
  4799. shared.syncRef(page, currentPage);
  4800. if (vueDemi.isRef(pageSize))
  4801. shared.syncRef(pageSize, currentPageSize);
  4802. function prev() {
  4803. currentPage.value--;
  4804. }
  4805. function next() {
  4806. currentPage.value++;
  4807. }
  4808. const returnValue = {
  4809. currentPage,
  4810. currentPageSize,
  4811. pageCount,
  4812. isFirstPage,
  4813. isLastPage,
  4814. prev,
  4815. next
  4816. };
  4817. vueDemi.watch(currentPage, () => {
  4818. onPageChange(vueDemi.reactive(returnValue));
  4819. });
  4820. vueDemi.watch(currentPageSize, () => {
  4821. onPageSizeChange(vueDemi.reactive(returnValue));
  4822. });
  4823. vueDemi.watch(pageCount, () => {
  4824. onPageCountChange(vueDemi.reactive(returnValue));
  4825. });
  4826. return returnValue;
  4827. }
  4828. function useOnline(options = {}) {
  4829. const { isOnline } = useNetwork(options);
  4830. return isOnline;
  4831. }
  4832. function usePageLeave(options = {}) {
  4833. const { window = defaultWindow } = options;
  4834. const isLeft = vueDemi.ref(false);
  4835. const handler = (event) => {
  4836. if (!window)
  4837. return;
  4838. event = event || window.event;
  4839. const from = event.relatedTarget || event.toElement;
  4840. isLeft.value = !from;
  4841. };
  4842. if (window) {
  4843. useEventListener(window, "mouseout", handler, { passive: true });
  4844. useEventListener(window.document, "mouseleave", handler, { passive: true });
  4845. useEventListener(window.document, "mouseenter", handler, { passive: true });
  4846. }
  4847. return isLeft;
  4848. }
  4849. function useParallax(target, options = {}) {
  4850. const {
  4851. deviceOrientationTiltAdjust = (i) => i,
  4852. deviceOrientationRollAdjust = (i) => i,
  4853. mouseTiltAdjust = (i) => i,
  4854. mouseRollAdjust = (i) => i,
  4855. window = defaultWindow
  4856. } = options;
  4857. const orientation = vueDemi.reactive(useDeviceOrientation({ window }));
  4858. const {
  4859. elementX: x,
  4860. elementY: y,
  4861. elementWidth: width,
  4862. elementHeight: height
  4863. } = useMouseInElement(target, { handleOutside: false, window });
  4864. const source = vueDemi.computed(() => {
  4865. if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))
  4866. return "deviceOrientation";
  4867. return "mouse";
  4868. });
  4869. const roll = vueDemi.computed(() => {
  4870. if (source.value === "deviceOrientation") {
  4871. const value = -orientation.beta / 90;
  4872. return deviceOrientationRollAdjust(value);
  4873. } else {
  4874. const value = -(y.value - height.value / 2) / height.value;
  4875. return mouseRollAdjust(value);
  4876. }
  4877. });
  4878. const tilt = vueDemi.computed(() => {
  4879. if (source.value === "deviceOrientation") {
  4880. const value = orientation.gamma / 90;
  4881. return deviceOrientationTiltAdjust(value);
  4882. } else {
  4883. const value = (x.value - width.value / 2) / width.value;
  4884. return mouseTiltAdjust(value);
  4885. }
  4886. });
  4887. return { roll, tilt, source };
  4888. }
  4889. function useParentElement(element = useCurrentElement()) {
  4890. const parentElement = vueDemi.shallowRef();
  4891. const update = () => {
  4892. const el = unrefElement(element);
  4893. if (el)
  4894. parentElement.value = el.parentElement;
  4895. };
  4896. shared.tryOnMounted(update);
  4897. vueDemi.watch(() => shared.toValue(element), update);
  4898. return parentElement;
  4899. }
  4900. var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
  4901. var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
  4902. var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
  4903. var __objRest$1 = (source, exclude) => {
  4904. var target = {};
  4905. for (var prop in source)
  4906. if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)
  4907. target[prop] = source[prop];
  4908. if (source != null && __getOwnPropSymbols$7)
  4909. for (var prop of __getOwnPropSymbols$7(source)) {
  4910. if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))
  4911. target[prop] = source[prop];
  4912. }
  4913. return target;
  4914. };
  4915. function usePerformanceObserver(options, callback) {
  4916. const _a = options, {
  4917. window = defaultWindow,
  4918. immediate = true
  4919. } = _a, performanceOptions = __objRest$1(_a, [
  4920. "window",
  4921. "immediate"
  4922. ]);
  4923. const isSupported = useSupported(() => window && "PerformanceObserver" in window);
  4924. let observer;
  4925. const stop = () => {
  4926. observer == null ? void 0 : observer.disconnect();
  4927. };
  4928. const start = () => {
  4929. if (isSupported.value) {
  4930. stop();
  4931. observer = new PerformanceObserver(callback);
  4932. observer.observe(performanceOptions);
  4933. }
  4934. };
  4935. shared.tryOnScopeDispose(stop);
  4936. if (immediate)
  4937. start();
  4938. return {
  4939. isSupported,
  4940. start,
  4941. stop
  4942. };
  4943. }
  4944. var __defProp$6 = Object.defineProperty;
  4945. var __defProps$2 = Object.defineProperties;
  4946. var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
  4947. var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
  4948. var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
  4949. var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
  4950. var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  4951. var __spreadValues$6 = (a, b) => {
  4952. for (var prop in b || (b = {}))
  4953. if (__hasOwnProp$6.call(b, prop))
  4954. __defNormalProp$6(a, prop, b[prop]);
  4955. if (__getOwnPropSymbols$6)
  4956. for (var prop of __getOwnPropSymbols$6(b)) {
  4957. if (__propIsEnum$6.call(b, prop))
  4958. __defNormalProp$6(a, prop, b[prop]);
  4959. }
  4960. return a;
  4961. };
  4962. var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
  4963. const defaultState = {
  4964. x: 0,
  4965. y: 0,
  4966. pointerId: 0,
  4967. pressure: 0,
  4968. tiltX: 0,
  4969. tiltY: 0,
  4970. width: 0,
  4971. height: 0,
  4972. twist: 0,
  4973. pointerType: null
  4974. };
  4975. const keys = /* @__PURE__ */ Object.keys(defaultState);
  4976. function usePointer(options = {}) {
  4977. const {
  4978. target = defaultWindow
  4979. } = options;
  4980. const isInside = vueDemi.ref(false);
  4981. const state = vueDemi.ref(options.initialValue || {});
  4982. Object.assign(state.value, defaultState, state.value);
  4983. const handler = (event) => {
  4984. isInside.value = true;
  4985. if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))
  4986. return;
  4987. state.value = shared.objectPick(event, keys, false);
  4988. };
  4989. if (target) {
  4990. useEventListener(target, "pointerdown", handler, { passive: true });
  4991. useEventListener(target, "pointermove", handler, { passive: true });
  4992. useEventListener(target, "pointerleave", () => isInside.value = false, { passive: true });
  4993. }
  4994. return __spreadProps$2(__spreadValues$6({}, shared.toRefs(state)), {
  4995. isInside
  4996. });
  4997. }
  4998. function usePointerLock(target, options = {}) {
  4999. const { document = defaultDocument, pointerLockOptions } = options;
  5000. const isSupported = useSupported(() => document && "pointerLockElement" in document);
  5001. const element = vueDemi.ref();
  5002. const triggerElement = vueDemi.ref();
  5003. let targetElement;
  5004. if (isSupported.value) {
  5005. useEventListener(document, "pointerlockchange", () => {
  5006. var _a;
  5007. const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;
  5008. if (targetElement && currentElement === targetElement) {
  5009. element.value = document.pointerLockElement;
  5010. if (!element.value)
  5011. targetElement = triggerElement.value = null;
  5012. }
  5013. });
  5014. useEventListener(document, "pointerlockerror", () => {
  5015. var _a;
  5016. const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;
  5017. if (targetElement && currentElement === targetElement) {
  5018. const action = document.pointerLockElement ? "release" : "acquire";
  5019. throw new Error(`Failed to ${action} pointer lock.`);
  5020. }
  5021. });
  5022. }
  5023. async function lock(e, options2) {
  5024. var _a;
  5025. if (!isSupported.value)
  5026. throw new Error("Pointer Lock API is not supported by your browser.");
  5027. triggerElement.value = e instanceof Event ? e.currentTarget : null;
  5028. targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);
  5029. if (!targetElement)
  5030. throw new Error("Target element undefined.");
  5031. targetElement.requestPointerLock(options2 != null ? options2 : pointerLockOptions);
  5032. return await shared.until(element).toBe(targetElement);
  5033. }
  5034. async function unlock() {
  5035. if (!element.value)
  5036. return false;
  5037. document.exitPointerLock();
  5038. await shared.until(element).toBeNull();
  5039. return true;
  5040. }
  5041. return {
  5042. isSupported,
  5043. element,
  5044. triggerElement,
  5045. lock,
  5046. unlock
  5047. };
  5048. }
  5049. function usePointerSwipe(target, options = {}) {
  5050. const targetRef = shared.toRef(target);
  5051. const {
  5052. threshold = 50,
  5053. onSwipe,
  5054. onSwipeEnd,
  5055. onSwipeStart
  5056. } = options;
  5057. const posStart = vueDemi.reactive({ x: 0, y: 0 });
  5058. const updatePosStart = (x, y) => {
  5059. posStart.x = x;
  5060. posStart.y = y;
  5061. };
  5062. const posEnd = vueDemi.reactive({ x: 0, y: 0 });
  5063. const updatePosEnd = (x, y) => {
  5064. posEnd.x = x;
  5065. posEnd.y = y;
  5066. };
  5067. const distanceX = vueDemi.computed(() => posStart.x - posEnd.x);
  5068. const distanceY = vueDemi.computed(() => posStart.y - posEnd.y);
  5069. const { max, abs } = Math;
  5070. const isThresholdExceeded = vueDemi.computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);
  5071. const isSwiping = vueDemi.ref(false);
  5072. const isPointerDown = vueDemi.ref(false);
  5073. const direction = vueDemi.computed(() => {
  5074. if (!isThresholdExceeded.value)
  5075. return "none";
  5076. if (abs(distanceX.value) > abs(distanceY.value)) {
  5077. return distanceX.value > 0 ? "left" : "right";
  5078. } else {
  5079. return distanceY.value > 0 ? "up" : "down";
  5080. }
  5081. });
  5082. const eventIsAllowed = (e) => {
  5083. var _a, _b, _c;
  5084. const isReleasingButton = e.buttons === 0;
  5085. const isPrimaryButton = e.buttons === 1;
  5086. return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;
  5087. };
  5088. const stops = [
  5089. useEventListener(target, "pointerdown", (e) => {
  5090. var _a, _b;
  5091. if (!eventIsAllowed(e))
  5092. return;
  5093. isPointerDown.value = true;
  5094. (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "none");
  5095. const eventTarget = e.target;
  5096. eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);
  5097. const { clientX: x, clientY: y } = e;
  5098. updatePosStart(x, y);
  5099. updatePosEnd(x, y);
  5100. onSwipeStart == null ? void 0 : onSwipeStart(e);
  5101. }),
  5102. useEventListener(target, "pointermove", (e) => {
  5103. if (!eventIsAllowed(e))
  5104. return;
  5105. if (!isPointerDown.value)
  5106. return;
  5107. const { clientX: x, clientY: y } = e;
  5108. updatePosEnd(x, y);
  5109. if (!isSwiping.value && isThresholdExceeded.value)
  5110. isSwiping.value = true;
  5111. if (isSwiping.value)
  5112. onSwipe == null ? void 0 : onSwipe(e);
  5113. }),
  5114. useEventListener(target, "pointerup", (e) => {
  5115. var _a, _b;
  5116. if (!eventIsAllowed(e))
  5117. return;
  5118. if (isSwiping.value)
  5119. onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
  5120. isPointerDown.value = false;
  5121. isSwiping.value = false;
  5122. (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty("touch-action", "initial");
  5123. })
  5124. ];
  5125. const stop = () => stops.forEach((s) => s());
  5126. return {
  5127. isSwiping: vueDemi.readonly(isSwiping),
  5128. direction: vueDemi.readonly(direction),
  5129. posStart: vueDemi.readonly(posStart),
  5130. posEnd: vueDemi.readonly(posEnd),
  5131. distanceX,
  5132. distanceY,
  5133. stop
  5134. };
  5135. }
  5136. function usePreferredColorScheme(options) {
  5137. const isLight = useMediaQuery("(prefers-color-scheme: light)", options);
  5138. const isDark = useMediaQuery("(prefers-color-scheme: dark)", options);
  5139. return vueDemi.computed(() => {
  5140. if (isDark.value)
  5141. return "dark";
  5142. if (isLight.value)
  5143. return "light";
  5144. return "no-preference";
  5145. });
  5146. }
  5147. function usePreferredContrast(options) {
  5148. const isMore = useMediaQuery("(prefers-contrast: more)", options);
  5149. const isLess = useMediaQuery("(prefers-contrast: less)", options);
  5150. const isCustom = useMediaQuery("(prefers-contrast: custom)", options);
  5151. return vueDemi.computed(() => {
  5152. if (isMore.value)
  5153. return "more";
  5154. if (isLess.value)
  5155. return "less";
  5156. if (isCustom.value)
  5157. return "custom";
  5158. return "no-preference";
  5159. });
  5160. }
  5161. function usePreferredLanguages(options = {}) {
  5162. const { window = defaultWindow } = options;
  5163. if (!window)
  5164. return vueDemi.ref(["en"]);
  5165. const navigator = window.navigator;
  5166. const value = vueDemi.ref(navigator.languages);
  5167. useEventListener(window, "languagechange", () => {
  5168. value.value = navigator.languages;
  5169. });
  5170. return value;
  5171. }
  5172. function usePreferredReducedMotion(options) {
  5173. const isReduced = useMediaQuery("(prefers-reduced-motion: reduce)", options);
  5174. return vueDemi.computed(() => {
  5175. if (isReduced.value)
  5176. return "reduce";
  5177. return "no-preference";
  5178. });
  5179. }
  5180. function usePrevious(value, initialValue) {
  5181. const previous = vueDemi.shallowRef(initialValue);
  5182. vueDemi.watch(
  5183. shared.toRef(value),
  5184. (_, oldValue) => {
  5185. previous.value = oldValue;
  5186. },
  5187. { flush: "sync" }
  5188. );
  5189. return vueDemi.readonly(previous);
  5190. }
  5191. function useScreenOrientation(options = {}) {
  5192. const {
  5193. window = defaultWindow
  5194. } = options;
  5195. const isSupported = useSupported(() => window && "screen" in window && "orientation" in window.screen);
  5196. const screenOrientation = isSupported.value ? window.screen.orientation : {};
  5197. const orientation = vueDemi.ref(screenOrientation.type);
  5198. const angle = vueDemi.ref(screenOrientation.angle || 0);
  5199. if (isSupported.value) {
  5200. useEventListener(window, "orientationchange", () => {
  5201. orientation.value = screenOrientation.type;
  5202. angle.value = screenOrientation.angle;
  5203. });
  5204. }
  5205. const lockOrientation = (type) => {
  5206. if (!isSupported.value)
  5207. return Promise.reject(new Error("Not supported"));
  5208. return screenOrientation.lock(type);
  5209. };
  5210. const unlockOrientation = () => {
  5211. if (isSupported.value)
  5212. screenOrientation.unlock();
  5213. };
  5214. return {
  5215. isSupported,
  5216. orientation,
  5217. angle,
  5218. lockOrientation,
  5219. unlockOrientation
  5220. };
  5221. }
  5222. const topVarName = "--vueuse-safe-area-top";
  5223. const rightVarName = "--vueuse-safe-area-right";
  5224. const bottomVarName = "--vueuse-safe-area-bottom";
  5225. const leftVarName = "--vueuse-safe-area-left";
  5226. function useScreenSafeArea() {
  5227. const top = vueDemi.ref("");
  5228. const right = vueDemi.ref("");
  5229. const bottom = vueDemi.ref("");
  5230. const left = vueDemi.ref("");
  5231. if (shared.isClient) {
  5232. const topCssVar = useCssVar(topVarName);
  5233. const rightCssVar = useCssVar(rightVarName);
  5234. const bottomCssVar = useCssVar(bottomVarName);
  5235. const leftCssVar = useCssVar(leftVarName);
  5236. topCssVar.value = "env(safe-area-inset-top, 0px)";
  5237. rightCssVar.value = "env(safe-area-inset-right, 0px)";
  5238. bottomCssVar.value = "env(safe-area-inset-bottom, 0px)";
  5239. leftCssVar.value = "env(safe-area-inset-left, 0px)";
  5240. update();
  5241. useEventListener("resize", shared.useDebounceFn(update));
  5242. }
  5243. function update() {
  5244. top.value = getValue(topVarName);
  5245. right.value = getValue(rightVarName);
  5246. bottom.value = getValue(bottomVarName);
  5247. left.value = getValue(leftVarName);
  5248. }
  5249. return {
  5250. top,
  5251. right,
  5252. bottom,
  5253. left,
  5254. update
  5255. };
  5256. }
  5257. function getValue(position) {
  5258. return getComputedStyle(document.documentElement).getPropertyValue(position);
  5259. }
  5260. function useScriptTag(src, onLoaded = shared.noop, options = {}) {
  5261. const {
  5262. immediate = true,
  5263. manual = false,
  5264. type = "text/javascript",
  5265. async = true,
  5266. crossOrigin,
  5267. referrerPolicy,
  5268. noModule,
  5269. defer,
  5270. document = defaultDocument,
  5271. attrs = {}
  5272. } = options;
  5273. const scriptTag = vueDemi.ref(null);
  5274. let _promise = null;
  5275. const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {
  5276. const resolveWithElement = (el2) => {
  5277. scriptTag.value = el2;
  5278. resolve(el2);
  5279. return el2;
  5280. };
  5281. if (!document) {
  5282. resolve(false);
  5283. return;
  5284. }
  5285. let shouldAppend = false;
  5286. let el = document.querySelector(`script[src="${shared.toValue(src)}"]`);
  5287. if (!el) {
  5288. el = document.createElement("script");
  5289. el.type = type;
  5290. el.async = async;
  5291. el.src = shared.toValue(src);
  5292. if (defer)
  5293. el.defer = defer;
  5294. if (crossOrigin)
  5295. el.crossOrigin = crossOrigin;
  5296. if (noModule)
  5297. el.noModule = noModule;
  5298. if (referrerPolicy)
  5299. el.referrerPolicy = referrerPolicy;
  5300. Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));
  5301. shouldAppend = true;
  5302. } else if (el.hasAttribute("data-loaded")) {
  5303. resolveWithElement(el);
  5304. }
  5305. el.addEventListener("error", (event) => reject(event));
  5306. el.addEventListener("abort", (event) => reject(event));
  5307. el.addEventListener("load", () => {
  5308. el.setAttribute("data-loaded", "true");
  5309. onLoaded(el);
  5310. resolveWithElement(el);
  5311. });
  5312. if (shouldAppend)
  5313. el = document.head.appendChild(el);
  5314. if (!waitForScriptLoad)
  5315. resolveWithElement(el);
  5316. });
  5317. const load = (waitForScriptLoad = true) => {
  5318. if (!_promise)
  5319. _promise = loadScript(waitForScriptLoad);
  5320. return _promise;
  5321. };
  5322. const unload = () => {
  5323. if (!document)
  5324. return;
  5325. _promise = null;
  5326. if (scriptTag.value)
  5327. scriptTag.value = null;
  5328. const el = document.querySelector(`script[src="${shared.toValue(src)}"]`);
  5329. if (el)
  5330. document.head.removeChild(el);
  5331. };
  5332. if (immediate && !manual)
  5333. shared.tryOnMounted(load);
  5334. if (!manual)
  5335. shared.tryOnUnmounted(unload);
  5336. return { scriptTag, load, unload };
  5337. }
  5338. function checkOverflowScroll(ele) {
  5339. const style = window.getComputedStyle(ele);
  5340. if (style.overflowX === "scroll" || style.overflowY === "scroll" || style.overflowX === "auto" && ele.clientHeight < ele.scrollHeight || style.overflowY === "auto" && ele.clientWidth < ele.scrollWidth) {
  5341. return true;
  5342. } else {
  5343. const parent = ele.parentNode;
  5344. if (!parent || parent.tagName === "BODY")
  5345. return false;
  5346. return checkOverflowScroll(parent);
  5347. }
  5348. }
  5349. function preventDefault(rawEvent) {
  5350. const e = rawEvent || window.event;
  5351. const _target = e.target;
  5352. if (checkOverflowScroll(_target))
  5353. return false;
  5354. if (e.touches.length > 1)
  5355. return true;
  5356. if (e.preventDefault)
  5357. e.preventDefault();
  5358. return false;
  5359. }
  5360. function useScrollLock(element, initialState = false) {
  5361. const isLocked = vueDemi.ref(initialState);
  5362. let stopTouchMoveListener = null;
  5363. let initialOverflow;
  5364. vueDemi.watch(shared.toRef(element), (el) => {
  5365. if (el) {
  5366. const ele = el;
  5367. initialOverflow = ele.style.overflow;
  5368. if (isLocked.value)
  5369. ele.style.overflow = "hidden";
  5370. }
  5371. }, {
  5372. immediate: true
  5373. });
  5374. const lock = () => {
  5375. const ele = shared.toValue(element);
  5376. if (!ele || isLocked.value)
  5377. return;
  5378. if (shared.isIOS) {
  5379. stopTouchMoveListener = useEventListener(
  5380. ele,
  5381. "touchmove",
  5382. (e) => {
  5383. preventDefault(e);
  5384. },
  5385. { passive: false }
  5386. );
  5387. }
  5388. ele.style.overflow = "hidden";
  5389. isLocked.value = true;
  5390. };
  5391. const unlock = () => {
  5392. const ele = shared.toValue(element);
  5393. if (!ele || !isLocked.value)
  5394. return;
  5395. shared.isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());
  5396. ele.style.overflow = initialOverflow;
  5397. isLocked.value = false;
  5398. };
  5399. shared.tryOnScopeDispose(unlock);
  5400. return vueDemi.computed({
  5401. get() {
  5402. return isLocked.value;
  5403. },
  5404. set(v) {
  5405. if (v)
  5406. lock();
  5407. else
  5408. unlock();
  5409. }
  5410. });
  5411. }
  5412. function useSessionStorage(key, initialValue, options = {}) {
  5413. const { window = defaultWindow } = options;
  5414. return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);
  5415. }
  5416. var __defProp$5 = Object.defineProperty;
  5417. var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
  5418. var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
  5419. var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
  5420. var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  5421. var __spreadValues$5 = (a, b) => {
  5422. for (var prop in b || (b = {}))
  5423. if (__hasOwnProp$5.call(b, prop))
  5424. __defNormalProp$5(a, prop, b[prop]);
  5425. if (__getOwnPropSymbols$5)
  5426. for (var prop of __getOwnPropSymbols$5(b)) {
  5427. if (__propIsEnum$5.call(b, prop))
  5428. __defNormalProp$5(a, prop, b[prop]);
  5429. }
  5430. return a;
  5431. };
  5432. function useShare(shareOptions = {}, options = {}) {
  5433. const { navigator = defaultNavigator } = options;
  5434. const _navigator = navigator;
  5435. const isSupported = useSupported(() => _navigator && "canShare" in _navigator);
  5436. const share = async (overrideOptions = {}) => {
  5437. if (isSupported.value) {
  5438. const data = __spreadValues$5(__spreadValues$5({}, shared.toValue(shareOptions)), shared.toValue(overrideOptions));
  5439. let granted = true;
  5440. if (data.files && _navigator.canShare)
  5441. granted = _navigator.canShare({ files: data.files });
  5442. if (granted)
  5443. return _navigator.share(data);
  5444. }
  5445. };
  5446. return {
  5447. isSupported,
  5448. share
  5449. };
  5450. }
  5451. const defaultSortFn = (source, compareFn) => source.sort(compareFn);
  5452. const defaultCompare = (a, b) => a - b;
  5453. function useSorted(...args) {
  5454. var _a, _b, _c, _d;
  5455. const [source] = args;
  5456. let compareFn = defaultCompare;
  5457. let options = {};
  5458. if (args.length === 2) {
  5459. if (typeof args[1] === "object") {
  5460. options = args[1];
  5461. compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;
  5462. } else {
  5463. compareFn = (_b = args[1]) != null ? _b : defaultCompare;
  5464. }
  5465. } else if (args.length > 2) {
  5466. compareFn = (_c = args[1]) != null ? _c : defaultCompare;
  5467. options = (_d = args[2]) != null ? _d : {};
  5468. }
  5469. const {
  5470. dirty = false,
  5471. sortFn = defaultSortFn
  5472. } = options;
  5473. if (!dirty)
  5474. return vueDemi.computed(() => sortFn([...shared.toValue(source)], compareFn));
  5475. vueDemi.watchEffect(() => {
  5476. const result = sortFn(shared.toValue(source), compareFn);
  5477. if (vueDemi.isRef(source))
  5478. source.value = result;
  5479. else
  5480. source.splice(0, source.length, ...result);
  5481. });
  5482. return source;
  5483. }
  5484. function useSpeechRecognition(options = {}) {
  5485. const {
  5486. interimResults = true,
  5487. continuous = true,
  5488. window = defaultWindow
  5489. } = options;
  5490. const lang = shared.toRef(options.lang || "en-US");
  5491. const isListening = vueDemi.ref(false);
  5492. const isFinal = vueDemi.ref(false);
  5493. const result = vueDemi.ref("");
  5494. const error = vueDemi.shallowRef(void 0);
  5495. const toggle = (value = !isListening.value) => {
  5496. isListening.value = value;
  5497. };
  5498. const start = () => {
  5499. isListening.value = true;
  5500. };
  5501. const stop = () => {
  5502. isListening.value = false;
  5503. };
  5504. const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);
  5505. const isSupported = useSupported(() => SpeechRecognition);
  5506. let recognition;
  5507. if (isSupported.value) {
  5508. recognition = new SpeechRecognition();
  5509. recognition.continuous = continuous;
  5510. recognition.interimResults = interimResults;
  5511. recognition.lang = shared.toValue(lang);
  5512. recognition.onstart = () => {
  5513. isFinal.value = false;
  5514. };
  5515. vueDemi.watch(lang, (lang2) => {
  5516. if (recognition && !isListening.value)
  5517. recognition.lang = lang2;
  5518. });
  5519. recognition.onresult = (event) => {
  5520. const transcript = Array.from(event.results).map((result2) => {
  5521. isFinal.value = result2.isFinal;
  5522. return result2[0];
  5523. }).map((result2) => result2.transcript).join("");
  5524. result.value = transcript;
  5525. error.value = void 0;
  5526. };
  5527. recognition.onerror = (event) => {
  5528. error.value = event;
  5529. };
  5530. recognition.onend = () => {
  5531. isListening.value = false;
  5532. recognition.lang = shared.toValue(lang);
  5533. };
  5534. vueDemi.watch(isListening, () => {
  5535. if (isListening.value)
  5536. recognition.start();
  5537. else
  5538. recognition.stop();
  5539. });
  5540. }
  5541. shared.tryOnScopeDispose(() => {
  5542. isListening.value = false;
  5543. });
  5544. return {
  5545. isSupported,
  5546. isListening,
  5547. isFinal,
  5548. recognition,
  5549. result,
  5550. error,
  5551. toggle,
  5552. start,
  5553. stop
  5554. };
  5555. }
  5556. function useSpeechSynthesis(text, options = {}) {
  5557. const {
  5558. pitch = 1,
  5559. rate = 1,
  5560. volume = 1,
  5561. window = defaultWindow
  5562. } = options;
  5563. const synth = window && window.speechSynthesis;
  5564. const isSupported = useSupported(() => synth);
  5565. const isPlaying = vueDemi.ref(false);
  5566. const status = vueDemi.ref("init");
  5567. const spokenText = shared.toRef(text || "");
  5568. const lang = shared.toRef(options.lang || "en-US");
  5569. const error = vueDemi.shallowRef(void 0);
  5570. const toggle = (value = !isPlaying.value) => {
  5571. isPlaying.value = value;
  5572. };
  5573. const bindEventsForUtterance = (utterance2) => {
  5574. utterance2.lang = shared.toValue(lang);
  5575. utterance2.voice = shared.toValue(options.voice) || null;
  5576. utterance2.pitch = pitch;
  5577. utterance2.rate = rate;
  5578. utterance2.volume = volume;
  5579. utterance2.onstart = () => {
  5580. isPlaying.value = true;
  5581. status.value = "play";
  5582. };
  5583. utterance2.onpause = () => {
  5584. isPlaying.value = false;
  5585. status.value = "pause";
  5586. };
  5587. utterance2.onresume = () => {
  5588. isPlaying.value = true;
  5589. status.value = "play";
  5590. };
  5591. utterance2.onend = () => {
  5592. isPlaying.value = false;
  5593. status.value = "end";
  5594. };
  5595. utterance2.onerror = (event) => {
  5596. error.value = event;
  5597. };
  5598. };
  5599. const utterance = vueDemi.computed(() => {
  5600. isPlaying.value = false;
  5601. status.value = "init";
  5602. const newUtterance = new SpeechSynthesisUtterance(spokenText.value);
  5603. bindEventsForUtterance(newUtterance);
  5604. return newUtterance;
  5605. });
  5606. const speak = () => {
  5607. synth.cancel();
  5608. utterance && synth.speak(utterance.value);
  5609. };
  5610. const stop = () => {
  5611. synth.cancel();
  5612. isPlaying.value = false;
  5613. };
  5614. if (isSupported.value) {
  5615. bindEventsForUtterance(utterance.value);
  5616. vueDemi.watch(lang, (lang2) => {
  5617. if (utterance.value && !isPlaying.value)
  5618. utterance.value.lang = lang2;
  5619. });
  5620. if (options.voice) {
  5621. vueDemi.watch(options.voice, () => {
  5622. synth.cancel();
  5623. });
  5624. }
  5625. vueDemi.watch(isPlaying, () => {
  5626. if (isPlaying.value)
  5627. synth.resume();
  5628. else
  5629. synth.pause();
  5630. });
  5631. }
  5632. shared.tryOnScopeDispose(() => {
  5633. isPlaying.value = false;
  5634. });
  5635. return {
  5636. isSupported,
  5637. isPlaying,
  5638. status,
  5639. utterance,
  5640. error,
  5641. stop,
  5642. toggle,
  5643. speak
  5644. };
  5645. }
  5646. function useStepper(steps, initialStep) {
  5647. const stepsRef = vueDemi.ref(steps);
  5648. const stepNames = vueDemi.computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));
  5649. const index = vueDemi.ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));
  5650. const current = vueDemi.computed(() => at(index.value));
  5651. const isFirst = vueDemi.computed(() => index.value === 0);
  5652. const isLast = vueDemi.computed(() => index.value === stepNames.value.length - 1);
  5653. const next = vueDemi.computed(() => stepNames.value[index.value + 1]);
  5654. const previous = vueDemi.computed(() => stepNames.value[index.value - 1]);
  5655. function at(index2) {
  5656. if (Array.isArray(stepsRef.value))
  5657. return stepsRef.value[index2];
  5658. return stepsRef.value[stepNames.value[index2]];
  5659. }
  5660. function get(step) {
  5661. if (!stepNames.value.includes(step))
  5662. return;
  5663. return at(stepNames.value.indexOf(step));
  5664. }
  5665. function goTo(step) {
  5666. if (stepNames.value.includes(step))
  5667. index.value = stepNames.value.indexOf(step);
  5668. }
  5669. function goToNext() {
  5670. if (isLast.value)
  5671. return;
  5672. index.value++;
  5673. }
  5674. function goToPrevious() {
  5675. if (isFirst.value)
  5676. return;
  5677. index.value--;
  5678. }
  5679. function goBackTo(step) {
  5680. if (isAfter(step))
  5681. goTo(step);
  5682. }
  5683. function isNext(step) {
  5684. return stepNames.value.indexOf(step) === index.value + 1;
  5685. }
  5686. function isPrevious(step) {
  5687. return stepNames.value.indexOf(step) === index.value - 1;
  5688. }
  5689. function isCurrent(step) {
  5690. return stepNames.value.indexOf(step) === index.value;
  5691. }
  5692. function isBefore(step) {
  5693. return index.value < stepNames.value.indexOf(step);
  5694. }
  5695. function isAfter(step) {
  5696. return index.value > stepNames.value.indexOf(step);
  5697. }
  5698. return {
  5699. steps: stepsRef,
  5700. stepNames,
  5701. index,
  5702. current,
  5703. next,
  5704. previous,
  5705. isFirst,
  5706. isLast,
  5707. at,
  5708. get,
  5709. goTo,
  5710. goToNext,
  5711. goToPrevious,
  5712. goBackTo,
  5713. isNext,
  5714. isPrevious,
  5715. isCurrent,
  5716. isBefore,
  5717. isAfter
  5718. };
  5719. }
  5720. var __defProp$4 = Object.defineProperty;
  5721. var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
  5722. var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
  5723. var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
  5724. var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  5725. var __spreadValues$4 = (a, b) => {
  5726. for (var prop in b || (b = {}))
  5727. if (__hasOwnProp$4.call(b, prop))
  5728. __defNormalProp$4(a, prop, b[prop]);
  5729. if (__getOwnPropSymbols$4)
  5730. for (var prop of __getOwnPropSymbols$4(b)) {
  5731. if (__propIsEnum$4.call(b, prop))
  5732. __defNormalProp$4(a, prop, b[prop]);
  5733. }
  5734. return a;
  5735. };
  5736. function useStorageAsync(key, initialValue, storage, options = {}) {
  5737. var _a;
  5738. const {
  5739. flush = "pre",
  5740. deep = true,
  5741. listenToStorageChanges = true,
  5742. writeDefaults = true,
  5743. mergeDefaults = false,
  5744. shallow,
  5745. window = defaultWindow,
  5746. eventFilter,
  5747. onError = (e) => {
  5748. console.error(e);
  5749. }
  5750. } = options;
  5751. const rawInit = shared.toValue(initialValue);
  5752. const type = guessSerializerType(rawInit);
  5753. const data = (shallow ? vueDemi.shallowRef : vueDemi.ref)(initialValue);
  5754. const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];
  5755. if (!storage) {
  5756. try {
  5757. storage = getSSRHandler("getDefaultStorage", () => {
  5758. var _a2;
  5759. return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
  5760. })();
  5761. } catch (e) {
  5762. onError(e);
  5763. }
  5764. }
  5765. async function read(event) {
  5766. if (!storage || event && event.key !== key)
  5767. return;
  5768. try {
  5769. const rawValue = event ? event.newValue : await storage.getItem(key);
  5770. if (rawValue == null) {
  5771. data.value = rawInit;
  5772. if (writeDefaults && rawInit !== null)
  5773. await storage.setItem(key, await serializer.write(rawInit));
  5774. } else if (mergeDefaults) {
  5775. const value = await serializer.read(rawValue);
  5776. if (typeof mergeDefaults === "function")
  5777. data.value = mergeDefaults(value, rawInit);
  5778. else if (type === "object" && !Array.isArray(value))
  5779. data.value = __spreadValues$4(__spreadValues$4({}, rawInit), value);
  5780. else
  5781. data.value = value;
  5782. } else {
  5783. data.value = await serializer.read(rawValue);
  5784. }
  5785. } catch (e) {
  5786. onError(e);
  5787. }
  5788. }
  5789. read();
  5790. if (window && listenToStorageChanges)
  5791. useEventListener(window, "storage", (e) => Promise.resolve().then(() => read(e)));
  5792. if (storage) {
  5793. shared.watchWithFilter(
  5794. data,
  5795. async () => {
  5796. try {
  5797. if (data.value == null)
  5798. await storage.removeItem(key);
  5799. else
  5800. await storage.setItem(key, await serializer.write(data.value));
  5801. } catch (e) {
  5802. onError(e);
  5803. }
  5804. },
  5805. {
  5806. flush,
  5807. deep,
  5808. eventFilter
  5809. }
  5810. );
  5811. }
  5812. return data;
  5813. }
  5814. let _id = 0;
  5815. function useStyleTag(css, options = {}) {
  5816. const isLoaded = vueDemi.ref(false);
  5817. const {
  5818. document = defaultDocument,
  5819. immediate = true,
  5820. manual = false,
  5821. id = `vueuse_styletag_${++_id}`
  5822. } = options;
  5823. const cssRef = vueDemi.ref(css);
  5824. let stop = () => {
  5825. };
  5826. const load = () => {
  5827. if (!document)
  5828. return;
  5829. const el = document.getElementById(id) || document.createElement("style");
  5830. if (!el.isConnected) {
  5831. el.type = "text/css";
  5832. el.id = id;
  5833. if (options.media)
  5834. el.media = options.media;
  5835. document.head.appendChild(el);
  5836. }
  5837. if (isLoaded.value)
  5838. return;
  5839. stop = vueDemi.watch(
  5840. cssRef,
  5841. (value) => {
  5842. el.textContent = value;
  5843. },
  5844. { immediate: true }
  5845. );
  5846. isLoaded.value = true;
  5847. };
  5848. const unload = () => {
  5849. if (!document || !isLoaded.value)
  5850. return;
  5851. stop();
  5852. document.head.removeChild(document.getElementById(id));
  5853. isLoaded.value = false;
  5854. };
  5855. if (immediate && !manual)
  5856. shared.tryOnMounted(load);
  5857. if (!manual)
  5858. shared.tryOnScopeDispose(unload);
  5859. return {
  5860. id,
  5861. css: cssRef,
  5862. unload,
  5863. load,
  5864. isLoaded: vueDemi.readonly(isLoaded)
  5865. };
  5866. }
  5867. function useSwipe(target, options = {}) {
  5868. const {
  5869. threshold = 50,
  5870. onSwipe,
  5871. onSwipeEnd,
  5872. onSwipeStart,
  5873. passive = true,
  5874. window = defaultWindow
  5875. } = options;
  5876. const coordsStart = vueDemi.reactive({ x: 0, y: 0 });
  5877. const coordsEnd = vueDemi.reactive({ x: 0, y: 0 });
  5878. const diffX = vueDemi.computed(() => coordsStart.x - coordsEnd.x);
  5879. const diffY = vueDemi.computed(() => coordsStart.y - coordsEnd.y);
  5880. const { max, abs } = Math;
  5881. const isThresholdExceeded = vueDemi.computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);
  5882. const isSwiping = vueDemi.ref(false);
  5883. const direction = vueDemi.computed(() => {
  5884. if (!isThresholdExceeded.value)
  5885. return "none";
  5886. if (abs(diffX.value) > abs(diffY.value)) {
  5887. return diffX.value > 0 ? "left" : "right";
  5888. } else {
  5889. return diffY.value > 0 ? "up" : "down";
  5890. }
  5891. });
  5892. const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];
  5893. const updateCoordsStart = (x, y) => {
  5894. coordsStart.x = x;
  5895. coordsStart.y = y;
  5896. };
  5897. const updateCoordsEnd = (x, y) => {
  5898. coordsEnd.x = x;
  5899. coordsEnd.y = y;
  5900. };
  5901. let listenerOptions;
  5902. const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);
  5903. if (!passive)
  5904. listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };
  5905. else
  5906. listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };
  5907. const onTouchEnd = (e) => {
  5908. if (isSwiping.value)
  5909. onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
  5910. isSwiping.value = false;
  5911. };
  5912. const stops = [
  5913. useEventListener(target, "touchstart", (e) => {
  5914. if (e.touches.length !== 1)
  5915. return;
  5916. if (listenerOptions.capture && !listenerOptions.passive)
  5917. e.preventDefault();
  5918. const [x, y] = getTouchEventCoords(e);
  5919. updateCoordsStart(x, y);
  5920. updateCoordsEnd(x, y);
  5921. onSwipeStart == null ? void 0 : onSwipeStart(e);
  5922. }, listenerOptions),
  5923. useEventListener(target, "touchmove", (e) => {
  5924. if (e.touches.length !== 1)
  5925. return;
  5926. const [x, y] = getTouchEventCoords(e);
  5927. updateCoordsEnd(x, y);
  5928. if (!isSwiping.value && isThresholdExceeded.value)
  5929. isSwiping.value = true;
  5930. if (isSwiping.value)
  5931. onSwipe == null ? void 0 : onSwipe(e);
  5932. }, listenerOptions),
  5933. useEventListener(target, "touchend", onTouchEnd, listenerOptions),
  5934. useEventListener(target, "touchcancel", onTouchEnd, listenerOptions)
  5935. ];
  5936. const stop = () => stops.forEach((s) => s());
  5937. return {
  5938. isPassiveEventSupported,
  5939. isSwiping,
  5940. direction,
  5941. coordsStart,
  5942. coordsEnd,
  5943. lengthX: diffX,
  5944. lengthY: diffY,
  5945. stop
  5946. };
  5947. }
  5948. function checkPassiveEventSupport(document) {
  5949. if (!document)
  5950. return false;
  5951. let supportsPassive = false;
  5952. const optionsBlock = {
  5953. get passive() {
  5954. supportsPassive = true;
  5955. return false;
  5956. }
  5957. };
  5958. document.addEventListener("x", shared.noop, optionsBlock);
  5959. document.removeEventListener("x", shared.noop);
  5960. return supportsPassive;
  5961. }
  5962. function useTemplateRefsList() {
  5963. const refs = vueDemi.ref([]);
  5964. refs.value.set = (el) => {
  5965. if (el)
  5966. refs.value.push(el);
  5967. };
  5968. vueDemi.onBeforeUpdate(() => {
  5969. refs.value.length = 0;
  5970. });
  5971. return refs;
  5972. }
  5973. function useTextDirection(options = {}) {
  5974. const {
  5975. document = defaultDocument,
  5976. selector = "html",
  5977. observe = false,
  5978. initialValue = "ltr"
  5979. } = options;
  5980. function getValue() {
  5981. var _a, _b;
  5982. return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute("dir")) != null ? _b : initialValue;
  5983. }
  5984. const dir = vueDemi.ref(getValue());
  5985. shared.tryOnMounted(() => dir.value = getValue());
  5986. if (observe && document) {
  5987. useMutationObserver(
  5988. document.querySelector(selector),
  5989. () => dir.value = getValue(),
  5990. { attributes: true }
  5991. );
  5992. }
  5993. return vueDemi.computed({
  5994. get() {
  5995. return dir.value;
  5996. },
  5997. set(v) {
  5998. var _a, _b;
  5999. dir.value = v;
  6000. if (!document)
  6001. return;
  6002. if (dir.value)
  6003. (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute("dir", dir.value);
  6004. else
  6005. (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute("dir");
  6006. }
  6007. });
  6008. }
  6009. function getRangesFromSelection(selection) {
  6010. var _a;
  6011. const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;
  6012. const ranges = new Array(rangeCount);
  6013. for (let i = 0; i < rangeCount; i++) {
  6014. const range = selection.getRangeAt(i);
  6015. ranges[i] = range;
  6016. }
  6017. return ranges;
  6018. }
  6019. function useTextSelection(options = {}) {
  6020. const {
  6021. window = defaultWindow
  6022. } = options;
  6023. const selection = vueDemi.ref(null);
  6024. const text = vueDemi.computed(() => {
  6025. var _a, _b;
  6026. return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : "";
  6027. });
  6028. const ranges = vueDemi.computed(() => selection.value ? getRangesFromSelection(selection.value) : []);
  6029. const rects = vueDemi.computed(() => ranges.value.map((range) => range.getBoundingClientRect()));
  6030. function onSelectionChange() {
  6031. selection.value = null;
  6032. if (window)
  6033. selection.value = window.getSelection();
  6034. }
  6035. if (window)
  6036. useEventListener(window.document, "selectionchange", onSelectionChange);
  6037. return {
  6038. text,
  6039. rects,
  6040. ranges,
  6041. selection
  6042. };
  6043. }
  6044. function useTextareaAutosize(options) {
  6045. const textarea = vueDemi.ref(options == null ? void 0 : options.element);
  6046. const input = vueDemi.ref(options == null ? void 0 : options.input);
  6047. const textareaScrollHeight = vueDemi.ref(1);
  6048. function triggerResize() {
  6049. var _a, _b;
  6050. if (!textarea.value)
  6051. return;
  6052. let height = "";
  6053. textarea.value.style.height = "1px";
  6054. textareaScrollHeight.value = (_a = textarea.value) == null ? void 0 : _a.scrollHeight;
  6055. if (options == null ? void 0 : options.styleTarget)
  6056. shared.toValue(options.styleTarget).style.height = `${textareaScrollHeight.value}px`;
  6057. else
  6058. height = `${textareaScrollHeight.value}px`;
  6059. textarea.value.style.height = height;
  6060. (_b = options == null ? void 0 : options.onResize) == null ? void 0 : _b.call(options);
  6061. }
  6062. vueDemi.watch([input, textarea], triggerResize, { immediate: true });
  6063. useResizeObserver(textarea, () => triggerResize());
  6064. if (options == null ? void 0 : options.watch)
  6065. vueDemi.watch(options.watch, triggerResize, { immediate: true, deep: true });
  6066. return {
  6067. textarea,
  6068. input,
  6069. triggerResize
  6070. };
  6071. }
  6072. var __defProp$3 = Object.defineProperty;
  6073. var __defProps$1 = Object.defineProperties;
  6074. var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
  6075. var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
  6076. var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
  6077. var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
  6078. var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  6079. var __spreadValues$3 = (a, b) => {
  6080. for (var prop in b || (b = {}))
  6081. if (__hasOwnProp$3.call(b, prop))
  6082. __defNormalProp$3(a, prop, b[prop]);
  6083. if (__getOwnPropSymbols$3)
  6084. for (var prop of __getOwnPropSymbols$3(b)) {
  6085. if (__propIsEnum$3.call(b, prop))
  6086. __defNormalProp$3(a, prop, b[prop]);
  6087. }
  6088. return a;
  6089. };
  6090. var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
  6091. function useThrottledRefHistory(source, options = {}) {
  6092. const { throttle = 200, trailing = true } = options;
  6093. const filter = shared.throttleFilter(throttle, trailing);
  6094. const history = useRefHistory(source, __spreadProps$1(__spreadValues$3({}, options), { eventFilter: filter }));
  6095. return __spreadValues$3({}, history);
  6096. }
  6097. var __defProp$2 = Object.defineProperty;
  6098. var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
  6099. var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
  6100. var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
  6101. var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  6102. var __spreadValues$2 = (a, b) => {
  6103. for (var prop in b || (b = {}))
  6104. if (__hasOwnProp$2.call(b, prop))
  6105. __defNormalProp$2(a, prop, b[prop]);
  6106. if (__getOwnPropSymbols$2)
  6107. for (var prop of __getOwnPropSymbols$2(b)) {
  6108. if (__propIsEnum$2.call(b, prop))
  6109. __defNormalProp$2(a, prop, b[prop]);
  6110. }
  6111. return a;
  6112. };
  6113. var __objRest = (source, exclude) => {
  6114. var target = {};
  6115. for (var prop in source)
  6116. if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0)
  6117. target[prop] = source[prop];
  6118. if (source != null && __getOwnPropSymbols$2)
  6119. for (var prop of __getOwnPropSymbols$2(source)) {
  6120. if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop))
  6121. target[prop] = source[prop];
  6122. }
  6123. return target;
  6124. };
  6125. const DEFAULT_UNITS = [
  6126. { max: 6e4, value: 1e3, name: "second" },
  6127. { max: 276e4, value: 6e4, name: "minute" },
  6128. { max: 72e6, value: 36e5, name: "hour" },
  6129. { max: 5184e5, value: 864e5, name: "day" },
  6130. { max: 24192e5, value: 6048e5, name: "week" },
  6131. { max: 28512e6, value: 2592e6, name: "month" },
  6132. { max: Infinity, value: 31536e6, name: "year" }
  6133. ];
  6134. const DEFAULT_MESSAGES = {
  6135. justNow: "just now",
  6136. past: (n) => n.match(/\d/) ? `${n} ago` : n,
  6137. future: (n) => n.match(/\d/) ? `in ${n}` : n,
  6138. month: (n, past) => n === 1 ? past ? "last month" : "next month" : `${n} month${n > 1 ? "s" : ""}`,
  6139. year: (n, past) => n === 1 ? past ? "last year" : "next year" : `${n} year${n > 1 ? "s" : ""}`,
  6140. day: (n, past) => n === 1 ? past ? "yesterday" : "tomorrow" : `${n} day${n > 1 ? "s" : ""}`,
  6141. week: (n, past) => n === 1 ? past ? "last week" : "next week" : `${n} week${n > 1 ? "s" : ""}`,
  6142. hour: (n) => `${n} hour${n > 1 ? "s" : ""}`,
  6143. minute: (n) => `${n} minute${n > 1 ? "s" : ""}`,
  6144. second: (n) => `${n} second${n > 1 ? "s" : ""}`,
  6145. invalid: ""
  6146. };
  6147. function DEFAULT_FORMATTER(date) {
  6148. return date.toISOString().slice(0, 10);
  6149. }
  6150. function useTimeAgo(time, options = {}) {
  6151. const {
  6152. controls: exposeControls = false,
  6153. updateInterval = 3e4
  6154. } = options;
  6155. const _a = useNow({ interval: updateInterval, controls: true }), { now } = _a, controls = __objRest(_a, ["now"]);
  6156. const timeAgo = vueDemi.computed(() => formatTimeAgo(new Date(shared.toValue(time)), options, shared.toValue(now.value)));
  6157. if (exposeControls) {
  6158. return __spreadValues$2({
  6159. timeAgo
  6160. }, controls);
  6161. } else {
  6162. return timeAgo;
  6163. }
  6164. }
  6165. function formatTimeAgo(from, options = {}, now = Date.now()) {
  6166. var _a;
  6167. const {
  6168. max,
  6169. messages = DEFAULT_MESSAGES,
  6170. fullDateFormatter = DEFAULT_FORMATTER,
  6171. units = DEFAULT_UNITS,
  6172. showSecond = false,
  6173. rounding = "round"
  6174. } = options;
  6175. const roundFn = typeof rounding === "number" ? (n) => +n.toFixed(rounding) : Math[rounding];
  6176. const diff = +now - +from;
  6177. const absDiff = Math.abs(diff);
  6178. function getValue(diff2, unit) {
  6179. return roundFn(Math.abs(diff2) / unit.value);
  6180. }
  6181. function format(diff2, unit) {
  6182. const val = getValue(diff2, unit);
  6183. const past = diff2 > 0;
  6184. const str = applyFormat(unit.name, val, past);
  6185. return applyFormat(past ? "past" : "future", str, past);
  6186. }
  6187. function applyFormat(name, val, isPast) {
  6188. const formatter = messages[name];
  6189. if (typeof formatter === "function")
  6190. return formatter(val, isPast);
  6191. return formatter.replace("{0}", val.toString());
  6192. }
  6193. if (absDiff < 6e4 && !showSecond)
  6194. return messages.justNow;
  6195. if (typeof max === "number" && absDiff > max)
  6196. return fullDateFormatter(new Date(from));
  6197. if (typeof max === "string") {
  6198. const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;
  6199. if (unitMax && absDiff > unitMax)
  6200. return fullDateFormatter(new Date(from));
  6201. }
  6202. for (const [idx, unit] of units.entries()) {
  6203. const val = getValue(diff, unit);
  6204. if (val <= 0 && units[idx - 1])
  6205. return format(diff, units[idx - 1]);
  6206. if (absDiff < unit.max)
  6207. return format(diff, unit);
  6208. }
  6209. return messages.invalid;
  6210. }
  6211. function useTimeoutPoll(fn, interval, timeoutPollOptions) {
  6212. const { start } = shared.useTimeoutFn(loop, interval);
  6213. const isActive = vueDemi.ref(false);
  6214. async function loop() {
  6215. if (!isActive.value)
  6216. return;
  6217. await fn();
  6218. start();
  6219. }
  6220. function resume() {
  6221. if (!isActive.value) {
  6222. isActive.value = true;
  6223. loop();
  6224. }
  6225. }
  6226. function pause() {
  6227. isActive.value = false;
  6228. }
  6229. if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)
  6230. resume();
  6231. shared.tryOnScopeDispose(pause);
  6232. return {
  6233. isActive,
  6234. pause,
  6235. resume
  6236. };
  6237. }
  6238. var __defProp$1 = Object.defineProperty;
  6239. var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
  6240. var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
  6241. var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
  6242. var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  6243. var __spreadValues$1 = (a, b) => {
  6244. for (var prop in b || (b = {}))
  6245. if (__hasOwnProp$1.call(b, prop))
  6246. __defNormalProp$1(a, prop, b[prop]);
  6247. if (__getOwnPropSymbols$1)
  6248. for (var prop of __getOwnPropSymbols$1(b)) {
  6249. if (__propIsEnum$1.call(b, prop))
  6250. __defNormalProp$1(a, prop, b[prop]);
  6251. }
  6252. return a;
  6253. };
  6254. function useTimestamp(options = {}) {
  6255. const {
  6256. controls: exposeControls = false,
  6257. offset = 0,
  6258. immediate = true,
  6259. interval = "requestAnimationFrame",
  6260. callback
  6261. } = options;
  6262. const ts = vueDemi.ref(shared.timestamp() + offset);
  6263. const update = () => ts.value = shared.timestamp() + offset;
  6264. const cb = callback ? () => {
  6265. update();
  6266. callback(ts.value);
  6267. } : update;
  6268. const controls = interval === "requestAnimationFrame" ? useRafFn(cb, { immediate }) : shared.useIntervalFn(cb, interval, { immediate });
  6269. if (exposeControls) {
  6270. return __spreadValues$1({
  6271. timestamp: ts
  6272. }, controls);
  6273. } else {
  6274. return ts;
  6275. }
  6276. }
  6277. function useTitle(newTitle = null, options = {}) {
  6278. var _a, _b;
  6279. const {
  6280. document = defaultDocument
  6281. } = options;
  6282. const title = shared.toRef((_a = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _a : null);
  6283. const isReadonly = newTitle && typeof newTitle === "function";
  6284. function format(t) {
  6285. if (!("titleTemplate" in options))
  6286. return t;
  6287. const template = options.titleTemplate || "%s";
  6288. return typeof template === "function" ? template(t) : shared.toValue(template).replace(/%s/g, t);
  6289. }
  6290. vueDemi.watch(
  6291. title,
  6292. (t, o) => {
  6293. if (t !== o && document)
  6294. document.title = format(typeof t === "string" ? t : "");
  6295. },
  6296. { immediate: true }
  6297. );
  6298. if (options.observe && !options.titleTemplate && document && !isReadonly) {
  6299. useMutationObserver(
  6300. (_b = document.head) == null ? void 0 : _b.querySelector("title"),
  6301. () => {
  6302. if (document && document.title !== title.value)
  6303. title.value = format(document.title);
  6304. },
  6305. { childList: true }
  6306. );
  6307. }
  6308. return title;
  6309. }
  6310. var __defProp = Object.defineProperty;
  6311. var __defProps = Object.defineProperties;
  6312. var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
  6313. var __getOwnPropSymbols = Object.getOwnPropertySymbols;
  6314. var __hasOwnProp = Object.prototype.hasOwnProperty;
  6315. var __propIsEnum = Object.prototype.propertyIsEnumerable;
  6316. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  6317. var __spreadValues = (a, b) => {
  6318. for (var prop in b || (b = {}))
  6319. if (__hasOwnProp.call(b, prop))
  6320. __defNormalProp(a, prop, b[prop]);
  6321. if (__getOwnPropSymbols)
  6322. for (var prop of __getOwnPropSymbols(b)) {
  6323. if (__propIsEnum.call(b, prop))
  6324. __defNormalProp(a, prop, b[prop]);
  6325. }
  6326. return a;
  6327. };
  6328. var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
  6329. const _TransitionPresets = {
  6330. easeInSine: [0.12, 0, 0.39, 0],
  6331. easeOutSine: [0.61, 1, 0.88, 1],
  6332. easeInOutSine: [0.37, 0, 0.63, 1],
  6333. easeInQuad: [0.11, 0, 0.5, 0],
  6334. easeOutQuad: [0.5, 1, 0.89, 1],
  6335. easeInOutQuad: [0.45, 0, 0.55, 1],
  6336. easeInCubic: [0.32, 0, 0.67, 0],
  6337. easeOutCubic: [0.33, 1, 0.68, 1],
  6338. easeInOutCubic: [0.65, 0, 0.35, 1],
  6339. easeInQuart: [0.5, 0, 0.75, 0],
  6340. easeOutQuart: [0.25, 1, 0.5, 1],
  6341. easeInOutQuart: [0.76, 0, 0.24, 1],
  6342. easeInQuint: [0.64, 0, 0.78, 0],
  6343. easeOutQuint: [0.22, 1, 0.36, 1],
  6344. easeInOutQuint: [0.83, 0, 0.17, 1],
  6345. easeInExpo: [0.7, 0, 0.84, 0],
  6346. easeOutExpo: [0.16, 1, 0.3, 1],
  6347. easeInOutExpo: [0.87, 0, 0.13, 1],
  6348. easeInCirc: [0.55, 0, 1, 0.45],
  6349. easeOutCirc: [0, 0.55, 0.45, 1],
  6350. easeInOutCirc: [0.85, 0, 0.15, 1],
  6351. easeInBack: [0.36, 0, 0.66, -0.56],
  6352. easeOutBack: [0.34, 1.56, 0.64, 1],
  6353. easeInOutBack: [0.68, -0.6, 0.32, 1.6]
  6354. };
  6355. const TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: shared.identity }, _TransitionPresets);
  6356. function createEasingFunction([p0, p1, p2, p3]) {
  6357. const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;
  6358. const b = (a1, a2) => 3 * a2 - 6 * a1;
  6359. const c = (a1) => 3 * a1;
  6360. const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;
  6361. const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);
  6362. const getTforX = (x) => {
  6363. let aGuessT = x;
  6364. for (let i = 0; i < 4; ++i) {
  6365. const currentSlope = getSlope(aGuessT, p0, p2);
  6366. if (currentSlope === 0)
  6367. return aGuessT;
  6368. const currentX = calcBezier(aGuessT, p0, p2) - x;
  6369. aGuessT -= currentX / currentSlope;
  6370. }
  6371. return aGuessT;
  6372. };
  6373. return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);
  6374. }
  6375. function lerp(a, b, alpha) {
  6376. return a + alpha * (b - a);
  6377. }
  6378. function toVec(t) {
  6379. return (typeof t === "number" ? [t] : t) || [];
  6380. }
  6381. function executeTransition(source, from, to, options = {}) {
  6382. var _a, _b;
  6383. const fromVal = shared.toValue(from);
  6384. const toVal = shared.toValue(to);
  6385. const v1 = toVec(fromVal);
  6386. const v2 = toVec(toVal);
  6387. const duration = (_a = shared.toValue(options.duration)) != null ? _a : 1e3;
  6388. const startedAt = Date.now();
  6389. const endAt = Date.now() + duration;
  6390. const trans = typeof options.transition === "function" ? options.transition : (_b = shared.toValue(options.transition)) != null ? _b : shared.identity;
  6391. const ease = typeof trans === "function" ? trans : createEasingFunction(trans);
  6392. return new Promise((resolve) => {
  6393. source.value = fromVal;
  6394. const tick = () => {
  6395. var _a2;
  6396. if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {
  6397. resolve();
  6398. return;
  6399. }
  6400. const now = Date.now();
  6401. const alpha = ease((now - startedAt) / duration);
  6402. const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));
  6403. if (Array.isArray(source.value))
  6404. source.value = arr.map((n, i) => {
  6405. var _a3, _b2;
  6406. return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);
  6407. });
  6408. else if (typeof source.value === "number")
  6409. source.value = arr[0];
  6410. if (now < endAt) {
  6411. requestAnimationFrame(tick);
  6412. } else {
  6413. source.value = toVal;
  6414. resolve();
  6415. }
  6416. };
  6417. tick();
  6418. });
  6419. }
  6420. function useTransition(source, options = {}) {
  6421. let currentId = 0;
  6422. const sourceVal = () => {
  6423. const v = shared.toValue(source);
  6424. return typeof v === "number" ? v : v.map(shared.toValue);
  6425. };
  6426. const outputRef = vueDemi.ref(sourceVal());
  6427. vueDemi.watch(sourceVal, async (to) => {
  6428. var _a, _b;
  6429. if (shared.toValue(options.disabled))
  6430. return;
  6431. const id = ++currentId;
  6432. if (options.delay)
  6433. await shared.promiseTimeout(shared.toValue(options.delay));
  6434. if (id !== currentId)
  6435. return;
  6436. const toVal = Array.isArray(to) ? to.map(shared.toValue) : shared.toValue(to);
  6437. (_a = options.onStarted) == null ? void 0 : _a.call(options);
  6438. await executeTransition(outputRef, outputRef.value, toVal, __spreadProps(__spreadValues({}, options), {
  6439. abort: () => {
  6440. var _a2;
  6441. return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));
  6442. }
  6443. }));
  6444. (_b = options.onFinished) == null ? void 0 : _b.call(options);
  6445. }, { deep: true });
  6446. vueDemi.watch(() => shared.toValue(options.disabled), (disabled) => {
  6447. if (disabled) {
  6448. currentId++;
  6449. outputRef.value = sourceVal();
  6450. }
  6451. });
  6452. shared.tryOnScopeDispose(() => {
  6453. currentId++;
  6454. });
  6455. return vueDemi.computed(() => shared.toValue(options.disabled) ? sourceVal() : outputRef.value);
  6456. }
  6457. function useUrlSearchParams(mode = "history", options = {}) {
  6458. const {
  6459. initialValue = {},
  6460. removeNullishValues = true,
  6461. removeFalsyValues = false,
  6462. write: enableWrite = true,
  6463. window = defaultWindow
  6464. } = options;
  6465. if (!window)
  6466. return vueDemi.reactive(initialValue);
  6467. const state = vueDemi.reactive({});
  6468. function getRawParams() {
  6469. if (mode === "history") {
  6470. return window.location.search || "";
  6471. } else if (mode === "hash") {
  6472. const hash = window.location.hash || "";
  6473. const index = hash.indexOf("?");
  6474. return index > 0 ? hash.slice(index) : "";
  6475. } else {
  6476. return (window.location.hash || "").replace(/^#/, "");
  6477. }
  6478. }
  6479. function constructQuery(params) {
  6480. const stringified = params.toString();
  6481. if (mode === "history")
  6482. return `${stringified ? `?${stringified}` : ""}${window.location.hash || ""}`;
  6483. if (mode === "hash-params")
  6484. return `${window.location.search || ""}${stringified ? `#${stringified}` : ""}`;
  6485. const hash = window.location.hash || "#";
  6486. const index = hash.indexOf("?");
  6487. if (index > 0)
  6488. return `${hash.slice(0, index)}${stringified ? `?${stringified}` : ""}`;
  6489. return `${hash}${stringified ? `?${stringified}` : ""}`;
  6490. }
  6491. function read() {
  6492. return new URLSearchParams(getRawParams());
  6493. }
  6494. function updateState(params) {
  6495. const unusedKeys = new Set(Object.keys(state));
  6496. for (const key of params.keys()) {
  6497. const paramsForKey = params.getAll(key);
  6498. state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || "";
  6499. unusedKeys.delete(key);
  6500. }
  6501. Array.from(unusedKeys).forEach((key) => delete state[key]);
  6502. }
  6503. const { pause, resume } = shared.pausableWatch(
  6504. state,
  6505. () => {
  6506. const params = new URLSearchParams("");
  6507. Object.keys(state).forEach((key) => {
  6508. const mapEntry = state[key];
  6509. if (Array.isArray(mapEntry))
  6510. mapEntry.forEach((value) => params.append(key, value));
  6511. else if (removeNullishValues && mapEntry == null)
  6512. params.delete(key);
  6513. else if (removeFalsyValues && !mapEntry)
  6514. params.delete(key);
  6515. else
  6516. params.set(key, mapEntry);
  6517. });
  6518. write(params);
  6519. },
  6520. { deep: true }
  6521. );
  6522. function write(params, shouldUpdate) {
  6523. pause();
  6524. if (shouldUpdate)
  6525. updateState(params);
  6526. window.history.replaceState(
  6527. window.history.state,
  6528. window.document.title,
  6529. window.location.pathname + constructQuery(params)
  6530. );
  6531. resume();
  6532. }
  6533. function onChanged() {
  6534. if (!enableWrite)
  6535. return;
  6536. write(read(), true);
  6537. }
  6538. useEventListener(window, "popstate", onChanged, false);
  6539. if (mode !== "history")
  6540. useEventListener(window, "hashchange", onChanged, false);
  6541. const initial = read();
  6542. if (initial.keys().next().value)
  6543. updateState(initial);
  6544. else
  6545. Object.assign(state, initialValue);
  6546. return state;
  6547. }
  6548. function useUserMedia(options = {}) {
  6549. var _a, _b;
  6550. const enabled = vueDemi.ref((_a = options.enabled) != null ? _a : false);
  6551. const autoSwitch = vueDemi.ref((_b = options.autoSwitch) != null ? _b : true);
  6552. const constraints = vueDemi.ref(options.constraints);
  6553. const { navigator = defaultNavigator } = options;
  6554. const isSupported = useSupported(() => {
  6555. var _a2;
  6556. return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;
  6557. });
  6558. const stream = vueDemi.shallowRef();
  6559. function getDeviceOptions(type) {
  6560. switch (type) {
  6561. case "video": {
  6562. if (constraints.value)
  6563. return constraints.value.video || false;
  6564. break;
  6565. }
  6566. case "audio": {
  6567. if (constraints.value)
  6568. return constraints.value.audio || false;
  6569. break;
  6570. }
  6571. }
  6572. }
  6573. async function _start() {
  6574. if (!isSupported.value || stream.value)
  6575. return;
  6576. stream.value = await navigator.mediaDevices.getUserMedia({
  6577. video: getDeviceOptions("video"),
  6578. audio: getDeviceOptions("audio")
  6579. });
  6580. return stream.value;
  6581. }
  6582. function _stop() {
  6583. var _a2;
  6584. (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());
  6585. stream.value = void 0;
  6586. }
  6587. function stop() {
  6588. _stop();
  6589. enabled.value = false;
  6590. }
  6591. async function start() {
  6592. await _start();
  6593. if (stream.value)
  6594. enabled.value = true;
  6595. return stream.value;
  6596. }
  6597. async function restart() {
  6598. _stop();
  6599. return await start();
  6600. }
  6601. vueDemi.watch(
  6602. enabled,
  6603. (v) => {
  6604. if (v)
  6605. _start();
  6606. else
  6607. _stop();
  6608. },
  6609. { immediate: true }
  6610. );
  6611. vueDemi.watch(
  6612. constraints,
  6613. () => {
  6614. if (autoSwitch.value && stream.value)
  6615. restart();
  6616. },
  6617. { immediate: true }
  6618. );
  6619. return {
  6620. isSupported,
  6621. stream,
  6622. start,
  6623. stop,
  6624. restart,
  6625. constraints,
  6626. enabled,
  6627. autoSwitch
  6628. };
  6629. }
  6630. function useVModel(props, key, emit, options = {}) {
  6631. var _a, _b, _c, _d, _e;
  6632. const {
  6633. clone = false,
  6634. passive = false,
  6635. eventName,
  6636. deep = false,
  6637. defaultValue,
  6638. shouldEmit
  6639. } = options;
  6640. const vm = vueDemi.getCurrentInstance();
  6641. const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));
  6642. let event = eventName;
  6643. if (!key) {
  6644. if (vueDemi.isVue2) {
  6645. const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;
  6646. key = (modelOptions == null ? void 0 : modelOptions.value) || "value";
  6647. if (!eventName)
  6648. event = (modelOptions == null ? void 0 : modelOptions.event) || "input";
  6649. } else {
  6650. key = "modelValue";
  6651. }
  6652. }
  6653. event = eventName || event || `update:${key.toString()}`;
  6654. const cloneFn = (val) => !clone ? val : typeof clone === "function" ? clone(val) : cloneFnJSON(val);
  6655. const getValue = () => shared.isDef(props[key]) ? cloneFn(props[key]) : defaultValue;
  6656. const triggerEmit = (value) => {
  6657. if (shouldEmit) {
  6658. if (shouldEmit(value))
  6659. _emit(event, value);
  6660. } else {
  6661. _emit(event, value);
  6662. }
  6663. };
  6664. if (passive) {
  6665. const initialValue = getValue();
  6666. const proxy = vueDemi.ref(initialValue);
  6667. vueDemi.watch(
  6668. () => props[key],
  6669. (v) => proxy.value = cloneFn(v)
  6670. );
  6671. vueDemi.watch(
  6672. proxy,
  6673. (v) => {
  6674. if (v !== props[key] || deep)
  6675. triggerEmit(v);
  6676. },
  6677. { deep }
  6678. );
  6679. return proxy;
  6680. } else {
  6681. return vueDemi.computed({
  6682. get() {
  6683. return getValue();
  6684. },
  6685. set(value) {
  6686. triggerEmit(value);
  6687. }
  6688. });
  6689. }
  6690. }
  6691. function useVModels(props, emit, options = {}) {
  6692. const ret = {};
  6693. for (const key in props)
  6694. ret[key] = useVModel(props, key, emit, options);
  6695. return ret;
  6696. }
  6697. function useVibrate(options) {
  6698. const {
  6699. pattern = [],
  6700. interval = 0,
  6701. navigator = defaultNavigator
  6702. } = options || {};
  6703. const isSupported = useSupported(() => typeof navigator !== "undefined" && "vibrate" in navigator);
  6704. const patternRef = shared.toRef(pattern);
  6705. let intervalControls;
  6706. const vibrate = (pattern2 = patternRef.value) => {
  6707. if (isSupported.value)
  6708. navigator.vibrate(pattern2);
  6709. };
  6710. const stop = () => {
  6711. if (isSupported.value)
  6712. navigator.vibrate(0);
  6713. intervalControls == null ? void 0 : intervalControls.pause();
  6714. };
  6715. if (interval > 0) {
  6716. intervalControls = shared.useIntervalFn(
  6717. vibrate,
  6718. interval,
  6719. {
  6720. immediate: false,
  6721. immediateCallback: false
  6722. }
  6723. );
  6724. }
  6725. return {
  6726. isSupported,
  6727. pattern,
  6728. intervalControls,
  6729. vibrate,
  6730. stop
  6731. };
  6732. }
  6733. function useVirtualList(list, options) {
  6734. const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = "itemHeight" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);
  6735. return {
  6736. list: currentList,
  6737. scrollTo,
  6738. containerProps: {
  6739. ref: containerRef,
  6740. onScroll: () => {
  6741. calculateRange();
  6742. },
  6743. style: containerStyle
  6744. },
  6745. wrapperProps
  6746. };
  6747. }
  6748. function useVirtualListResources(list) {
  6749. const containerRef = vueDemi.ref(null);
  6750. const size = useElementSize(containerRef);
  6751. const currentList = vueDemi.ref([]);
  6752. const source = vueDemi.shallowRef(list);
  6753. const state = vueDemi.ref({ start: 0, end: 10 });
  6754. return { state, source, currentList, size, containerRef };
  6755. }
  6756. function createGetViewCapacity(state, source, itemSize) {
  6757. return (containerSize) => {
  6758. if (typeof itemSize === "number")
  6759. return Math.ceil(containerSize / itemSize);
  6760. const { start = 0 } = state.value;
  6761. let sum = 0;
  6762. let capacity = 0;
  6763. for (let i = start; i < source.value.length; i++) {
  6764. const size = itemSize(i);
  6765. sum += size;
  6766. capacity = i;
  6767. if (sum > containerSize)
  6768. break;
  6769. }
  6770. return capacity - start;
  6771. };
  6772. }
  6773. function createGetOffset(source, itemSize) {
  6774. return (scrollDirection) => {
  6775. if (typeof itemSize === "number")
  6776. return Math.floor(scrollDirection / itemSize) + 1;
  6777. let sum = 0;
  6778. let offset = 0;
  6779. for (let i = 0; i < source.value.length; i++) {
  6780. const size = itemSize(i);
  6781. sum += size;
  6782. if (sum >= scrollDirection) {
  6783. offset = i;
  6784. break;
  6785. }
  6786. }
  6787. return offset + 1;
  6788. };
  6789. }
  6790. function createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {
  6791. return () => {
  6792. const element = containerRef.value;
  6793. if (element) {
  6794. const offset = getOffset(type === "vertical" ? element.scrollTop : element.scrollLeft);
  6795. const viewCapacity = getViewCapacity(type === "vertical" ? element.clientHeight : element.clientWidth);
  6796. const from = offset - overscan;
  6797. const to = offset + viewCapacity + overscan;
  6798. state.value = {
  6799. start: from < 0 ? 0 : from,
  6800. end: to > source.value.length ? source.value.length : to
  6801. };
  6802. currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({
  6803. data: ele,
  6804. index: index + state.value.start
  6805. }));
  6806. }
  6807. };
  6808. }
  6809. function createGetDistance(itemSize, source) {
  6810. return (index) => {
  6811. if (typeof itemSize === "number") {
  6812. const size2 = index * itemSize;
  6813. return size2;
  6814. }
  6815. const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);
  6816. return size;
  6817. };
  6818. }
  6819. function useWatchForSizes(size, list, calculateRange) {
  6820. vueDemi.watch([size.width, size.height, list], () => {
  6821. calculateRange();
  6822. });
  6823. }
  6824. function createComputedTotalSize(itemSize, source) {
  6825. return vueDemi.computed(() => {
  6826. if (typeof itemSize === "number")
  6827. return source.value.length * itemSize;
  6828. return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);
  6829. });
  6830. }
  6831. const scrollToDictionaryForElementScrollKey = {
  6832. horizontal: "scrollLeft",
  6833. vertical: "scrollTop"
  6834. };
  6835. function createScrollTo(type, calculateRange, getDistance, containerRef) {
  6836. return (index) => {
  6837. if (containerRef.value) {
  6838. containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);
  6839. calculateRange();
  6840. }
  6841. };
  6842. }
  6843. function useHorizontalVirtualList(options, list) {
  6844. const resources = useVirtualListResources(list);
  6845. const { state, source, currentList, size, containerRef } = resources;
  6846. const containerStyle = { overflowX: "auto" };
  6847. const { itemWidth, overscan = 5 } = options;
  6848. const getViewCapacity = createGetViewCapacity(state, source, itemWidth);
  6849. const getOffset = createGetOffset(source, itemWidth);
  6850. const calculateRange = createCalculateRange("horizontal", overscan, getOffset, getViewCapacity, resources);
  6851. const getDistanceLeft = createGetDistance(itemWidth, source);
  6852. const offsetLeft = vueDemi.computed(() => getDistanceLeft(state.value.start));
  6853. const totalWidth = createComputedTotalSize(itemWidth, source);
  6854. useWatchForSizes(size, list, calculateRange);
  6855. const scrollTo = createScrollTo("horizontal", calculateRange, getDistanceLeft, containerRef);
  6856. const wrapperProps = vueDemi.computed(() => {
  6857. return {
  6858. style: {
  6859. height: "100%",
  6860. width: `${totalWidth.value - offsetLeft.value}px`,
  6861. marginLeft: `${offsetLeft.value}px`,
  6862. display: "flex"
  6863. }
  6864. };
  6865. });
  6866. return {
  6867. scrollTo,
  6868. calculateRange,
  6869. wrapperProps,
  6870. containerStyle,
  6871. currentList,
  6872. containerRef
  6873. };
  6874. }
  6875. function useVerticalVirtualList(options, list) {
  6876. const resources = useVirtualListResources(list);
  6877. const { state, source, currentList, size, containerRef } = resources;
  6878. const containerStyle = { overflowY: "auto" };
  6879. const { itemHeight, overscan = 5 } = options;
  6880. const getViewCapacity = createGetViewCapacity(state, source, itemHeight);
  6881. const getOffset = createGetOffset(source, itemHeight);
  6882. const calculateRange = createCalculateRange("vertical", overscan, getOffset, getViewCapacity, resources);
  6883. const getDistanceTop = createGetDistance(itemHeight, source);
  6884. const offsetTop = vueDemi.computed(() => getDistanceTop(state.value.start));
  6885. const totalHeight = createComputedTotalSize(itemHeight, source);
  6886. useWatchForSizes(size, list, calculateRange);
  6887. const scrollTo = createScrollTo("vertical", calculateRange, getDistanceTop, containerRef);
  6888. const wrapperProps = vueDemi.computed(() => {
  6889. return {
  6890. style: {
  6891. width: "100%",
  6892. height: `${totalHeight.value - offsetTop.value}px`,
  6893. marginTop: `${offsetTop.value}px`
  6894. }
  6895. };
  6896. });
  6897. return {
  6898. calculateRange,
  6899. scrollTo,
  6900. containerStyle,
  6901. wrapperProps,
  6902. currentList,
  6903. containerRef
  6904. };
  6905. }
  6906. function useWakeLock(options = {}) {
  6907. const {
  6908. navigator = defaultNavigator,
  6909. document = defaultDocument
  6910. } = options;
  6911. let wakeLock;
  6912. const isSupported = useSupported(() => navigator && "wakeLock" in navigator);
  6913. const isActive = vueDemi.ref(false);
  6914. async function onVisibilityChange() {
  6915. if (!isSupported.value || !wakeLock)
  6916. return;
  6917. if (document && document.visibilityState === "visible")
  6918. wakeLock = await navigator.wakeLock.request("screen");
  6919. isActive.value = !wakeLock.released;
  6920. }
  6921. if (document)
  6922. useEventListener(document, "visibilitychange", onVisibilityChange, { passive: true });
  6923. async function request(type) {
  6924. if (!isSupported.value)
  6925. return;
  6926. wakeLock = await navigator.wakeLock.request(type);
  6927. isActive.value = !wakeLock.released;
  6928. }
  6929. async function release() {
  6930. if (!isSupported.value || !wakeLock)
  6931. return;
  6932. await wakeLock.release();
  6933. isActive.value = !wakeLock.released;
  6934. wakeLock = null;
  6935. }
  6936. return {
  6937. isSupported,
  6938. isActive,
  6939. request,
  6940. release
  6941. };
  6942. }
  6943. function useWebNotification(defaultOptions = {}) {
  6944. const {
  6945. window = defaultWindow
  6946. } = defaultOptions;
  6947. const isSupported = useSupported(() => !!window && "Notification" in window);
  6948. const notification = vueDemi.ref(null);
  6949. const requestPermission = async () => {
  6950. if (!isSupported.value)
  6951. return;
  6952. if ("permission" in Notification && Notification.permission !== "denied")
  6953. await Notification.requestPermission();
  6954. };
  6955. const { on: onClick, trigger: clickTrigger } = shared.createEventHook();
  6956. const { on: onShow, trigger: showTrigger } = shared.createEventHook();
  6957. const { on: onError, trigger: errorTrigger } = shared.createEventHook();
  6958. const { on: onClose, trigger: closeTrigger } = shared.createEventHook();
  6959. const show = async (overrides) => {
  6960. if (!isSupported.value)
  6961. return;
  6962. await requestPermission();
  6963. const options = Object.assign({}, defaultOptions, overrides);
  6964. notification.value = new Notification(options.title || "", options);
  6965. notification.value.onclick = clickTrigger;
  6966. notification.value.onshow = showTrigger;
  6967. notification.value.onerror = errorTrigger;
  6968. notification.value.onclose = closeTrigger;
  6969. return notification.value;
  6970. };
  6971. const close = () => {
  6972. if (notification.value)
  6973. notification.value.close();
  6974. notification.value = null;
  6975. };
  6976. shared.tryOnMounted(async () => {
  6977. if (isSupported.value)
  6978. await requestPermission();
  6979. });
  6980. shared.tryOnScopeDispose(close);
  6981. if (isSupported.value && window) {
  6982. const document = window.document;
  6983. useEventListener(document, "visibilitychange", (e) => {
  6984. e.preventDefault();
  6985. if (document.visibilityState === "visible") {
  6986. close();
  6987. }
  6988. });
  6989. }
  6990. return {
  6991. isSupported,
  6992. notification,
  6993. show,
  6994. close,
  6995. onClick,
  6996. onShow,
  6997. onError,
  6998. onClose
  6999. };
  7000. }
  7001. const DEFAULT_PING_MESSAGE = "ping";
  7002. function resolveNestedOptions(options) {
  7003. if (options === true)
  7004. return {};
  7005. return options;
  7006. }
  7007. function useWebSocket(url, options = {}) {
  7008. const {
  7009. onConnected,
  7010. onDisconnected,
  7011. onError,
  7012. onMessage,
  7013. immediate = true,
  7014. autoClose = true,
  7015. protocols = []
  7016. } = options;
  7017. const data = vueDemi.ref(null);
  7018. const status = vueDemi.ref("CLOSED");
  7019. const wsRef = vueDemi.ref();
  7020. const urlRef = shared.toRef(url);
  7021. let heartbeatPause;
  7022. let heartbeatResume;
  7023. let explicitlyClosed = false;
  7024. let retried = 0;
  7025. let bufferedData = [];
  7026. let pongTimeoutWait;
  7027. const close = (code = 1e3, reason) => {
  7028. if (!wsRef.value)
  7029. return;
  7030. explicitlyClosed = true;
  7031. heartbeatPause == null ? void 0 : heartbeatPause();
  7032. wsRef.value.close(code, reason);
  7033. };
  7034. const _sendBuffer = () => {
  7035. if (bufferedData.length && wsRef.value && status.value === "OPEN") {
  7036. for (const buffer of bufferedData)
  7037. wsRef.value.send(buffer);
  7038. bufferedData = [];
  7039. }
  7040. };
  7041. const resetHeartbeat = () => {
  7042. clearTimeout(pongTimeoutWait);
  7043. pongTimeoutWait = void 0;
  7044. };
  7045. const send = (data2, useBuffer = true) => {
  7046. if (!wsRef.value || status.value !== "OPEN") {
  7047. if (useBuffer)
  7048. bufferedData.push(data2);
  7049. return false;
  7050. }
  7051. _sendBuffer();
  7052. wsRef.value.send(data2);
  7053. return true;
  7054. };
  7055. const _init = () => {
  7056. if (explicitlyClosed || typeof urlRef.value === "undefined")
  7057. return;
  7058. const ws = new WebSocket(urlRef.value, protocols);
  7059. wsRef.value = ws;
  7060. status.value = "CONNECTING";
  7061. ws.onopen = () => {
  7062. status.value = "OPEN";
  7063. onConnected == null ? void 0 : onConnected(ws);
  7064. heartbeatResume == null ? void 0 : heartbeatResume();
  7065. _sendBuffer();
  7066. };
  7067. ws.onclose = (ev) => {
  7068. status.value = "CLOSED";
  7069. wsRef.value = void 0;
  7070. onDisconnected == null ? void 0 : onDisconnected(ws, ev);
  7071. if (!explicitlyClosed && options.autoReconnect) {
  7072. const {
  7073. retries = -1,
  7074. delay = 1e3,
  7075. onFailed
  7076. } = resolveNestedOptions(options.autoReconnect);
  7077. retried += 1;
  7078. if (typeof retries === "number" && (retries < 0 || retried < retries))
  7079. setTimeout(_init, delay);
  7080. else if (typeof retries === "function" && retries())
  7081. setTimeout(_init, delay);
  7082. else
  7083. onFailed == null ? void 0 : onFailed();
  7084. }
  7085. };
  7086. ws.onerror = (e) => {
  7087. onError == null ? void 0 : onError(ws, e);
  7088. };
  7089. ws.onmessage = (e) => {
  7090. if (options.heartbeat) {
  7091. resetHeartbeat();
  7092. const {
  7093. message = DEFAULT_PING_MESSAGE
  7094. } = resolveNestedOptions(options.heartbeat);
  7095. if (e.data === message)
  7096. return;
  7097. }
  7098. data.value = e.data;
  7099. onMessage == null ? void 0 : onMessage(ws, e);
  7100. };
  7101. };
  7102. if (options.heartbeat) {
  7103. const {
  7104. message = DEFAULT_PING_MESSAGE,
  7105. interval = 1e3,
  7106. pongTimeout = 1e3
  7107. } = resolveNestedOptions(options.heartbeat);
  7108. const { pause, resume } = shared.useIntervalFn(
  7109. () => {
  7110. send(message, false);
  7111. if (pongTimeoutWait != null)
  7112. return;
  7113. pongTimeoutWait = setTimeout(() => {
  7114. close();
  7115. }, pongTimeout);
  7116. },
  7117. interval,
  7118. { immediate: false }
  7119. );
  7120. heartbeatPause = pause;
  7121. heartbeatResume = resume;
  7122. }
  7123. if (autoClose) {
  7124. useEventListener(window, "beforeunload", () => close());
  7125. shared.tryOnScopeDispose(close);
  7126. }
  7127. const open = () => {
  7128. close();
  7129. explicitlyClosed = false;
  7130. retried = 0;
  7131. _init();
  7132. };
  7133. if (immediate)
  7134. vueDemi.watch(urlRef, open, { immediate: true });
  7135. return {
  7136. data,
  7137. status,
  7138. close,
  7139. send,
  7140. open,
  7141. ws: wsRef
  7142. };
  7143. }
  7144. function useWebWorker(arg0, workerOptions, options) {
  7145. const {
  7146. window = defaultWindow
  7147. } = options != null ? options : {};
  7148. const data = vueDemi.ref(null);
  7149. const worker = vueDemi.shallowRef();
  7150. const post = function post2(val) {
  7151. if (!worker.value)
  7152. return;
  7153. worker.value.postMessage(val);
  7154. };
  7155. const terminate = function terminate2() {
  7156. if (!worker.value)
  7157. return;
  7158. worker.value.terminate();
  7159. };
  7160. if (window) {
  7161. if (typeof arg0 === "string")
  7162. worker.value = new Worker(arg0, workerOptions);
  7163. else if (typeof arg0 === "function")
  7164. worker.value = arg0();
  7165. else
  7166. worker.value = arg0;
  7167. worker.value.onmessage = (e) => {
  7168. data.value = e.data;
  7169. };
  7170. shared.tryOnScopeDispose(() => {
  7171. if (worker.value)
  7172. worker.value.terminate();
  7173. });
  7174. }
  7175. return {
  7176. data,
  7177. post,
  7178. terminate,
  7179. worker
  7180. };
  7181. }
  7182. function jobRunner(userFunc) {
  7183. return (e) => {
  7184. const userFuncArgs = e.data[0];
  7185. return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {
  7186. postMessage(["SUCCESS", result]);
  7187. }).catch((error) => {
  7188. postMessage(["ERROR", error]);
  7189. });
  7190. };
  7191. }
  7192. function depsParser(deps) {
  7193. if (deps.length === 0)
  7194. return "";
  7195. const depsString = deps.map((dep) => `'${dep}'`).toString();
  7196. return `importScripts(${depsString})`;
  7197. }
  7198. function createWorkerBlobUrl(fn, deps) {
  7199. const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;
  7200. const blob = new Blob([blobCode], { type: "text/javascript" });
  7201. const url = URL.createObjectURL(blob);
  7202. return url;
  7203. }
  7204. function useWebWorkerFn(fn, options = {}) {
  7205. const {
  7206. dependencies = [],
  7207. timeout,
  7208. window = defaultWindow
  7209. } = options;
  7210. const worker = vueDemi.ref();
  7211. const workerStatus = vueDemi.ref("PENDING");
  7212. const promise = vueDemi.ref({});
  7213. const timeoutId = vueDemi.ref();
  7214. const workerTerminate = (status = "PENDING") => {
  7215. if (worker.value && worker.value._url && window) {
  7216. worker.value.terminate();
  7217. URL.revokeObjectURL(worker.value._url);
  7218. promise.value = {};
  7219. worker.value = void 0;
  7220. window.clearTimeout(timeoutId.value);
  7221. workerStatus.value = status;
  7222. }
  7223. };
  7224. workerTerminate();
  7225. shared.tryOnScopeDispose(workerTerminate);
  7226. const generateWorker = () => {
  7227. const blobUrl = createWorkerBlobUrl(fn, dependencies);
  7228. const newWorker = new Worker(blobUrl);
  7229. newWorker._url = blobUrl;
  7230. newWorker.onmessage = (e) => {
  7231. const { resolve = () => {
  7232. }, reject = () => {
  7233. } } = promise.value;
  7234. const [status, result] = e.data;
  7235. switch (status) {
  7236. case "SUCCESS":
  7237. resolve(result);
  7238. workerTerminate(status);
  7239. break;
  7240. default:
  7241. reject(result);
  7242. workerTerminate("ERROR");
  7243. break;
  7244. }
  7245. };
  7246. newWorker.onerror = (e) => {
  7247. const { reject = () => {
  7248. } } = promise.value;
  7249. reject(e);
  7250. workerTerminate("ERROR");
  7251. };
  7252. if (timeout) {
  7253. timeoutId.value = setTimeout(
  7254. () => workerTerminate("TIMEOUT_EXPIRED"),
  7255. timeout
  7256. );
  7257. }
  7258. return newWorker;
  7259. };
  7260. const callWorker = (...fnArgs) => new Promise((resolve, reject) => {
  7261. promise.value = {
  7262. resolve,
  7263. reject
  7264. };
  7265. worker.value && worker.value.postMessage([[...fnArgs]]);
  7266. workerStatus.value = "RUNNING";
  7267. });
  7268. const workerFn = (...fnArgs) => {
  7269. if (workerStatus.value === "RUNNING") {
  7270. console.error(
  7271. "[useWebWorkerFn] You can only run one instance of the worker at a time."
  7272. );
  7273. return Promise.reject();
  7274. }
  7275. worker.value = generateWorker();
  7276. return callWorker(...fnArgs);
  7277. };
  7278. return {
  7279. workerFn,
  7280. workerStatus,
  7281. workerTerminate
  7282. };
  7283. }
  7284. function useWindowFocus({ window = defaultWindow } = {}) {
  7285. if (!window)
  7286. return vueDemi.ref(false);
  7287. const focused = vueDemi.ref(window.document.hasFocus());
  7288. useEventListener(window, "blur", () => {
  7289. focused.value = false;
  7290. });
  7291. useEventListener(window, "focus", () => {
  7292. focused.value = true;
  7293. });
  7294. return focused;
  7295. }
  7296. function useWindowScroll({ window = defaultWindow } = {}) {
  7297. if (!window) {
  7298. return {
  7299. x: vueDemi.ref(0),
  7300. y: vueDemi.ref(0)
  7301. };
  7302. }
  7303. const x = vueDemi.ref(window.scrollX);
  7304. const y = vueDemi.ref(window.scrollY);
  7305. useEventListener(
  7306. window,
  7307. "scroll",
  7308. () => {
  7309. x.value = window.scrollX;
  7310. y.value = window.scrollY;
  7311. },
  7312. {
  7313. capture: false,
  7314. passive: true
  7315. }
  7316. );
  7317. return { x, y };
  7318. }
  7319. function useWindowSize(options = {}) {
  7320. const {
  7321. window = defaultWindow,
  7322. initialWidth = Infinity,
  7323. initialHeight = Infinity,
  7324. listenOrientation = true,
  7325. includeScrollbar = true
  7326. } = options;
  7327. const width = vueDemi.ref(initialWidth);
  7328. const height = vueDemi.ref(initialHeight);
  7329. const update = () => {
  7330. if (window) {
  7331. if (includeScrollbar) {
  7332. width.value = window.innerWidth;
  7333. height.value = window.innerHeight;
  7334. } else {
  7335. width.value = window.document.documentElement.clientWidth;
  7336. height.value = window.document.documentElement.clientHeight;
  7337. }
  7338. }
  7339. };
  7340. update();
  7341. shared.tryOnMounted(update);
  7342. useEventListener("resize", update, { passive: true });
  7343. if (listenOrientation) {
  7344. const matches = useMediaQuery("(orientation: portrait)");
  7345. vueDemi.watch(matches, () => update());
  7346. }
  7347. return { width, height };
  7348. }
  7349. exports.DefaultMagicKeysAliasMap = DefaultMagicKeysAliasMap;
  7350. exports.StorageSerializers = StorageSerializers;
  7351. exports.TransitionPresets = TransitionPresets;
  7352. exports.asyncComputed = computedAsync;
  7353. exports.breakpointsAntDesign = breakpointsAntDesign;
  7354. exports.breakpointsBootstrapV5 = breakpointsBootstrapV5;
  7355. exports.breakpointsMasterCss = breakpointsMasterCss;
  7356. exports.breakpointsQuasar = breakpointsQuasar;
  7357. exports.breakpointsSematic = breakpointsSematic;
  7358. exports.breakpointsTailwind = breakpointsTailwind;
  7359. exports.breakpointsVuetify = breakpointsVuetify;
  7360. exports.cloneFnJSON = cloneFnJSON;
  7361. exports.computedAsync = computedAsync;
  7362. exports.computedInject = computedInject;
  7363. exports.createFetch = createFetch;
  7364. exports.createReusableTemplate = createReusableTemplate;
  7365. exports.createTemplatePromise = createTemplatePromise;
  7366. exports.createUnrefFn = createUnrefFn;
  7367. exports.customStorageEventName = customStorageEventName;
  7368. exports.defaultDocument = defaultDocument;
  7369. exports.defaultLocation = defaultLocation;
  7370. exports.defaultNavigator = defaultNavigator;
  7371. exports.defaultWindow = defaultWindow;
  7372. exports.executeTransition = executeTransition;
  7373. exports.formatTimeAgo = formatTimeAgo;
  7374. exports.getSSRHandler = getSSRHandler;
  7375. exports.mapGamepadToXbox360Controller = mapGamepadToXbox360Controller;
  7376. exports.onClickOutside = onClickOutside;
  7377. exports.onKeyDown = onKeyDown;
  7378. exports.onKeyPressed = onKeyPressed;
  7379. exports.onKeyStroke = onKeyStroke;
  7380. exports.onKeyUp = onKeyUp;
  7381. exports.onLongPress = onLongPress;
  7382. exports.onStartTyping = onStartTyping;
  7383. exports.setSSRHandler = setSSRHandler;
  7384. exports.templateRef = templateRef;
  7385. exports.unrefElement = unrefElement;
  7386. exports.useActiveElement = useActiveElement;
  7387. exports.useAnimate = useAnimate;
  7388. exports.useAsyncQueue = useAsyncQueue;
  7389. exports.useAsyncState = useAsyncState;
  7390. exports.useBase64 = useBase64;
  7391. exports.useBattery = useBattery;
  7392. exports.useBluetooth = useBluetooth;
  7393. exports.useBreakpoints = useBreakpoints;
  7394. exports.useBroadcastChannel = useBroadcastChannel;
  7395. exports.useBrowserLocation = useBrowserLocation;
  7396. exports.useCached = useCached;
  7397. exports.useClipboard = useClipboard;
  7398. exports.useCloned = useCloned;
  7399. exports.useColorMode = useColorMode;
  7400. exports.useConfirmDialog = useConfirmDialog;
  7401. exports.useCssVar = useCssVar;
  7402. exports.useCurrentElement = useCurrentElement;
  7403. exports.useCycleList = useCycleList;
  7404. exports.useDark = useDark;
  7405. exports.useDebouncedRefHistory = useDebouncedRefHistory;
  7406. exports.useDeviceMotion = useDeviceMotion;
  7407. exports.useDeviceOrientation = useDeviceOrientation;
  7408. exports.useDevicePixelRatio = useDevicePixelRatio;
  7409. exports.useDevicesList = useDevicesList;
  7410. exports.useDisplayMedia = useDisplayMedia;
  7411. exports.useDocumentVisibility = useDocumentVisibility;
  7412. exports.useDraggable = useDraggable;
  7413. exports.useDropZone = useDropZone;
  7414. exports.useElementBounding = useElementBounding;
  7415. exports.useElementByPoint = useElementByPoint;
  7416. exports.useElementHover = useElementHover;
  7417. exports.useElementSize = useElementSize;
  7418. exports.useElementVisibility = useElementVisibility;
  7419. exports.useEventBus = useEventBus;
  7420. exports.useEventListener = useEventListener;
  7421. exports.useEventSource = useEventSource;
  7422. exports.useEyeDropper = useEyeDropper;
  7423. exports.useFavicon = useFavicon;
  7424. exports.useFetch = useFetch;
  7425. exports.useFileDialog = useFileDialog;
  7426. exports.useFileSystemAccess = useFileSystemAccess;
  7427. exports.useFocus = useFocus;
  7428. exports.useFocusWithin = useFocusWithin;
  7429. exports.useFps = useFps;
  7430. exports.useFullscreen = useFullscreen;
  7431. exports.useGamepad = useGamepad;
  7432. exports.useGeolocation = useGeolocation;
  7433. exports.useIdle = useIdle;
  7434. exports.useImage = useImage;
  7435. exports.useInfiniteScroll = useInfiniteScroll;
  7436. exports.useIntersectionObserver = useIntersectionObserver;
  7437. exports.useKeyModifier = useKeyModifier;
  7438. exports.useLocalStorage = useLocalStorage;
  7439. exports.useMagicKeys = useMagicKeys;
  7440. exports.useManualRefHistory = useManualRefHistory;
  7441. exports.useMediaControls = useMediaControls;
  7442. exports.useMediaQuery = useMediaQuery;
  7443. exports.useMemoize = useMemoize;
  7444. exports.useMemory = useMemory;
  7445. exports.useMounted = useMounted;
  7446. exports.useMouse = useMouse;
  7447. exports.useMouseInElement = useMouseInElement;
  7448. exports.useMousePressed = useMousePressed;
  7449. exports.useMutationObserver = useMutationObserver;
  7450. exports.useNavigatorLanguage = useNavigatorLanguage;
  7451. exports.useNetwork = useNetwork;
  7452. exports.useNow = useNow;
  7453. exports.useObjectUrl = useObjectUrl;
  7454. exports.useOffsetPagination = useOffsetPagination;
  7455. exports.useOnline = useOnline;
  7456. exports.usePageLeave = usePageLeave;
  7457. exports.useParallax = useParallax;
  7458. exports.useParentElement = useParentElement;
  7459. exports.usePerformanceObserver = usePerformanceObserver;
  7460. exports.usePermission = usePermission;
  7461. exports.usePointer = usePointer;
  7462. exports.usePointerLock = usePointerLock;
  7463. exports.usePointerSwipe = usePointerSwipe;
  7464. exports.usePreferredColorScheme = usePreferredColorScheme;
  7465. exports.usePreferredContrast = usePreferredContrast;
  7466. exports.usePreferredDark = usePreferredDark;
  7467. exports.usePreferredLanguages = usePreferredLanguages;
  7468. exports.usePreferredReducedMotion = usePreferredReducedMotion;
  7469. exports.usePrevious = usePrevious;
  7470. exports.useRafFn = useRafFn;
  7471. exports.useRefHistory = useRefHistory;
  7472. exports.useResizeObserver = useResizeObserver;
  7473. exports.useScreenOrientation = useScreenOrientation;
  7474. exports.useScreenSafeArea = useScreenSafeArea;
  7475. exports.useScriptTag = useScriptTag;
  7476. exports.useScroll = useScroll;
  7477. exports.useScrollLock = useScrollLock;
  7478. exports.useSessionStorage = useSessionStorage;
  7479. exports.useShare = useShare;
  7480. exports.useSorted = useSorted;
  7481. exports.useSpeechRecognition = useSpeechRecognition;
  7482. exports.useSpeechSynthesis = useSpeechSynthesis;
  7483. exports.useStepper = useStepper;
  7484. exports.useStorage = useStorage;
  7485. exports.useStorageAsync = useStorageAsync;
  7486. exports.useStyleTag = useStyleTag;
  7487. exports.useSupported = useSupported;
  7488. exports.useSwipe = useSwipe;
  7489. exports.useTemplateRefsList = useTemplateRefsList;
  7490. exports.useTextDirection = useTextDirection;
  7491. exports.useTextSelection = useTextSelection;
  7492. exports.useTextareaAutosize = useTextareaAutosize;
  7493. exports.useThrottledRefHistory = useThrottledRefHistory;
  7494. exports.useTimeAgo = useTimeAgo;
  7495. exports.useTimeoutPoll = useTimeoutPoll;
  7496. exports.useTimestamp = useTimestamp;
  7497. exports.useTitle = useTitle;
  7498. exports.useTransition = useTransition;
  7499. exports.useUrlSearchParams = useUrlSearchParams;
  7500. exports.useUserMedia = useUserMedia;
  7501. exports.useVModel = useVModel;
  7502. exports.useVModels = useVModels;
  7503. exports.useVibrate = useVibrate;
  7504. exports.useVirtualList = useVirtualList;
  7505. exports.useWakeLock = useWakeLock;
  7506. exports.useWebNotification = useWebNotification;
  7507. exports.useWebSocket = useWebSocket;
  7508. exports.useWebWorker = useWebWorker;
  7509. exports.useWebWorkerFn = useWebWorkerFn;
  7510. exports.useWindowFocus = useWindowFocus;
  7511. exports.useWindowScroll = useWindowScroll;
  7512. exports.useWindowSize = useWindowSize;
  7513. Object.keys(shared).forEach(function (k) {
  7514. if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
  7515. enumerable: true,
  7516. get: function () { return shared[k]; }
  7517. });
  7518. });
  7519. })(this.VueUse = this.VueUse || {}, VueUse, VueDemi);