123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753 |
- import {
- Fragment,
- TransitionGroup,
- computed,
- customRef,
- defineComponent,
- effectScope,
- getCurrentInstance,
- getCurrentScope,
- h,
- inject,
- isReactive,
- isReadonly,
- isRef,
- markRaw,
- nextTick,
- onBeforeMount,
- onBeforeUnmount,
- onBeforeUpdate,
- onMounted,
- onScopeDispose,
- onUnmounted,
- onUpdated,
- provide,
- reactive,
- readonly,
- ref,
- shallowReactive,
- shallowRef,
- toRef,
- toRefs,
- unref,
- version,
- watch,
- watchEffect,
- } from './chunk-Z6W6QRLO.js';
- // ../node_modules/.pnpm/vitepress@1.2.2_@algolia+client-search@4.23.3_@types+node@20.12.12_async-validator@4.2.5_axio_5jctzjtewfbzj62xdve5deaagi/node_modules/vitepress/lib/vue-demi.mjs
- var isVue2 = false;
- var isVue3 = true;
- function set(target, key, val) {
- if (Array.isArray(target)) {
- target.length = Math.max(target.length, key);
- target.splice(key, 1, val);
- return val;
- }
- target[key] = val;
- return val;
- }
- function del(target, key) {
- if (Array.isArray(target)) {
- target.splice(key, 1);
- return;
- }
- delete target[key];
- }
- // ../node_modules/.pnpm/@vueuse+shared@10.9.0_vue@3.4.27_typescript@5.4.5_/node_modules/@vueuse/shared/index.mjs
- function computedEager(fn, options) {
- var _a;
- const result = shallowRef();
- watchEffect(
- () => {
- result.value = fn();
- },
- {
- ...options,
- flush:
- (_a = options == null ? void 0 : options.flush) != null ? _a : 'sync',
- },
- );
- return readonly(result);
- }
- function computedWithControl(source, fn) {
- let v = void 0;
- let track;
- let trigger;
- const dirty = ref(true);
- const update = () => {
- dirty.value = true;
- trigger();
- };
- watch(source, update, { flush: 'sync' });
- const get2 = typeof fn === 'function' ? fn : fn.get;
- const set3 = typeof fn === 'function' ? void 0 : fn.set;
- const result = customRef((_track, _trigger) => {
- track = _track;
- trigger = _trigger;
- return {
- get() {
- if (dirty.value) {
- v = get2();
- dirty.value = false;
- }
- track();
- return v;
- },
- set(v2) {
- set3 == null ? void 0 : set3(v2);
- },
- };
- });
- if (Object.isExtensible(result)) result.trigger = update;
- return result;
- }
- function tryOnScopeDispose(fn) {
- if (getCurrentScope()) {
- onScopeDispose(fn);
- return true;
- }
- return false;
- }
- function createEventHook() {
- const fns = /* @__PURE__ */ new Set();
- const off = (fn) => {
- fns.delete(fn);
- };
- const on = (fn) => {
- fns.add(fn);
- const offFn = () => off(fn);
- tryOnScopeDispose(offFn);
- return {
- off: offFn,
- };
- };
- const trigger = (...args) => {
- return Promise.all(Array.from(fns).map((fn) => fn(...args)));
- };
- return {
- on,
- off,
- trigger,
- };
- }
- function createGlobalState(stateFactory) {
- let initialized = false;
- let state;
- const scope = effectScope(true);
- return (...args) => {
- if (!initialized) {
- state = scope.run(() => stateFactory(...args));
- initialized = true;
- }
- return state;
- };
- }
- var localProvidedStateMap = /* @__PURE__ */ new WeakMap();
- var provideLocal = (key, value) => {
- var _a;
- const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;
- if (instance == null) throw new Error('provideLocal must be called in setup');
- if (!localProvidedStateMap.has(instance))
- localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));
- const localProvidedState = localProvidedStateMap.get(instance);
- localProvidedState[key] = value;
- provide(key, value);
- };
- var injectLocal = (...args) => {
- var _a;
- const key = args[0];
- const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;
- if (instance == null) throw new Error('injectLocal must be called in setup');
- if (
- localProvidedStateMap.has(instance) &&
- key in localProvidedStateMap.get(instance)
- )
- return localProvidedStateMap.get(instance)[key];
- return inject(...args);
- };
- function createInjectionState(composable, options) {
- const key =
- (options == null ? void 0 : options.injectionKey) ||
- Symbol(composable.name || 'InjectionState');
- const useProvidingState = (...args) => {
- const state = composable(...args);
- provideLocal(key, state);
- return state;
- };
- const useInjectedState = () => injectLocal(key);
- return [useProvidingState, useInjectedState];
- }
- function createSharedComposable(composable) {
- let subscribers = 0;
- let state;
- let scope;
- const dispose = () => {
- subscribers -= 1;
- if (scope && subscribers <= 0) {
- scope.stop();
- state = void 0;
- scope = void 0;
- }
- };
- return (...args) => {
- subscribers += 1;
- if (!state) {
- scope = effectScope(true);
- state = scope.run(() => composable(...args));
- }
- tryOnScopeDispose(dispose);
- return state;
- };
- }
- function extendRef(ref2, extend, { enumerable = false, unwrap = true } = {}) {
- if (!isVue3 && !version.startsWith('2.7.')) {
- if (true)
- throw new Error('[VueUse] extendRef only works in Vue 2.7 or above.');
- return;
- }
- for (const [key, value] of Object.entries(extend)) {
- if (key === 'value') continue;
- if (isRef(value) && unwrap) {
- Object.defineProperty(ref2, key, {
- get() {
- return value.value;
- },
- set(v) {
- value.value = v;
- },
- enumerable,
- });
- } else {
- Object.defineProperty(ref2, key, { value, enumerable });
- }
- }
- return ref2;
- }
- function get(obj, key) {
- if (key == null) return unref(obj);
- return unref(obj)[key];
- }
- function isDefined(v) {
- return unref(v) != null;
- }
- function makeDestructurable(obj, arr) {
- if (typeof Symbol !== 'undefined') {
- const clone = { ...obj };
- Object.defineProperty(clone, Symbol.iterator, {
- enumerable: false,
- value() {
- let index = 0;
- return {
- next: () => ({
- value: arr[index++],
- done: index > arr.length,
- }),
- };
- },
- });
- return clone;
- } else {
- return Object.assign([...arr], obj);
- }
- }
- function toValue(r) {
- return typeof r === 'function' ? r() : unref(r);
- }
- var resolveUnref = toValue;
- function reactify(fn, options) {
- const unrefFn =
- (options == null ? void 0 : options.computedGetter) === false
- ? unref
- : toValue;
- return function (...args) {
- return computed(() =>
- fn.apply(
- this,
- args.map((i) => unrefFn(i)),
- ),
- );
- };
- }
- function reactifyObject(obj, optionsOrKeys = {}) {
- let keys2 = [];
- let options;
- if (Array.isArray(optionsOrKeys)) {
- keys2 = optionsOrKeys;
- } else {
- options = optionsOrKeys;
- const { includeOwnProperties = true } = optionsOrKeys;
- keys2.push(...Object.keys(obj));
- if (includeOwnProperties) keys2.push(...Object.getOwnPropertyNames(obj));
- }
- return Object.fromEntries(
- keys2.map((key) => {
- const value = obj[key];
- return [
- key,
- typeof value === 'function'
- ? reactify(value.bind(obj), options)
- : value,
- ];
- }),
- );
- }
- function toReactive(objectRef) {
- if (!isRef(objectRef)) return reactive(objectRef);
- const proxy = new Proxy(
- {},
- {
- get(_, p, receiver) {
- return unref(Reflect.get(objectRef.value, p, receiver));
- },
- set(_, p, value) {
- if (isRef(objectRef.value[p]) && !isRef(value))
- objectRef.value[p].value = value;
- else objectRef.value[p] = value;
- return true;
- },
- deleteProperty(_, p) {
- return Reflect.deleteProperty(objectRef.value, p);
- },
- has(_, p) {
- return Reflect.has(objectRef.value, p);
- },
- ownKeys() {
- return Object.keys(objectRef.value);
- },
- getOwnPropertyDescriptor() {
- return {
- enumerable: true,
- configurable: true,
- };
- },
- },
- );
- return reactive(proxy);
- }
- function reactiveComputed(fn) {
- return toReactive(computed(fn));
- }
- function reactiveOmit(obj, ...keys2) {
- const flatKeys = keys2.flat();
- const predicate = flatKeys[0];
- return reactiveComputed(() =>
- typeof predicate === 'function'
- ? Object.fromEntries(
- Object.entries(toRefs(obj)).filter(
- ([k, v]) => !predicate(toValue(v), k),
- ),
- )
- : Object.fromEntries(
- Object.entries(toRefs(obj)).filter((e) => !flatKeys.includes(e[0])),
- ),
- );
- }
- var isClient = typeof window !== 'undefined' && typeof document !== 'undefined';
- var isWorker =
- typeof WorkerGlobalScope !== 'undefined' &&
- globalThis instanceof WorkerGlobalScope;
- var isDef = (val) => typeof val !== 'undefined';
- var notNullish = (val) => val != null;
- var assert = (condition, ...infos) => {
- if (!condition) console.warn(...infos);
- };
- var toString = Object.prototype.toString;
- var isObject = (val) => toString.call(val) === '[object Object]';
- var now = () => Date.now();
- var timestamp = () => +Date.now();
- var clamp = (n, min, max) => Math.min(max, Math.max(min, n));
- var noop = () => {};
- var rand = (min, max) => {
- min = Math.ceil(min);
- max = Math.floor(max);
- return Math.floor(Math.random() * (max - min + 1)) + min;
- };
- var hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);
- var isIOS = getIsIOS();
- function getIsIOS() {
- var _a, _b;
- return (
- isClient &&
- ((_a = window == null ? void 0 : window.navigator) == null
- ? void 0
- : _a.userAgent) &&
- (/iP(ad|hone|od)/.test(window.navigator.userAgent) ||
- (((_b = window == null ? void 0 : window.navigator) == null
- ? void 0
- : _b.maxTouchPoints) > 2 &&
- /iPad|Macintosh/.test(
- window == null ? void 0 : window.navigator.userAgent,
- )))
- );
- }
- function createFilterWrapper(filter, fn) {
- function wrapper(...args) {
- return new Promise((resolve, reject) => {
- Promise.resolve(
- filter(() => fn.apply(this, args), { fn, thisArg: this, args }),
- )
- .then(resolve)
- .catch(reject);
- });
- }
- return wrapper;
- }
- var bypassFilter = (invoke2) => {
- return invoke2();
- };
- function debounceFilter(ms, options = {}) {
- let timer;
- let maxTimer;
- let lastRejector = noop;
- const _clearTimeout = (timer2) => {
- clearTimeout(timer2);
- lastRejector();
- lastRejector = noop;
- };
- const filter = (invoke2) => {
- const duration = toValue(ms);
- const maxDuration = toValue(options.maxWait);
- if (timer) _clearTimeout(timer);
- if (duration <= 0 || (maxDuration !== void 0 && maxDuration <= 0)) {
- if (maxTimer) {
- _clearTimeout(maxTimer);
- maxTimer = null;
- }
- return Promise.resolve(invoke2());
- }
- return new Promise((resolve, reject) => {
- lastRejector = options.rejectOnCancel ? reject : resolve;
- if (maxDuration && !maxTimer) {
- maxTimer = setTimeout(() => {
- if (timer) _clearTimeout(timer);
- maxTimer = null;
- resolve(invoke2());
- }, maxDuration);
- }
- timer = setTimeout(() => {
- if (maxTimer) _clearTimeout(maxTimer);
- maxTimer = null;
- resolve(invoke2());
- }, duration);
- });
- };
- return filter;
- }
- function throttleFilter(...args) {
- let lastExec = 0;
- let timer;
- let isLeading = true;
- let lastRejector = noop;
- let lastValue;
- let ms;
- let trailing;
- let leading;
- let rejectOnCancel;
- if (!isRef(args[0]) && typeof args[0] === 'object')
- ({
- delay: ms,
- trailing = true,
- leading = true,
- rejectOnCancel = false,
- } = args[0]);
- else [ms, trailing = true, leading = true, rejectOnCancel = false] = args;
- const clear = () => {
- if (timer) {
- clearTimeout(timer);
- timer = void 0;
- lastRejector();
- lastRejector = noop;
- }
- };
- const filter = (_invoke) => {
- const duration = toValue(ms);
- const elapsed = Date.now() - lastExec;
- const invoke2 = () => {
- return (lastValue = _invoke());
- };
- clear();
- if (duration <= 0) {
- lastExec = Date.now();
- return invoke2();
- }
- if (elapsed > duration && (leading || !isLeading)) {
- lastExec = Date.now();
- invoke2();
- } else if (trailing) {
- lastValue = new Promise((resolve, reject) => {
- lastRejector = rejectOnCancel ? reject : resolve;
- timer = setTimeout(
- () => {
- lastExec = Date.now();
- isLeading = true;
- resolve(invoke2());
- clear();
- },
- Math.max(0, duration - elapsed),
- );
- });
- }
- if (!leading && !timer)
- timer = setTimeout(() => (isLeading = true), duration);
- isLeading = false;
- return lastValue;
- };
- return filter;
- }
- function pausableFilter(extendFilter = bypassFilter) {
- const isActive = ref(true);
- function pause() {
- isActive.value = false;
- }
- function resume() {
- isActive.value = true;
- }
- const eventFilter = (...args) => {
- if (isActive.value) extendFilter(...args);
- };
- return { isActive: readonly(isActive), pause, resume, eventFilter };
- }
- var directiveHooks = {
- mounted: isVue3 ? 'mounted' : 'inserted',
- updated: isVue3 ? 'updated' : 'componentUpdated',
- unmounted: isVue3 ? 'unmounted' : 'unbind',
- };
- function cacheStringFunction(fn) {
- const cache = /* @__PURE__ */ Object.create(null);
- return (str) => {
- const hit = cache[str];
- return hit || (cache[str] = fn(str));
- };
- }
- var hyphenateRE = /\B([A-Z])/g;
- var hyphenate = cacheStringFunction((str) =>
- str.replace(hyphenateRE, '-$1').toLowerCase(),
- );
- var camelizeRE = /-(\w)/g;
- var camelize = cacheStringFunction((str) => {
- return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));
- });
- function promiseTimeout(ms, throwOnTimeout = false, reason = 'Timeout') {
- return new Promise((resolve, reject) => {
- if (throwOnTimeout) setTimeout(() => reject(reason), ms);
- else setTimeout(resolve, ms);
- });
- }
- function identity(arg) {
- return arg;
- }
- function createSingletonPromise(fn) {
- let _promise;
- function wrapper() {
- if (!_promise) _promise = fn();
- return _promise;
- }
- wrapper.reset = async () => {
- const _prev = _promise;
- _promise = void 0;
- if (_prev) await _prev;
- };
- return wrapper;
- }
- function invoke(fn) {
- return fn();
- }
- function containsProp(obj, ...props) {
- return props.some((k) => k in obj);
- }
- function increaseWithUnit(target, delta) {
- var _a;
- if (typeof target === 'number') return target + delta;
- const value =
- ((_a = target.match(/^-?[0-9]+\.?[0-9]*/)) == null ? void 0 : _a[0]) || '';
- const unit = target.slice(value.length);
- const result = Number.parseFloat(value) + delta;
- if (Number.isNaN(result)) return target;
- return result + unit;
- }
- function objectPick(obj, keys2, omitUndefined = false) {
- return keys2.reduce((n, k) => {
- if (k in obj) {
- if (!omitUndefined || obj[k] !== void 0) n[k] = obj[k];
- }
- return n;
- }, {});
- }
- function objectOmit(obj, keys2, omitUndefined = false) {
- return Object.fromEntries(
- Object.entries(obj).filter(([key, value]) => {
- return (!omitUndefined || value !== void 0) && !keys2.includes(key);
- }),
- );
- }
- function objectEntries(obj) {
- return Object.entries(obj);
- }
- function getLifeCycleTarget(target) {
- return target || getCurrentInstance();
- }
- function toRef2(...args) {
- if (args.length !== 1) return toRef(...args);
- const r = args[0];
- return typeof r === 'function'
- ? readonly(customRef(() => ({ get: r, set: noop })))
- : ref(r);
- }
- var resolveRef = toRef2;
- function reactivePick(obj, ...keys2) {
- const flatKeys = keys2.flat();
- const predicate = flatKeys[0];
- return reactiveComputed(() =>
- typeof predicate === 'function'
- ? Object.fromEntries(
- Object.entries(toRefs(obj)).filter(([k, v]) =>
- predicate(toValue(v), k),
- ),
- )
- : Object.fromEntries(flatKeys.map((k) => [k, toRef2(obj, k)])),
- );
- }
- function refAutoReset(defaultValue, afterMs = 1e4) {
- return customRef((track, trigger) => {
- let value = toValue(defaultValue);
- let timer;
- const resetAfter = () =>
- setTimeout(() => {
- value = toValue(defaultValue);
- trigger();
- }, toValue(afterMs));
- tryOnScopeDispose(() => {
- clearTimeout(timer);
- });
- return {
- get() {
- track();
- return value;
- },
- set(newValue) {
- value = newValue;
- trigger();
- clearTimeout(timer);
- timer = resetAfter();
- },
- };
- });
- }
- function useDebounceFn(fn, ms = 200, options = {}) {
- return createFilterWrapper(debounceFilter(ms, options), fn);
- }
- function refDebounced(value, ms = 200, options = {}) {
- const debounced = ref(value.value);
- const updater = useDebounceFn(
- () => {
- debounced.value = value.value;
- },
- ms,
- options,
- );
- watch(value, () => updater());
- return debounced;
- }
- function refDefault(source, defaultValue) {
- return computed({
- get() {
- var _a;
- return (_a = source.value) != null ? _a : defaultValue;
- },
- set(value) {
- source.value = value;
- },
- });
- }
- function useThrottleFn(
- fn,
- ms = 200,
- trailing = false,
- leading = true,
- rejectOnCancel = false,
- ) {
- return createFilterWrapper(
- throttleFilter(ms, trailing, leading, rejectOnCancel),
- fn,
- );
- }
- function refThrottled(value, delay = 200, trailing = true, leading = true) {
- if (delay <= 0) return value;
- const throttled = ref(value.value);
- const updater = useThrottleFn(
- () => {
- throttled.value = value.value;
- },
- delay,
- trailing,
- leading,
- );
- watch(value, () => updater());
- return throttled;
- }
- function refWithControl(initial, options = {}) {
- let source = initial;
- let track;
- let trigger;
- const ref2 = customRef((_track, _trigger) => {
- track = _track;
- trigger = _trigger;
- return {
- get() {
- return get2();
- },
- set(v) {
- set3(v);
- },
- };
- });
- function get2(tracking = true) {
- if (tracking) track();
- return source;
- }
- function set3(value, triggering = true) {
- var _a, _b;
- if (value === source) return;
- const old = source;
- if (
- ((_a = options.onBeforeChange) == null
- ? void 0
- : _a.call(options, value, old)) === false
- )
- return;
- source = value;
- (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);
- if (triggering) trigger();
- }
- const untrackedGet = () => get2(false);
- const silentSet = (v) => set3(v, false);
- const peek = () => get2(false);
- const lay = (v) => set3(v, false);
- return extendRef(
- ref2,
- {
- get: get2,
- set: set3,
- untrackedGet,
- silentSet,
- peek,
- lay,
- },
- { enumerable: true },
- );
- }
- var controlledRef = refWithControl;
- function set2(...args) {
- if (args.length === 2) {
- const [ref2, value] = args;
- ref2.value = value;
- }
- if (args.length === 3) {
- if (isVue2) {
- set(...args);
- } else {
- const [target, key, value] = args;
- target[key] = value;
- }
- }
- }
- function watchWithFilter(source, cb, options = {}) {
- const { eventFilter = bypassFilter, ...watchOptions } = options;
- return watch(source, createFilterWrapper(eventFilter, cb), watchOptions);
- }
- function watchPausable(source, cb, options = {}) {
- const { eventFilter: filter, ...watchOptions } = options;
- const { eventFilter, pause, resume, isActive } = pausableFilter(filter);
- const stop = watchWithFilter(source, cb, {
- ...watchOptions,
- eventFilter,
- });
- return { stop, pause, resume, isActive };
- }
- function syncRef(left, right, ...[options]) {
- const {
- flush = 'sync',
- deep = false,
- immediate = true,
- direction = 'both',
- transform = {},
- } = options || {};
- const watchers = [];
- const transformLTR = ('ltr' in transform && transform.ltr) || ((v) => v);
- const transformRTL = ('rtl' in transform && transform.rtl) || ((v) => v);
- if (direction === 'both' || direction === 'ltr') {
- watchers.push(
- watchPausable(
- left,
- (newValue) => {
- watchers.forEach((w) => w.pause());
- right.value = transformLTR(newValue);
- watchers.forEach((w) => w.resume());
- },
- { flush, deep, immediate },
- ),
- );
- }
- if (direction === 'both' || direction === 'rtl') {
- watchers.push(
- watchPausable(
- right,
- (newValue) => {
- watchers.forEach((w) => w.pause());
- left.value = transformRTL(newValue);
- watchers.forEach((w) => w.resume());
- },
- { flush, deep, immediate },
- ),
- );
- }
- const stop = () => {
- watchers.forEach((w) => w.stop());
- };
- return stop;
- }
- function syncRefs(source, targets, options = {}) {
- const { flush = 'sync', deep = false, immediate = true } = options;
- if (!Array.isArray(targets)) targets = [targets];
- return watch(
- source,
- (newValue) => targets.forEach((target) => (target.value = newValue)),
- { flush, deep, immediate },
- );
- }
- function toRefs2(objectRef, options = {}) {
- if (!isRef(objectRef)) return toRefs(objectRef);
- const result = Array.isArray(objectRef.value)
- ? Array.from({ length: objectRef.value.length })
- : {};
- for (const key in objectRef.value) {
- result[key] = customRef(() => ({
- get() {
- return objectRef.value[key];
- },
- set(v) {
- var _a;
- const replaceRef =
- (_a = toValue(options.replaceRef)) != null ? _a : true;
- if (replaceRef) {
- if (Array.isArray(objectRef.value)) {
- const copy = [...objectRef.value];
- copy[key] = v;
- objectRef.value = copy;
- } else {
- const newObject = { ...objectRef.value, [key]: v };
- Object.setPrototypeOf(
- newObject,
- Object.getPrototypeOf(objectRef.value),
- );
- objectRef.value = newObject;
- }
- } else {
- objectRef.value[key] = v;
- }
- },
- }));
- }
- return result;
- }
- function tryOnBeforeMount(fn, sync = true, target) {
- const instance = getLifeCycleTarget(target);
- if (instance) onBeforeMount(fn, target);
- else if (sync) fn();
- else nextTick(fn);
- }
- function tryOnBeforeUnmount(fn, target) {
- const instance = getLifeCycleTarget(target);
- if (instance) onBeforeUnmount(fn, target);
- }
- function tryOnMounted(fn, sync = true, target) {
- const instance = getLifeCycleTarget();
- if (instance) onMounted(fn, target);
- else if (sync) fn();
- else nextTick(fn);
- }
- function tryOnUnmounted(fn, target) {
- const instance = getLifeCycleTarget(target);
- if (instance) onUnmounted(fn, target);
- }
- function createUntil(r, isNot = false) {
- function toMatch(
- condition,
- { flush = 'sync', deep = false, timeout, throwOnTimeout } = {},
- ) {
- let stop = null;
- const watcher = new Promise((resolve) => {
- stop = watch(
- r,
- (v) => {
- if (condition(v) !== isNot) {
- stop == null ? void 0 : stop();
- resolve(v);
- }
- },
- {
- flush,
- deep,
- immediate: true,
- },
- );
- });
- const promises = [watcher];
- if (timeout != null) {
- promises.push(
- promiseTimeout(timeout, throwOnTimeout)
- .then(() => toValue(r))
- .finally(() => (stop == null ? void 0 : stop())),
- );
- }
- return Promise.race(promises);
- }
- function toBe(value, options) {
- if (!isRef(value)) return toMatch((v) => v === value, options);
- const {
- flush = 'sync',
- deep = false,
- timeout,
- throwOnTimeout,
- } = options != null ? options : {};
- let stop = null;
- const watcher = new Promise((resolve) => {
- stop = watch(
- [r, value],
- ([v1, v2]) => {
- if (isNot !== (v1 === v2)) {
- stop == null ? void 0 : stop();
- resolve(v1);
- }
- },
- {
- flush,
- deep,
- immediate: true,
- },
- );
- });
- const promises = [watcher];
- if (timeout != null) {
- promises.push(
- promiseTimeout(timeout, throwOnTimeout)
- .then(() => toValue(r))
- .finally(() => {
- stop == null ? void 0 : stop();
- return toValue(r);
- }),
- );
- }
- return Promise.race(promises);
- }
- function toBeTruthy(options) {
- return toMatch((v) => Boolean(v), options);
- }
- function toBeNull(options) {
- return toBe(null, options);
- }
- function toBeUndefined(options) {
- return toBe(void 0, options);
- }
- function toBeNaN(options) {
- return toMatch(Number.isNaN, options);
- }
- function toContains(value, options) {
- return toMatch((v) => {
- const array = Array.from(v);
- return array.includes(value) || array.includes(toValue(value));
- }, options);
- }
- function changed(options) {
- return changedTimes(1, options);
- }
- function changedTimes(n = 1, options) {
- let count = -1;
- return toMatch(() => {
- count += 1;
- return count >= n;
- }, options);
- }
- if (Array.isArray(toValue(r))) {
- const instance = {
- toMatch,
- toContains,
- changed,
- changedTimes,
- get not() {
- return createUntil(r, !isNot);
- },
- };
- return instance;
- } else {
- const instance = {
- toMatch,
- toBe,
- toBeTruthy,
- toBeNull,
- toBeNaN,
- toBeUndefined,
- changed,
- changedTimes,
- get not() {
- return createUntil(r, !isNot);
- },
- };
- return instance;
- }
- }
- function until(r) {
- return createUntil(r);
- }
- function defaultComparator(value, othVal) {
- return value === othVal;
- }
- function useArrayDifference(...args) {
- var _a;
- const list = args[0];
- const values = args[1];
- let compareFn = (_a = args[2]) != null ? _a : defaultComparator;
- if (typeof compareFn === 'string') {
- const key = compareFn;
- compareFn = (value, othVal) => value[key] === othVal[key];
- }
- return computed(() =>
- toValue(list).filter(
- (x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1,
- ),
- );
- }
- function useArrayEvery(list, fn) {
- return computed(() =>
- toValue(list).every((element, index, array) =>
- fn(toValue(element), index, array),
- ),
- );
- }
- function useArrayFilter(list, fn) {
- return computed(() =>
- toValue(list)
- .map((i) => toValue(i))
- .filter(fn),
- );
- }
- function useArrayFind(list, fn) {
- return computed(() =>
- toValue(
- toValue(list).find((element, index, array) =>
- fn(toValue(element), index, array),
- ),
- ),
- );
- }
- function useArrayFindIndex(list, fn) {
- return computed(() =>
- toValue(list).findIndex((element, index, array) =>
- fn(toValue(element), index, array),
- ),
- );
- }
- function findLast(arr, cb) {
- let index = arr.length;
- while (index-- > 0) {
- if (cb(arr[index], index, arr)) return arr[index];
- }
- return void 0;
- }
- function useArrayFindLast(list, fn) {
- return computed(() =>
- toValue(
- !Array.prototype.findLast
- ? findLast(toValue(list), (element, index, array) =>
- fn(toValue(element), index, array),
- )
- : toValue(list).findLast((element, index, array) =>
- fn(toValue(element), index, array),
- ),
- ),
- );
- }
- function isArrayIncludesOptions(obj) {
- return isObject(obj) && containsProp(obj, 'formIndex', 'comparator');
- }
- function useArrayIncludes(...args) {
- var _a;
- const list = args[0];
- const value = args[1];
- let comparator = args[2];
- let formIndex = 0;
- if (isArrayIncludesOptions(comparator)) {
- formIndex = (_a = comparator.fromIndex) != null ? _a : 0;
- comparator = comparator.comparator;
- }
- if (typeof comparator === 'string') {
- const key = comparator;
- comparator = (element, value2) => element[key] === toValue(value2);
- }
- comparator =
- comparator != null
- ? comparator
- : (element, value2) => element === toValue(value2);
- return computed(() =>
- toValue(list)
- .slice(formIndex)
- .some((element, index, array) =>
- comparator(toValue(element), toValue(value), index, toValue(array)),
- ),
- );
- }
- function useArrayJoin(list, separator) {
- return computed(() =>
- toValue(list)
- .map((i) => toValue(i))
- .join(toValue(separator)),
- );
- }
- function useArrayMap(list, fn) {
- return computed(() =>
- toValue(list)
- .map((i) => toValue(i))
- .map(fn),
- );
- }
- function useArrayReduce(list, reducer, ...args) {
- const reduceCallback = (sum, value, index) =>
- reducer(toValue(sum), toValue(value), index);
- return computed(() => {
- const resolved = toValue(list);
- return args.length
- ? resolved.reduce(reduceCallback, toValue(args[0]))
- : resolved.reduce(reduceCallback);
- });
- }
- function useArraySome(list, fn) {
- return computed(() =>
- toValue(list).some((element, index, array) =>
- fn(toValue(element), index, array),
- ),
- );
- }
- function uniq(array) {
- return Array.from(new Set(array));
- }
- function uniqueElementsBy(array, fn) {
- return array.reduce((acc, v) => {
- if (!acc.some((x) => fn(v, x, array))) acc.push(v);
- return acc;
- }, []);
- }
- function useArrayUnique(list, compareFn) {
- return computed(() => {
- const resolvedList = toValue(list).map((element) => toValue(element));
- return compareFn
- ? uniqueElementsBy(resolvedList, compareFn)
- : uniq(resolvedList);
- });
- }
- function useCounter(initialValue = 0, options = {}) {
- let _initialValue = unref(initialValue);
- const count = ref(initialValue);
- const { max = Number.POSITIVE_INFINITY, min = Number.NEGATIVE_INFINITY } =
- options;
- const inc = (delta = 1) =>
- (count.value = Math.max(Math.min(max, count.value + delta), min));
- const dec = (delta = 1) =>
- (count.value = Math.min(Math.max(min, count.value - delta), max));
- const get2 = () => count.value;
- const set3 = (val) => (count.value = Math.max(min, Math.min(max, val)));
- const reset = (val = _initialValue) => {
- _initialValue = val;
- return set3(val);
- };
- return { count, inc, dec, get: get2, set: set3, reset };
- }
- var REGEX_PARSE =
- /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
- var REGEX_FORMAT =
- /[YMDHhms]o|\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
- function defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {
- let m = hours < 12 ? 'AM' : 'PM';
- if (hasPeriod) m = m.split('').reduce((acc, curr) => (acc += `${curr}.`), '');
- return isLowercase ? m.toLowerCase() : m;
- }
- function formatOrdinal(num) {
- const suffixes = ['th', 'st', 'nd', 'rd'];
- const v = num % 100;
- return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);
- }
- function formatDate(date, formatStr, options = {}) {
- var _a;
- const years = date.getFullYear();
- const month = date.getMonth();
- const days = date.getDate();
- const hours = date.getHours();
- const minutes = date.getMinutes();
- const seconds = date.getSeconds();
- const milliseconds = date.getMilliseconds();
- const day = date.getDay();
- const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;
- const matches = {
- Yo: () => formatOrdinal(years),
- YY: () => String(years).slice(-2),
- YYYY: () => years,
- M: () => month + 1,
- Mo: () => formatOrdinal(month + 1),
- MM: () => `${month + 1}`.padStart(2, '0'),
- MMM: () => date.toLocaleDateString(options.locales, { month: 'short' }),
- MMMM: () => date.toLocaleDateString(options.locales, { month: 'long' }),
- D: () => String(days),
- Do: () => formatOrdinal(days),
- DD: () => `${days}`.padStart(2, '0'),
- H: () => String(hours),
- Ho: () => formatOrdinal(hours),
- HH: () => `${hours}`.padStart(2, '0'),
- h: () => `${hours % 12 || 12}`.padStart(1, '0'),
- ho: () => formatOrdinal(hours % 12 || 12),
- hh: () => `${hours % 12 || 12}`.padStart(2, '0'),
- m: () => String(minutes),
- mo: () => formatOrdinal(minutes),
- mm: () => `${minutes}`.padStart(2, '0'),
- s: () => String(seconds),
- so: () => formatOrdinal(seconds),
- ss: () => `${seconds}`.padStart(2, '0'),
- SSS: () => `${milliseconds}`.padStart(3, '0'),
- d: () => day,
- dd: () => date.toLocaleDateString(options.locales, { weekday: 'narrow' }),
- ddd: () => date.toLocaleDateString(options.locales, { weekday: 'short' }),
- dddd: () => date.toLocaleDateString(options.locales, { weekday: 'long' }),
- A: () => meridiem(hours, minutes),
- AA: () => meridiem(hours, minutes, false, true),
- a: () => meridiem(hours, minutes, true),
- aa: () => meridiem(hours, minutes, true, true),
- };
- return formatStr.replace(REGEX_FORMAT, (match, $1) => {
- var _a2, _b;
- return (_b =
- $1 != null
- ? $1
- : (_a2 = matches[match]) == null
- ? void 0
- : _a2.call(matches)) != null
- ? _b
- : match;
- });
- }
- function normalizeDate(date) {
- if (date === null) return new Date(Number.NaN);
- if (date === void 0) return /* @__PURE__ */ new Date();
- if (date instanceof Date) return new Date(date);
- if (typeof date === 'string' && !/Z$/i.test(date)) {
- const d = date.match(REGEX_PARSE);
- if (d) {
- const m = d[2] - 1 || 0;
- const ms = (d[7] || '0').substring(0, 3);
- return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
- }
- }
- return new Date(date);
- }
- function useDateFormat(date, formatStr = 'HH:mm:ss', options = {}) {
- return computed(() =>
- formatDate(normalizeDate(toValue(date)), toValue(formatStr), options),
- );
- }
- function useIntervalFn(cb, interval = 1e3, options = {}) {
- const { immediate = true, immediateCallback = false } = options;
- let timer = null;
- const isActive = ref(false);
- function clean() {
- if (timer) {
- clearInterval(timer);
- timer = null;
- }
- }
- function pause() {
- isActive.value = false;
- clean();
- }
- function resume() {
- const intervalValue = toValue(interval);
- if (intervalValue <= 0) return;
- isActive.value = true;
- if (immediateCallback) cb();
- clean();
- timer = setInterval(cb, intervalValue);
- }
- if (immediate && isClient) resume();
- if (isRef(interval) || typeof interval === 'function') {
- const stopWatch = watch(interval, () => {
- if (isActive.value && isClient) resume();
- });
- tryOnScopeDispose(stopWatch);
- }
- tryOnScopeDispose(pause);
- return {
- isActive,
- pause,
- resume,
- };
- }
- function useInterval(interval = 1e3, options = {}) {
- const {
- controls: exposeControls = false,
- immediate = true,
- callback,
- } = options;
- const counter = ref(0);
- const update = () => (counter.value += 1);
- const reset = () => {
- counter.value = 0;
- };
- const controls = useIntervalFn(
- callback
- ? () => {
- update();
- callback(counter.value);
- }
- : update,
- interval,
- { immediate },
- );
- if (exposeControls) {
- return {
- counter,
- reset,
- ...controls,
- };
- } else {
- return counter;
- }
- }
- function useLastChanged(source, options = {}) {
- var _a;
- const ms = ref((_a = options.initialValue) != null ? _a : null);
- watch(source, () => (ms.value = timestamp()), options);
- return ms;
- }
- function useTimeoutFn(cb, interval, options = {}) {
- const { immediate = true } = options;
- const isPending = ref(false);
- let timer = null;
- function clear() {
- if (timer) {
- clearTimeout(timer);
- timer = null;
- }
- }
- function stop() {
- isPending.value = false;
- clear();
- }
- function start(...args) {
- clear();
- isPending.value = true;
- timer = setTimeout(() => {
- isPending.value = false;
- timer = null;
- cb(...args);
- }, toValue(interval));
- }
- if (immediate) {
- isPending.value = true;
- if (isClient) start();
- }
- tryOnScopeDispose(stop);
- return {
- isPending: readonly(isPending),
- start,
- stop,
- };
- }
- function useTimeout(interval = 1e3, options = {}) {
- const { controls: exposeControls = false, callback } = options;
- const controls = useTimeoutFn(
- callback != null ? callback : noop,
- interval,
- options,
- );
- const ready = computed(() => !controls.isPending.value);
- if (exposeControls) {
- return {
- ready,
- ...controls,
- };
- } else {
- return ready;
- }
- }
- function useToNumber(value, options = {}) {
- const { method = 'parseFloat', radix, nanToZero } = options;
- return computed(() => {
- let resolved = toValue(value);
- if (typeof resolved === 'string')
- resolved = Number[method](resolved, radix);
- if (nanToZero && Number.isNaN(resolved)) resolved = 0;
- return resolved;
- });
- }
- function useToString(value) {
- return computed(() => `${toValue(value)}`);
- }
- function useToggle(initialValue = false, options = {}) {
- const { truthyValue = true, falsyValue = false } = options;
- const valueIsRef = isRef(initialValue);
- const _value = ref(initialValue);
- function toggle(value) {
- if (arguments.length) {
- _value.value = value;
- return _value.value;
- } else {
- const truthy = toValue(truthyValue);
- _value.value = _value.value === truthy ? toValue(falsyValue) : truthy;
- return _value.value;
- }
- }
- if (valueIsRef) return toggle;
- else return [_value, toggle];
- }
- function watchArray(source, cb, options) {
- let oldList = (options == null ? void 0 : options.immediate)
- ? []
- : [
- ...(source instanceof Function
- ? source()
- : Array.isArray(source)
- ? source
- : toValue(source)),
- ];
- return watch(
- source,
- (newList, _, onCleanup) => {
- const oldListRemains = Array.from({ length: oldList.length });
- const added = [];
- for (const obj of newList) {
- let found = false;
- for (let i = 0; i < oldList.length; i++) {
- if (!oldListRemains[i] && obj === oldList[i]) {
- oldListRemains[i] = true;
- found = true;
- break;
- }
- }
- if (!found) added.push(obj);
- }
- const removed = oldList.filter((_2, i) => !oldListRemains[i]);
- cb(newList, oldList, added, removed, onCleanup);
- oldList = [...newList];
- },
- options,
- );
- }
- function watchAtMost(source, cb, options) {
- const { count, ...watchOptions } = options;
- const current = ref(0);
- const stop = watchWithFilter(
- source,
- (...args) => {
- current.value += 1;
- if (current.value >= toValue(count)) nextTick(() => stop());
- cb(...args);
- },
- watchOptions,
- );
- return { count: current, stop };
- }
- function watchDebounced(source, cb, options = {}) {
- const { debounce = 0, maxWait = void 0, ...watchOptions } = options;
- return watchWithFilter(source, cb, {
- ...watchOptions,
- eventFilter: debounceFilter(debounce, { maxWait }),
- });
- }
- function watchDeep(source, cb, options) {
- return watch(source, cb, {
- ...options,
- deep: true,
- });
- }
- function watchIgnorable(source, cb, options = {}) {
- const { eventFilter = bypassFilter, ...watchOptions } = options;
- const filteredCb = createFilterWrapper(eventFilter, cb);
- let ignoreUpdates;
- let ignorePrevAsyncUpdates;
- let stop;
- if (watchOptions.flush === 'sync') {
- const ignore = ref(false);
- ignorePrevAsyncUpdates = () => {};
- ignoreUpdates = (updater) => {
- ignore.value = true;
- updater();
- ignore.value = false;
- };
- stop = watch(
- source,
- (...args) => {
- if (!ignore.value) filteredCb(...args);
- },
- watchOptions,
- );
- } else {
- const disposables = [];
- const ignoreCounter = ref(0);
- const syncCounter = ref(0);
- ignorePrevAsyncUpdates = () => {
- ignoreCounter.value = syncCounter.value;
- };
- disposables.push(
- watch(
- source,
- () => {
- syncCounter.value++;
- },
- { ...watchOptions, flush: 'sync' },
- ),
- );
- ignoreUpdates = (updater) => {
- const syncCounterPrev = syncCounter.value;
- updater();
- ignoreCounter.value += syncCounter.value - syncCounterPrev;
- };
- disposables.push(
- watch(
- source,
- (...args) => {
- const ignore =
- ignoreCounter.value > 0 &&
- ignoreCounter.value === syncCounter.value;
- ignoreCounter.value = 0;
- syncCounter.value = 0;
- if (ignore) return;
- filteredCb(...args);
- },
- watchOptions,
- ),
- );
- stop = () => {
- disposables.forEach((fn) => fn());
- };
- }
- return { stop, ignoreUpdates, ignorePrevAsyncUpdates };
- }
- function watchImmediate(source, cb, options) {
- return watch(source, cb, {
- ...options,
- immediate: true,
- });
- }
- function watchOnce(source, cb, options) {
- const stop = watch(
- source,
- (...args) => {
- nextTick(() => stop());
- return cb(...args);
- },
- options,
- );
- return stop;
- }
- function watchThrottled(source, cb, options = {}) {
- const {
- throttle = 0,
- trailing = true,
- leading = true,
- ...watchOptions
- } = options;
- return watchWithFilter(source, cb, {
- ...watchOptions,
- eventFilter: throttleFilter(throttle, trailing, leading),
- });
- }
- function watchTriggerable(source, cb, options = {}) {
- let cleanupFn;
- function onEffect() {
- if (!cleanupFn) return;
- const fn = cleanupFn;
- cleanupFn = void 0;
- fn();
- }
- function onCleanup(callback) {
- cleanupFn = callback;
- }
- const _cb = (value, oldValue) => {
- onEffect();
- return cb(value, oldValue, onCleanup);
- };
- const res = watchIgnorable(source, _cb, options);
- const { ignoreUpdates } = res;
- const trigger = () => {
- let res2;
- ignoreUpdates(() => {
- res2 = _cb(getWatchSources(source), getOldValue(source));
- });
- return res2;
- };
- return {
- ...res,
- trigger,
- };
- }
- function getWatchSources(sources) {
- if (isReactive(sources)) return sources;
- if (Array.isArray(sources)) return sources.map((item) => toValue(item));
- return toValue(sources);
- }
- function getOldValue(source) {
- return Array.isArray(source) ? source.map(() => void 0) : void 0;
- }
- function whenever(source, cb, options) {
- const stop = watch(
- source,
- (v, ov, onInvalidate) => {
- if (v) {
- if (options == null ? void 0 : options.once) nextTick(() => stop());
- cb(v, ov, onInvalidate);
- }
- },
- {
- ...options,
- once: false,
- },
- );
- return stop;
- }
- // ../node_modules/.pnpm/@vueuse+core@10.9.0_vue@3.4.27_typescript@5.4.5_/node_modules/@vueuse/core/index.mjs
- function computedAsync(evaluationCallback, initialState, optionsOrRef) {
- let options;
- if (isRef(optionsOrRef)) {
- options = {
- evaluating: optionsOrRef,
- };
- } else {
- options = optionsOrRef || {};
- }
- const {
- lazy = false,
- evaluating = void 0,
- shallow = true,
- onError = noop,
- } = options;
- const started = ref(!lazy);
- const current = shallow ? shallowRef(initialState) : ref(initialState);
- let counter = 0;
- watchEffect(async (onInvalidate) => {
- if (!started.value) return;
- counter++;
- const counterAtBeginning = counter;
- let hasFinished = false;
- if (evaluating) {
- Promise.resolve().then(() => {
- evaluating.value = true;
- });
- }
- try {
- const result = await evaluationCallback((cancelCallback) => {
- onInvalidate(() => {
- if (evaluating) evaluating.value = false;
- if (!hasFinished) cancelCallback();
- });
- });
- if (counterAtBeginning === counter) current.value = result;
- } catch (e) {
- onError(e);
- } finally {
- if (evaluating && counterAtBeginning === counter)
- evaluating.value = false;
- hasFinished = true;
- }
- });
- if (lazy) {
- return computed(() => {
- started.value = true;
- return current.value;
- });
- } else {
- return current;
- }
- }
- function computedInject(key, options, defaultSource, treatDefaultAsFactory) {
- let source = inject(key);
- if (defaultSource) source = inject(key, defaultSource);
- if (treatDefaultAsFactory)
- source = inject(key, defaultSource, treatDefaultAsFactory);
- if (typeof options === 'function') {
- return computed((ctx) => options(source, ctx));
- } else {
- return computed({
- get: (ctx) => options.get(source, ctx),
- set: options.set,
- });
- }
- }
- function createReusableTemplate(options = {}) {
- if (!isVue3 && !version.startsWith('2.7.')) {
- if (true)
- throw new Error(
- '[VueUse] createReusableTemplate only works in Vue 2.7 or above.',
- );
- return;
- }
- const { inheritAttrs = true } = options;
- const render = shallowRef();
- const define = defineComponent({
- setup(_, { slots }) {
- return () => {
- render.value = slots.default;
- };
- },
- });
- const reuse = defineComponent({
- inheritAttrs,
- setup(_, { attrs, slots }) {
- return () => {
- var _a;
- if (!render.value && true)
- throw new Error(
- '[VueUse] Failed to find the definition of reusable template',
- );
- const vnode =
- (_a = render.value) == null
- ? void 0
- : _a.call(render, {
- ...keysToCamelKebabCase(attrs),
- $slots: slots,
- });
- return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1
- ? vnode[0]
- : vnode;
- };
- },
- });
- return makeDestructurable({ define, reuse }, [define, reuse]);
- }
- function keysToCamelKebabCase(obj) {
- const newObj = {};
- for (const key in obj) newObj[camelize(key)] = obj[key];
- return newObj;
- }
- function createTemplatePromise(options = {}) {
- if (!isVue3) {
- if (true)
- throw new Error(
- '[VueUse] createTemplatePromise only works in Vue 3 or above.',
- );
- return;
- }
- let index = 0;
- const instances = ref([]);
- function create(...args) {
- const props = shallowReactive({
- key: index++,
- args,
- promise: void 0,
- resolve: () => {},
- reject: () => {},
- isResolving: false,
- options,
- });
- instances.value.push(props);
- props.promise = new Promise((_resolve, _reject) => {
- props.resolve = (v) => {
- props.isResolving = true;
- return _resolve(v);
- };
- props.reject = _reject;
- }).finally(() => {
- props.promise = void 0;
- const index2 = instances.value.indexOf(props);
- if (index2 !== -1) instances.value.splice(index2, 1);
- });
- return props.promise;
- }
- function start(...args) {
- if (options.singleton && instances.value.length > 0)
- return instances.value[0].promise;
- return create(...args);
- }
- const component = defineComponent((_, { slots }) => {
- const renderList = () =>
- instances.value.map((props) => {
- var _a;
- return h(
- Fragment,
- { key: props.key },
- (_a = slots.default) == null ? void 0 : _a.call(slots, props),
- );
- });
- if (options.transition)
- return () => h(TransitionGroup, options.transition, renderList);
- return renderList;
- });
- component.start = start;
- return component;
- }
- function createUnrefFn(fn) {
- return function (...args) {
- return fn.apply(
- this,
- args.map((i) => toValue(i)),
- );
- };
- }
- function unrefElement(elRef) {
- var _a;
- const plain = toValue(elRef);
- return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
- }
- var defaultWindow = isClient ? window : void 0;
- var defaultDocument = isClient ? window.document : void 0;
- var defaultNavigator = isClient ? window.navigator : void 0;
- var defaultLocation = isClient ? window.location : void 0;
- function useEventListener(...args) {
- let target;
- let events2;
- let listeners;
- let options;
- if (typeof args[0] === 'string' || Array.isArray(args[0])) {
- [events2, listeners, options] = args;
- target = defaultWindow;
- } else {
- [target, events2, listeners, options] = args;
- }
- if (!target) return noop;
- if (!Array.isArray(events2)) events2 = [events2];
- if (!Array.isArray(listeners)) listeners = [listeners];
- const cleanups = [];
- const cleanup = () => {
- cleanups.forEach((fn) => fn());
- cleanups.length = 0;
- };
- const register = (el, event, listener, options2) => {
- el.addEventListener(event, listener, options2);
- return () => el.removeEventListener(event, listener, options2);
- };
- const stopWatch = watch(
- () => [unrefElement(target), toValue(options)],
- ([el, options2]) => {
- cleanup();
- if (!el) return;
- const optionsClone = isObject(options2) ? { ...options2 } : options2;
- cleanups.push(
- ...events2.flatMap((event) => {
- return listeners.map((listener) =>
- register(el, event, listener, optionsClone),
- );
- }),
- );
- },
- { immediate: true, flush: 'post' },
- );
- const stop = () => {
- stopWatch();
- cleanup();
- };
- tryOnScopeDispose(stop);
- return stop;
- }
- var _iOSWorkaround = false;
- function onClickOutside(target, handler, options = {}) {
- const {
- window: window2 = defaultWindow,
- ignore = [],
- capture = true,
- detectIframe = false,
- } = options;
- if (!window2) return noop;
- if (isIOS && !_iOSWorkaround) {
- _iOSWorkaround = true;
- Array.from(window2.document.body.children).forEach((el) =>
- el.addEventListener('click', noop),
- );
- window2.document.documentElement.addEventListener('click', noop);
- }
- let shouldListen = true;
- const shouldIgnore = (event) => {
- return ignore.some((target2) => {
- if (typeof target2 === 'string') {
- return Array.from(window2.document.querySelectorAll(target2)).some(
- (el) => el === event.target || event.composedPath().includes(el),
- );
- } else {
- const el = unrefElement(target2);
- return el && (event.target === el || event.composedPath().includes(el));
- }
- });
- };
- const listener = (event) => {
- const el = unrefElement(target);
- if (!el || el === event.target || event.composedPath().includes(el)) return;
- if (event.detail === 0) shouldListen = !shouldIgnore(event);
- if (!shouldListen) {
- shouldListen = true;
- return;
- }
- handler(event);
- };
- const cleanup = [
- useEventListener(window2, 'click', listener, { passive: true, capture }),
- useEventListener(
- window2,
- 'pointerdown',
- (e) => {
- const el = unrefElement(target);
- shouldListen =
- !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));
- },
- { passive: true },
- ),
- detectIframe &&
- useEventListener(window2, 'blur', (event) => {
- setTimeout(() => {
- var _a;
- const el = unrefElement(target);
- if (
- ((_a = window2.document.activeElement) == null
- ? void 0
- : _a.tagName) === 'IFRAME' &&
- !(el == null ? void 0 : el.contains(window2.document.activeElement))
- )
- handler(event);
- }, 0);
- }),
- ].filter(Boolean);
- const stop = () => cleanup.forEach((fn) => fn());
- return stop;
- }
- function createKeyPredicate(keyFilter) {
- if (typeof keyFilter === 'function') return keyFilter;
- else if (typeof keyFilter === 'string')
- return (event) => event.key === keyFilter;
- else if (Array.isArray(keyFilter))
- return (event) => keyFilter.includes(event.key);
- return () => true;
- }
- function onKeyStroke(...args) {
- let key;
- let handler;
- let options = {};
- if (args.length === 3) {
- key = args[0];
- handler = args[1];
- options = args[2];
- } else if (args.length === 2) {
- if (typeof args[1] === 'object') {
- key = true;
- handler = args[0];
- options = args[1];
- } else {
- key = args[0];
- handler = args[1];
- }
- } else {
- key = true;
- handler = args[0];
- }
- const {
- target = defaultWindow,
- eventName = 'keydown',
- passive = false,
- dedupe = false,
- } = options;
- const predicate = createKeyPredicate(key);
- const listener = (e) => {
- if (e.repeat && toValue(dedupe)) return;
- if (predicate(e)) handler(e);
- };
- return useEventListener(target, eventName, listener, passive);
- }
- function onKeyDown(key, handler, options = {}) {
- return onKeyStroke(key, handler, { ...options, eventName: 'keydown' });
- }
- function onKeyPressed(key, handler, options = {}) {
- return onKeyStroke(key, handler, { ...options, eventName: 'keypress' });
- }
- function onKeyUp(key, handler, options = {}) {
- return onKeyStroke(key, handler, { ...options, eventName: 'keyup' });
- }
- var DEFAULT_DELAY = 500;
- var DEFAULT_THRESHOLD = 10;
- function onLongPress(target, handler, options) {
- var _a, _b;
- const elementRef = computed(() => unrefElement(target));
- let timeout;
- let posStart;
- function clear() {
- if (timeout) {
- clearTimeout(timeout);
- timeout = void 0;
- }
- posStart = void 0;
- }
- function onDown(ev) {
- var _a2, _b2, _c, _d;
- if (
- ((_a2 = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _a2.self) &&
- ev.target !== elementRef.value
- )
- return;
- clear();
- if (
- (_b2 = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _b2.prevent
- )
- ev.preventDefault();
- if (
- (_c = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _c.stop
- )
- ev.stopPropagation();
- posStart = {
- x: ev.x,
- y: ev.y,
- };
- timeout = setTimeout(
- () => handler(ev),
- (_d = options == null ? void 0 : options.delay) != null
- ? _d
- : DEFAULT_DELAY,
- );
- }
- function onMove(ev) {
- var _a2, _b2, _c, _d;
- if (
- ((_a2 = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _a2.self) &&
- ev.target !== elementRef.value
- )
- return;
- if (
- !posStart ||
- (options == null ? void 0 : options.distanceThreshold) === false
- )
- return;
- if (
- (_b2 = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _b2.prevent
- )
- ev.preventDefault();
- if (
- (_c = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _c.stop
- )
- ev.stopPropagation();
- const dx = ev.x - posStart.x;
- const dy = ev.y - posStart.y;
- const distance = Math.sqrt(dx * dx + dy * dy);
- if (
- distance >=
- ((_d = options == null ? void 0 : options.distanceThreshold) != null
- ? _d
- : DEFAULT_THRESHOLD)
- )
- clear();
- }
- const listenerOptions = {
- capture:
- (_a = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _a.capture,
- once:
- (_b = options == null ? void 0 : options.modifiers) == null
- ? void 0
- : _b.once,
- };
- const cleanup = [
- useEventListener(elementRef, 'pointerdown', onDown, listenerOptions),
- useEventListener(elementRef, 'pointermove', onMove, listenerOptions),
- useEventListener(
- elementRef,
- ['pointerup', 'pointerleave'],
- clear,
- listenerOptions,
- ),
- ];
- const stop = () => cleanup.forEach((fn) => fn());
- return stop;
- }
- function isFocusedElementEditable() {
- const { activeElement, body } = document;
- if (!activeElement) return false;
- if (activeElement === body) return false;
- switch (activeElement.tagName) {
- case 'INPUT':
- case 'TEXTAREA':
- return true;
- }
- return activeElement.hasAttribute('contenteditable');
- }
- function isTypedCharValid({ keyCode, metaKey, ctrlKey, altKey }) {
- if (metaKey || ctrlKey || altKey) return false;
- if (keyCode >= 48 && keyCode <= 57) return true;
- if (keyCode >= 65 && keyCode <= 90) return true;
- if (keyCode >= 97 && keyCode <= 122) return true;
- return false;
- }
- function onStartTyping(callback, options = {}) {
- const { document: document2 = defaultDocument } = options;
- const keydown = (event) => {
- !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);
- };
- if (document2)
- useEventListener(document2, 'keydown', keydown, { passive: true });
- }
- function templateRef(key, initialValue = null) {
- const instance = getCurrentInstance();
- let _trigger = () => {};
- const element = customRef((track, trigger) => {
- _trigger = trigger;
- return {
- get() {
- var _a, _b;
- track();
- return (_b =
- (_a = instance == null ? void 0 : instance.proxy) == null
- ? void 0
- : _a.$refs[key]) != null
- ? _b
- : initialValue;
- },
- set() {},
- };
- });
- tryOnMounted(_trigger);
- onUpdated(_trigger);
- return element;
- }
- function useActiveElement(options = {}) {
- var _a;
- const { window: window2 = defaultWindow, deep = true } = options;
- const document2 =
- (_a = options.document) != null
- ? _a
- : window2 == null
- ? void 0
- : window2.document;
- const getDeepActiveElement = () => {
- var _a2;
- let element = document2 == null ? void 0 : document2.activeElement;
- if (deep) {
- while (element == null ? void 0 : element.shadowRoot)
- element =
- (_a2 = element == null ? void 0 : element.shadowRoot) == null
- ? void 0
- : _a2.activeElement;
- }
- return element;
- };
- const activeElement = ref();
- const trigger = () => {
- activeElement.value = getDeepActiveElement();
- };
- if (window2) {
- useEventListener(
- window2,
- 'blur',
- (event) => {
- if (event.relatedTarget !== null) return;
- trigger();
- },
- true,
- );
- useEventListener(window2, 'focus', trigger, true);
- }
- trigger();
- return activeElement;
- }
- function useMounted() {
- const isMounted = ref(false);
- const instance = getCurrentInstance();
- if (instance) {
- onMounted(
- () => {
- isMounted.value = true;
- },
- isVue2 ? null : instance,
- );
- }
- return isMounted;
- }
- function useSupported(callback) {
- const isMounted = useMounted();
- return computed(() => {
- isMounted.value;
- return Boolean(callback());
- });
- }
- function useRafFn(fn, options = {}) {
- const {
- immediate = true,
- fpsLimit = void 0,
- window: window2 = defaultWindow,
- } = options;
- const isActive = ref(false);
- const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null;
- let previousFrameTimestamp = 0;
- let rafId = null;
- function loop(timestamp2) {
- if (!isActive.value || !window2) return;
- if (!previousFrameTimestamp) previousFrameTimestamp = timestamp2;
- const delta = timestamp2 - previousFrameTimestamp;
- if (intervalLimit && delta < intervalLimit) {
- rafId = window2.requestAnimationFrame(loop);
- return;
- }
- previousFrameTimestamp = timestamp2;
- fn({ delta, timestamp: timestamp2 });
- rafId = window2.requestAnimationFrame(loop);
- }
- function resume() {
- if (!isActive.value && window2) {
- isActive.value = true;
- previousFrameTimestamp = 0;
- rafId = window2.requestAnimationFrame(loop);
- }
- }
- function pause() {
- isActive.value = false;
- if (rafId != null && window2) {
- window2.cancelAnimationFrame(rafId);
- rafId = null;
- }
- }
- if (immediate) resume();
- tryOnScopeDispose(pause);
- return {
- isActive: readonly(isActive),
- pause,
- resume,
- };
- }
- function useAnimate(target, keyframes, options) {
- let config;
- let animateOptions;
- if (isObject(options)) {
- config = options;
- animateOptions = objectOmit(options, [
- 'window',
- 'immediate',
- 'commitStyles',
- 'persist',
- 'onReady',
- 'onError',
- ]);
- } else {
- config = { duration: options };
- animateOptions = options;
- }
- const {
- window: window2 = defaultWindow,
- immediate = true,
- commitStyles,
- persist,
- playbackRate: _playbackRate = 1,
- onReady,
- onError = (e) => {
- console.error(e);
- },
- } = config;
- const isSupported = useSupported(
- () => window2 && HTMLElement && 'animate' in HTMLElement.prototype,
- );
- const animate = shallowRef(void 0);
- const store = shallowReactive({
- startTime: null,
- currentTime: null,
- timeline: null,
- playbackRate: _playbackRate,
- pending: false,
- playState: immediate ? 'idle' : 'paused',
- replaceState: 'active',
- });
- const pending = computed(() => store.pending);
- const playState = computed(() => store.playState);
- const replaceState = computed(() => store.replaceState);
- const startTime = computed({
- get() {
- return store.startTime;
- },
- set(value) {
- store.startTime = value;
- if (animate.value) animate.value.startTime = value;
- },
- });
- const currentTime = computed({
- get() {
- return store.currentTime;
- },
- set(value) {
- store.currentTime = value;
- if (animate.value) {
- animate.value.currentTime = value;
- syncResume();
- }
- },
- });
- const timeline = computed({
- get() {
- return store.timeline;
- },
- set(value) {
- store.timeline = value;
- if (animate.value) animate.value.timeline = value;
- },
- });
- const playbackRate = computed({
- get() {
- return store.playbackRate;
- },
- set(value) {
- store.playbackRate = value;
- if (animate.value) animate.value.playbackRate = value;
- },
- });
- const play = () => {
- if (animate.value) {
- try {
- animate.value.play();
- syncResume();
- } catch (e) {
- syncPause();
- onError(e);
- }
- } else {
- update();
- }
- };
- const pause = () => {
- var _a;
- try {
- (_a = animate.value) == null ? void 0 : _a.pause();
- syncPause();
- } catch (e) {
- onError(e);
- }
- };
- const reverse = () => {
- var _a;
- !animate.value && update();
- try {
- (_a = animate.value) == null ? void 0 : _a.reverse();
- syncResume();
- } catch (e) {
- syncPause();
- onError(e);
- }
- };
- const finish = () => {
- var _a;
- try {
- (_a = animate.value) == null ? void 0 : _a.finish();
- syncPause();
- } catch (e) {
- onError(e);
- }
- };
- const cancel = () => {
- var _a;
- try {
- (_a = animate.value) == null ? void 0 : _a.cancel();
- syncPause();
- } catch (e) {
- onError(e);
- }
- };
- watch(
- () => unrefElement(target),
- (el) => {
- el && update();
- },
- );
- watch(
- () => keyframes,
- (value) => {
- !animate.value && update();
- if (!unrefElement(target) && animate.value) {
- animate.value.effect = new KeyframeEffect(
- unrefElement(target),
- toValue(value),
- animateOptions,
- );
- }
- },
- { deep: true },
- );
- tryOnMounted(() => {
- nextTick(() => update(true));
- });
- tryOnScopeDispose(cancel);
- function update(init) {
- const el = unrefElement(target);
- if (!isSupported.value || !el) return;
- if (!animate.value)
- animate.value = el.animate(toValue(keyframes), animateOptions);
- if (commitStyles) animate.value.commitStyles();
- if (persist) animate.value.persist();
- if (_playbackRate !== 1) animate.value.playbackRate = _playbackRate;
- if (init && !immediate) animate.value.pause();
- else syncResume();
- onReady == null ? void 0 : onReady(animate.value);
- }
- useEventListener(animate, ['cancel', 'finish', 'remove'], syncPause);
- const { resume: resumeRef, pause: pauseRef } = useRafFn(
- () => {
- if (!animate.value) return;
- store.pending = animate.value.pending;
- store.playState = animate.value.playState;
- store.replaceState = animate.value.replaceState;
- store.startTime = animate.value.startTime;
- store.currentTime = animate.value.currentTime;
- store.timeline = animate.value.timeline;
- store.playbackRate = animate.value.playbackRate;
- },
- { immediate: false },
- );
- function syncResume() {
- if (isSupported.value) resumeRef();
- }
- function syncPause() {
- if (isSupported.value && window2) window2.requestAnimationFrame(pauseRef);
- }
- return {
- isSupported,
- animate,
- // actions
- play,
- pause,
- reverse,
- finish,
- cancel,
- // state
- pending,
- playState,
- replaceState,
- startTime,
- currentTime,
- timeline,
- playbackRate,
- };
- }
- function useAsyncQueue(tasks, options) {
- const {
- interrupt = true,
- onError = noop,
- onFinished = noop,
- signal,
- } = options || {};
- const promiseState = {
- aborted: 'aborted',
- fulfilled: 'fulfilled',
- pending: 'pending',
- rejected: 'rejected',
- };
- const initialResult = Array.from(
- Array.from({ length: tasks.length }),
- () => ({ state: promiseState.pending, data: null }),
- );
- const result = reactive(initialResult);
- const activeIndex = ref(-1);
- if (!tasks || tasks.length === 0) {
- onFinished();
- return {
- activeIndex,
- result,
- };
- }
- function updateResult(state, res) {
- activeIndex.value++;
- result[activeIndex.value].data = res;
- result[activeIndex.value].state = state;
- }
- tasks.reduce((prev, curr) => {
- return prev
- .then((prevRes) => {
- var _a;
- if (signal == null ? void 0 : signal.aborted) {
- updateResult(promiseState.aborted, new Error('aborted'));
- return;
- }
- if (
- ((_a = result[activeIndex.value]) == null ? void 0 : _a.state) ===
- promiseState.rejected &&
- interrupt
- ) {
- onFinished();
- return;
- }
- const done = curr(prevRes).then((currentRes) => {
- updateResult(promiseState.fulfilled, currentRes);
- activeIndex.value === tasks.length - 1 && onFinished();
- return currentRes;
- });
- if (!signal) return done;
- return Promise.race([done, whenAborted(signal)]);
- })
- .catch((e) => {
- if (signal == null ? void 0 : signal.aborted) {
- updateResult(promiseState.aborted, e);
- return e;
- }
- updateResult(promiseState.rejected, e);
- onError();
- return e;
- });
- }, Promise.resolve());
- return {
- activeIndex,
- result,
- };
- }
- function whenAborted(signal) {
- return new Promise((resolve, reject) => {
- const error = new Error('aborted');
- if (signal.aborted) reject(error);
- else signal.addEventListener('abort', () => reject(error), { once: true });
- });
- }
- function useAsyncState(promise, initialState, options) {
- const {
- immediate = true,
- delay = 0,
- onError = noop,
- onSuccess = noop,
- resetOnExecute = true,
- shallow = true,
- throwError,
- } = options != null ? options : {};
- const state = shallow ? shallowRef(initialState) : ref(initialState);
- const isReady = ref(false);
- const isLoading = ref(false);
- const error = shallowRef(void 0);
- async function execute(delay2 = 0, ...args) {
- if (resetOnExecute) state.value = initialState;
- error.value = void 0;
- isReady.value = false;
- isLoading.value = true;
- if (delay2 > 0) await promiseTimeout(delay2);
- const _promise = typeof promise === 'function' ? promise(...args) : promise;
- try {
- const data = await _promise;
- state.value = data;
- isReady.value = true;
- onSuccess(data);
- } catch (e) {
- error.value = e;
- onError(e);
- if (throwError) throw e;
- } finally {
- isLoading.value = false;
- }
- return state.value;
- }
- if (immediate) execute(delay);
- const shell = {
- state,
- isReady,
- isLoading,
- error,
- execute,
- };
- function waitUntilIsLoaded() {
- return new Promise((resolve, reject) => {
- until(isLoading)
- .toBe(false)
- .then(() => resolve(shell))
- .catch(reject);
- });
- }
- return {
- ...shell,
- then(onFulfilled, onRejected) {
- return waitUntilIsLoaded().then(onFulfilled, onRejected);
- },
- };
- }
- var defaults = {
- array: (v) => JSON.stringify(v),
- object: (v) => JSON.stringify(v),
- set: (v) => JSON.stringify(Array.from(v)),
- map: (v) => JSON.stringify(Object.fromEntries(v)),
- null: () => '',
- };
- function getDefaultSerialization(target) {
- if (!target) return defaults.null;
- if (target instanceof Map) return defaults.map;
- else if (target instanceof Set) return defaults.set;
- else if (Array.isArray(target)) return defaults.array;
- else return defaults.object;
- }
- function useBase64(target, options) {
- const base64 = ref('');
- const promise = ref();
- function execute() {
- if (!isClient) return;
- promise.value = new Promise((resolve, reject) => {
- try {
- const _target = toValue(target);
- if (_target == null) {
- resolve('');
- } else if (typeof _target === 'string') {
- resolve(blobToBase64(new Blob([_target], { type: 'text/plain' })));
- } else if (_target instanceof Blob) {
- resolve(blobToBase64(_target));
- } else if (_target instanceof ArrayBuffer) {
- resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));
- } else if (_target instanceof HTMLCanvasElement) {
- resolve(
- _target.toDataURL(
- options == null ? void 0 : options.type,
- options == null ? void 0 : options.quality,
- ),
- );
- } else if (_target instanceof HTMLImageElement) {
- const img = _target.cloneNode(false);
- img.crossOrigin = 'Anonymous';
- imgLoaded(img)
- .then(() => {
- const canvas = document.createElement('canvas');
- const ctx = canvas.getContext('2d');
- canvas.width = img.width;
- canvas.height = img.height;
- ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
- resolve(
- canvas.toDataURL(
- options == null ? void 0 : options.type,
- options == null ? void 0 : options.quality,
- ),
- );
- })
- .catch(reject);
- } else if (typeof _target === 'object') {
- const _serializeFn =
- (options == null ? void 0 : options.serializer) ||
- getDefaultSerialization(_target);
- const serialized = _serializeFn(_target);
- return resolve(
- blobToBase64(new Blob([serialized], { type: 'application/json' })),
- );
- } else {
- reject(new Error('target is unsupported types'));
- }
- } catch (error) {
- reject(error);
- }
- });
- promise.value.then((res) => (base64.value = res));
- return promise.value;
- }
- if (isRef(target) || typeof target === 'function')
- watch(target, execute, { immediate: true });
- else execute();
- return {
- base64,
- promise,
- execute,
- };
- }
- function imgLoaded(img) {
- return new Promise((resolve, reject) => {
- if (!img.complete) {
- img.onload = () => {
- resolve();
- };
- img.onerror = reject;
- } else {
- resolve();
- }
- });
- }
- function blobToBase64(blob) {
- return new Promise((resolve, reject) => {
- const fr = new FileReader();
- fr.onload = (e) => {
- resolve(e.target.result);
- };
- fr.onerror = reject;
- fr.readAsDataURL(blob);
- });
- }
- function useBattery(options = {}) {
- const { navigator = defaultNavigator } = options;
- const events2 = [
- 'chargingchange',
- 'chargingtimechange',
- 'dischargingtimechange',
- 'levelchange',
- ];
- const isSupported = useSupported(
- () =>
- navigator &&
- 'getBattery' in navigator &&
- typeof navigator.getBattery === 'function',
- );
- const charging = ref(false);
- const chargingTime = ref(0);
- const dischargingTime = ref(0);
- const level = ref(1);
- let battery;
- function updateBatteryInfo() {
- charging.value = this.charging;
- chargingTime.value = this.chargingTime || 0;
- dischargingTime.value = this.dischargingTime || 0;
- level.value = this.level;
- }
- if (isSupported.value) {
- navigator.getBattery().then((_battery) => {
- battery = _battery;
- updateBatteryInfo.call(battery);
- useEventListener(battery, events2, updateBatteryInfo, { passive: true });
- });
- }
- return {
- isSupported,
- charging,
- chargingTime,
- dischargingTime,
- level,
- };
- }
- function useBluetooth(options) {
- let { acceptAllDevices = false } = options || {};
- const {
- filters = void 0,
- optionalServices = void 0,
- navigator = defaultNavigator,
- } = options || {};
- const isSupported = useSupported(() => navigator && 'bluetooth' in navigator);
- const device = shallowRef(void 0);
- const error = shallowRef(null);
- watch(device, () => {
- connectToBluetoothGATTServer();
- });
- async function requestDevice() {
- if (!isSupported.value) return;
- error.value = null;
- if (filters && filters.length > 0) acceptAllDevices = false;
- try {
- device.value = await (navigator == null
- ? void 0
- : navigator.bluetooth.requestDevice({
- acceptAllDevices,
- filters,
- optionalServices,
- }));
- } catch (err) {
- error.value = err;
- }
- }
- const server = ref();
- const isConnected = computed(() => {
- var _a;
- return ((_a = server.value) == null ? void 0 : _a.connected) || false;
- });
- async function connectToBluetoothGATTServer() {
- error.value = null;
- if (device.value && device.value.gatt) {
- device.value.addEventListener('gattserverdisconnected', () => {});
- try {
- server.value = await device.value.gatt.connect();
- } catch (err) {
- error.value = err;
- }
- }
- }
- tryOnMounted(() => {
- var _a;
- if (device.value) (_a = device.value.gatt) == null ? void 0 : _a.connect();
- });
- tryOnScopeDispose(() => {
- var _a;
- if (device.value)
- (_a = device.value.gatt) == null ? void 0 : _a.disconnect();
- });
- return {
- isSupported,
- isConnected,
- // Device:
- device,
- requestDevice,
- // Server:
- server,
- // Errors:
- error,
- };
- }
- function useMediaQuery(query, options = {}) {
- const { window: window2 = defaultWindow } = options;
- const isSupported = useSupported(
- () =>
- window2 &&
- 'matchMedia' in window2 &&
- typeof window2.matchMedia === 'function',
- );
- let mediaQuery;
- const matches = ref(false);
- const handler = (event) => {
- matches.value = event.matches;
- };
- const cleanup = () => {
- if (!mediaQuery) return;
- if ('removeEventListener' in mediaQuery)
- mediaQuery.removeEventListener('change', handler);
- else mediaQuery.removeListener(handler);
- };
- const stopWatch = watchEffect(() => {
- if (!isSupported.value) return;
- cleanup();
- mediaQuery = window2.matchMedia(toValue(query));
- if ('addEventListener' in mediaQuery)
- mediaQuery.addEventListener('change', handler);
- else mediaQuery.addListener(handler);
- matches.value = mediaQuery.matches;
- });
- tryOnScopeDispose(() => {
- stopWatch();
- cleanup();
- mediaQuery = void 0;
- });
- return matches;
- }
- var breakpointsTailwind = {
- sm: 640,
- md: 768,
- lg: 1024,
- xl: 1280,
- '2xl': 1536,
- };
- var breakpointsBootstrapV5 = {
- xs: 0,
- sm: 576,
- md: 768,
- lg: 992,
- xl: 1200,
- xxl: 1400,
- };
- var breakpointsVuetifyV2 = {
- xs: 0,
- sm: 600,
- md: 960,
- lg: 1264,
- xl: 1904,
- };
- var breakpointsVuetifyV3 = {
- xs: 0,
- sm: 600,
- md: 960,
- lg: 1280,
- xl: 1920,
- xxl: 2560,
- };
- var breakpointsVuetify = breakpointsVuetifyV2;
- var breakpointsAntDesign = {
- xs: 480,
- sm: 576,
- md: 768,
- lg: 992,
- xl: 1200,
- xxl: 1600,
- };
- var breakpointsQuasar = {
- xs: 0,
- sm: 600,
- md: 1024,
- lg: 1440,
- xl: 1920,
- };
- var breakpointsSematic = {
- mobileS: 320,
- mobileM: 375,
- mobileL: 425,
- tablet: 768,
- laptop: 1024,
- laptopL: 1440,
- desktop4K: 2560,
- };
- var breakpointsMasterCss = {
- '3xs': 360,
- '2xs': 480,
- xs: 600,
- sm: 768,
- md: 1024,
- lg: 1280,
- xl: 1440,
- '2xl': 1600,
- '3xl': 1920,
- '4xl': 2560,
- };
- var breakpointsPrimeFlex = {
- sm: 576,
- md: 768,
- lg: 992,
- xl: 1200,
- };
- function useBreakpoints(breakpoints, options = {}) {
- function getValue2(k, delta) {
- let v = toValue(breakpoints[toValue(k)]);
- if (delta != null) v = increaseWithUnit(v, delta);
- if (typeof v === 'number') v = `${v}px`;
- return v;
- }
- const { window: window2 = defaultWindow, strategy = 'min-width' } = options;
- function match(query) {
- if (!window2) return false;
- return window2.matchMedia(query).matches;
- }
- const greaterOrEqual = (k) => {
- return useMediaQuery(() => `(min-width: ${getValue2(k)})`, options);
- };
- const smallerOrEqual = (k) => {
- return useMediaQuery(() => `(max-width: ${getValue2(k)})`, options);
- };
- const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {
- Object.defineProperty(shortcuts, k, {
- get: () =>
- strategy === 'min-width' ? greaterOrEqual(k) : smallerOrEqual(k),
- enumerable: true,
- configurable: true,
- });
- return shortcuts;
- }, {});
- function current() {
- const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);
- return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));
- }
- return Object.assign(shortcutMethods, {
- greaterOrEqual,
- smallerOrEqual,
- greater(k) {
- return useMediaQuery(() => `(min-width: ${getValue2(k, 0.1)})`, options);
- },
- smaller(k) {
- return useMediaQuery(() => `(max-width: ${getValue2(k, -0.1)})`, options);
- },
- between(a, b) {
- return useMediaQuery(
- () =>
- `(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`,
- options,
- );
- },
- isGreater(k) {
- return match(`(min-width: ${getValue2(k, 0.1)})`);
- },
- isGreaterOrEqual(k) {
- return match(`(min-width: ${getValue2(k)})`);
- },
- isSmaller(k) {
- return match(`(max-width: ${getValue2(k, -0.1)})`);
- },
- isSmallerOrEqual(k) {
- return match(`(max-width: ${getValue2(k)})`);
- },
- isInBetween(a, b) {
- return match(
- `(min-width: ${getValue2(a)}) and (max-width: ${getValue2(b, -0.1)})`,
- );
- },
- current,
- active() {
- const bps = current();
- return computed(() => (bps.value.length === 0 ? '' : bps.value.at(-1)));
- },
- });
- }
- function useBroadcastChannel(options) {
- const { name, window: window2 = defaultWindow } = options;
- const isSupported = useSupported(
- () => window2 && 'BroadcastChannel' in window2,
- );
- const isClosed = ref(false);
- const channel = ref();
- const data = ref();
- const error = shallowRef(null);
- const post = (data2) => {
- if (channel.value) channel.value.postMessage(data2);
- };
- const close = () => {
- if (channel.value) channel.value.close();
- isClosed.value = true;
- };
- if (isSupported.value) {
- tryOnMounted(() => {
- error.value = null;
- channel.value = new BroadcastChannel(name);
- channel.value.addEventListener(
- 'message',
- (e) => {
- data.value = e.data;
- },
- { passive: true },
- );
- channel.value.addEventListener(
- 'messageerror',
- (e) => {
- error.value = e;
- },
- { passive: true },
- );
- channel.value.addEventListener('close', () => {
- isClosed.value = true;
- });
- });
- }
- tryOnScopeDispose(() => {
- close();
- });
- return {
- isSupported,
- channel,
- data,
- post,
- close,
- error,
- isClosed,
- };
- }
- var WRITABLE_PROPERTIES = [
- 'hash',
- 'host',
- 'hostname',
- 'href',
- 'pathname',
- 'port',
- 'protocol',
- 'search',
- ];
- function useBrowserLocation(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const refs = Object.fromEntries(
- WRITABLE_PROPERTIES.map((key) => [key, ref()]),
- );
- for (const [key, ref2] of objectEntries(refs)) {
- watch(ref2, (value) => {
- if (
- !(window2 == null ? void 0 : window2.location) ||
- window2.location[key] === value
- )
- return;
- window2.location[key] = value;
- });
- }
- const buildState = (trigger) => {
- var _a;
- const { state: state2, length } =
- (window2 == null ? void 0 : window2.history) || {};
- const { origin } = (window2 == null ? void 0 : window2.location) || {};
- for (const key of WRITABLE_PROPERTIES)
- refs[key].value =
- (_a = window2 == null ? void 0 : window2.location) == null
- ? void 0
- : _a[key];
- return reactive({
- trigger,
- state: state2,
- length,
- origin,
- ...refs,
- });
- };
- const state = ref(buildState('load'));
- if (window2) {
- useEventListener(
- window2,
- 'popstate',
- () => (state.value = buildState('popstate')),
- { passive: true },
- );
- useEventListener(
- window2,
- 'hashchange',
- () => (state.value = buildState('hashchange')),
- { passive: true },
- );
- }
- return state;
- }
- function useCached(refValue, comparator = (a, b) => a === b, watchOptions) {
- const cachedValue = ref(refValue.value);
- watch(
- () => refValue.value,
- (value) => {
- if (!comparator(value, cachedValue.value)) cachedValue.value = value;
- },
- watchOptions,
- );
- return cachedValue;
- }
- function usePermission(permissionDesc, options = {}) {
- const { controls = false, navigator = defaultNavigator } = options;
- const isSupported = useSupported(
- () => navigator && 'permissions' in navigator,
- );
- let permissionStatus;
- const desc =
- typeof permissionDesc === 'string'
- ? { name: permissionDesc }
- : permissionDesc;
- const state = ref();
- const onChange = () => {
- if (permissionStatus) state.value = permissionStatus.state;
- };
- const query = createSingletonPromise(async () => {
- if (!isSupported.value) return;
- if (!permissionStatus) {
- try {
- permissionStatus = await navigator.permissions.query(desc);
- useEventListener(permissionStatus, 'change', onChange);
- onChange();
- } catch (e) {
- state.value = 'prompt';
- }
- }
- return permissionStatus;
- });
- query();
- if (controls) {
- return {
- state,
- isSupported,
- query,
- };
- } else {
- return state;
- }
- }
- function useClipboard(options = {}) {
- const {
- navigator = defaultNavigator,
- read = false,
- source,
- copiedDuring = 1500,
- legacy = false,
- } = options;
- const isClipboardApiSupported = useSupported(
- () => navigator && 'clipboard' in navigator,
- );
- const permissionRead = usePermission('clipboard-read');
- const permissionWrite = usePermission('clipboard-write');
- const isSupported = computed(() => isClipboardApiSupported.value || legacy);
- const text = ref('');
- const copied = ref(false);
- const timeout = useTimeoutFn(() => (copied.value = false), copiedDuring);
- function updateText() {
- if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) {
- navigator.clipboard.readText().then((value) => {
- text.value = value;
- });
- } else {
- text.value = legacyRead();
- }
- }
- if (isSupported.value && read) useEventListener(['copy', 'cut'], updateText);
- async function copy(value = toValue(source)) {
- if (isSupported.value && value != null) {
- if (isClipboardApiSupported.value && isAllowed(permissionWrite.value))
- await navigator.clipboard.writeText(value);
- else legacyCopy(value);
- text.value = value;
- copied.value = true;
- timeout.start();
- }
- }
- function legacyCopy(value) {
- const ta = document.createElement('textarea');
- ta.value = value != null ? value : '';
- ta.style.position = 'absolute';
- ta.style.opacity = '0';
- document.body.appendChild(ta);
- ta.select();
- document.execCommand('copy');
- ta.remove();
- }
- function legacyRead() {
- var _a, _b, _c;
- return (_c =
- (_b =
- (_a = document == null ? void 0 : document.getSelection) == null
- ? void 0
- : _a.call(document)) == null
- ? void 0
- : _b.toString()) != null
- ? _c
- : '';
- }
- function isAllowed(status) {
- return status === 'granted' || status === 'prompt';
- }
- return {
- isSupported,
- text,
- copied,
- copy,
- };
- }
- function useClipboardItems(options = {}) {
- const {
- navigator = defaultNavigator,
- read = false,
- source,
- copiedDuring = 1500,
- } = options;
- const isSupported = useSupported(() => navigator && 'clipboard' in navigator);
- const content = ref([]);
- const copied = ref(false);
- const timeout = useTimeoutFn(() => (copied.value = false), copiedDuring);
- function updateContent() {
- if (isSupported.value) {
- navigator.clipboard.read().then((items) => {
- content.value = items;
- });
- }
- }
- if (isSupported.value && read)
- useEventListener(['copy', 'cut'], updateContent);
- async function copy(value = toValue(source)) {
- if (isSupported.value && value != null) {
- await navigator.clipboard.write(value);
- content.value = value;
- copied.value = true;
- timeout.start();
- }
- }
- return {
- isSupported,
- content,
- copied,
- copy,
- };
- }
- function cloneFnJSON(source) {
- return JSON.parse(JSON.stringify(source));
- }
- function useCloned(source, options = {}) {
- const cloned = ref({});
- const {
- manual,
- clone = cloneFnJSON,
- // watch options
- deep = true,
- immediate = true,
- } = options;
- function sync() {
- cloned.value = clone(toValue(source));
- }
- if (!manual && (isRef(source) || typeof source === 'function')) {
- watch(source, sync, {
- ...options,
- deep,
- immediate,
- });
- } else {
- sync();
- }
- return { cloned, sync };
- }
- var _global =
- typeof globalThis !== 'undefined'
- ? globalThis
- : typeof window !== 'undefined'
- ? window
- : typeof global !== 'undefined'
- ? global
- : typeof self !== 'undefined'
- ? self
- : {};
- var globalKey = '__vueuse_ssr_handlers__';
- var handlers = getHandlers();
- function getHandlers() {
- if (!(globalKey in _global)) _global[globalKey] = _global[globalKey] || {};
- return _global[globalKey];
- }
- function getSSRHandler(key, fallback) {
- return handlers[key] || fallback;
- }
- function setSSRHandler(key, fn) {
- handlers[key] = fn;
- }
- function guessSerializerType(rawInit) {
- 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';
- }
- var StorageSerializers = {
- boolean: {
- read: (v) => v === 'true',
- write: (v) => String(v),
- },
- object: {
- read: (v) => JSON.parse(v),
- write: (v) => JSON.stringify(v),
- },
- number: {
- read: (v) => Number.parseFloat(v),
- write: (v) => String(v),
- },
- any: {
- read: (v) => v,
- write: (v) => String(v),
- },
- string: {
- read: (v) => v,
- write: (v) => String(v),
- },
- map: {
- read: (v) => new Map(JSON.parse(v)),
- write: (v) => JSON.stringify(Array.from(v.entries())),
- },
- set: {
- read: (v) => new Set(JSON.parse(v)),
- write: (v) => JSON.stringify(Array.from(v)),
- },
- date: {
- read: (v) => new Date(v),
- write: (v) => v.toISOString(),
- },
- };
- var customStorageEventName = 'vueuse-storage';
- function useStorage(key, defaults2, storage, options = {}) {
- var _a;
- const {
- flush = 'pre',
- deep = true,
- listenToStorageChanges = true,
- writeDefaults = true,
- mergeDefaults = false,
- shallow,
- window: window2 = defaultWindow,
- eventFilter,
- onError = (e) => {
- console.error(e);
- },
- initOnMounted,
- } = options;
- const data = (shallow ? shallowRef : ref)(
- typeof defaults2 === 'function' ? defaults2() : defaults2,
- );
- if (!storage) {
- try {
- storage = getSSRHandler('getDefaultStorage', () => {
- var _a2;
- return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
- })();
- } catch (e) {
- onError(e);
- }
- }
- if (!storage) return data;
- const rawInit = toValue(defaults2);
- const type = guessSerializerType(rawInit);
- const serializer =
- (_a = options.serializer) != null ? _a : StorageSerializers[type];
- const { pause: pauseWatch, resume: resumeWatch } = watchPausable(
- data,
- () => write(data.value),
- { flush, deep, eventFilter },
- );
- if (window2 && listenToStorageChanges) {
- tryOnMounted(() => {
- useEventListener(window2, 'storage', update);
- useEventListener(window2, customStorageEventName, updateFromCustomEvent);
- if (initOnMounted) update();
- });
- }
- if (!initOnMounted) update();
- function dispatchWriteEvent(oldValue, newValue) {
- if (window2) {
- window2.dispatchEvent(
- new CustomEvent(customStorageEventName, {
- detail: {
- key,
- oldValue,
- newValue,
- storageArea: storage,
- },
- }),
- );
- }
- }
- function write(v) {
- try {
- const oldValue = storage.getItem(key);
- if (v == null) {
- dispatchWriteEvent(oldValue, null);
- storage.removeItem(key);
- } else {
- const serialized = serializer.write(v);
- if (oldValue !== serialized) {
- storage.setItem(key, serialized);
- dispatchWriteEvent(oldValue, serialized);
- }
- }
- } catch (e) {
- onError(e);
- }
- }
- function read(event) {
- const rawValue = event ? event.newValue : storage.getItem(key);
- if (rawValue == null) {
- if (writeDefaults && rawInit != null)
- storage.setItem(key, serializer.write(rawInit));
- return rawInit;
- } else if (!event && mergeDefaults) {
- const value = serializer.read(rawValue);
- if (typeof mergeDefaults === 'function')
- return mergeDefaults(value, rawInit);
- else if (type === 'object' && !Array.isArray(value))
- return { ...rawInit, ...value };
- return value;
- } else if (typeof rawValue !== 'string') {
- return rawValue;
- } else {
- return serializer.read(rawValue);
- }
- }
- function update(event) {
- if (event && event.storageArea !== storage) return;
- if (event && event.key == null) {
- data.value = rawInit;
- return;
- }
- if (event && event.key !== key) return;
- pauseWatch();
- try {
- if (
- (event == null ? void 0 : event.newValue) !==
- serializer.write(data.value)
- )
- data.value = read(event);
- } catch (e) {
- onError(e);
- } finally {
- if (event) nextTick(resumeWatch);
- else resumeWatch();
- }
- }
- function updateFromCustomEvent(event) {
- update(event.detail);
- }
- return data;
- }
- function usePreferredDark(options) {
- return useMediaQuery('(prefers-color-scheme: dark)', options);
- }
- function useColorMode(options = {}) {
- const {
- selector = 'html',
- attribute = 'class',
- initialValue = 'auto',
- window: window2 = defaultWindow,
- storage,
- storageKey = 'vueuse-color-scheme',
- listenToStorageChanges = true,
- storageRef,
- emitAuto,
- disableTransition = true,
- } = options;
- const modes = {
- auto: '',
- light: 'light',
- dark: 'dark',
- ...(options.modes || {}),
- };
- const preferredDark = usePreferredDark({ window: window2 });
- const system = computed(() => (preferredDark.value ? 'dark' : 'light'));
- const store =
- storageRef ||
- (storageKey == null
- ? toRef2(initialValue)
- : useStorage(storageKey, initialValue, storage, {
- window: window2,
- listenToStorageChanges,
- }));
- const state = computed(() =>
- store.value === 'auto' ? system.value : store.value,
- );
- const updateHTMLAttrs = getSSRHandler(
- 'updateHTMLAttrs',
- (selector2, attribute2, value) => {
- const el =
- typeof selector2 === 'string'
- ? window2 == null
- ? void 0
- : window2.document.querySelector(selector2)
- : unrefElement(selector2);
- if (!el) return;
- let style;
- if (disableTransition) {
- style = window2.document.createElement('style');
- const styleString =
- '*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}';
- style.appendChild(document.createTextNode(styleString));
- window2.document.head.appendChild(style);
- }
- if (attribute2 === 'class') {
- const current = value.split(/\s/g);
- Object.values(modes)
- .flatMap((i) => (i || '').split(/\s/g))
- .filter(Boolean)
- .forEach((v) => {
- if (current.includes(v)) el.classList.add(v);
- else el.classList.remove(v);
- });
- } else {
- el.setAttribute(attribute2, value);
- }
- if (disableTransition) {
- window2.getComputedStyle(style).opacity;
- document.head.removeChild(style);
- }
- },
- );
- function defaultOnChanged(mode) {
- var _a;
- updateHTMLAttrs(
- selector,
- attribute,
- (_a = modes[mode]) != null ? _a : mode,
- );
- }
- function onChanged(mode) {
- if (options.onChanged) options.onChanged(mode, defaultOnChanged);
- else defaultOnChanged(mode);
- }
- watch(state, onChanged, { flush: 'post', immediate: true });
- tryOnMounted(() => onChanged(state.value));
- const auto = computed({
- get() {
- return emitAuto ? store.value : state.value;
- },
- set(v) {
- store.value = v;
- },
- });
- try {
- return Object.assign(auto, { store, system, state });
- } catch (e) {
- return auto;
- }
- }
- function useConfirmDialog(revealed = ref(false)) {
- const confirmHook = createEventHook();
- const cancelHook = createEventHook();
- const revealHook = createEventHook();
- let _resolve = noop;
- const reveal = (data) => {
- revealHook.trigger(data);
- revealed.value = true;
- return new Promise((resolve) => {
- _resolve = resolve;
- });
- };
- const confirm = (data) => {
- revealed.value = false;
- confirmHook.trigger(data);
- _resolve({ data, isCanceled: false });
- };
- const cancel = (data) => {
- revealed.value = false;
- cancelHook.trigger(data);
- _resolve({ data, isCanceled: true });
- };
- return {
- isRevealed: computed(() => revealed.value),
- reveal,
- confirm,
- cancel,
- onReveal: revealHook.on,
- onConfirm: confirmHook.on,
- onCancel: cancelHook.on,
- };
- }
- function useMutationObserver(target, callback, options = {}) {
- const { window: window2 = defaultWindow, ...mutationOptions } = options;
- let observer;
- const isSupported = useSupported(
- () => window2 && 'MutationObserver' in window2,
- );
- const cleanup = () => {
- if (observer) {
- observer.disconnect();
- observer = void 0;
- }
- };
- const targets = computed(() => {
- const value = toValue(target);
- const items = (Array.isArray(value) ? value : [value])
- .map(unrefElement)
- .filter(notNullish);
- return new Set(items);
- });
- const stopWatch = watch(
- () => targets.value,
- (targets2) => {
- cleanup();
- if (isSupported.value && window2 && targets2.size) {
- observer = new MutationObserver(callback);
- targets2.forEach((el) => observer.observe(el, mutationOptions));
- }
- },
- { immediate: true, flush: 'post' },
- );
- const takeRecords = () => {
- return observer == null ? void 0 : observer.takeRecords();
- };
- const stop = () => {
- cleanup();
- stopWatch();
- };
- tryOnScopeDispose(stop);
- return {
- isSupported,
- stop,
- takeRecords,
- };
- }
- function useCssVar(prop, target, options = {}) {
- const {
- window: window2 = defaultWindow,
- initialValue = '',
- observe = false,
- } = options;
- const variable = ref(initialValue);
- const elRef = computed(() => {
- var _a;
- return (
- unrefElement(target) ||
- ((_a = window2 == null ? void 0 : window2.document) == null
- ? void 0
- : _a.documentElement)
- );
- });
- function updateCssVar() {
- var _a;
- const key = toValue(prop);
- const el = toValue(elRef);
- if (el && window2) {
- const value =
- (_a = window2.getComputedStyle(el).getPropertyValue(key)) == null
- ? void 0
- : _a.trim();
- variable.value = value || initialValue;
- }
- }
- if (observe) {
- useMutationObserver(elRef, updateCssVar, {
- attributeFilter: ['style', 'class'],
- window: window2,
- });
- }
- watch([elRef, () => toValue(prop)], updateCssVar, { immediate: true });
- watch(variable, (val) => {
- var _a;
- if ((_a = elRef.value) == null ? void 0 : _a.style)
- elRef.value.style.setProperty(toValue(prop), val);
- });
- return variable;
- }
- function useCurrentElement(rootComponent) {
- const vm = getCurrentInstance();
- const currentElement = computedWithControl(
- () => null,
- () => (rootComponent ? unrefElement(rootComponent) : vm.proxy.$el),
- );
- onUpdated(currentElement.trigger);
- onMounted(currentElement.trigger);
- return currentElement;
- }
- function useCycleList(list, options) {
- const state = shallowRef(getInitialValue());
- const listRef = toRef2(list);
- const index = computed({
- get() {
- var _a;
- const targetList = listRef.value;
- let index2 = (options == null ? void 0 : options.getIndexOf)
- ? options.getIndexOf(state.value, targetList)
- : targetList.indexOf(state.value);
- if (index2 < 0)
- index2 =
- (_a = options == null ? void 0 : options.fallbackIndex) != null
- ? _a
- : 0;
- return index2;
- },
- set(v) {
- set3(v);
- },
- });
- function set3(i) {
- const targetList = listRef.value;
- const length = targetList.length;
- const index2 = ((i % length) + length) % length;
- const value = targetList[index2];
- state.value = value;
- return value;
- }
- function shift(delta = 1) {
- return set3(index.value + delta);
- }
- function next(n = 1) {
- return shift(n);
- }
- function prev(n = 1) {
- return shift(-n);
- }
- function getInitialValue() {
- var _a, _b;
- return (_b = toValue(
- (_a = options == null ? void 0 : options.initialValue) != null
- ? _a
- : toValue(list)[0],
- )) != null
- ? _b
- : void 0;
- }
- watch(listRef, () => set3(index.value));
- return {
- state,
- index,
- next,
- prev,
- go: set3,
- };
- }
- function useDark(options = {}) {
- const {
- valueDark = 'dark',
- valueLight = '',
- window: window2 = defaultWindow,
- } = options;
- const mode = useColorMode({
- ...options,
- onChanged: (mode2, defaultHandler) => {
- var _a;
- if (options.onChanged)
- (_a = options.onChanged) == null
- ? void 0
- : _a.call(options, mode2 === 'dark', defaultHandler, mode2);
- else defaultHandler(mode2);
- },
- modes: {
- dark: valueDark,
- light: valueLight,
- },
- });
- const system = computed(() => {
- if (mode.system) {
- return mode.system.value;
- } else {
- const preferredDark = usePreferredDark({ window: window2 });
- return preferredDark.value ? 'dark' : 'light';
- }
- });
- const isDark = computed({
- get() {
- return mode.value === 'dark';
- },
- set(v) {
- const modeVal = v ? 'dark' : 'light';
- if (system.value === modeVal) mode.value = 'auto';
- else mode.value = modeVal;
- },
- });
- return isDark;
- }
- function fnBypass(v) {
- return v;
- }
- function fnSetSource(source, value) {
- return (source.value = value);
- }
- function defaultDump(clone) {
- return clone ? (typeof clone === 'function' ? clone : cloneFnJSON) : fnBypass;
- }
- function defaultParse(clone) {
- return clone ? (typeof clone === 'function' ? clone : cloneFnJSON) : fnBypass;
- }
- function useManualRefHistory(source, options = {}) {
- const {
- clone = false,
- dump = defaultDump(clone),
- parse = defaultParse(clone),
- setSource = fnSetSource,
- } = options;
- function _createHistoryRecord() {
- return markRaw({
- snapshot: dump(source.value),
- timestamp: timestamp(),
- });
- }
- const last = ref(_createHistoryRecord());
- const undoStack = ref([]);
- const redoStack = ref([]);
- const _setSource = (record) => {
- setSource(source, parse(record.snapshot));
- last.value = record;
- };
- const commit = () => {
- undoStack.value.unshift(last.value);
- last.value = _createHistoryRecord();
- if (options.capacity && undoStack.value.length > options.capacity)
- undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);
- if (redoStack.value.length)
- redoStack.value.splice(0, redoStack.value.length);
- };
- const clear = () => {
- undoStack.value.splice(0, undoStack.value.length);
- redoStack.value.splice(0, redoStack.value.length);
- };
- const undo = () => {
- const state = undoStack.value.shift();
- if (state) {
- redoStack.value.unshift(last.value);
- _setSource(state);
- }
- };
- const redo = () => {
- const state = redoStack.value.shift();
- if (state) {
- undoStack.value.unshift(last.value);
- _setSource(state);
- }
- };
- const reset = () => {
- _setSource(last.value);
- };
- const history = computed(() => [last.value, ...undoStack.value]);
- const canUndo = computed(() => undoStack.value.length > 0);
- const canRedo = computed(() => redoStack.value.length > 0);
- return {
- source,
- undoStack,
- redoStack,
- last,
- history,
- canUndo,
- canRedo,
- clear,
- commit,
- reset,
- undo,
- redo,
- };
- }
- function useRefHistory(source, options = {}) {
- const { deep = false, flush = 'pre', eventFilter } = options;
- const {
- eventFilter: composedFilter,
- pause,
- resume: resumeTracking,
- isActive: isTracking,
- } = pausableFilter(eventFilter);
- const { ignoreUpdates, ignorePrevAsyncUpdates, stop } = watchIgnorable(
- source,
- commit,
- { deep, flush, eventFilter: composedFilter },
- );
- function setSource(source2, value) {
- ignorePrevAsyncUpdates();
- ignoreUpdates(() => {
- source2.value = value;
- });
- }
- const manualHistory = useManualRefHistory(source, {
- ...options,
- clone: options.clone || deep,
- setSource,
- });
- const { clear, commit: manualCommit } = manualHistory;
- function commit() {
- ignorePrevAsyncUpdates();
- manualCommit();
- }
- function resume(commitNow) {
- resumeTracking();
- if (commitNow) commit();
- }
- function batch(fn) {
- let canceled = false;
- const cancel = () => (canceled = true);
- ignoreUpdates(() => {
- fn(cancel);
- });
- if (!canceled) commit();
- }
- function dispose() {
- stop();
- clear();
- }
- return {
- ...manualHistory,
- isTracking,
- pause,
- resume,
- commit,
- batch,
- dispose,
- };
- }
- function useDebouncedRefHistory(source, options = {}) {
- const filter = options.debounce ? debounceFilter(options.debounce) : void 0;
- const history = useRefHistory(source, { ...options, eventFilter: filter });
- return {
- ...history,
- };
- }
- function useDeviceMotion(options = {}) {
- const { window: window2 = defaultWindow, eventFilter = bypassFilter } =
- options;
- const acceleration = ref({ x: null, y: null, z: null });
- const rotationRate = ref({ alpha: null, beta: null, gamma: null });
- const interval = ref(0);
- const accelerationIncludingGravity = ref({
- x: null,
- y: null,
- z: null,
- });
- if (window2) {
- const onDeviceMotion = createFilterWrapper(eventFilter, (event) => {
- acceleration.value = event.acceleration;
- accelerationIncludingGravity.value = event.accelerationIncludingGravity;
- rotationRate.value = event.rotationRate;
- interval.value = event.interval;
- });
- useEventListener(window2, 'devicemotion', onDeviceMotion);
- }
- return {
- acceleration,
- accelerationIncludingGravity,
- rotationRate,
- interval,
- };
- }
- function useDeviceOrientation(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const isSupported = useSupported(
- () => window2 && 'DeviceOrientationEvent' in window2,
- );
- const isAbsolute = ref(false);
- const alpha = ref(null);
- const beta = ref(null);
- const gamma = ref(null);
- if (window2 && isSupported.value) {
- useEventListener(window2, 'deviceorientation', (event) => {
- isAbsolute.value = event.absolute;
- alpha.value = event.alpha;
- beta.value = event.beta;
- gamma.value = event.gamma;
- });
- }
- return {
- isSupported,
- isAbsolute,
- alpha,
- beta,
- gamma,
- };
- }
- function useDevicePixelRatio(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const pixelRatio = ref(1);
- if (window2) {
- let observe2 = function () {
- pixelRatio.value = window2.devicePixelRatio;
- cleanup2();
- media = window2.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);
- media.addEventListener('change', observe2, { once: true });
- },
- cleanup2 = function () {
- media == null ? void 0 : media.removeEventListener('change', observe2);
- };
- let media;
- observe2();
- tryOnScopeDispose(cleanup2);
- }
- return { pixelRatio };
- }
- function useDevicesList(options = {}) {
- const {
- navigator = defaultNavigator,
- requestPermissions = false,
- constraints = { audio: true, video: true },
- onUpdated: onUpdated2,
- } = options;
- const devices = ref([]);
- const videoInputs = computed(() =>
- devices.value.filter((i) => i.kind === 'videoinput'),
- );
- const audioInputs = computed(() =>
- devices.value.filter((i) => i.kind === 'audioinput'),
- );
- const audioOutputs = computed(() =>
- devices.value.filter((i) => i.kind === 'audiooutput'),
- );
- const isSupported = useSupported(
- () =>
- navigator &&
- navigator.mediaDevices &&
- navigator.mediaDevices.enumerateDevices,
- );
- const permissionGranted = ref(false);
- let stream;
- async function update() {
- if (!isSupported.value) return;
- devices.value = await navigator.mediaDevices.enumerateDevices();
- onUpdated2 == null ? void 0 : onUpdated2(devices.value);
- if (stream) {
- stream.getTracks().forEach((t) => t.stop());
- stream = null;
- }
- }
- async function ensurePermissions() {
- if (!isSupported.value) return false;
- if (permissionGranted.value) return true;
- const { state, query } = usePermission('camera', { controls: true });
- await query();
- if (state.value !== 'granted') {
- stream = await navigator.mediaDevices.getUserMedia(constraints);
- update();
- permissionGranted.value = true;
- } else {
- permissionGranted.value = true;
- }
- return permissionGranted.value;
- }
- if (isSupported.value) {
- if (requestPermissions) ensurePermissions();
- useEventListener(navigator.mediaDevices, 'devicechange', update);
- update();
- }
- return {
- devices,
- ensurePermissions,
- permissionGranted,
- videoInputs,
- audioInputs,
- audioOutputs,
- isSupported,
- };
- }
- function useDisplayMedia(options = {}) {
- var _a;
- const enabled = ref((_a = options.enabled) != null ? _a : false);
- const video = options.video;
- const audio = options.audio;
- const { navigator = defaultNavigator } = options;
- const isSupported = useSupported(() => {
- var _a2;
- return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null
- ? void 0
- : _a2.getDisplayMedia;
- });
- const constraint = { audio, video };
- const stream = shallowRef();
- async function _start() {
- if (!isSupported.value || stream.value) return;
- stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);
- return stream.value;
- }
- async function _stop() {
- var _a2;
- (_a2 = stream.value) == null
- ? void 0
- : _a2.getTracks().forEach((t) => t.stop());
- stream.value = void 0;
- }
- function stop() {
- _stop();
- enabled.value = false;
- }
- async function start() {
- await _start();
- if (stream.value) enabled.value = true;
- return stream.value;
- }
- watch(
- enabled,
- (v) => {
- if (v) _start();
- else _stop();
- },
- { immediate: true },
- );
- return {
- isSupported,
- stream,
- start,
- stop,
- enabled,
- };
- }
- function useDocumentVisibility(options = {}) {
- const { document: document2 = defaultDocument } = options;
- if (!document2) return ref('visible');
- const visibility = ref(document2.visibilityState);
- useEventListener(document2, 'visibilitychange', () => {
- visibility.value = document2.visibilityState;
- });
- return visibility;
- }
- function useDraggable(target, options = {}) {
- var _a, _b;
- const {
- pointerTypes,
- preventDefault: preventDefault2,
- stopPropagation,
- exact,
- onMove,
- onEnd,
- onStart,
- initialValue,
- axis = 'both',
- draggingElement = defaultWindow,
- containerElement,
- handle: draggingHandle = target,
- } = options;
- const position = ref(
- (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 },
- );
- const pressedDelta = ref();
- const filterEvent = (e) => {
- if (pointerTypes) return pointerTypes.includes(e.pointerType);
- return true;
- };
- const handleEvent = (e) => {
- if (toValue(preventDefault2)) e.preventDefault();
- if (toValue(stopPropagation)) e.stopPropagation();
- };
- const start = (e) => {
- var _a2;
- if (toValue(options.disabled) || !filterEvent(e)) return;
- if (toValue(exact) && e.target !== toValue(target)) return;
- const container = toValue(containerElement);
- const containerRect =
- (_a2 = container == null ? void 0 : container.getBoundingClientRect) ==
- null
- ? void 0
- : _a2.call(container);
- const targetRect = toValue(target).getBoundingClientRect();
- const pos = {
- x:
- e.clientX -
- (container
- ? targetRect.left - containerRect.left + container.scrollLeft
- : targetRect.left),
- y:
- e.clientY -
- (container
- ? targetRect.top - containerRect.top + container.scrollTop
- : targetRect.top),
- };
- if ((onStart == null ? void 0 : onStart(pos, e)) === false) return;
- pressedDelta.value = pos;
- handleEvent(e);
- };
- const move = (e) => {
- if (toValue(options.disabled) || !filterEvent(e)) return;
- if (!pressedDelta.value) return;
- const container = toValue(containerElement);
- const targetRect = toValue(target).getBoundingClientRect();
- let { x, y } = position.value;
- if (axis === 'x' || axis === 'both') {
- x = e.clientX - pressedDelta.value.x;
- if (container)
- x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);
- }
- if (axis === 'y' || axis === 'both') {
- y = e.clientY - pressedDelta.value.y;
- if (container)
- y = Math.min(
- Math.max(0, y),
- container.scrollHeight - targetRect.height,
- );
- }
- position.value = {
- x,
- y,
- };
- onMove == null ? void 0 : onMove(position.value, e);
- handleEvent(e);
- };
- const end = (e) => {
- if (toValue(options.disabled) || !filterEvent(e)) return;
- if (!pressedDelta.value) return;
- pressedDelta.value = void 0;
- onEnd == null ? void 0 : onEnd(position.value, e);
- handleEvent(e);
- };
- if (isClient) {
- const config = { capture: (_b = options.capture) != null ? _b : true };
- useEventListener(draggingHandle, 'pointerdown', start, config);
- useEventListener(draggingElement, 'pointermove', move, config);
- useEventListener(draggingElement, 'pointerup', end, config);
- }
- return {
- ...toRefs2(position),
- position,
- isDragging: computed(() => !!pressedDelta.value),
- style: computed(
- () => `left:${position.value.x}px;top:${position.value.y}px;`,
- ),
- };
- }
- function useDropZone(target, options = {}) {
- const isOverDropZone = ref(false);
- const files = shallowRef(null);
- let counter = 0;
- let isDataTypeIncluded = true;
- if (isClient) {
- const _options =
- typeof options === 'function' ? { onDrop: options } : options;
- const getFiles = (event) => {
- var _a, _b;
- const list = Array.from(
- (_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null
- ? _b
- : [],
- );
- return (files.value = list.length === 0 ? null : list);
- };
- useEventListener(target, 'dragenter', (event) => {
- var _a, _b;
- const types = Array.from(
- ((_a = event == null ? void 0 : event.dataTransfer) == null
- ? void 0
- : _a.items) || [],
- )
- .map((i) => (i.kind === 'file' ? i.type : null))
- .filter(notNullish);
- if (_options.dataTypes && event.dataTransfer) {
- const dataTypes = unref(_options.dataTypes);
- isDataTypeIncluded =
- typeof dataTypes === 'function'
- ? dataTypes(types)
- : dataTypes
- ? dataTypes.some((item) => types.includes(item))
- : true;
- if (!isDataTypeIncluded) return;
- }
- event.preventDefault();
- counter += 1;
- isOverDropZone.value = true;
- (_b = _options.onEnter) == null
- ? void 0
- : _b.call(_options, getFiles(event), event);
- });
- useEventListener(target, 'dragover', (event) => {
- var _a;
- if (!isDataTypeIncluded) return;
- event.preventDefault();
- (_a = _options.onOver) == null
- ? void 0
- : _a.call(_options, getFiles(event), event);
- });
- useEventListener(target, 'dragleave', (event) => {
- var _a;
- if (!isDataTypeIncluded) return;
- event.preventDefault();
- counter -= 1;
- if (counter === 0) isOverDropZone.value = false;
- (_a = _options.onLeave) == null
- ? void 0
- : _a.call(_options, getFiles(event), event);
- });
- useEventListener(target, 'drop', (event) => {
- var _a;
- event.preventDefault();
- counter = 0;
- isOverDropZone.value = false;
- (_a = _options.onDrop) == null
- ? void 0
- : _a.call(_options, getFiles(event), event);
- });
- }
- return {
- files,
- isOverDropZone,
- };
- }
- function useResizeObserver(target, callback, options = {}) {
- const { window: window2 = defaultWindow, ...observerOptions } = options;
- let observer;
- const isSupported = useSupported(
- () => window2 && 'ResizeObserver' in window2,
- );
- const cleanup = () => {
- if (observer) {
- observer.disconnect();
- observer = void 0;
- }
- };
- const targets = computed(() =>
- Array.isArray(target)
- ? target.map((el) => unrefElement(el))
- : [unrefElement(target)],
- );
- const stopWatch = watch(
- targets,
- (els) => {
- cleanup();
- if (isSupported.value && window2) {
- observer = new ResizeObserver(callback);
- for (const _el of els) _el && observer.observe(_el, observerOptions);
- }
- },
- { immediate: true, flush: 'post' },
- );
- const stop = () => {
- cleanup();
- stopWatch();
- };
- tryOnScopeDispose(stop);
- return {
- isSupported,
- stop,
- };
- }
- function useElementBounding(target, options = {}) {
- const {
- reset = true,
- windowResize = true,
- windowScroll = true,
- immediate = true,
- } = options;
- const height = ref(0);
- const bottom = ref(0);
- const left = ref(0);
- const right = ref(0);
- const top = ref(0);
- const width = ref(0);
- const x = ref(0);
- const y = ref(0);
- function update() {
- const el = unrefElement(target);
- if (!el) {
- if (reset) {
- height.value = 0;
- bottom.value = 0;
- left.value = 0;
- right.value = 0;
- top.value = 0;
- width.value = 0;
- x.value = 0;
- y.value = 0;
- }
- return;
- }
- const rect = el.getBoundingClientRect();
- height.value = rect.height;
- bottom.value = rect.bottom;
- left.value = rect.left;
- right.value = rect.right;
- top.value = rect.top;
- width.value = rect.width;
- x.value = rect.x;
- y.value = rect.y;
- }
- useResizeObserver(target, update);
- watch(
- () => unrefElement(target),
- (ele) => !ele && update(),
- );
- useMutationObserver(target, update, {
- attributeFilter: ['style', 'class'],
- });
- if (windowScroll)
- useEventListener('scroll', update, { capture: true, passive: true });
- if (windowResize) useEventListener('resize', update, { passive: true });
- tryOnMounted(() => {
- if (immediate) update();
- });
- return {
- height,
- bottom,
- left,
- right,
- top,
- width,
- x,
- y,
- update,
- };
- }
- function useElementByPoint(options) {
- const {
- x,
- y,
- document: document2 = defaultDocument,
- multiple,
- interval = 'requestAnimationFrame',
- immediate = true,
- } = options;
- const isSupported = useSupported(() => {
- if (toValue(multiple)) return document2 && 'elementsFromPoint' in document2;
- return document2 && 'elementFromPoint' in document2;
- });
- const element = ref(null);
- const cb = () => {
- var _a, _b;
- element.value = toValue(multiple)
- ? (_a =
- document2 == null
- ? void 0
- : document2.elementsFromPoint(toValue(x), toValue(y))) != null
- ? _a
- : []
- : (_b =
- document2 == null
- ? void 0
- : document2.elementFromPoint(toValue(x), toValue(y))) != null
- ? _b
- : null;
- };
- const controls =
- interval === 'requestAnimationFrame'
- ? useRafFn(cb, { immediate })
- : useIntervalFn(cb, interval, { immediate });
- return {
- isSupported,
- element,
- ...controls,
- };
- }
- function useElementHover(el, options = {}) {
- const {
- delayEnter = 0,
- delayLeave = 0,
- window: window2 = defaultWindow,
- } = options;
- const isHovered = ref(false);
- let timer;
- const toggle = (entering) => {
- const delay = entering ? delayEnter : delayLeave;
- if (timer) {
- clearTimeout(timer);
- timer = void 0;
- }
- if (delay) timer = setTimeout(() => (isHovered.value = entering), delay);
- else isHovered.value = entering;
- };
- if (!window2) return isHovered;
- useEventListener(el, 'mouseenter', () => toggle(true), { passive: true });
- useEventListener(el, 'mouseleave', () => toggle(false), { passive: true });
- return isHovered;
- }
- function useElementSize(
- target,
- initialSize = { width: 0, height: 0 },
- options = {},
- ) {
- const { window: window2 = defaultWindow, box = 'content-box' } = options;
- const isSVG = computed(() => {
- var _a, _b;
- return (_b =
- (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null
- ? void 0
- : _b.includes('svg');
- });
- const width = ref(initialSize.width);
- const height = ref(initialSize.height);
- const { stop: stop1 } = useResizeObserver(
- target,
- ([entry]) => {
- const boxSize =
- box === 'border-box'
- ? entry.borderBoxSize
- : box === 'content-box'
- ? entry.contentBoxSize
- : entry.devicePixelContentBoxSize;
- if (window2 && isSVG.value) {
- const $elem = unrefElement(target);
- if ($elem) {
- const styles = window2.getComputedStyle($elem);
- width.value = Number.parseFloat(styles.width);
- height.value = Number.parseFloat(styles.height);
- }
- } else {
- if (boxSize) {
- const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];
- width.value = formatBoxSize.reduce(
- (acc, { inlineSize }) => acc + inlineSize,
- 0,
- );
- height.value = formatBoxSize.reduce(
- (acc, { blockSize }) => acc + blockSize,
- 0,
- );
- } else {
- width.value = entry.contentRect.width;
- height.value = entry.contentRect.height;
- }
- }
- },
- options,
- );
- tryOnMounted(() => {
- const ele = unrefElement(target);
- if (ele) {
- width.value = 'offsetWidth' in ele ? ele.offsetWidth : initialSize.width;
- height.value =
- 'offsetHeight' in ele ? ele.offsetHeight : initialSize.height;
- }
- });
- const stop2 = watch(
- () => unrefElement(target),
- (ele) => {
- width.value = ele ? initialSize.width : 0;
- height.value = ele ? initialSize.height : 0;
- },
- );
- function stop() {
- stop1();
- stop2();
- }
- return {
- width,
- height,
- stop,
- };
- }
- function useIntersectionObserver(target, callback, options = {}) {
- const {
- root,
- rootMargin = '0px',
- threshold = 0.1,
- window: window2 = defaultWindow,
- immediate = true,
- } = options;
- const isSupported = useSupported(
- () => window2 && 'IntersectionObserver' in window2,
- );
- const targets = computed(() => {
- const _target = toValue(target);
- return (Array.isArray(_target) ? _target : [_target])
- .map(unrefElement)
- .filter(notNullish);
- });
- let cleanup = noop;
- const isActive = ref(immediate);
- const stopWatch = isSupported.value
- ? watch(
- () => [targets.value, unrefElement(root), isActive.value],
- ([targets2, root2]) => {
- cleanup();
- if (!isActive.value) return;
- if (!targets2.length) return;
- const observer = new IntersectionObserver(callback, {
- root: unrefElement(root2),
- rootMargin,
- threshold,
- });
- targets2.forEach((el) => el && observer.observe(el));
- cleanup = () => {
- observer.disconnect();
- cleanup = noop;
- };
- },
- { immediate, flush: 'post' },
- )
- : noop;
- const stop = () => {
- cleanup();
- stopWatch();
- isActive.value = false;
- };
- tryOnScopeDispose(stop);
- return {
- isSupported,
- isActive,
- pause() {
- cleanup();
- isActive.value = false;
- },
- resume() {
- isActive.value = true;
- },
- stop,
- };
- }
- function useElementVisibility(element, options = {}) {
- const {
- window: window2 = defaultWindow,
- scrollTarget,
- threshold = 0,
- } = options;
- const elementIsVisible = ref(false);
- useIntersectionObserver(
- element,
- (intersectionObserverEntries) => {
- let isIntersecting = elementIsVisible.value;
- let latestTime = 0;
- for (const entry of intersectionObserverEntries) {
- if (entry.time >= latestTime) {
- latestTime = entry.time;
- isIntersecting = entry.isIntersecting;
- }
- }
- elementIsVisible.value = isIntersecting;
- },
- {
- root: scrollTarget,
- window: window2,
- threshold,
- },
- );
- return elementIsVisible;
- }
- var events = /* @__PURE__ */ new Map();
- function useEventBus(key) {
- const scope = getCurrentScope();
- function on(listener) {
- var _a;
- const listeners = events.get(key) || /* @__PURE__ */ new Set();
- listeners.add(listener);
- events.set(key, listeners);
- const _off = () => off(listener);
- (_a = scope == null ? void 0 : scope.cleanups) == null
- ? void 0
- : _a.push(_off);
- return _off;
- }
- function once(listener) {
- function _listener(...args) {
- off(_listener);
- listener(...args);
- }
- return on(_listener);
- }
- function off(listener) {
- const listeners = events.get(key);
- if (!listeners) return;
- listeners.delete(listener);
- if (!listeners.size) reset();
- }
- function reset() {
- events.delete(key);
- }
- function emit(event, payload) {
- var _a;
- (_a = events.get(key)) == null
- ? void 0
- : _a.forEach((v) => v(event, payload));
- }
- return { on, once, off, emit, reset };
- }
- function resolveNestedOptions$1(options) {
- if (options === true) return {};
- return options;
- }
- function useEventSource(url, events2 = [], options = {}) {
- const event = ref(null);
- const data = ref(null);
- const status = ref('CONNECTING');
- const eventSource = ref(null);
- const error = shallowRef(null);
- const urlRef = toRef2(url);
- let explicitlyClosed = false;
- let retried = 0;
- const { withCredentials = false, immediate = true } = options;
- const close = () => {
- if (isClient && eventSource.value) {
- eventSource.value.close();
- eventSource.value = null;
- status.value = 'CLOSED';
- explicitlyClosed = true;
- }
- };
- const _init = () => {
- if (explicitlyClosed || typeof urlRef.value === 'undefined') return;
- const es = new EventSource(urlRef.value, { withCredentials });
- status.value = 'CONNECTING';
- eventSource.value = es;
- es.onopen = () => {
- status.value = 'OPEN';
- error.value = null;
- };
- es.onerror = (e) => {
- status.value = 'CLOSED';
- error.value = e;
- if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) {
- es.close();
- const {
- retries = -1,
- delay = 1e3,
- onFailed,
- } = resolveNestedOptions$1(options.autoReconnect);
- retried += 1;
- if (typeof retries === 'number' && (retries < 0 || retried < retries))
- setTimeout(_init, delay);
- else if (typeof retries === 'function' && retries())
- setTimeout(_init, delay);
- else onFailed == null ? void 0 : onFailed();
- }
- };
- es.onmessage = (e) => {
- event.value = null;
- data.value = e.data;
- };
- for (const event_name of events2) {
- useEventListener(es, event_name, (e) => {
- event.value = event_name;
- data.value = e.data || null;
- });
- }
- };
- const open = () => {
- if (!isClient) return;
- close();
- explicitlyClosed = false;
- retried = 0;
- _init();
- };
- if (immediate) watch(urlRef, open, { immediate: true });
- tryOnScopeDispose(close);
- return {
- eventSource,
- event,
- data,
- status,
- error,
- open,
- close,
- };
- }
- function useEyeDropper(options = {}) {
- const { initialValue = '' } = options;
- const isSupported = useSupported(
- () => typeof window !== 'undefined' && 'EyeDropper' in window,
- );
- const sRGBHex = ref(initialValue);
- async function open(openOptions) {
- if (!isSupported.value) return;
- const eyeDropper = new window.EyeDropper();
- const result = await eyeDropper.open(openOptions);
- sRGBHex.value = result.sRGBHex;
- return result;
- }
- return { isSupported, sRGBHex, open };
- }
- function useFavicon(newIcon = null, options = {}) {
- const {
- baseUrl = '',
- rel = 'icon',
- document: document2 = defaultDocument,
- } = options;
- const favicon = toRef2(newIcon);
- const applyIcon = (icon) => {
- const elements =
- document2 == null
- ? void 0
- : document2.head.querySelectorAll(`link[rel*="${rel}"]`);
- if (!elements || elements.length === 0) {
- const link = document2 == null ? void 0 : document2.createElement('link');
- if (link) {
- link.rel = rel;
- link.href = `${baseUrl}${icon}`;
- link.type = `image/${icon.split('.').pop()}`;
- document2 == null ? void 0 : document2.head.append(link);
- }
- return;
- }
- elements == null
- ? void 0
- : elements.forEach((el) => (el.href = `${baseUrl}${icon}`));
- };
- watch(
- favicon,
- (i, o) => {
- if (typeof i === 'string' && i !== o) applyIcon(i);
- },
- { immediate: true },
- );
- return favicon;
- }
- var payloadMapping = {
- json: 'application/json',
- text: 'text/plain',
- };
- function isFetchOptions(obj) {
- return (
- obj &&
- containsProp(
- obj,
- 'immediate',
- 'refetch',
- 'initialData',
- 'timeout',
- 'beforeFetch',
- 'afterFetch',
- 'onFetchError',
- 'fetch',
- 'updateDataOnError',
- )
- );
- }
- function isAbsoluteURL(url) {
- return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
- }
- function headersToObject(headers) {
- if (typeof Headers !== 'undefined' && headers instanceof Headers)
- return Object.fromEntries(headers.entries());
- return headers;
- }
- function combineCallbacks(combination, ...callbacks) {
- if (combination === 'overwrite') {
- return async (ctx) => {
- const callback = callbacks[callbacks.length - 1];
- if (callback) return { ...ctx, ...(await callback(ctx)) };
- return ctx;
- };
- } else {
- return async (ctx) => {
- for (const callback of callbacks) {
- if (callback) ctx = { ...ctx, ...(await callback(ctx)) };
- }
- return ctx;
- };
- }
- }
- function createFetch(config = {}) {
- const _combination = config.combination || 'chain';
- const _options = config.options || {};
- const _fetchOptions = config.fetchOptions || {};
- function useFactoryFetch(url, ...args) {
- const computedUrl = computed(() => {
- const baseUrl = toValue(config.baseUrl);
- const targetUrl = toValue(url);
- return baseUrl && !isAbsoluteURL(targetUrl)
- ? joinPaths(baseUrl, targetUrl)
- : targetUrl;
- });
- let options = _options;
- let fetchOptions = _fetchOptions;
- if (args.length > 0) {
- if (isFetchOptions(args[0])) {
- options = {
- ...options,
- ...args[0],
- beforeFetch: combineCallbacks(
- _combination,
- _options.beforeFetch,
- args[0].beforeFetch,
- ),
- afterFetch: combineCallbacks(
- _combination,
- _options.afterFetch,
- args[0].afterFetch,
- ),
- onFetchError: combineCallbacks(
- _combination,
- _options.onFetchError,
- args[0].onFetchError,
- ),
- };
- } else {
- fetchOptions = {
- ...fetchOptions,
- ...args[0],
- headers: {
- ...(headersToObject(fetchOptions.headers) || {}),
- ...(headersToObject(args[0].headers) || {}),
- },
- };
- }
- }
- if (args.length > 1 && isFetchOptions(args[1])) {
- options = {
- ...options,
- ...args[1],
- beforeFetch: combineCallbacks(
- _combination,
- _options.beforeFetch,
- args[1].beforeFetch,
- ),
- afterFetch: combineCallbacks(
- _combination,
- _options.afterFetch,
- args[1].afterFetch,
- ),
- onFetchError: combineCallbacks(
- _combination,
- _options.onFetchError,
- args[1].onFetchError,
- ),
- };
- }
- return useFetch(computedUrl, fetchOptions, options);
- }
- return useFactoryFetch;
- }
- function useFetch(url, ...args) {
- var _a;
- const supportsAbort = typeof AbortController === 'function';
- let fetchOptions = {};
- let options = {
- immediate: true,
- refetch: false,
- timeout: 0,
- updateDataOnError: false,
- };
- const config = {
- method: 'GET',
- type: 'text',
- payload: void 0,
- };
- if (args.length > 0) {
- if (isFetchOptions(args[0])) options = { ...options, ...args[0] };
- else fetchOptions = args[0];
- }
- if (args.length > 1) {
- if (isFetchOptions(args[1])) options = { ...options, ...args[1] };
- }
- const {
- fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,
- initialData,
- timeout,
- } = options;
- const responseEvent = createEventHook();
- const errorEvent = createEventHook();
- const finallyEvent = createEventHook();
- const isFinished = ref(false);
- const isFetching = ref(false);
- const aborted = ref(false);
- const statusCode = ref(null);
- const response = shallowRef(null);
- const error = shallowRef(null);
- const data = shallowRef(initialData || null);
- const canAbort = computed(() => supportsAbort && isFetching.value);
- let controller;
- let timer;
- const abort = () => {
- if (supportsAbort) {
- controller == null ? void 0 : controller.abort();
- controller = new AbortController();
- controller.signal.onabort = () => (aborted.value = true);
- fetchOptions = {
- ...fetchOptions,
- signal: controller.signal,
- };
- }
- };
- const loading = (isLoading) => {
- isFetching.value = isLoading;
- isFinished.value = !isLoading;
- };
- if (timeout) timer = useTimeoutFn(abort, timeout, { immediate: false });
- let executeCounter = 0;
- const execute = async (throwOnFailed = false) => {
- var _a2, _b;
- abort();
- loading(true);
- error.value = null;
- statusCode.value = null;
- aborted.value = false;
- executeCounter += 1;
- const currentExecuteCounter = executeCounter;
- const defaultFetchOptions = {
- method: config.method,
- headers: {},
- };
- if (config.payload) {
- const headers = headersToObject(defaultFetchOptions.headers);
- const payload = toValue(config.payload);
- if (
- !config.payloadType &&
- payload &&
- Object.getPrototypeOf(payload) === Object.prototype &&
- !(payload instanceof FormData)
- )
- config.payloadType = 'json';
- if (config.payloadType)
- headers['Content-Type'] =
- (_a2 = payloadMapping[config.payloadType]) != null
- ? _a2
- : config.payloadType;
- defaultFetchOptions.body =
- config.payloadType === 'json' ? JSON.stringify(payload) : payload;
- }
- let isCanceled = false;
- const context = {
- url: toValue(url),
- options: {
- ...defaultFetchOptions,
- ...fetchOptions,
- },
- cancel: () => {
- isCanceled = true;
- },
- };
- if (options.beforeFetch)
- Object.assign(context, await options.beforeFetch(context));
- if (isCanceled || !fetch) {
- loading(false);
- return Promise.resolve(null);
- }
- let responseData = null;
- if (timer) timer.start();
- return fetch(context.url, {
- ...defaultFetchOptions,
- ...context.options,
- headers: {
- ...headersToObject(defaultFetchOptions.headers),
- ...headersToObject(
- (_b = context.options) == null ? void 0 : _b.headers,
- ),
- },
- })
- .then(async (fetchResponse) => {
- response.value = fetchResponse;
- statusCode.value = fetchResponse.status;
- responseData = await fetchResponse.clone()[config.type]();
- if (!fetchResponse.ok) {
- data.value = initialData || null;
- throw new Error(fetchResponse.statusText);
- }
- if (options.afterFetch) {
- ({ data: responseData } = await options.afterFetch({
- data: responseData,
- response: fetchResponse,
- }));
- }
- data.value = responseData;
- responseEvent.trigger(fetchResponse);
- return fetchResponse;
- })
- .catch(async (fetchError) => {
- let errorData = fetchError.message || fetchError.name;
- if (options.onFetchError) {
- ({ error: errorData, data: responseData } =
- await options.onFetchError({
- data: responseData,
- error: fetchError,
- response: response.value,
- }));
- }
- error.value = errorData;
- if (options.updateDataOnError) data.value = responseData;
- errorEvent.trigger(fetchError);
- if (throwOnFailed) throw fetchError;
- return null;
- })
- .finally(() => {
- if (currentExecuteCounter === executeCounter) loading(false);
- if (timer) timer.stop();
- finallyEvent.trigger(null);
- });
- };
- const refetch = toRef2(options.refetch);
- watch([refetch, toRef2(url)], ([refetch2]) => refetch2 && execute(), {
- deep: true,
- });
- const shell = {
- isFinished: readonly(isFinished),
- isFetching: readonly(isFetching),
- statusCode,
- response,
- error,
- data,
- canAbort,
- aborted,
- abort,
- execute,
- onFetchResponse: responseEvent.on,
- onFetchError: errorEvent.on,
- onFetchFinally: finallyEvent.on,
- // method
- get: setMethod('GET'),
- put: setMethod('PUT'),
- post: setMethod('POST'),
- delete: setMethod('DELETE'),
- patch: setMethod('PATCH'),
- head: setMethod('HEAD'),
- options: setMethod('OPTIONS'),
- // type
- json: setType('json'),
- text: setType('text'),
- blob: setType('blob'),
- arrayBuffer: setType('arrayBuffer'),
- formData: setType('formData'),
- };
- function setMethod(method) {
- return (payload, payloadType) => {
- if (!isFetching.value) {
- config.method = method;
- config.payload = payload;
- config.payloadType = payloadType;
- if (isRef(config.payload)) {
- watch(
- [refetch, toRef2(config.payload)],
- ([refetch2]) => refetch2 && execute(),
- { deep: true },
- );
- }
- return {
- ...shell,
- then(onFulfilled, onRejected) {
- return waitUntilFinished().then(onFulfilled, onRejected);
- },
- };
- }
- return void 0;
- };
- }
- function waitUntilFinished() {
- return new Promise((resolve, reject) => {
- until(isFinished)
- .toBe(true)
- .then(() => resolve(shell))
- .catch((error2) => reject(error2));
- });
- }
- function setType(type) {
- return () => {
- if (!isFetching.value) {
- config.type = type;
- return {
- ...shell,
- then(onFulfilled, onRejected) {
- return waitUntilFinished().then(onFulfilled, onRejected);
- },
- };
- }
- return void 0;
- };
- }
- if (options.immediate) Promise.resolve().then(() => execute());
- return {
- ...shell,
- then(onFulfilled, onRejected) {
- return waitUntilFinished().then(onFulfilled, onRejected);
- },
- };
- }
- function joinPaths(start, end) {
- if (!start.endsWith('/') && !end.startsWith('/')) return `${start}/${end}`;
- return `${start}${end}`;
- }
- var DEFAULT_OPTIONS = {
- multiple: true,
- accept: '*',
- reset: false,
- directory: false,
- };
- function useFileDialog(options = {}) {
- const { document: document2 = defaultDocument } = options;
- const files = ref(null);
- const { on: onChange, trigger } = createEventHook();
- let input;
- if (document2) {
- input = document2.createElement('input');
- input.type = 'file';
- input.onchange = (event) => {
- const result = event.target;
- files.value = result.files;
- trigger(files.value);
- };
- }
- const reset = () => {
- files.value = null;
- if (input) {
- input.value = '';
- trigger(null);
- }
- };
- const open = (localOptions) => {
- if (!input) return;
- const _options = {
- ...DEFAULT_OPTIONS,
- ...options,
- ...localOptions,
- };
- input.multiple = _options.multiple;
- input.accept = _options.accept;
- input.webkitdirectory = _options.directory;
- if (hasOwn(_options, 'capture')) input.capture = _options.capture;
- if (_options.reset) reset();
- input.click();
- };
- return {
- files: readonly(files),
- open,
- reset,
- onChange,
- };
- }
- function useFileSystemAccess(options = {}) {
- const { window: _window = defaultWindow, dataType = 'Text' } = options;
- const window2 = _window;
- const isSupported = useSupported(
- () =>
- window2 &&
- 'showSaveFilePicker' in window2 &&
- 'showOpenFilePicker' in window2,
- );
- const fileHandle = ref();
- const data = ref();
- const file = ref();
- const fileName = computed(() => {
- var _a, _b;
- return (_b = (_a = file.value) == null ? void 0 : _a.name) != null
- ? _b
- : '';
- });
- const fileMIME = computed(() => {
- var _a, _b;
- return (_b = (_a = file.value) == null ? void 0 : _a.type) != null
- ? _b
- : '';
- });
- const fileSize = computed(() => {
- var _a, _b;
- return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;
- });
- const fileLastModified = computed(() => {
- var _a, _b;
- return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null
- ? _b
- : 0;
- });
- async function open(_options = {}) {
- if (!isSupported.value) return;
- const [handle] = await window2.showOpenFilePicker({
- ...toValue(options),
- ..._options,
- });
- fileHandle.value = handle;
- await updateData();
- }
- async function create(_options = {}) {
- if (!isSupported.value) return;
- fileHandle.value = await window2.showSaveFilePicker({
- ...options,
- ..._options,
- });
- data.value = void 0;
- await updateData();
- }
- async function save(_options = {}) {
- if (!isSupported.value) return;
- if (!fileHandle.value) return saveAs(_options);
- if (data.value) {
- const writableStream = await fileHandle.value.createWritable();
- await writableStream.write(data.value);
- await writableStream.close();
- }
- await updateFile();
- }
- async function saveAs(_options = {}) {
- if (!isSupported.value) return;
- fileHandle.value = await window2.showSaveFilePicker({
- ...options,
- ..._options,
- });
- if (data.value) {
- const writableStream = await fileHandle.value.createWritable();
- await writableStream.write(data.value);
- await writableStream.close();
- }
- await updateFile();
- }
- async function updateFile() {
- var _a;
- file.value = await ((_a = fileHandle.value) == null
- ? void 0
- : _a.getFile());
- }
- async function updateData() {
- var _a, _b;
- await updateFile();
- const type = toValue(dataType);
- if (type === 'Text')
- data.value = await ((_a = file.value) == null ? void 0 : _a.text());
- else if (type === 'ArrayBuffer')
- data.value = await ((_b = file.value) == null
- ? void 0
- : _b.arrayBuffer());
- else if (type === 'Blob') data.value = file.value;
- }
- watch(() => toValue(dataType), updateData);
- return {
- isSupported,
- data,
- file,
- fileName,
- fileMIME,
- fileSize,
- fileLastModified,
- open,
- create,
- save,
- saveAs,
- updateData,
- };
- }
- function useFocus(target, options = {}) {
- const { initialValue = false, focusVisible = false } = options;
- const innerFocused = ref(false);
- const targetElement = computed(() => unrefElement(target));
- useEventListener(targetElement, 'focus', (event) => {
- var _a, _b;
- if (
- !focusVisible ||
- ((_b = (_a = event.target).matches) == null
- ? void 0
- : _b.call(_a, ':focus-visible'))
- )
- innerFocused.value = true;
- });
- useEventListener(targetElement, 'blur', () => (innerFocused.value = false));
- const focused = computed({
- get: () => innerFocused.value,
- set(value) {
- var _a, _b;
- if (!value && innerFocused.value)
- (_a = targetElement.value) == null ? void 0 : _a.blur();
- else if (value && !innerFocused.value)
- (_b = targetElement.value) == null ? void 0 : _b.focus();
- },
- });
- watch(
- targetElement,
- () => {
- focused.value = initialValue;
- },
- { immediate: true, flush: 'post' },
- );
- return { focused };
- }
- function useFocusWithin(target, options = {}) {
- const activeElement = useActiveElement(options);
- const targetElement = computed(() => unrefElement(target));
- const focused = computed(() =>
- targetElement.value && activeElement.value
- ? targetElement.value.contains(activeElement.value)
- : false,
- );
- return { focused };
- }
- function useFps(options) {
- var _a;
- const fps = ref(0);
- if (typeof performance === 'undefined') return fps;
- const every =
- (_a = options == null ? void 0 : options.every) != null ? _a : 10;
- let last = performance.now();
- let ticks = 0;
- useRafFn(() => {
- ticks += 1;
- if (ticks >= every) {
- const now2 = performance.now();
- const diff = now2 - last;
- fps.value = Math.round(1e3 / (diff / ticks));
- last = now2;
- ticks = 0;
- }
- });
- return fps;
- }
- var eventHandlers = [
- 'fullscreenchange',
- 'webkitfullscreenchange',
- 'webkitendfullscreen',
- 'mozfullscreenchange',
- 'MSFullscreenChange',
- ];
- function useFullscreen(target, options = {}) {
- const { document: document2 = defaultDocument, autoExit = false } = options;
- const targetRef = computed(() => {
- var _a;
- return (_a = unrefElement(target)) != null
- ? _a
- : document2 == null
- ? void 0
- : document2.querySelector('html');
- });
- const isFullscreen = ref(false);
- const requestMethod = computed(() => {
- return [
- 'requestFullscreen',
- 'webkitRequestFullscreen',
- 'webkitEnterFullscreen',
- 'webkitEnterFullScreen',
- 'webkitRequestFullScreen',
- 'mozRequestFullScreen',
- 'msRequestFullscreen',
- ].find(
- (m) =>
- (document2 && m in document2) ||
- (targetRef.value && m in targetRef.value),
- );
- });
- const exitMethod = computed(() => {
- return [
- 'exitFullscreen',
- 'webkitExitFullscreen',
- 'webkitExitFullScreen',
- 'webkitCancelFullScreen',
- 'mozCancelFullScreen',
- 'msExitFullscreen',
- ].find(
- (m) =>
- (document2 && m in document2) ||
- (targetRef.value && m in targetRef.value),
- );
- });
- const fullscreenEnabled = computed(() => {
- return [
- 'fullScreen',
- 'webkitIsFullScreen',
- 'webkitDisplayingFullscreen',
- 'mozFullScreen',
- 'msFullscreenElement',
- ].find(
- (m) =>
- (document2 && m in document2) ||
- (targetRef.value && m in targetRef.value),
- );
- });
- const fullscreenElementMethod = [
- 'fullscreenElement',
- 'webkitFullscreenElement',
- 'mozFullScreenElement',
- 'msFullscreenElement',
- ].find((m) => document2 && m in document2);
- const isSupported = useSupported(
- () =>
- targetRef.value &&
- document2 &&
- requestMethod.value !== void 0 &&
- exitMethod.value !== void 0 &&
- fullscreenEnabled.value !== void 0,
- );
- const isCurrentElementFullScreen = () => {
- if (fullscreenElementMethod)
- return (
- (document2 == null ? void 0 : document2[fullscreenElementMethod]) ===
- targetRef.value
- );
- return false;
- };
- const isElementFullScreen = () => {
- if (fullscreenEnabled.value) {
- if (document2 && document2[fullscreenEnabled.value] != null) {
- return document2[fullscreenEnabled.value];
- } else {
- const target2 = targetRef.value;
- if (
- (target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null
- ) {
- return Boolean(target2[fullscreenEnabled.value]);
- }
- }
- }
- return false;
- };
- async function exit() {
- if (!isSupported.value || !isFullscreen.value) return;
- if (exitMethod.value) {
- if ((document2 == null ? void 0 : document2[exitMethod.value]) != null) {
- await document2[exitMethod.value]();
- } else {
- const target2 = targetRef.value;
- if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)
- await target2[exitMethod.value]();
- }
- }
- isFullscreen.value = false;
- }
- async function enter() {
- if (!isSupported.value || isFullscreen.value) return;
- if (isElementFullScreen()) await exit();
- const target2 = targetRef.value;
- if (
- requestMethod.value &&
- (target2 == null ? void 0 : target2[requestMethod.value]) != null
- ) {
- await target2[requestMethod.value]();
- isFullscreen.value = true;
- }
- }
- async function toggle() {
- await (isFullscreen.value ? exit() : enter());
- }
- const handlerCallback = () => {
- const isElementFullScreenValue = isElementFullScreen();
- if (
- !isElementFullScreenValue ||
- (isElementFullScreenValue && isCurrentElementFullScreen())
- )
- isFullscreen.value = isElementFullScreenValue;
- };
- useEventListener(document2, eventHandlers, handlerCallback, false);
- useEventListener(
- () => unrefElement(targetRef),
- eventHandlers,
- handlerCallback,
- false,
- );
- if (autoExit) tryOnScopeDispose(exit);
- return {
- isSupported,
- isFullscreen,
- enter,
- exit,
- toggle,
- };
- }
- function mapGamepadToXbox360Controller(gamepad) {
- return computed(() => {
- if (gamepad.value) {
- return {
- buttons: {
- a: gamepad.value.buttons[0],
- b: gamepad.value.buttons[1],
- x: gamepad.value.buttons[2],
- y: gamepad.value.buttons[3],
- },
- bumper: {
- left: gamepad.value.buttons[4],
- right: gamepad.value.buttons[5],
- },
- triggers: {
- left: gamepad.value.buttons[6],
- right: gamepad.value.buttons[7],
- },
- stick: {
- left: {
- horizontal: gamepad.value.axes[0],
- vertical: gamepad.value.axes[1],
- button: gamepad.value.buttons[10],
- },
- right: {
- horizontal: gamepad.value.axes[2],
- vertical: gamepad.value.axes[3],
- button: gamepad.value.buttons[11],
- },
- },
- dpad: {
- up: gamepad.value.buttons[12],
- down: gamepad.value.buttons[13],
- left: gamepad.value.buttons[14],
- right: gamepad.value.buttons[15],
- },
- back: gamepad.value.buttons[8],
- start: gamepad.value.buttons[9],
- };
- }
- return null;
- });
- }
- function useGamepad(options = {}) {
- const { navigator = defaultNavigator } = options;
- const isSupported = useSupported(
- () => navigator && 'getGamepads' in navigator,
- );
- const gamepads = ref([]);
- const onConnectedHook = createEventHook();
- const onDisconnectedHook = createEventHook();
- const stateFromGamepad = (gamepad) => {
- const hapticActuators = [];
- const vibrationActuator =
- 'vibrationActuator' in gamepad ? gamepad.vibrationActuator : null;
- if (vibrationActuator) hapticActuators.push(vibrationActuator);
- if (gamepad.hapticActuators)
- hapticActuators.push(...gamepad.hapticActuators);
- return {
- ...gamepad,
- id: gamepad.id,
- hapticActuators,
- axes: gamepad.axes.map((axes) => axes),
- buttons: gamepad.buttons.map((button) => ({
- pressed: button.pressed,
- touched: button.touched,
- value: button.value,
- })),
- index: gamepad.index,
- };
- };
- const updateGamepadState = () => {
- const _gamepads =
- (navigator == null ? void 0 : navigator.getGamepads()) || [];
- for (const gamepad of _gamepads) {
- if (gamepad && gamepads.value[gamepad.index])
- gamepads.value[gamepad.index] = stateFromGamepad(gamepad);
- }
- };
- const { isActive, pause, resume } = useRafFn(updateGamepadState);
- const onGamepadConnected = (gamepad) => {
- if (!gamepads.value.some(({ index }) => index === gamepad.index)) {
- gamepads.value.push(stateFromGamepad(gamepad));
- onConnectedHook.trigger(gamepad.index);
- }
- resume();
- };
- const onGamepadDisconnected = (gamepad) => {
- gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);
- onDisconnectedHook.trigger(gamepad.index);
- };
- useEventListener('gamepadconnected', (e) => onGamepadConnected(e.gamepad));
- useEventListener('gamepaddisconnected', (e) =>
- onGamepadDisconnected(e.gamepad),
- );
- tryOnMounted(() => {
- const _gamepads =
- (navigator == null ? void 0 : navigator.getGamepads()) || [];
- for (const gamepad of _gamepads) {
- if (gamepad && gamepads.value[gamepad.index]) onGamepadConnected(gamepad);
- }
- });
- pause();
- return {
- isSupported,
- onConnected: onConnectedHook.on,
- onDisconnected: onDisconnectedHook.on,
- gamepads,
- pause,
- resume,
- isActive,
- };
- }
- function useGeolocation(options = {}) {
- const {
- enableHighAccuracy = true,
- maximumAge = 3e4,
- timeout = 27e3,
- navigator = defaultNavigator,
- immediate = true,
- } = options;
- const isSupported = useSupported(
- () => navigator && 'geolocation' in navigator,
- );
- const locatedAt = ref(null);
- const error = shallowRef(null);
- const coords = ref({
- accuracy: 0,
- latitude: Number.POSITIVE_INFINITY,
- longitude: Number.POSITIVE_INFINITY,
- altitude: null,
- altitudeAccuracy: null,
- heading: null,
- speed: null,
- });
- function updatePosition(position) {
- locatedAt.value = position.timestamp;
- coords.value = position.coords;
- error.value = null;
- }
- let watcher;
- function resume() {
- if (isSupported.value) {
- watcher = navigator.geolocation.watchPosition(
- updatePosition,
- (err) => (error.value = err),
- {
- enableHighAccuracy,
- maximumAge,
- timeout,
- },
- );
- }
- }
- if (immediate) resume();
- function pause() {
- if (watcher && navigator) navigator.geolocation.clearWatch(watcher);
- }
- tryOnScopeDispose(() => {
- pause();
- });
- return {
- isSupported,
- coords,
- locatedAt,
- error,
- resume,
- pause,
- };
- }
- var defaultEvents$1 = [
- 'mousemove',
- 'mousedown',
- 'resize',
- 'keydown',
- 'touchstart',
- 'wheel',
- ];
- var oneMinute = 6e4;
- function useIdle(timeout = oneMinute, options = {}) {
- const {
- initialState = false,
- listenForVisibilityChange = true,
- events: events2 = defaultEvents$1,
- window: window2 = defaultWindow,
- eventFilter = throttleFilter(50),
- } = options;
- const idle = ref(initialState);
- const lastActive = ref(timestamp());
- let timer;
- const reset = () => {
- idle.value = false;
- clearTimeout(timer);
- timer = setTimeout(() => (idle.value = true), timeout);
- };
- const onEvent = createFilterWrapper(eventFilter, () => {
- lastActive.value = timestamp();
- reset();
- });
- if (window2) {
- const document2 = window2.document;
- for (const event of events2)
- useEventListener(window2, event, onEvent, { passive: true });
- if (listenForVisibilityChange) {
- useEventListener(document2, 'visibilitychange', () => {
- if (!document2.hidden) onEvent();
- });
- }
- reset();
- }
- return {
- idle,
- lastActive,
- reset,
- };
- }
- async function loadImage(options) {
- return new Promise((resolve, reject) => {
- const img = new Image();
- const {
- src,
- srcset,
- sizes,
- class: clazz,
- loading,
- crossorigin,
- referrerPolicy,
- } = options;
- img.src = src;
- if (srcset) img.srcset = srcset;
- if (sizes) img.sizes = sizes;
- if (clazz) img.className = clazz;
- if (loading) img.loading = loading;
- if (crossorigin) img.crossOrigin = crossorigin;
- if (referrerPolicy) img.referrerPolicy = referrerPolicy;
- img.onload = () => resolve(img);
- img.onerror = reject;
- });
- }
- function useImage(options, asyncStateOptions = {}) {
- const state = useAsyncState(() => loadImage(toValue(options)), void 0, {
- resetOnExecute: true,
- ...asyncStateOptions,
- });
- watch(
- () => toValue(options),
- () => state.execute(asyncStateOptions.delay),
- { deep: true },
- );
- return state;
- }
- var ARRIVED_STATE_THRESHOLD_PIXELS = 1;
- function useScroll(element, options = {}) {
- const {
- throttle = 0,
- idle = 200,
- onStop = noop,
- onScroll = noop,
- offset = {
- left: 0,
- right: 0,
- top: 0,
- bottom: 0,
- },
- eventListenerOptions = {
- capture: false,
- passive: true,
- },
- behavior = 'auto',
- window: window2 = defaultWindow,
- onError = (e) => {
- console.error(e);
- },
- } = options;
- const internalX = ref(0);
- const internalY = ref(0);
- const x = computed({
- get() {
- return internalX.value;
- },
- set(x2) {
- scrollTo2(x2, void 0);
- },
- });
- const y = computed({
- get() {
- return internalY.value;
- },
- set(y2) {
- scrollTo2(void 0, y2);
- },
- });
- function scrollTo2(_x, _y) {
- var _a, _b, _c;
- if (!window2) return;
- const _element = toValue(element);
- if (!_element) return;
- (_c = _element instanceof Document ? window2.document.body : _element) ==
- null
- ? void 0
- : _c.scrollTo({
- top: (_a = toValue(_y)) != null ? _a : y.value,
- left: (_b = toValue(_x)) != null ? _b : x.value,
- behavior: toValue(behavior),
- });
- }
- const isScrolling = ref(false);
- const arrivedState = reactive({
- left: true,
- right: false,
- top: true,
- bottom: false,
- });
- const directions = reactive({
- left: false,
- right: false,
- top: false,
- bottom: false,
- });
- const onScrollEnd = (e) => {
- if (!isScrolling.value) return;
- isScrolling.value = false;
- directions.left = false;
- directions.right = false;
- directions.top = false;
- directions.bottom = false;
- onStop(e);
- };
- const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);
- const setArrivedState = (target) => {
- var _a;
- if (!window2) return;
- const el =
- ((_a = target == null ? void 0 : target.document) == null
- ? void 0
- : _a.documentElement) ||
- (target == null ? void 0 : target.documentElement) ||
- unrefElement(target);
- const { display, flexDirection } = getComputedStyle(el);
- const scrollLeft = el.scrollLeft;
- directions.left = scrollLeft < internalX.value;
- directions.right = scrollLeft > internalX.value;
- const left = Math.abs(scrollLeft) <= (offset.left || 0);
- const right =
- Math.abs(scrollLeft) + el.clientWidth >=
- el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
- if (display === 'flex' && flexDirection === 'row-reverse') {
- arrivedState.left = right;
- arrivedState.right = left;
- } else {
- arrivedState.left = left;
- arrivedState.right = right;
- }
- internalX.value = scrollLeft;
- let scrollTop = el.scrollTop;
- if (target === window2.document && !scrollTop)
- scrollTop = window2.document.body.scrollTop;
- directions.top = scrollTop < internalY.value;
- directions.bottom = scrollTop > internalY.value;
- const top = Math.abs(scrollTop) <= (offset.top || 0);
- const bottom =
- Math.abs(scrollTop) + el.clientHeight >=
- el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;
- if (display === 'flex' && flexDirection === 'column-reverse') {
- arrivedState.top = bottom;
- arrivedState.bottom = top;
- } else {
- arrivedState.top = top;
- arrivedState.bottom = bottom;
- }
- internalY.value = scrollTop;
- };
- const onScrollHandler = (e) => {
- var _a;
- if (!window2) return;
- const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;
- setArrivedState(eventTarget);
- isScrolling.value = true;
- onScrollEndDebounced(e);
- onScroll(e);
- };
- useEventListener(
- element,
- 'scroll',
- throttle
- ? useThrottleFn(onScrollHandler, throttle, true, false)
- : onScrollHandler,
- eventListenerOptions,
- );
- tryOnMounted(() => {
- try {
- const _element = toValue(element);
- if (!_element) return;
- setArrivedState(_element);
- } catch (e) {
- onError(e);
- }
- });
- useEventListener(element, 'scrollend', onScrollEnd, eventListenerOptions);
- return {
- x,
- y,
- isScrolling,
- arrivedState,
- directions,
- measure() {
- const _element = toValue(element);
- if (window2 && _element) setArrivedState(_element);
- },
- };
- }
- function resolveElement(el) {
- if (typeof Window !== 'undefined' && el instanceof Window)
- return el.document.documentElement;
- if (typeof Document !== 'undefined' && el instanceof Document)
- return el.documentElement;
- return el;
- }
- function useInfiniteScroll(element, onLoadMore, options = {}) {
- var _a;
- const {
- direction = 'bottom',
- interval = 100,
- canLoadMore = () => true,
- } = options;
- const state = reactive(
- useScroll(element, {
- ...options,
- offset: {
- [direction]: (_a = options.distance) != null ? _a : 0,
- ...options.offset,
- },
- }),
- );
- const promise = ref();
- const isLoading = computed(() => !!promise.value);
- const observedElement = computed(() => {
- return resolveElement(toValue(element));
- });
- const isElementVisible = useElementVisibility(observedElement);
- function checkAndLoad() {
- state.measure();
- if (
- !observedElement.value ||
- !isElementVisible.value ||
- !canLoadMore(observedElement.value)
- )
- return;
- const { scrollHeight, clientHeight, scrollWidth, clientWidth } =
- observedElement.value;
- const isNarrower =
- direction === 'bottom' || direction === 'top'
- ? scrollHeight <= clientHeight
- : scrollWidth <= clientWidth;
- if (state.arrivedState[direction] || isNarrower) {
- if (!promise.value) {
- promise.value = Promise.all([
- onLoadMore(state),
- new Promise((resolve) => setTimeout(resolve, interval)),
- ]).finally(() => {
- promise.value = null;
- nextTick(() => checkAndLoad());
- });
- }
- }
- }
- watch(
- () => [state.arrivedState[direction], isElementVisible.value],
- checkAndLoad,
- { immediate: true },
- );
- return {
- isLoading,
- };
- }
- var defaultEvents = ['mousedown', 'mouseup', 'keydown', 'keyup'];
- function useKeyModifier(modifier, options = {}) {
- const {
- events: events2 = defaultEvents,
- document: document2 = defaultDocument,
- initial = null,
- } = options;
- const state = ref(initial);
- if (document2) {
- events2.forEach((listenerEvent) => {
- useEventListener(document2, listenerEvent, (evt) => {
- if (typeof evt.getModifierState === 'function')
- state.value = evt.getModifierState(modifier);
- });
- });
- }
- return state;
- }
- function useLocalStorage(key, initialValue, options = {}) {
- const { window: window2 = defaultWindow } = options;
- return useStorage(
- key,
- initialValue,
- window2 == null ? void 0 : window2.localStorage,
- options,
- );
- }
- var DefaultMagicKeysAliasMap = {
- ctrl: 'control',
- command: 'meta',
- cmd: 'meta',
- option: 'alt',
- up: 'arrowup',
- down: 'arrowdown',
- left: 'arrowleft',
- right: 'arrowright',
- };
- function useMagicKeys(options = {}) {
- const {
- reactive: useReactive = false,
- target = defaultWindow,
- aliasMap = DefaultMagicKeysAliasMap,
- passive = true,
- onEventFired = noop,
- } = options;
- const current = reactive(/* @__PURE__ */ new Set());
- const obj = {
- toJSON() {
- return {};
- },
- current,
- };
- const refs = useReactive ? reactive(obj) : obj;
- const metaDeps = /* @__PURE__ */ new Set();
- const usedKeys = /* @__PURE__ */ new Set();
- function setRefs(key, value) {
- if (key in refs) {
- if (useReactive) refs[key] = value;
- else refs[key].value = value;
- }
- }
- function reset() {
- current.clear();
- for (const key of usedKeys) setRefs(key, false);
- }
- function updateRefs(e, value) {
- var _a, _b;
- const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();
- const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();
- const values = [code, key].filter(Boolean);
- if (key) {
- if (value) current.add(key);
- else current.delete(key);
- }
- for (const key2 of values) {
- usedKeys.add(key2);
- setRefs(key2, value);
- }
- if (key === 'meta' && !value) {
- metaDeps.forEach((key2) => {
- current.delete(key2);
- setRefs(key2, false);
- });
- metaDeps.clear();
- } else if (
- typeof e.getModifierState === 'function' &&
- e.getModifierState('Meta') &&
- value
- ) {
- [...current, ...values].forEach((key2) => metaDeps.add(key2));
- }
- }
- useEventListener(
- target,
- 'keydown',
- (e) => {
- updateRefs(e, true);
- return onEventFired(e);
- },
- { passive },
- );
- useEventListener(
- target,
- 'keyup',
- (e) => {
- updateRefs(e, false);
- return onEventFired(e);
- },
- { passive },
- );
- useEventListener('blur', reset, { passive: true });
- useEventListener('focus', reset, { passive: true });
- const proxy = new Proxy(refs, {
- get(target2, prop, rec) {
- if (typeof prop !== 'string') return Reflect.get(target2, prop, rec);
- prop = prop.toLowerCase();
- if (prop in aliasMap) prop = aliasMap[prop];
- if (!(prop in refs)) {
- if (/[+_-]/.test(prop)) {
- const keys2 = prop.split(/[+_-]/g).map((i) => i.trim());
- refs[prop] = computed(() =>
- keys2.every((key) => toValue(proxy[key])),
- );
- } else {
- refs[prop] = ref(false);
- }
- }
- const r = Reflect.get(target2, prop, rec);
- return useReactive ? toValue(r) : r;
- },
- });
- return proxy;
- }
- function usingElRef(source, cb) {
- if (toValue(source)) cb(toValue(source));
- }
- function timeRangeToArray(timeRanges) {
- let ranges = [];
- for (let i = 0; i < timeRanges.length; ++i)
- ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];
- return ranges;
- }
- function tracksToArray(tracks) {
- return Array.from(tracks).map(
- (
- {
- label,
- kind,
- language,
- mode,
- activeCues,
- cues,
- inBandMetadataTrackDispatchType,
- },
- id,
- ) => ({
- id,
- label,
- kind,
- language,
- mode,
- activeCues,
- cues,
- inBandMetadataTrackDispatchType,
- }),
- );
- }
- var defaultOptions = {
- src: '',
- tracks: [],
- };
- function useMediaControls(target, options = {}) {
- options = {
- ...defaultOptions,
- ...options,
- };
- const { document: document2 = defaultDocument } = options;
- const currentTime = ref(0);
- const duration = ref(0);
- const seeking = ref(false);
- const volume = ref(1);
- const waiting = ref(false);
- const ended = ref(false);
- const playing = ref(false);
- const rate = ref(1);
- const stalled = ref(false);
- const buffered = ref([]);
- const tracks = ref([]);
- const selectedTrack = ref(-1);
- const isPictureInPicture = ref(false);
- const muted = ref(false);
- const supportsPictureInPicture =
- document2 && 'pictureInPictureEnabled' in document2;
- const sourceErrorEvent = createEventHook();
- const disableTrack = (track) => {
- usingElRef(target, (el) => {
- if (track) {
- const id = typeof track === 'number' ? track : track.id;
- el.textTracks[id].mode = 'disabled';
- } else {
- for (let i = 0; i < el.textTracks.length; ++i)
- el.textTracks[i].mode = 'disabled';
- }
- selectedTrack.value = -1;
- });
- };
- const enableTrack = (track, disableTracks = true) => {
- usingElRef(target, (el) => {
- const id = typeof track === 'number' ? track : track.id;
- if (disableTracks) disableTrack();
- el.textTracks[id].mode = 'showing';
- selectedTrack.value = id;
- });
- };
- const togglePictureInPicture = () => {
- return new Promise((resolve, reject) => {
- usingElRef(target, async (el) => {
- if (supportsPictureInPicture) {
- if (!isPictureInPicture.value) {
- el.requestPictureInPicture().then(resolve).catch(reject);
- } else {
- document2.exitPictureInPicture().then(resolve).catch(reject);
- }
- }
- });
- });
- };
- watchEffect(() => {
- if (!document2) return;
- const el = toValue(target);
- if (!el) return;
- const src = toValue(options.src);
- let sources = [];
- if (!src) return;
- if (typeof src === 'string') sources = [{ src }];
- else if (Array.isArray(src)) sources = src;
- else if (isObject(src)) sources = [src];
- el.querySelectorAll('source').forEach((e) => {
- e.removeEventListener('error', sourceErrorEvent.trigger);
- e.remove();
- });
- sources.forEach(({ src: src2, type }) => {
- const source = document2.createElement('source');
- source.setAttribute('src', src2);
- source.setAttribute('type', type || '');
- source.addEventListener('error', sourceErrorEvent.trigger);
- el.appendChild(source);
- });
- el.load();
- });
- tryOnScopeDispose(() => {
- const el = toValue(target);
- if (!el) return;
- el.querySelectorAll('source').forEach((e) =>
- e.removeEventListener('error', sourceErrorEvent.trigger),
- );
- });
- watch([target, volume], () => {
- const el = toValue(target);
- if (!el) return;
- el.volume = volume.value;
- });
- watch([target, muted], () => {
- const el = toValue(target);
- if (!el) return;
- el.muted = muted.value;
- });
- watch([target, rate], () => {
- const el = toValue(target);
- if (!el) return;
- el.playbackRate = rate.value;
- });
- watchEffect(() => {
- if (!document2) return;
- const textTracks = toValue(options.tracks);
- const el = toValue(target);
- if (!textTracks || !textTracks.length || !el) return;
- el.querySelectorAll('track').forEach((e) => e.remove());
- textTracks.forEach(
- ({ default: isDefault, kind, label, src, srcLang }, i) => {
- const track = document2.createElement('track');
- track.default = isDefault || false;
- track.kind = kind;
- track.label = label;
- track.src = src;
- track.srclang = srcLang;
- if (track.default) selectedTrack.value = i;
- el.appendChild(track);
- },
- );
- });
- const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(
- currentTime,
- (time) => {
- const el = toValue(target);
- if (!el) return;
- el.currentTime = time;
- },
- );
- const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(
- playing,
- (isPlaying) => {
- const el = toValue(target);
- if (!el) return;
- isPlaying ? el.play() : el.pause();
- },
- );
- useEventListener(target, 'timeupdate', () =>
- ignoreCurrentTimeUpdates(
- () => (currentTime.value = toValue(target).currentTime),
- ),
- );
- useEventListener(
- target,
- 'durationchange',
- () => (duration.value = toValue(target).duration),
- );
- useEventListener(
- target,
- 'progress',
- () => (buffered.value = timeRangeToArray(toValue(target).buffered)),
- );
- useEventListener(target, 'seeking', () => (seeking.value = true));
- useEventListener(target, 'seeked', () => (seeking.value = false));
- useEventListener(target, ['waiting', 'loadstart'], () => {
- waiting.value = true;
- ignorePlayingUpdates(() => (playing.value = false));
- });
- useEventListener(target, 'loadeddata', () => (waiting.value = false));
- useEventListener(target, 'playing', () => {
- waiting.value = false;
- ended.value = false;
- ignorePlayingUpdates(() => (playing.value = true));
- });
- useEventListener(
- target,
- 'ratechange',
- () => (rate.value = toValue(target).playbackRate),
- );
- useEventListener(target, 'stalled', () => (stalled.value = true));
- useEventListener(target, 'ended', () => (ended.value = true));
- useEventListener(target, 'pause', () =>
- ignorePlayingUpdates(() => (playing.value = false)),
- );
- useEventListener(target, 'play', () =>
- ignorePlayingUpdates(() => (playing.value = true)),
- );
- useEventListener(
- target,
- 'enterpictureinpicture',
- () => (isPictureInPicture.value = true),
- );
- useEventListener(
- target,
- 'leavepictureinpicture',
- () => (isPictureInPicture.value = false),
- );
- useEventListener(target, 'volumechange', () => {
- const el = toValue(target);
- if (!el) return;
- volume.value = el.volume;
- muted.value = el.muted;
- });
- const listeners = [];
- const stop = watch([target], () => {
- const el = toValue(target);
- if (!el) return;
- stop();
- listeners[0] = useEventListener(
- el.textTracks,
- 'addtrack',
- () => (tracks.value = tracksToArray(el.textTracks)),
- );
- listeners[1] = useEventListener(
- el.textTracks,
- 'removetrack',
- () => (tracks.value = tracksToArray(el.textTracks)),
- );
- listeners[2] = useEventListener(
- el.textTracks,
- 'change',
- () => (tracks.value = tracksToArray(el.textTracks)),
- );
- });
- tryOnScopeDispose(() => listeners.forEach((listener) => listener()));
- return {
- currentTime,
- duration,
- waiting,
- seeking,
- ended,
- stalled,
- buffered,
- playing,
- rate,
- // Volume
- volume,
- muted,
- // Tracks
- tracks,
- selectedTrack,
- enableTrack,
- disableTrack,
- // Picture in Picture
- supportsPictureInPicture,
- togglePictureInPicture,
- isPictureInPicture,
- // Events
- onSourceError: sourceErrorEvent.on,
- };
- }
- function getMapVue2Compat() {
- const data = shallowReactive({});
- return {
- get: (key) => data[key],
- set: (key, value) => set(data, key, value),
- has: (key) => hasOwn(data, key),
- delete: (key) => del(data, key),
- clear: () => {
- Object.keys(data).forEach((key) => {
- del(data, key);
- });
- },
- };
- }
- function useMemoize(resolver, options) {
- const initCache = () => {
- if (options == null ? void 0 : options.cache)
- return shallowReactive(options.cache);
- if (isVue2) return getMapVue2Compat();
- return shallowReactive(/* @__PURE__ */ new Map());
- };
- const cache = initCache();
- const generateKey = (...args) =>
- (options == null ? void 0 : options.getKey)
- ? options.getKey(...args)
- : JSON.stringify(args);
- const _loadData = (key, ...args) => {
- cache.set(key, resolver(...args));
- return cache.get(key);
- };
- const loadData = (...args) => _loadData(generateKey(...args), ...args);
- const deleteData = (...args) => {
- cache.delete(generateKey(...args));
- };
- const clearData = () => {
- cache.clear();
- };
- const memoized = (...args) => {
- const key = generateKey(...args);
- if (cache.has(key)) return cache.get(key);
- return _loadData(key, ...args);
- };
- memoized.load = loadData;
- memoized.delete = deleteData;
- memoized.clear = clearData;
- memoized.generateKey = generateKey;
- memoized.cache = cache;
- return memoized;
- }
- function useMemory(options = {}) {
- const memory = ref();
- const isSupported = useSupported(
- () => typeof performance !== 'undefined' && 'memory' in performance,
- );
- if (isSupported.value) {
- const { interval = 1e3 } = options;
- useIntervalFn(
- () => {
- memory.value = performance.memory;
- },
- interval,
- {
- immediate: options.immediate,
- immediateCallback: options.immediateCallback,
- },
- );
- }
- return { isSupported, memory };
- }
- var UseMouseBuiltinExtractors = {
- page: (event) => [event.pageX, event.pageY],
- client: (event) => [event.clientX, event.clientY],
- screen: (event) => [event.screenX, event.screenY],
- movement: (event) =>
- event instanceof Touch ? null : [event.movementX, event.movementY],
- };
- function useMouse(options = {}) {
- const {
- type = 'page',
- touch = true,
- resetOnTouchEnds = false,
- initialValue = { x: 0, y: 0 },
- window: window2 = defaultWindow,
- target = window2,
- scroll = true,
- eventFilter,
- } = options;
- let _prevMouseEvent = null;
- const x = ref(initialValue.x);
- const y = ref(initialValue.y);
- const sourceType = ref(null);
- const extractor =
- typeof type === 'function' ? type : UseMouseBuiltinExtractors[type];
- const mouseHandler = (event) => {
- const result = extractor(event);
- _prevMouseEvent = event;
- if (result) {
- [x.value, y.value] = result;
- sourceType.value = 'mouse';
- }
- };
- const touchHandler = (event) => {
- if (event.touches.length > 0) {
- const result = extractor(event.touches[0]);
- if (result) {
- [x.value, y.value] = result;
- sourceType.value = 'touch';
- }
- }
- };
- const scrollHandler = () => {
- if (!_prevMouseEvent || !window2) return;
- const pos = extractor(_prevMouseEvent);
- if (_prevMouseEvent instanceof MouseEvent && pos) {
- x.value = pos[0] + window2.scrollX;
- y.value = pos[1] + window2.scrollY;
- }
- };
- const reset = () => {
- x.value = initialValue.x;
- y.value = initialValue.y;
- };
- const mouseHandlerWrapper = eventFilter
- ? (event) => eventFilter(() => mouseHandler(event), {})
- : (event) => mouseHandler(event);
- const touchHandlerWrapper = eventFilter
- ? (event) => eventFilter(() => touchHandler(event), {})
- : (event) => touchHandler(event);
- const scrollHandlerWrapper = eventFilter
- ? () => eventFilter(() => scrollHandler(), {})
- : () => scrollHandler();
- if (target) {
- const listenerOptions = { passive: true };
- useEventListener(
- target,
- ['mousemove', 'dragover'],
- mouseHandlerWrapper,
- listenerOptions,
- );
- if (touch && type !== 'movement') {
- useEventListener(
- target,
- ['touchstart', 'touchmove'],
- touchHandlerWrapper,
- listenerOptions,
- );
- if (resetOnTouchEnds)
- useEventListener(target, 'touchend', reset, listenerOptions);
- }
- if (scroll && type === 'page')
- useEventListener(window2, 'scroll', scrollHandlerWrapper, {
- passive: true,
- });
- }
- return {
- x,
- y,
- sourceType,
- };
- }
- function useMouseInElement(target, options = {}) {
- const { handleOutside = true, window: window2 = defaultWindow } = options;
- const type = options.type || 'page';
- const { x, y, sourceType } = useMouse(options);
- const targetRef = ref(
- target != null ? target : window2 == null ? void 0 : window2.document.body,
- );
- const elementX = ref(0);
- const elementY = ref(0);
- const elementPositionX = ref(0);
- const elementPositionY = ref(0);
- const elementHeight = ref(0);
- const elementWidth = ref(0);
- const isOutside = ref(true);
- let stop = () => {};
- if (window2) {
- stop = watch(
- [targetRef, x, y],
- () => {
- const el = unrefElement(targetRef);
- if (!el) return;
- const { left, top, width, height } = el.getBoundingClientRect();
- elementPositionX.value =
- left + (type === 'page' ? window2.pageXOffset : 0);
- elementPositionY.value =
- top + (type === 'page' ? window2.pageYOffset : 0);
- elementHeight.value = height;
- elementWidth.value = width;
- const elX = x.value - elementPositionX.value;
- const elY = y.value - elementPositionY.value;
- isOutside.value =
- width === 0 ||
- height === 0 ||
- elX < 0 ||
- elY < 0 ||
- elX > width ||
- elY > height;
- if (handleOutside || !isOutside.value) {
- elementX.value = elX;
- elementY.value = elY;
- }
- },
- { immediate: true },
- );
- useEventListener(document, 'mouseleave', () => {
- isOutside.value = true;
- });
- }
- return {
- x,
- y,
- sourceType,
- elementX,
- elementY,
- elementPositionX,
- elementPositionY,
- elementHeight,
- elementWidth,
- isOutside,
- stop,
- };
- }
- function useMousePressed(options = {}) {
- const {
- touch = true,
- drag = true,
- capture = false,
- initialValue = false,
- window: window2 = defaultWindow,
- } = options;
- const pressed = ref(initialValue);
- const sourceType = ref(null);
- if (!window2) {
- return {
- pressed,
- sourceType,
- };
- }
- const onPressed = (srcType) => () => {
- pressed.value = true;
- sourceType.value = srcType;
- };
- const onReleased = () => {
- pressed.value = false;
- sourceType.value = null;
- };
- const target = computed(() => unrefElement(options.target) || window2);
- useEventListener(target, 'mousedown', onPressed('mouse'), {
- passive: true,
- capture,
- });
- useEventListener(window2, 'mouseleave', onReleased, {
- passive: true,
- capture,
- });
- useEventListener(window2, 'mouseup', onReleased, { passive: true, capture });
- if (drag) {
- useEventListener(target, 'dragstart', onPressed('mouse'), {
- passive: true,
- capture,
- });
- useEventListener(window2, 'drop', onReleased, { passive: true, capture });
- useEventListener(window2, 'dragend', onReleased, {
- passive: true,
- capture,
- });
- }
- if (touch) {
- useEventListener(target, 'touchstart', onPressed('touch'), {
- passive: true,
- capture,
- });
- useEventListener(window2, 'touchend', onReleased, {
- passive: true,
- capture,
- });
- useEventListener(window2, 'touchcancel', onReleased, {
- passive: true,
- capture,
- });
- }
- return {
- pressed,
- sourceType,
- };
- }
- function useNavigatorLanguage(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const navigator = window2 == null ? void 0 : window2.navigator;
- const isSupported = useSupported(() => navigator && 'language' in navigator);
- const language = ref(navigator == null ? void 0 : navigator.language);
- useEventListener(window2, 'languagechange', () => {
- if (navigator) language.value = navigator.language;
- });
- return {
- isSupported,
- language,
- };
- }
- function useNetwork(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const navigator = window2 == null ? void 0 : window2.navigator;
- const isSupported = useSupported(
- () => navigator && 'connection' in navigator,
- );
- const isOnline = ref(true);
- const saveData = ref(false);
- const offlineAt = ref(void 0);
- const onlineAt = ref(void 0);
- const downlink = ref(void 0);
- const downlinkMax = ref(void 0);
- const rtt = ref(void 0);
- const effectiveType = ref(void 0);
- const type = ref('unknown');
- const connection = isSupported.value && navigator.connection;
- function updateNetworkInformation() {
- if (!navigator) return;
- isOnline.value = navigator.onLine;
- offlineAt.value = isOnline.value ? void 0 : Date.now();
- onlineAt.value = isOnline.value ? Date.now() : void 0;
- if (connection) {
- downlink.value = connection.downlink;
- downlinkMax.value = connection.downlinkMax;
- effectiveType.value = connection.effectiveType;
- rtt.value = connection.rtt;
- saveData.value = connection.saveData;
- type.value = connection.type;
- }
- }
- if (window2) {
- useEventListener(window2, 'offline', () => {
- isOnline.value = false;
- offlineAt.value = Date.now();
- });
- useEventListener(window2, 'online', () => {
- isOnline.value = true;
- onlineAt.value = Date.now();
- });
- }
- if (connection)
- useEventListener(connection, 'change', updateNetworkInformation, false);
- updateNetworkInformation();
- return {
- isSupported,
- isOnline,
- saveData,
- offlineAt,
- onlineAt,
- downlink,
- downlinkMax,
- effectiveType,
- rtt,
- type,
- };
- }
- function useNow(options = {}) {
- const {
- controls: exposeControls = false,
- interval = 'requestAnimationFrame',
- } = options;
- const now2 = ref(/* @__PURE__ */ new Date());
- const update = () => (now2.value = /* @__PURE__ */ new Date());
- const controls =
- interval === 'requestAnimationFrame'
- ? useRafFn(update, { immediate: true })
- : useIntervalFn(update, interval, { immediate: true });
- if (exposeControls) {
- return {
- now: now2,
- ...controls,
- };
- } else {
- return now2;
- }
- }
- function useObjectUrl(object) {
- const url = ref();
- const release = () => {
- if (url.value) URL.revokeObjectURL(url.value);
- url.value = void 0;
- };
- watch(
- () => toValue(object),
- (newObject) => {
- release();
- if (newObject) url.value = URL.createObjectURL(newObject);
- },
- { immediate: true },
- );
- tryOnScopeDispose(release);
- return readonly(url);
- }
- function useClamp(value, min, max) {
- if (typeof value === 'function' || isReadonly(value))
- return computed(() => clamp(toValue(value), toValue(min), toValue(max)));
- const _value = ref(value);
- return computed({
- get() {
- return (_value.value = clamp(_value.value, toValue(min), toValue(max)));
- },
- set(value2) {
- _value.value = clamp(value2, toValue(min), toValue(max));
- },
- });
- }
- function useOffsetPagination(options) {
- const {
- total = Number.POSITIVE_INFINITY,
- pageSize = 10,
- page = 1,
- onPageChange = noop,
- onPageSizeChange = noop,
- onPageCountChange = noop,
- } = options;
- const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);
- const pageCount = computed(() =>
- Math.max(1, Math.ceil(toValue(total) / toValue(currentPageSize))),
- );
- const currentPage = useClamp(page, 1, pageCount);
- const isFirstPage = computed(() => currentPage.value === 1);
- const isLastPage = computed(() => currentPage.value === pageCount.value);
- if (isRef(page)) {
- syncRef(page, currentPage, {
- direction: isReadonly(page) ? 'ltr' : 'both',
- });
- }
- if (isRef(pageSize)) {
- syncRef(pageSize, currentPageSize, {
- direction: isReadonly(pageSize) ? 'ltr' : 'both',
- });
- }
- function prev() {
- currentPage.value--;
- }
- function next() {
- currentPage.value++;
- }
- const returnValue = {
- currentPage,
- currentPageSize,
- pageCount,
- isFirstPage,
- isLastPage,
- prev,
- next,
- };
- watch(currentPage, () => {
- onPageChange(reactive(returnValue));
- });
- watch(currentPageSize, () => {
- onPageSizeChange(reactive(returnValue));
- });
- watch(pageCount, () => {
- onPageCountChange(reactive(returnValue));
- });
- return returnValue;
- }
- function useOnline(options = {}) {
- const { isOnline } = useNetwork(options);
- return isOnline;
- }
- function usePageLeave(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const isLeft = ref(false);
- const handler = (event) => {
- if (!window2) return;
- event = event || window2.event;
- const from = event.relatedTarget || event.toElement;
- isLeft.value = !from;
- };
- if (window2) {
- useEventListener(window2, 'mouseout', handler, { passive: true });
- useEventListener(window2.document, 'mouseleave', handler, {
- passive: true,
- });
- useEventListener(window2.document, 'mouseenter', handler, {
- passive: true,
- });
- }
- return isLeft;
- }
- function useScreenOrientation(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const isSupported = useSupported(
- () => window2 && 'screen' in window2 && 'orientation' in window2.screen,
- );
- const screenOrientation = isSupported.value ? window2.screen.orientation : {};
- const orientation = ref(screenOrientation.type);
- const angle = ref(screenOrientation.angle || 0);
- if (isSupported.value) {
- useEventListener(window2, 'orientationchange', () => {
- orientation.value = screenOrientation.type;
- angle.value = screenOrientation.angle;
- });
- }
- const lockOrientation = (type) => {
- if (isSupported.value && typeof screenOrientation.lock === 'function')
- return screenOrientation.lock(type);
- return Promise.reject(new Error('Not supported'));
- };
- const unlockOrientation = () => {
- if (isSupported.value && typeof screenOrientation.unlock === 'function')
- screenOrientation.unlock();
- };
- return {
- isSupported,
- orientation,
- angle,
- lockOrientation,
- unlockOrientation,
- };
- }
- function useParallax(target, options = {}) {
- const {
- deviceOrientationTiltAdjust = (i) => i,
- deviceOrientationRollAdjust = (i) => i,
- mouseTiltAdjust = (i) => i,
- mouseRollAdjust = (i) => i,
- window: window2 = defaultWindow,
- } = options;
- const orientation = reactive(useDeviceOrientation({ window: window2 }));
- const screenOrientation = reactive(useScreenOrientation({ window: window2 }));
- const {
- elementX: x,
- elementY: y,
- elementWidth: width,
- elementHeight: height,
- } = useMouseInElement(target, { handleOutside: false, window: window2 });
- const source = computed(() => {
- if (
- orientation.isSupported &&
- ((orientation.alpha != null && orientation.alpha !== 0) ||
- (orientation.gamma != null && orientation.gamma !== 0))
- )
- return 'deviceOrientation';
- return 'mouse';
- });
- const roll = computed(() => {
- if (source.value === 'deviceOrientation') {
- let value;
- switch (screenOrientation.orientation) {
- case 'landscape-primary':
- value = orientation.gamma / 90;
- break;
- case 'landscape-secondary':
- value = -orientation.gamma / 90;
- break;
- case 'portrait-primary':
- value = -orientation.beta / 90;
- break;
- case 'portrait-secondary':
- value = orientation.beta / 90;
- break;
- default:
- value = -orientation.beta / 90;
- }
- return deviceOrientationRollAdjust(value);
- } else {
- const value = -(y.value - height.value / 2) / height.value;
- return mouseRollAdjust(value);
- }
- });
- const tilt = computed(() => {
- if (source.value === 'deviceOrientation') {
- let value;
- switch (screenOrientation.orientation) {
- case 'landscape-primary':
- value = orientation.beta / 90;
- break;
- case 'landscape-secondary':
- value = -orientation.beta / 90;
- break;
- case 'portrait-primary':
- value = orientation.gamma / 90;
- break;
- case 'portrait-secondary':
- value = -orientation.gamma / 90;
- break;
- default:
- value = orientation.gamma / 90;
- }
- return deviceOrientationTiltAdjust(value);
- } else {
- const value = (x.value - width.value / 2) / width.value;
- return mouseTiltAdjust(value);
- }
- });
- return { roll, tilt, source };
- }
- function useParentElement(element = useCurrentElement()) {
- const parentElement = shallowRef();
- const update = () => {
- const el = unrefElement(element);
- if (el) parentElement.value = el.parentElement;
- };
- tryOnMounted(update);
- watch(() => toValue(element), update);
- return parentElement;
- }
- function usePerformanceObserver(options, callback) {
- const {
- window: window2 = defaultWindow,
- immediate = true,
- ...performanceOptions
- } = options;
- const isSupported = useSupported(
- () => window2 && 'PerformanceObserver' in window2,
- );
- let observer;
- const stop = () => {
- observer == null ? void 0 : observer.disconnect();
- };
- const start = () => {
- if (isSupported.value) {
- stop();
- observer = new PerformanceObserver(callback);
- observer.observe(performanceOptions);
- }
- };
- tryOnScopeDispose(stop);
- if (immediate) start();
- return {
- isSupported,
- start,
- stop,
- };
- }
- var defaultState = {
- x: 0,
- y: 0,
- pointerId: 0,
- pressure: 0,
- tiltX: 0,
- tiltY: 0,
- width: 0,
- height: 0,
- twist: 0,
- pointerType: null,
- };
- var keys = Object.keys(defaultState);
- function usePointer(options = {}) {
- const { target = defaultWindow } = options;
- const isInside = ref(false);
- const state = ref(options.initialValue || {});
- Object.assign(state.value, defaultState, state.value);
- const handler = (event) => {
- isInside.value = true;
- if (
- options.pointerTypes &&
- !options.pointerTypes.includes(event.pointerType)
- )
- return;
- state.value = objectPick(event, keys, false);
- };
- if (target) {
- const listenerOptions = { passive: true };
- useEventListener(
- target,
- ['pointerdown', 'pointermove', 'pointerup'],
- handler,
- listenerOptions,
- );
- useEventListener(
- target,
- 'pointerleave',
- () => (isInside.value = false),
- listenerOptions,
- );
- }
- return {
- ...toRefs2(state),
- isInside,
- };
- }
- function usePointerLock(target, options = {}) {
- const { document: document2 = defaultDocument } = options;
- const isSupported = useSupported(
- () => document2 && 'pointerLockElement' in document2,
- );
- const element = ref();
- const triggerElement = ref();
- let targetElement;
- if (isSupported.value) {
- useEventListener(document2, 'pointerlockchange', () => {
- var _a;
- const currentElement =
- (_a = document2.pointerLockElement) != null ? _a : element.value;
- if (targetElement && currentElement === targetElement) {
- element.value = document2.pointerLockElement;
- if (!element.value) targetElement = triggerElement.value = null;
- }
- });
- useEventListener(document2, 'pointerlockerror', () => {
- var _a;
- const currentElement =
- (_a = document2.pointerLockElement) != null ? _a : element.value;
- if (targetElement && currentElement === targetElement) {
- const action = document2.pointerLockElement ? 'release' : 'acquire';
- throw new Error(`Failed to ${action} pointer lock.`);
- }
- });
- }
- async function lock(e) {
- var _a;
- if (!isSupported.value)
- throw new Error('Pointer Lock API is not supported by your browser.');
- triggerElement.value = e instanceof Event ? e.currentTarget : null;
- targetElement =
- e instanceof Event
- ? (_a = unrefElement(target)) != null
- ? _a
- : triggerElement.value
- : unrefElement(e);
- if (!targetElement) throw new Error('Target element undefined.');
- targetElement.requestPointerLock();
- return await until(element).toBe(targetElement);
- }
- async function unlock() {
- if (!element.value) return false;
- document2.exitPointerLock();
- await until(element).toBeNull();
- return true;
- }
- return {
- isSupported,
- element,
- triggerElement,
- lock,
- unlock,
- };
- }
- function usePointerSwipe(target, options = {}) {
- const targetRef = toRef2(target);
- const {
- threshold = 50,
- onSwipe,
- onSwipeEnd,
- onSwipeStart,
- disableTextSelect = false,
- } = options;
- const posStart = reactive({ x: 0, y: 0 });
- const updatePosStart = (x, y) => {
- posStart.x = x;
- posStart.y = y;
- };
- const posEnd = reactive({ x: 0, y: 0 });
- const updatePosEnd = (x, y) => {
- posEnd.x = x;
- posEnd.y = y;
- };
- const distanceX = computed(() => posStart.x - posEnd.x);
- const distanceY = computed(() => posStart.y - posEnd.y);
- const { max, abs } = Math;
- const isThresholdExceeded = computed(
- () => max(abs(distanceX.value), abs(distanceY.value)) >= threshold,
- );
- const isSwiping = ref(false);
- const isPointerDown = ref(false);
- const direction = computed(() => {
- if (!isThresholdExceeded.value) return 'none';
- if (abs(distanceX.value) > abs(distanceY.value)) {
- return distanceX.value > 0 ? 'left' : 'right';
- } else {
- return distanceY.value > 0 ? 'up' : 'down';
- }
- });
- const eventIsAllowed = (e) => {
- var _a, _b, _c;
- const isReleasingButton = e.buttons === 0;
- const isPrimaryButton = e.buttons === 1;
- return (_c =
- (_b =
- (_a = options.pointerTypes) == null
- ? void 0
- : _a.includes(e.pointerType)) != null
- ? _b
- : isReleasingButton || isPrimaryButton) != null
- ? _c
- : true;
- };
- const stops = [
- useEventListener(target, 'pointerdown', (e) => {
- if (!eventIsAllowed(e)) return;
- isPointerDown.value = true;
- const eventTarget = e.target;
- eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);
- const { clientX: x, clientY: y } = e;
- updatePosStart(x, y);
- updatePosEnd(x, y);
- onSwipeStart == null ? void 0 : onSwipeStart(e);
- }),
- useEventListener(target, 'pointermove', (e) => {
- if (!eventIsAllowed(e)) return;
- if (!isPointerDown.value) return;
- const { clientX: x, clientY: y } = e;
- updatePosEnd(x, y);
- if (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true;
- if (isSwiping.value) onSwipe == null ? void 0 : onSwipe(e);
- }),
- useEventListener(target, 'pointerup', (e) => {
- if (!eventIsAllowed(e)) return;
- if (isSwiping.value)
- onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
- isPointerDown.value = false;
- isSwiping.value = false;
- }),
- ];
- tryOnMounted(() => {
- var _a, _b, _c, _d, _e, _f, _g, _h;
- (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null
- ? void 0
- : _b.setProperty('touch-action', 'none');
- if (disableTextSelect) {
- (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null
- ? void 0
- : _d.setProperty('-webkit-user-select', 'none');
- (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null
- ? void 0
- : _f.setProperty('-ms-user-select', 'none');
- (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null
- ? void 0
- : _h.setProperty('user-select', 'none');
- }
- });
- const stop = () => stops.forEach((s) => s());
- return {
- isSwiping: readonly(isSwiping),
- direction: readonly(direction),
- posStart: readonly(posStart),
- posEnd: readonly(posEnd),
- distanceX,
- distanceY,
- stop,
- };
- }
- function usePreferredColorScheme(options) {
- const isLight = useMediaQuery('(prefers-color-scheme: light)', options);
- const isDark = useMediaQuery('(prefers-color-scheme: dark)', options);
- return computed(() => {
- if (isDark.value) return 'dark';
- if (isLight.value) return 'light';
- return 'no-preference';
- });
- }
- function usePreferredContrast(options) {
- const isMore = useMediaQuery('(prefers-contrast: more)', options);
- const isLess = useMediaQuery('(prefers-contrast: less)', options);
- const isCustom = useMediaQuery('(prefers-contrast: custom)', options);
- return computed(() => {
- if (isMore.value) return 'more';
- if (isLess.value) return 'less';
- if (isCustom.value) return 'custom';
- return 'no-preference';
- });
- }
- function usePreferredLanguages(options = {}) {
- const { window: window2 = defaultWindow } = options;
- if (!window2) return ref(['en']);
- const navigator = window2.navigator;
- const value = ref(navigator.languages);
- useEventListener(window2, 'languagechange', () => {
- value.value = navigator.languages;
- });
- return value;
- }
- function usePreferredReducedMotion(options) {
- const isReduced = useMediaQuery('(prefers-reduced-motion: reduce)', options);
- return computed(() => {
- if (isReduced.value) return 'reduce';
- return 'no-preference';
- });
- }
- function usePrevious(value, initialValue) {
- const previous = shallowRef(initialValue);
- watch(
- toRef2(value),
- (_, oldValue) => {
- previous.value = oldValue;
- },
- { flush: 'sync' },
- );
- return readonly(previous);
- }
- var topVarName = '--vueuse-safe-area-top';
- var rightVarName = '--vueuse-safe-area-right';
- var bottomVarName = '--vueuse-safe-area-bottom';
- var leftVarName = '--vueuse-safe-area-left';
- function useScreenSafeArea() {
- const top = ref('');
- const right = ref('');
- const bottom = ref('');
- const left = ref('');
- if (isClient) {
- const topCssVar = useCssVar(topVarName);
- const rightCssVar = useCssVar(rightVarName);
- const bottomCssVar = useCssVar(bottomVarName);
- const leftCssVar = useCssVar(leftVarName);
- topCssVar.value = 'env(safe-area-inset-top, 0px)';
- rightCssVar.value = 'env(safe-area-inset-right, 0px)';
- bottomCssVar.value = 'env(safe-area-inset-bottom, 0px)';
- leftCssVar.value = 'env(safe-area-inset-left, 0px)';
- update();
- useEventListener('resize', useDebounceFn(update));
- }
- function update() {
- top.value = getValue(topVarName);
- right.value = getValue(rightVarName);
- bottom.value = getValue(bottomVarName);
- left.value = getValue(leftVarName);
- }
- return {
- top,
- right,
- bottom,
- left,
- update,
- };
- }
- function getValue(position) {
- return getComputedStyle(document.documentElement).getPropertyValue(position);
- }
- function useScriptTag(src, onLoaded = noop, options = {}) {
- const {
- immediate = true,
- manual = false,
- type = 'text/javascript',
- async = true,
- crossOrigin,
- referrerPolicy,
- noModule,
- defer,
- document: document2 = defaultDocument,
- attrs = {},
- } = options;
- const scriptTag = ref(null);
- let _promise = null;
- const loadScript = (waitForScriptLoad) =>
- new Promise((resolve, reject) => {
- const resolveWithElement = (el2) => {
- scriptTag.value = el2;
- resolve(el2);
- return el2;
- };
- if (!document2) {
- resolve(false);
- return;
- }
- let shouldAppend = false;
- let el = document2.querySelector(`script[src="${toValue(src)}"]`);
- if (!el) {
- el = document2.createElement('script');
- el.type = type;
- el.async = async;
- el.src = toValue(src);
- if (defer) el.defer = defer;
- if (crossOrigin) el.crossOrigin = crossOrigin;
- if (noModule) el.noModule = noModule;
- if (referrerPolicy) el.referrerPolicy = referrerPolicy;
- Object.entries(attrs).forEach(([name, value]) =>
- el == null ? void 0 : el.setAttribute(name, value),
- );
- shouldAppend = true;
- } else if (el.hasAttribute('data-loaded')) {
- resolveWithElement(el);
- }
- el.addEventListener('error', (event) => reject(event));
- el.addEventListener('abort', (event) => reject(event));
- el.addEventListener('load', () => {
- el.setAttribute('data-loaded', 'true');
- onLoaded(el);
- resolveWithElement(el);
- });
- if (shouldAppend) el = document2.head.appendChild(el);
- if (!waitForScriptLoad) resolveWithElement(el);
- });
- const load = (waitForScriptLoad = true) => {
- if (!_promise) _promise = loadScript(waitForScriptLoad);
- return _promise;
- };
- const unload = () => {
- if (!document2) return;
- _promise = null;
- if (scriptTag.value) scriptTag.value = null;
- const el = document2.querySelector(`script[src="${toValue(src)}"]`);
- if (el) document2.head.removeChild(el);
- };
- if (immediate && !manual) tryOnMounted(load);
- if (!manual) tryOnUnmounted(unload);
- return { scriptTag, load, unload };
- }
- function checkOverflowScroll(ele) {
- const style = window.getComputedStyle(ele);
- if (
- style.overflowX === 'scroll' ||
- style.overflowY === 'scroll' ||
- (style.overflowX === 'auto' && ele.clientWidth < ele.scrollWidth) ||
- (style.overflowY === 'auto' && ele.clientHeight < ele.scrollHeight)
- ) {
- return true;
- } else {
- const parent = ele.parentNode;
- if (!parent || parent.tagName === 'BODY') return false;
- return checkOverflowScroll(parent);
- }
- }
- function preventDefault(rawEvent) {
- const e = rawEvent || window.event;
- const _target = e.target;
- if (checkOverflowScroll(_target)) return false;
- if (e.touches.length > 1) return true;
- if (e.preventDefault) e.preventDefault();
- return false;
- }
- var elInitialOverflow = /* @__PURE__ */ new WeakMap();
- function useScrollLock(element, initialState = false) {
- const isLocked = ref(initialState);
- let stopTouchMoveListener = null;
- watch(
- toRef2(element),
- (el) => {
- const target = resolveElement(toValue(el));
- if (target) {
- const ele = target;
- if (!elInitialOverflow.get(ele))
- elInitialOverflow.set(ele, ele.style.overflow);
- if (isLocked.value) ele.style.overflow = 'hidden';
- }
- },
- {
- immediate: true,
- },
- );
- const lock = () => {
- const el = resolveElement(toValue(element));
- if (!el || isLocked.value) return;
- if (isIOS) {
- stopTouchMoveListener = useEventListener(
- el,
- 'touchmove',
- (e) => {
- preventDefault(e);
- },
- { passive: false },
- );
- }
- el.style.overflow = 'hidden';
- isLocked.value = true;
- };
- const unlock = () => {
- var _a;
- const el = resolveElement(toValue(element));
- if (!el || !isLocked.value) return;
- isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());
- el.style.overflow = (_a = elInitialOverflow.get(el)) != null ? _a : '';
- elInitialOverflow.delete(el);
- isLocked.value = false;
- };
- tryOnScopeDispose(unlock);
- return computed({
- get() {
- return isLocked.value;
- },
- set(v) {
- if (v) lock();
- else unlock();
- },
- });
- }
- function useSessionStorage(key, initialValue, options = {}) {
- const { window: window2 = defaultWindow } = options;
- return useStorage(
- key,
- initialValue,
- window2 == null ? void 0 : window2.sessionStorage,
- options,
- );
- }
- function useShare(shareOptions = {}, options = {}) {
- const { navigator = defaultNavigator } = options;
- const _navigator = navigator;
- const isSupported = useSupported(
- () => _navigator && 'canShare' in _navigator,
- );
- const share = async (overrideOptions = {}) => {
- if (isSupported.value) {
- const data = {
- ...toValue(shareOptions),
- ...toValue(overrideOptions),
- };
- let granted = true;
- if (data.files && _navigator.canShare)
- granted = _navigator.canShare({ files: data.files });
- if (granted) return _navigator.share(data);
- }
- };
- return {
- isSupported,
- share,
- };
- }
- var defaultSortFn = (source, compareFn) => source.sort(compareFn);
- var defaultCompare = (a, b) => a - b;
- function useSorted(...args) {
- var _a, _b, _c, _d;
- const [source] = args;
- let compareFn = defaultCompare;
- let options = {};
- if (args.length === 2) {
- if (typeof args[1] === 'object') {
- options = args[1];
- compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;
- } else {
- compareFn = (_b = args[1]) != null ? _b : defaultCompare;
- }
- } else if (args.length > 2) {
- compareFn = (_c = args[1]) != null ? _c : defaultCompare;
- options = (_d = args[2]) != null ? _d : {};
- }
- const { dirty = false, sortFn = defaultSortFn } = options;
- if (!dirty) return computed(() => sortFn([...toValue(source)], compareFn));
- watchEffect(() => {
- const result = sortFn(toValue(source), compareFn);
- if (isRef(source)) source.value = result;
- else source.splice(0, source.length, ...result);
- });
- return source;
- }
- function useSpeechRecognition(options = {}) {
- const {
- interimResults = true,
- continuous = true,
- window: window2 = defaultWindow,
- } = options;
- const lang = toRef2(options.lang || 'en-US');
- const isListening = ref(false);
- const isFinal = ref(false);
- const result = ref('');
- const error = shallowRef(void 0);
- const toggle = (value = !isListening.value) => {
- isListening.value = value;
- };
- const start = () => {
- isListening.value = true;
- };
- const stop = () => {
- isListening.value = false;
- };
- const SpeechRecognition =
- window2 && (window2.SpeechRecognition || window2.webkitSpeechRecognition);
- const isSupported = useSupported(() => SpeechRecognition);
- let recognition;
- if (isSupported.value) {
- recognition = new SpeechRecognition();
- recognition.continuous = continuous;
- recognition.interimResults = interimResults;
- recognition.lang = toValue(lang);
- recognition.onstart = () => {
- isFinal.value = false;
- };
- watch(lang, (lang2) => {
- if (recognition && !isListening.value) recognition.lang = lang2;
- });
- recognition.onresult = (event) => {
- const transcript = Array.from(event.results)
- .map((result2) => {
- isFinal.value = result2.isFinal;
- return result2[0];
- })
- .map((result2) => result2.transcript)
- .join('');
- result.value = transcript;
- error.value = void 0;
- };
- recognition.onerror = (event) => {
- error.value = event;
- };
- recognition.onend = () => {
- isListening.value = false;
- recognition.lang = toValue(lang);
- };
- watch(isListening, () => {
- if (isListening.value) recognition.start();
- else recognition.stop();
- });
- }
- tryOnScopeDispose(() => {
- isListening.value = false;
- });
- return {
- isSupported,
- isListening,
- isFinal,
- recognition,
- result,
- error,
- toggle,
- start,
- stop,
- };
- }
- function useSpeechSynthesis(text, options = {}) {
- const {
- pitch = 1,
- rate = 1,
- volume = 1,
- window: window2 = defaultWindow,
- } = options;
- const synth = window2 && window2.speechSynthesis;
- const isSupported = useSupported(() => synth);
- const isPlaying = ref(false);
- const status = ref('init');
- const spokenText = toRef2(text || '');
- const lang = toRef2(options.lang || 'en-US');
- const error = shallowRef(void 0);
- const toggle = (value = !isPlaying.value) => {
- isPlaying.value = value;
- };
- const bindEventsForUtterance = (utterance2) => {
- utterance2.lang = toValue(lang);
- utterance2.voice = toValue(options.voice) || null;
- utterance2.pitch = toValue(pitch);
- utterance2.rate = toValue(rate);
- utterance2.volume = volume;
- utterance2.onstart = () => {
- isPlaying.value = true;
- status.value = 'play';
- };
- utterance2.onpause = () => {
- isPlaying.value = false;
- status.value = 'pause';
- };
- utterance2.onresume = () => {
- isPlaying.value = true;
- status.value = 'play';
- };
- utterance2.onend = () => {
- isPlaying.value = false;
- status.value = 'end';
- };
- utterance2.onerror = (event) => {
- error.value = event;
- };
- };
- const utterance = computed(() => {
- isPlaying.value = false;
- status.value = 'init';
- const newUtterance = new SpeechSynthesisUtterance(spokenText.value);
- bindEventsForUtterance(newUtterance);
- return newUtterance;
- });
- const speak = () => {
- synth.cancel();
- utterance && synth.speak(utterance.value);
- };
- const stop = () => {
- synth.cancel();
- isPlaying.value = false;
- };
- if (isSupported.value) {
- bindEventsForUtterance(utterance.value);
- watch(lang, (lang2) => {
- if (utterance.value && !isPlaying.value) utterance.value.lang = lang2;
- });
- if (options.voice) {
- watch(options.voice, () => {
- synth.cancel();
- });
- }
- watch(isPlaying, () => {
- if (isPlaying.value) synth.resume();
- else synth.pause();
- });
- }
- tryOnScopeDispose(() => {
- isPlaying.value = false;
- });
- return {
- isSupported,
- isPlaying,
- status,
- utterance,
- error,
- stop,
- toggle,
- speak,
- };
- }
- function useStepper(steps, initialStep) {
- const stepsRef = ref(steps);
- const stepNames = computed(() =>
- Array.isArray(stepsRef.value)
- ? stepsRef.value
- : Object.keys(stepsRef.value),
- );
- const index = ref(
- stepNames.value.indexOf(
- initialStep != null ? initialStep : stepNames.value[0],
- ),
- );
- const current = computed(() => at(index.value));
- const isFirst = computed(() => index.value === 0);
- const isLast = computed(() => index.value === stepNames.value.length - 1);
- const next = computed(() => stepNames.value[index.value + 1]);
- const previous = computed(() => stepNames.value[index.value - 1]);
- function at(index2) {
- if (Array.isArray(stepsRef.value)) return stepsRef.value[index2];
- return stepsRef.value[stepNames.value[index2]];
- }
- function get2(step) {
- if (!stepNames.value.includes(step)) return;
- return at(stepNames.value.indexOf(step));
- }
- function goTo(step) {
- if (stepNames.value.includes(step))
- index.value = stepNames.value.indexOf(step);
- }
- function goToNext() {
- if (isLast.value) return;
- index.value++;
- }
- function goToPrevious() {
- if (isFirst.value) return;
- index.value--;
- }
- function goBackTo(step) {
- if (isAfter(step)) goTo(step);
- }
- function isNext(step) {
- return stepNames.value.indexOf(step) === index.value + 1;
- }
- function isPrevious(step) {
- return stepNames.value.indexOf(step) === index.value - 1;
- }
- function isCurrent(step) {
- return stepNames.value.indexOf(step) === index.value;
- }
- function isBefore(step) {
- return index.value < stepNames.value.indexOf(step);
- }
- function isAfter(step) {
- return index.value > stepNames.value.indexOf(step);
- }
- return {
- steps: stepsRef,
- stepNames,
- index,
- current,
- next,
- previous,
- isFirst,
- isLast,
- at,
- get: get2,
- goTo,
- goToNext,
- goToPrevious,
- goBackTo,
- isNext,
- isPrevious,
- isCurrent,
- isBefore,
- isAfter,
- };
- }
- function useStorageAsync(key, initialValue, storage, options = {}) {
- var _a;
- const {
- flush = 'pre',
- deep = true,
- listenToStorageChanges = true,
- writeDefaults = true,
- mergeDefaults = false,
- shallow,
- window: window2 = defaultWindow,
- eventFilter,
- onError = (e) => {
- console.error(e);
- },
- } = options;
- const rawInit = toValue(initialValue);
- const type = guessSerializerType(rawInit);
- const data = (shallow ? shallowRef : ref)(initialValue);
- const serializer =
- (_a = options.serializer) != null ? _a : StorageSerializers[type];
- if (!storage) {
- try {
- storage = getSSRHandler('getDefaultStorageAsync', () => {
- var _a2;
- return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;
- })();
- } catch (e) {
- onError(e);
- }
- }
- async function read(event) {
- if (!storage || (event && event.key !== key)) return;
- try {
- const rawValue = event ? event.newValue : await storage.getItem(key);
- if (rawValue == null) {
- data.value = rawInit;
- if (writeDefaults && rawInit !== null)
- await storage.setItem(key, await serializer.write(rawInit));
- } else if (mergeDefaults) {
- const value = await serializer.read(rawValue);
- if (typeof mergeDefaults === 'function')
- data.value = mergeDefaults(value, rawInit);
- else if (type === 'object' && !Array.isArray(value))
- data.value = { ...rawInit, ...value };
- else data.value = value;
- } else {
- data.value = await serializer.read(rawValue);
- }
- } catch (e) {
- onError(e);
- }
- }
- read();
- if (window2 && listenToStorageChanges)
- useEventListener(window2, 'storage', (e) =>
- Promise.resolve().then(() => read(e)),
- );
- if (storage) {
- watchWithFilter(
- data,
- async () => {
- try {
- if (data.value == null) await storage.removeItem(key);
- else await storage.setItem(key, await serializer.write(data.value));
- } catch (e) {
- onError(e);
- }
- },
- {
- flush,
- deep,
- eventFilter,
- },
- );
- }
- return data;
- }
- var _id = 0;
- function useStyleTag(css, options = {}) {
- const isLoaded = ref(false);
- const {
- document: document2 = defaultDocument,
- immediate = true,
- manual = false,
- id = `vueuse_styletag_${++_id}`,
- } = options;
- const cssRef = ref(css);
- let stop = () => {};
- const load = () => {
- if (!document2) return;
- const el = document2.getElementById(id) || document2.createElement('style');
- if (!el.isConnected) {
- el.id = id;
- if (options.media) el.media = options.media;
- document2.head.appendChild(el);
- }
- if (isLoaded.value) return;
- stop = watch(
- cssRef,
- (value) => {
- el.textContent = value;
- },
- { immediate: true },
- );
- isLoaded.value = true;
- };
- const unload = () => {
- if (!document2 || !isLoaded.value) return;
- stop();
- document2.head.removeChild(document2.getElementById(id));
- isLoaded.value = false;
- };
- if (immediate && !manual) tryOnMounted(load);
- if (!manual) tryOnScopeDispose(unload);
- return {
- id,
- css: cssRef,
- unload,
- load,
- isLoaded: readonly(isLoaded),
- };
- }
- function useSwipe(target, options = {}) {
- const {
- threshold = 50,
- onSwipe,
- onSwipeEnd,
- onSwipeStart,
- passive = true,
- window: window2 = defaultWindow,
- } = options;
- const coordsStart = reactive({ x: 0, y: 0 });
- const coordsEnd = reactive({ x: 0, y: 0 });
- const diffX = computed(() => coordsStart.x - coordsEnd.x);
- const diffY = computed(() => coordsStart.y - coordsEnd.y);
- const { max, abs } = Math;
- const isThresholdExceeded = computed(
- () => max(abs(diffX.value), abs(diffY.value)) >= threshold,
- );
- const isSwiping = ref(false);
- const direction = computed(() => {
- if (!isThresholdExceeded.value) return 'none';
- if (abs(diffX.value) > abs(diffY.value)) {
- return diffX.value > 0 ? 'left' : 'right';
- } else {
- return diffY.value > 0 ? 'up' : 'down';
- }
- });
- const getTouchEventCoords = (e) => [
- e.touches[0].clientX,
- e.touches[0].clientY,
- ];
- const updateCoordsStart = (x, y) => {
- coordsStart.x = x;
- coordsStart.y = y;
- };
- const updateCoordsEnd = (x, y) => {
- coordsEnd.x = x;
- coordsEnd.y = y;
- };
- let listenerOptions;
- const isPassiveEventSupported = checkPassiveEventSupport(
- window2 == null ? void 0 : window2.document,
- );
- if (!passive)
- listenerOptions = isPassiveEventSupported
- ? { passive: false, capture: true }
- : { capture: true };
- else
- listenerOptions = isPassiveEventSupported
- ? { passive: true }
- : { capture: false };
- const onTouchEnd = (e) => {
- if (isSwiping.value)
- onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);
- isSwiping.value = false;
- };
- const stops = [
- useEventListener(
- target,
- 'touchstart',
- (e) => {
- if (e.touches.length !== 1) return;
- if (listenerOptions.capture && !listenerOptions.passive)
- e.preventDefault();
- const [x, y] = getTouchEventCoords(e);
- updateCoordsStart(x, y);
- updateCoordsEnd(x, y);
- onSwipeStart == null ? void 0 : onSwipeStart(e);
- },
- listenerOptions,
- ),
- useEventListener(
- target,
- 'touchmove',
- (e) => {
- if (e.touches.length !== 1) return;
- const [x, y] = getTouchEventCoords(e);
- updateCoordsEnd(x, y);
- if (!isSwiping.value && isThresholdExceeded.value)
- isSwiping.value = true;
- if (isSwiping.value) onSwipe == null ? void 0 : onSwipe(e);
- },
- listenerOptions,
- ),
- useEventListener(
- target,
- ['touchend', 'touchcancel'],
- onTouchEnd,
- listenerOptions,
- ),
- ];
- const stop = () => stops.forEach((s) => s());
- return {
- isPassiveEventSupported,
- isSwiping,
- direction,
- coordsStart,
- coordsEnd,
- lengthX: diffX,
- lengthY: diffY,
- stop,
- };
- }
- function checkPassiveEventSupport(document2) {
- if (!document2) return false;
- let supportsPassive = false;
- const optionsBlock = {
- get passive() {
- supportsPassive = true;
- return false;
- },
- };
- document2.addEventListener('x', noop, optionsBlock);
- document2.removeEventListener('x', noop);
- return supportsPassive;
- }
- function useTemplateRefsList() {
- const refs = ref([]);
- refs.value.set = (el) => {
- if (el) refs.value.push(el);
- };
- onBeforeUpdate(() => {
- refs.value.length = 0;
- });
- return refs;
- }
- function useTextDirection(options = {}) {
- const {
- document: document2 = defaultDocument,
- selector = 'html',
- observe = false,
- initialValue = 'ltr',
- } = options;
- function getValue2() {
- var _a, _b;
- return (_b =
- (_a = document2 == null ? void 0 : document2.querySelector(selector)) ==
- null
- ? void 0
- : _a.getAttribute('dir')) != null
- ? _b
- : initialValue;
- }
- const dir = ref(getValue2());
- tryOnMounted(() => (dir.value = getValue2()));
- if (observe && document2) {
- useMutationObserver(
- document2.querySelector(selector),
- () => (dir.value = getValue2()),
- { attributes: true },
- );
- }
- return computed({
- get() {
- return dir.value;
- },
- set(v) {
- var _a, _b;
- dir.value = v;
- if (!document2) return;
- if (dir.value)
- (_a = document2.querySelector(selector)) == null
- ? void 0
- : _a.setAttribute('dir', dir.value);
- else
- (_b = document2.querySelector(selector)) == null
- ? void 0
- : _b.removeAttribute('dir');
- },
- });
- }
- function getRangesFromSelection(selection) {
- var _a;
- const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;
- return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));
- }
- function useTextSelection(options = {}) {
- const { window: window2 = defaultWindow } = options;
- const selection = ref(null);
- const text = computed(() => {
- var _a, _b;
- return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) !=
- null
- ? _b
- : '';
- });
- const ranges = computed(() =>
- selection.value ? getRangesFromSelection(selection.value) : [],
- );
- const rects = computed(() =>
- ranges.value.map((range) => range.getBoundingClientRect()),
- );
- function onSelectionChange() {
- selection.value = null;
- if (window2) selection.value = window2.getSelection();
- }
- if (window2)
- useEventListener(window2.document, 'selectionchange', onSelectionChange);
- return {
- text,
- rects,
- ranges,
- selection,
- };
- }
- function useTextareaAutosize(options) {
- var _a;
- const textarea = ref(options == null ? void 0 : options.element);
- const input = ref(options == null ? void 0 : options.input);
- const styleProp =
- (_a = options == null ? void 0 : options.styleProp) != null ? _a : 'height';
- const textareaScrollHeight = ref(1);
- function triggerResize() {
- var _a2, _b;
- if (!textarea.value) return;
- let height = '';
- textarea.value.style[styleProp] = '1px';
- textareaScrollHeight.value =
- (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;
- if (options == null ? void 0 : options.styleTarget)
- toValue(options.styleTarget).style[styleProp] =
- `${textareaScrollHeight.value}px`;
- else height = `${textareaScrollHeight.value}px`;
- textarea.value.style[styleProp] = height;
- (_b = options == null ? void 0 : options.onResize) == null
- ? void 0
- : _b.call(options);
- }
- watch([input, textarea], () => nextTick(triggerResize), { immediate: true });
- useResizeObserver(textarea, () => triggerResize());
- if (options == null ? void 0 : options.watch)
- watch(options.watch, triggerResize, { immediate: true, deep: true });
- return {
- textarea,
- input,
- triggerResize,
- };
- }
- function useThrottledRefHistory(source, options = {}) {
- const { throttle = 200, trailing = true } = options;
- const filter = throttleFilter(throttle, trailing);
- const history = useRefHistory(source, { ...options, eventFilter: filter });
- return {
- ...history,
- };
- }
- var DEFAULT_UNITS = [
- { max: 6e4, value: 1e3, name: 'second' },
- { max: 276e4, value: 6e4, name: 'minute' },
- { max: 72e6, value: 36e5, name: 'hour' },
- { max: 5184e5, value: 864e5, name: 'day' },
- { max: 24192e5, value: 6048e5, name: 'week' },
- { max: 28512e6, value: 2592e6, name: 'month' },
- { max: Number.POSITIVE_INFINITY, value: 31536e6, name: 'year' },
- ];
- var DEFAULT_MESSAGES = {
- justNow: 'just now',
- past: (n) => (n.match(/\d/) ? `${n} ago` : n),
- future: (n) => (n.match(/\d/) ? `in ${n}` : n),
- month: (n, past) =>
- n === 1
- ? past
- ? 'last month'
- : 'next month'
- : `${n} month${n > 1 ? 's' : ''}`,
- year: (n, past) =>
- n === 1
- ? past
- ? 'last year'
- : 'next year'
- : `${n} year${n > 1 ? 's' : ''}`,
- day: (n, past) =>
- n === 1 ? (past ? 'yesterday' : 'tomorrow') : `${n} day${n > 1 ? 's' : ''}`,
- week: (n, past) =>
- n === 1
- ? past
- ? 'last week'
- : 'next week'
- : `${n} week${n > 1 ? 's' : ''}`,
- hour: (n) => `${n} hour${n > 1 ? 's' : ''}`,
- minute: (n) => `${n} minute${n > 1 ? 's' : ''}`,
- second: (n) => `${n} second${n > 1 ? 's' : ''}`,
- invalid: '',
- };
- function DEFAULT_FORMATTER(date) {
- return date.toISOString().slice(0, 10);
- }
- function useTimeAgo(time, options = {}) {
- const { controls: exposeControls = false, updateInterval = 3e4 } = options;
- const { now: now2, ...controls } = useNow({
- interval: updateInterval,
- controls: true,
- });
- const timeAgo = computed(() =>
- formatTimeAgo(new Date(toValue(time)), options, toValue(now2)),
- );
- if (exposeControls) {
- return {
- timeAgo,
- ...controls,
- };
- } else {
- return timeAgo;
- }
- }
- function formatTimeAgo(from, options = {}, now2 = Date.now()) {
- var _a;
- const {
- max,
- messages = DEFAULT_MESSAGES,
- fullDateFormatter = DEFAULT_FORMATTER,
- units = DEFAULT_UNITS,
- showSecond = false,
- rounding = 'round',
- } = options;
- const roundFn =
- typeof rounding === 'number' ? (n) => +n.toFixed(rounding) : Math[rounding];
- const diff = +now2 - +from;
- const absDiff = Math.abs(diff);
- function getValue2(diff2, unit) {
- return roundFn(Math.abs(diff2) / unit.value);
- }
- function format(diff2, unit) {
- const val = getValue2(diff2, unit);
- const past = diff2 > 0;
- const str = applyFormat(unit.name, val, past);
- return applyFormat(past ? 'past' : 'future', str, past);
- }
- function applyFormat(name, val, isPast) {
- const formatter = messages[name];
- if (typeof formatter === 'function') return formatter(val, isPast);
- return formatter.replace('{0}', val.toString());
- }
- if (absDiff < 6e4 && !showSecond) return messages.justNow;
- if (typeof max === 'number' && absDiff > max)
- return fullDateFormatter(new Date(from));
- if (typeof max === 'string') {
- const unitMax =
- (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;
- if (unitMax && absDiff > unitMax) return fullDateFormatter(new Date(from));
- }
- for (const [idx, unit] of units.entries()) {
- const val = getValue2(diff, unit);
- if (val <= 0 && units[idx - 1]) return format(diff, units[idx - 1]);
- if (absDiff < unit.max) return format(diff, unit);
- }
- return messages.invalid;
- }
- function useTimeoutPoll(fn, interval, timeoutPollOptions) {
- const { start } = useTimeoutFn(loop, interval, { immediate: false });
- const isActive = ref(false);
- async function loop() {
- if (!isActive.value) return;
- await fn();
- start();
- }
- function resume() {
- if (!isActive.value) {
- isActive.value = true;
- loop();
- }
- }
- function pause() {
- isActive.value = false;
- }
- if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)
- resume();
- tryOnScopeDispose(pause);
- return {
- isActive,
- pause,
- resume,
- };
- }
- function useTimestamp(options = {}) {
- const {
- controls: exposeControls = false,
- offset = 0,
- immediate = true,
- interval = 'requestAnimationFrame',
- callback,
- } = options;
- const ts = ref(timestamp() + offset);
- const update = () => (ts.value = timestamp() + offset);
- const cb = callback
- ? () => {
- update();
- callback(ts.value);
- }
- : update;
- const controls =
- interval === 'requestAnimationFrame'
- ? useRafFn(cb, { immediate })
- : useIntervalFn(cb, interval, { immediate });
- if (exposeControls) {
- return {
- timestamp: ts,
- ...controls,
- };
- } else {
- return ts;
- }
- }
- function useTitle(newTitle = null, options = {}) {
- var _a, _b, _c;
- const { document: document2 = defaultDocument, restoreOnUnmount = (t) => t } =
- options;
- const originalTitle =
- (_a = document2 == null ? void 0 : document2.title) != null ? _a : '';
- const title = toRef2(
- (_b =
- newTitle != null
- ? newTitle
- : document2 == null
- ? void 0
- : document2.title) != null
- ? _b
- : null,
- );
- const isReadonly2 = newTitle && typeof newTitle === 'function';
- function format(t) {
- if (!('titleTemplate' in options)) return t;
- const template = options.titleTemplate || '%s';
- return typeof template === 'function'
- ? template(t)
- : toValue(template).replace(/%s/g, t);
- }
- watch(
- title,
- (t, o) => {
- if (t !== o && document2)
- document2.title = format(typeof t === 'string' ? t : '');
- },
- { immediate: true },
- );
- if (options.observe && !options.titleTemplate && document2 && !isReadonly2) {
- useMutationObserver(
- (_c = document2.head) == null ? void 0 : _c.querySelector('title'),
- () => {
- if (document2 && document2.title !== title.value)
- title.value = format(document2.title);
- },
- { childList: true },
- );
- }
- tryOnBeforeUnmount(() => {
- if (restoreOnUnmount) {
- const restoredTitle = restoreOnUnmount(originalTitle, title.value || '');
- if (restoredTitle != null && document2) document2.title = restoredTitle;
- }
- });
- return title;
- }
- var _TransitionPresets = {
- easeInSine: [0.12, 0, 0.39, 0],
- easeOutSine: [0.61, 1, 0.88, 1],
- easeInOutSine: [0.37, 0, 0.63, 1],
- easeInQuad: [0.11, 0, 0.5, 0],
- easeOutQuad: [0.5, 1, 0.89, 1],
- easeInOutQuad: [0.45, 0, 0.55, 1],
- easeInCubic: [0.32, 0, 0.67, 0],
- easeOutCubic: [0.33, 1, 0.68, 1],
- easeInOutCubic: [0.65, 0, 0.35, 1],
- easeInQuart: [0.5, 0, 0.75, 0],
- easeOutQuart: [0.25, 1, 0.5, 1],
- easeInOutQuart: [0.76, 0, 0.24, 1],
- easeInQuint: [0.64, 0, 0.78, 0],
- easeOutQuint: [0.22, 1, 0.36, 1],
- easeInOutQuint: [0.83, 0, 0.17, 1],
- easeInExpo: [0.7, 0, 0.84, 0],
- easeOutExpo: [0.16, 1, 0.3, 1],
- easeInOutExpo: [0.87, 0, 0.13, 1],
- easeInCirc: [0.55, 0, 1, 0.45],
- easeOutCirc: [0, 0.55, 0.45, 1],
- easeInOutCirc: [0.85, 0, 0.15, 1],
- easeInBack: [0.36, 0, 0.66, -0.56],
- easeOutBack: [0.34, 1.56, 0.64, 1],
- easeInOutBack: [0.68, -0.6, 0.32, 1.6],
- };
- var TransitionPresets = Object.assign(
- {},
- { linear: identity },
- _TransitionPresets,
- );
- function createEasingFunction([p0, p1, p2, p3]) {
- const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;
- const b = (a1, a2) => 3 * a2 - 6 * a1;
- const c = (a1) => 3 * a1;
- const calcBezier = (t, a1, a2) =>
- ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;
- const getSlope = (t, a1, a2) =>
- 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);
- const getTforX = (x) => {
- let aGuessT = x;
- for (let i = 0; i < 4; ++i) {
- const currentSlope = getSlope(aGuessT, p0, p2);
- if (currentSlope === 0) return aGuessT;
- const currentX = calcBezier(aGuessT, p0, p2) - x;
- aGuessT -= currentX / currentSlope;
- }
- return aGuessT;
- };
- return (x) => (p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3));
- }
- function lerp(a, b, alpha) {
- return a + alpha * (b - a);
- }
- function toVec(t) {
- return (typeof t === 'number' ? [t] : t) || [];
- }
- function executeTransition(source, from, to, options = {}) {
- var _a, _b;
- const fromVal = toValue(from);
- const toVal = toValue(to);
- const v1 = toVec(fromVal);
- const v2 = toVec(toVal);
- const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;
- const startedAt = Date.now();
- const endAt = Date.now() + duration;
- const trans =
- typeof options.transition === 'function'
- ? options.transition
- : (_b = toValue(options.transition)) != null
- ? _b
- : identity;
- const ease =
- typeof trans === 'function' ? trans : createEasingFunction(trans);
- return new Promise((resolve) => {
- source.value = fromVal;
- const tick = () => {
- var _a2;
- if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {
- resolve();
- return;
- }
- const now2 = Date.now();
- const alpha = ease((now2 - startedAt) / duration);
- const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));
- if (Array.isArray(source.value))
- source.value = arr.map((n, i) => {
- var _a3, _b2;
- return lerp(
- (_a3 = v1[i]) != null ? _a3 : 0,
- (_b2 = v2[i]) != null ? _b2 : 0,
- alpha,
- );
- });
- else if (typeof source.value === 'number') source.value = arr[0];
- if (now2 < endAt) {
- requestAnimationFrame(tick);
- } else {
- source.value = toVal;
- resolve();
- }
- };
- tick();
- });
- }
- function useTransition(source, options = {}) {
- let currentId = 0;
- const sourceVal = () => {
- const v = toValue(source);
- return typeof v === 'number' ? v : v.map(toValue);
- };
- const outputRef = ref(sourceVal());
- watch(
- sourceVal,
- async (to) => {
- var _a, _b;
- if (toValue(options.disabled)) return;
- const id = ++currentId;
- if (options.delay) await promiseTimeout(toValue(options.delay));
- if (id !== currentId) return;
- const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);
- (_a = options.onStarted) == null ? void 0 : _a.call(options);
- await executeTransition(outputRef, outputRef.value, toVal, {
- ...options,
- abort: () => {
- var _a2;
- return (
- id !== currentId ||
- ((_a2 = options.abort) == null ? void 0 : _a2.call(options))
- );
- },
- });
- (_b = options.onFinished) == null ? void 0 : _b.call(options);
- },
- { deep: true },
- );
- watch(
- () => toValue(options.disabled),
- (disabled) => {
- if (disabled) {
- currentId++;
- outputRef.value = sourceVal();
- }
- },
- );
- tryOnScopeDispose(() => {
- currentId++;
- });
- return computed(() =>
- toValue(options.disabled) ? sourceVal() : outputRef.value,
- );
- }
- function useUrlSearchParams(mode = 'history', options = {}) {
- const {
- initialValue = {},
- removeNullishValues = true,
- removeFalsyValues = false,
- write: enableWrite = true,
- window: window2 = defaultWindow,
- } = options;
- if (!window2) return reactive(initialValue);
- const state = reactive({});
- function getRawParams() {
- if (mode === 'history') {
- return window2.location.search || '';
- } else if (mode === 'hash') {
- const hash = window2.location.hash || '';
- const index = hash.indexOf('?');
- return index > 0 ? hash.slice(index) : '';
- } else {
- return (window2.location.hash || '').replace(/^#/, '');
- }
- }
- function constructQuery(params) {
- const stringified = params.toString();
- if (mode === 'history')
- return `${stringified ? `?${stringified}` : ''}${window2.location.hash || ''}`;
- if (mode === 'hash-params')
- return `${window2.location.search || ''}${stringified ? `#${stringified}` : ''}`;
- const hash = window2.location.hash || '#';
- const index = hash.indexOf('?');
- if (index > 0)
- return `${hash.slice(0, index)}${stringified ? `?${stringified}` : ''}`;
- return `${hash}${stringified ? `?${stringified}` : ''}`;
- }
- function read() {
- return new URLSearchParams(getRawParams());
- }
- function updateState(params) {
- const unusedKeys = new Set(Object.keys(state));
- for (const key of params.keys()) {
- const paramsForKey = params.getAll(key);
- state[key] =
- paramsForKey.length > 1 ? paramsForKey : params.get(key) || '';
- unusedKeys.delete(key);
- }
- Array.from(unusedKeys).forEach((key) => delete state[key]);
- }
- const { pause, resume } = watchPausable(
- state,
- () => {
- const params = new URLSearchParams('');
- Object.keys(state).forEach((key) => {
- const mapEntry = state[key];
- if (Array.isArray(mapEntry))
- mapEntry.forEach((value) => params.append(key, value));
- else if (removeNullishValues && mapEntry == null) params.delete(key);
- else if (removeFalsyValues && !mapEntry) params.delete(key);
- else params.set(key, mapEntry);
- });
- write(params);
- },
- { deep: true },
- );
- function write(params, shouldUpdate) {
- pause();
- if (shouldUpdate) updateState(params);
- window2.history.replaceState(
- window2.history.state,
- window2.document.title,
- window2.location.pathname + constructQuery(params),
- );
- resume();
- }
- function onChanged() {
- if (!enableWrite) return;
- write(read(), true);
- }
- useEventListener(window2, 'popstate', onChanged, false);
- if (mode !== 'history')
- useEventListener(window2, 'hashchange', onChanged, false);
- const initial = read();
- if (initial.keys().next().value) updateState(initial);
- else Object.assign(state, initialValue);
- return state;
- }
- function useUserMedia(options = {}) {
- var _a, _b;
- const enabled = ref((_a = options.enabled) != null ? _a : false);
- const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);
- const constraints = ref(options.constraints);
- const { navigator = defaultNavigator } = options;
- const isSupported = useSupported(() => {
- var _a2;
- return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null
- ? void 0
- : _a2.getUserMedia;
- });
- const stream = shallowRef();
- function getDeviceOptions(type) {
- switch (type) {
- case 'video': {
- if (constraints.value) return constraints.value.video || false;
- break;
- }
- case 'audio': {
- if (constraints.value) return constraints.value.audio || false;
- break;
- }
- }
- }
- async function _start() {
- if (!isSupported.value || stream.value) return;
- stream.value = await navigator.mediaDevices.getUserMedia({
- video: getDeviceOptions('video'),
- audio: getDeviceOptions('audio'),
- });
- return stream.value;
- }
- function _stop() {
- var _a2;
- (_a2 = stream.value) == null
- ? void 0
- : _a2.getTracks().forEach((t) => t.stop());
- stream.value = void 0;
- }
- function stop() {
- _stop();
- enabled.value = false;
- }
- async function start() {
- await _start();
- if (stream.value) enabled.value = true;
- return stream.value;
- }
- async function restart() {
- _stop();
- return await start();
- }
- watch(
- enabled,
- (v) => {
- if (v) _start();
- else _stop();
- },
- { immediate: true },
- );
- watch(
- constraints,
- () => {
- if (autoSwitch.value && stream.value) restart();
- },
- { immediate: true },
- );
- tryOnScopeDispose(() => {
- stop();
- });
- return {
- isSupported,
- stream,
- start,
- stop,
- restart,
- constraints,
- enabled,
- autoSwitch,
- };
- }
- function useVModel(props, key, emit, options = {}) {
- var _a, _b, _c, _d, _e;
- const {
- clone = false,
- passive = false,
- eventName,
- deep = false,
- defaultValue,
- shouldEmit,
- } = options;
- const vm = getCurrentInstance();
- 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));
- let event = eventName;
- if (!key) {
- if (isVue2) {
- const modelOptions =
- (_e =
- (_d = vm == null ? void 0 : vm.proxy) == null
- ? void 0
- : _d.$options) == null
- ? void 0
- : _e.model;
- key = (modelOptions == null ? void 0 : modelOptions.value) || 'value';
- if (!eventName)
- event = (modelOptions == null ? void 0 : modelOptions.event) || 'input';
- } else {
- key = 'modelValue';
- }
- }
- event = event || `update:${key.toString()}`;
- const cloneFn = (val) =>
- !clone ? val : typeof clone === 'function' ? clone(val) : cloneFnJSON(val);
- const getValue2 = () =>
- isDef(props[key]) ? cloneFn(props[key]) : defaultValue;
- const triggerEmit = (value) => {
- if (shouldEmit) {
- if (shouldEmit(value)) _emit(event, value);
- } else {
- _emit(event, value);
- }
- };
- if (passive) {
- const initialValue = getValue2();
- const proxy = ref(initialValue);
- let isUpdating = false;
- watch(
- () => props[key],
- (v) => {
- if (!isUpdating) {
- isUpdating = true;
- proxy.value = cloneFn(v);
- nextTick(() => (isUpdating = false));
- }
- },
- );
- watch(
- proxy,
- (v) => {
- if (!isUpdating && (v !== props[key] || deep)) triggerEmit(v);
- },
- { deep },
- );
- return proxy;
- } else {
- return computed({
- get() {
- return getValue2();
- },
- set(value) {
- triggerEmit(value);
- },
- });
- }
- }
- function useVModels(props, emit, options = {}) {
- const ret = {};
- for (const key in props) {
- ret[key] = useVModel(props, key, emit, options);
- }
- return ret;
- }
- function useVibrate(options) {
- const {
- pattern = [],
- interval = 0,
- navigator = defaultNavigator,
- } = options || {};
- const isSupported = useSupported(
- () => typeof navigator !== 'undefined' && 'vibrate' in navigator,
- );
- const patternRef = toRef2(pattern);
- let intervalControls;
- const vibrate = (pattern2 = patternRef.value) => {
- if (isSupported.value) navigator.vibrate(pattern2);
- };
- const stop = () => {
- if (isSupported.value) navigator.vibrate(0);
- intervalControls == null ? void 0 : intervalControls.pause();
- };
- if (interval > 0) {
- intervalControls = useIntervalFn(vibrate, interval, {
- immediate: false,
- immediateCallback: false,
- });
- }
- return {
- isSupported,
- pattern,
- intervalControls,
- vibrate,
- stop,
- };
- }
- function useVirtualList(list, options) {
- const {
- containerStyle,
- wrapperProps,
- scrollTo: scrollTo2,
- calculateRange,
- currentList,
- containerRef,
- } = 'itemHeight' in options
- ? useVerticalVirtualList(options, list)
- : useHorizontalVirtualList(options, list);
- return {
- list: currentList,
- scrollTo: scrollTo2,
- containerProps: {
- ref: containerRef,
- onScroll: () => {
- calculateRange();
- },
- style: containerStyle,
- },
- wrapperProps,
- };
- }
- function useVirtualListResources(list) {
- const containerRef = ref(null);
- const size = useElementSize(containerRef);
- const currentList = ref([]);
- const source = shallowRef(list);
- const state = ref({ start: 0, end: 10 });
- return { state, source, currentList, size, containerRef };
- }
- function createGetViewCapacity(state, source, itemSize) {
- return (containerSize) => {
- if (typeof itemSize === 'number')
- return Math.ceil(containerSize / itemSize);
- const { start = 0 } = state.value;
- let sum = 0;
- let capacity = 0;
- for (let i = start; i < source.value.length; i++) {
- const size = itemSize(i);
- sum += size;
- capacity = i;
- if (sum > containerSize) break;
- }
- return capacity - start;
- };
- }
- function createGetOffset(source, itemSize) {
- return (scrollDirection) => {
- if (typeof itemSize === 'number')
- return Math.floor(scrollDirection / itemSize) + 1;
- let sum = 0;
- let offset = 0;
- for (let i = 0; i < source.value.length; i++) {
- const size = itemSize(i);
- sum += size;
- if (sum >= scrollDirection) {
- offset = i;
- break;
- }
- }
- return offset + 1;
- };
- }
- function createCalculateRange(
- type,
- overscan,
- getOffset,
- getViewCapacity,
- { containerRef, state, currentList, source },
- ) {
- return () => {
- const element = containerRef.value;
- if (element) {
- const offset = getOffset(
- type === 'vertical' ? element.scrollTop : element.scrollLeft,
- );
- const viewCapacity = getViewCapacity(
- type === 'vertical' ? element.clientHeight : element.clientWidth,
- );
- const from = offset - overscan;
- const to = offset + viewCapacity + overscan;
- state.value = {
- start: from < 0 ? 0 : from,
- end: to > source.value.length ? source.value.length : to,
- };
- currentList.value = source.value
- .slice(state.value.start, state.value.end)
- .map((ele, index) => ({
- data: ele,
- index: index + state.value.start,
- }));
- }
- };
- }
- function createGetDistance(itemSize, source) {
- return (index) => {
- if (typeof itemSize === 'number') {
- const size2 = index * itemSize;
- return size2;
- }
- const size = source.value
- .slice(0, index)
- .reduce((sum, _, i) => sum + itemSize(i), 0);
- return size;
- };
- }
- function useWatchForSizes(size, list, calculateRange) {
- watch([size.width, size.height, list], () => {
- calculateRange();
- });
- }
- function createComputedTotalSize(itemSize, source) {
- return computed(() => {
- if (typeof itemSize === 'number') return source.value.length * itemSize;
- return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);
- });
- }
- var scrollToDictionaryForElementScrollKey = {
- horizontal: 'scrollLeft',
- vertical: 'scrollTop',
- };
- function createScrollTo(type, calculateRange, getDistance, containerRef) {
- return (index) => {
- if (containerRef.value) {
- containerRef.value[scrollToDictionaryForElementScrollKey[type]] =
- getDistance(index);
- calculateRange();
- }
- };
- }
- function useHorizontalVirtualList(options, list) {
- const resources = useVirtualListResources(list);
- const { state, source, currentList, size, containerRef } = resources;
- const containerStyle = { overflowX: 'auto' };
- const { itemWidth, overscan = 5 } = options;
- const getViewCapacity = createGetViewCapacity(state, source, itemWidth);
- const getOffset = createGetOffset(source, itemWidth);
- const calculateRange = createCalculateRange(
- 'horizontal',
- overscan,
- getOffset,
- getViewCapacity,
- resources,
- );
- const getDistanceLeft = createGetDistance(itemWidth, source);
- const offsetLeft = computed(() => getDistanceLeft(state.value.start));
- const totalWidth = createComputedTotalSize(itemWidth, source);
- useWatchForSizes(size, list, calculateRange);
- const scrollTo2 = createScrollTo(
- 'horizontal',
- calculateRange,
- getDistanceLeft,
- containerRef,
- );
- const wrapperProps = computed(() => {
- return {
- style: {
- height: '100%',
- width: `${totalWidth.value - offsetLeft.value}px`,
- marginLeft: `${offsetLeft.value}px`,
- display: 'flex',
- },
- };
- });
- return {
- scrollTo: scrollTo2,
- calculateRange,
- wrapperProps,
- containerStyle,
- currentList,
- containerRef,
- };
- }
- function useVerticalVirtualList(options, list) {
- const resources = useVirtualListResources(list);
- const { state, source, currentList, size, containerRef } = resources;
- const containerStyle = { overflowY: 'auto' };
- const { itemHeight, overscan = 5 } = options;
- const getViewCapacity = createGetViewCapacity(state, source, itemHeight);
- const getOffset = createGetOffset(source, itemHeight);
- const calculateRange = createCalculateRange(
- 'vertical',
- overscan,
- getOffset,
- getViewCapacity,
- resources,
- );
- const getDistanceTop = createGetDistance(itemHeight, source);
- const offsetTop = computed(() => getDistanceTop(state.value.start));
- const totalHeight = createComputedTotalSize(itemHeight, source);
- useWatchForSizes(size, list, calculateRange);
- const scrollTo2 = createScrollTo(
- 'vertical',
- calculateRange,
- getDistanceTop,
- containerRef,
- );
- const wrapperProps = computed(() => {
- return {
- style: {
- width: '100%',
- height: `${totalHeight.value - offsetTop.value}px`,
- marginTop: `${offsetTop.value}px`,
- },
- };
- });
- return {
- calculateRange,
- scrollTo: scrollTo2,
- containerStyle,
- wrapperProps,
- currentList,
- containerRef,
- };
- }
- function useWakeLock(options = {}) {
- const {
- navigator = defaultNavigator,
- document: document2 = defaultDocument,
- } = options;
- let wakeLock;
- const isSupported = useSupported(() => navigator && 'wakeLock' in navigator);
- const isActive = ref(false);
- async function onVisibilityChange() {
- if (!isSupported.value || !wakeLock) return;
- if (document2 && document2.visibilityState === 'visible')
- wakeLock = await navigator.wakeLock.request('screen');
- isActive.value = !wakeLock.released;
- }
- if (document2)
- useEventListener(document2, 'visibilitychange', onVisibilityChange, {
- passive: true,
- });
- async function request(type) {
- if (!isSupported.value) return;
- wakeLock = await navigator.wakeLock.request(type);
- isActive.value = !wakeLock.released;
- }
- async function release() {
- if (!isSupported.value || !wakeLock) return;
- await wakeLock.release();
- isActive.value = !wakeLock.released;
- wakeLock = null;
- }
- return {
- isSupported,
- isActive,
- request,
- release,
- };
- }
- function useWebNotification(options = {}) {
- const {
- window: window2 = defaultWindow,
- requestPermissions: _requestForPermissions = true,
- } = options;
- const defaultWebNotificationOptions = options;
- const isSupported = useSupported(
- () => !!window2 && 'Notification' in window2,
- );
- const permissionGranted = ref(
- isSupported.value &&
- 'permission' in Notification &&
- Notification.permission === 'granted',
- );
- const notification = ref(null);
- const ensurePermissions = async () => {
- if (!isSupported.value) return;
- if (!permissionGranted.value && Notification.permission !== 'denied') {
- const result = await Notification.requestPermission();
- if (result === 'granted') permissionGranted.value = true;
- }
- return permissionGranted.value;
- };
- const { on: onClick, trigger: clickTrigger } = createEventHook();
- const { on: onShow, trigger: showTrigger } = createEventHook();
- const { on: onError, trigger: errorTrigger } = createEventHook();
- const { on: onClose, trigger: closeTrigger } = createEventHook();
- const show = async (overrides) => {
- if (!isSupported.value || !permissionGranted.value) return;
- const options2 = Object.assign(
- {},
- defaultWebNotificationOptions,
- overrides,
- );
- notification.value = new Notification(options2.title || '', options2);
- notification.value.onclick = clickTrigger;
- notification.value.onshow = showTrigger;
- notification.value.onerror = errorTrigger;
- notification.value.onclose = closeTrigger;
- return notification.value;
- };
- const close = () => {
- if (notification.value) notification.value.close();
- notification.value = null;
- };
- if (_requestForPermissions) tryOnMounted(ensurePermissions);
- tryOnScopeDispose(close);
- if (isSupported.value && window2) {
- const document2 = window2.document;
- useEventListener(document2, 'visibilitychange', (e) => {
- e.preventDefault();
- if (document2.visibilityState === 'visible') {
- close();
- }
- });
- }
- return {
- isSupported,
- notification,
- ensurePermissions,
- permissionGranted,
- show,
- close,
- onClick,
- onShow,
- onError,
- onClose,
- };
- }
- var DEFAULT_PING_MESSAGE = 'ping';
- function resolveNestedOptions(options) {
- if (options === true) return {};
- return options;
- }
- function useWebSocket(url, options = {}) {
- const {
- onConnected,
- onDisconnected,
- onError,
- onMessage,
- immediate = true,
- autoClose = true,
- protocols = [],
- } = options;
- const data = ref(null);
- const status = ref('CLOSED');
- const wsRef = ref();
- const urlRef = toRef2(url);
- let heartbeatPause;
- let heartbeatResume;
- let explicitlyClosed = false;
- let retried = 0;
- let bufferedData = [];
- let pongTimeoutWait;
- const _sendBuffer = () => {
- if (bufferedData.length && wsRef.value && status.value === 'OPEN') {
- for (const buffer of bufferedData) wsRef.value.send(buffer);
- bufferedData = [];
- }
- };
- const resetHeartbeat = () => {
- clearTimeout(pongTimeoutWait);
- pongTimeoutWait = void 0;
- };
- const close = (code = 1e3, reason) => {
- if (!isClient || !wsRef.value) return;
- explicitlyClosed = true;
- resetHeartbeat();
- heartbeatPause == null ? void 0 : heartbeatPause();
- wsRef.value.close(code, reason);
- wsRef.value = void 0;
- };
- const send = (data2, useBuffer = true) => {
- if (!wsRef.value || status.value !== 'OPEN') {
- if (useBuffer) bufferedData.push(data2);
- return false;
- }
- _sendBuffer();
- wsRef.value.send(data2);
- return true;
- };
- const _init = () => {
- if (explicitlyClosed || typeof urlRef.value === 'undefined') return;
- const ws = new WebSocket(urlRef.value, protocols);
- wsRef.value = ws;
- status.value = 'CONNECTING';
- ws.onopen = () => {
- status.value = 'OPEN';
- onConnected == null ? void 0 : onConnected(ws);
- heartbeatResume == null ? void 0 : heartbeatResume();
- _sendBuffer();
- };
- ws.onclose = (ev) => {
- status.value = 'CLOSED';
- onDisconnected == null ? void 0 : onDisconnected(ws, ev);
- if (!explicitlyClosed && options.autoReconnect) {
- const {
- retries = -1,
- delay = 1e3,
- onFailed,
- } = resolveNestedOptions(options.autoReconnect);
- retried += 1;
- if (typeof retries === 'number' && (retries < 0 || retried < retries))
- setTimeout(_init, delay);
- else if (typeof retries === 'function' && retries())
- setTimeout(_init, delay);
- else onFailed == null ? void 0 : onFailed();
- }
- };
- ws.onerror = (e) => {
- onError == null ? void 0 : onError(ws, e);
- };
- ws.onmessage = (e) => {
- if (options.heartbeat) {
- resetHeartbeat();
- const { message = DEFAULT_PING_MESSAGE } = resolveNestedOptions(
- options.heartbeat,
- );
- if (e.data === message) return;
- }
- data.value = e.data;
- onMessage == null ? void 0 : onMessage(ws, e);
- };
- };
- if (options.heartbeat) {
- const {
- message = DEFAULT_PING_MESSAGE,
- interval = 1e3,
- pongTimeout = 1e3,
- } = resolveNestedOptions(options.heartbeat);
- const { pause, resume } = useIntervalFn(
- () => {
- send(message, false);
- if (pongTimeoutWait != null) return;
- pongTimeoutWait = setTimeout(() => {
- close();
- explicitlyClosed = false;
- }, pongTimeout);
- },
- interval,
- { immediate: false },
- );
- heartbeatPause = pause;
- heartbeatResume = resume;
- }
- if (autoClose) {
- if (isClient) useEventListener('beforeunload', () => close());
- tryOnScopeDispose(close);
- }
- const open = () => {
- if (!isClient && !isWorker) return;
- close();
- explicitlyClosed = false;
- retried = 0;
- _init();
- };
- if (immediate) open();
- return {
- data,
- status,
- close,
- send,
- open,
- ws: wsRef,
- };
- }
- function useWebWorker(arg0, workerOptions, options) {
- const { window: window2 = defaultWindow } = options != null ? options : {};
- const data = ref(null);
- const worker = shallowRef();
- const post = (...args) => {
- if (!worker.value) return;
- worker.value.postMessage(...args);
- };
- const terminate = function terminate2() {
- if (!worker.value) return;
- worker.value.terminate();
- };
- if (window2) {
- if (typeof arg0 === 'string')
- worker.value = new Worker(arg0, workerOptions);
- else if (typeof arg0 === 'function') worker.value = arg0();
- else worker.value = arg0;
- worker.value.onmessage = (e) => {
- data.value = e.data;
- };
- tryOnScopeDispose(() => {
- if (worker.value) worker.value.terminate();
- });
- }
- return {
- data,
- post,
- terminate,
- worker,
- };
- }
- function jobRunner(userFunc) {
- return (e) => {
- const userFuncArgs = e.data[0];
- return Promise.resolve(userFunc.apply(void 0, userFuncArgs))
- .then((result) => {
- postMessage(['SUCCESS', result]);
- })
- .catch((error) => {
- postMessage(['ERROR', error]);
- });
- };
- }
- function depsParser(deps) {
- if (deps.length === 0) return '';
- const depsString = deps.map((dep) => `'${dep}'`).toString();
- return `importScripts(${depsString})`;
- }
- function createWorkerBlobUrl(fn, deps) {
- const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;
- const blob = new Blob([blobCode], { type: 'text/javascript' });
- const url = URL.createObjectURL(blob);
- return url;
- }
- function useWebWorkerFn(fn, options = {}) {
- const {
- dependencies = [],
- timeout,
- window: window2 = defaultWindow,
- } = options;
- const worker = ref();
- const workerStatus = ref('PENDING');
- const promise = ref({});
- const timeoutId = ref();
- const workerTerminate = (status = 'PENDING') => {
- if (worker.value && worker.value._url && window2) {
- worker.value.terminate();
- URL.revokeObjectURL(worker.value._url);
- promise.value = {};
- worker.value = void 0;
- window2.clearTimeout(timeoutId.value);
- workerStatus.value = status;
- }
- };
- workerTerminate();
- tryOnScopeDispose(workerTerminate);
- const generateWorker = () => {
- const blobUrl = createWorkerBlobUrl(fn, dependencies);
- const newWorker = new Worker(blobUrl);
- newWorker._url = blobUrl;
- newWorker.onmessage = (e) => {
- const { resolve = () => {}, reject = () => {} } = promise.value;
- const [status, result] = e.data;
- switch (status) {
- case 'SUCCESS':
- resolve(result);
- workerTerminate(status);
- break;
- default:
- reject(result);
- workerTerminate('ERROR');
- break;
- }
- };
- newWorker.onerror = (e) => {
- const { reject = () => {} } = promise.value;
- e.preventDefault();
- reject(e);
- workerTerminate('ERROR');
- };
- if (timeout) {
- timeoutId.value = setTimeout(
- () => workerTerminate('TIMEOUT_EXPIRED'),
- timeout,
- );
- }
- return newWorker;
- };
- const callWorker = (...fnArgs) =>
- new Promise((resolve, reject) => {
- promise.value = {
- resolve,
- reject,
- };
- worker.value && worker.value.postMessage([[...fnArgs]]);
- workerStatus.value = 'RUNNING';
- });
- const workerFn = (...fnArgs) => {
- if (workerStatus.value === 'RUNNING') {
- console.error(
- '[useWebWorkerFn] You can only run one instance of the worker at a time.',
- );
- return Promise.reject();
- }
- worker.value = generateWorker();
- return callWorker(...fnArgs);
- };
- return {
- workerFn,
- workerStatus,
- workerTerminate,
- };
- }
- function useWindowFocus(options = {}) {
- const { window: window2 = defaultWindow } = options;
- if (!window2) return ref(false);
- const focused = ref(window2.document.hasFocus());
- useEventListener(window2, 'blur', () => {
- focused.value = false;
- });
- useEventListener(window2, 'focus', () => {
- focused.value = true;
- });
- return focused;
- }
- function useWindowScroll(options = {}) {
- const { window: window2 = defaultWindow, behavior = 'auto' } = options;
- if (!window2) {
- return {
- x: ref(0),
- y: ref(0),
- };
- }
- const internalX = ref(window2.scrollX);
- const internalY = ref(window2.scrollY);
- const x = computed({
- get() {
- return internalX.value;
- },
- set(x2) {
- scrollTo({ left: x2, behavior });
- },
- });
- const y = computed({
- get() {
- return internalY.value;
- },
- set(y2) {
- scrollTo({ top: y2, behavior });
- },
- });
- useEventListener(
- window2,
- 'scroll',
- () => {
- internalX.value = window2.scrollX;
- internalY.value = window2.scrollY;
- },
- {
- capture: false,
- passive: true,
- },
- );
- return { x, y };
- }
- function useWindowSize(options = {}) {
- const {
- window: window2 = defaultWindow,
- initialWidth = Number.POSITIVE_INFINITY,
- initialHeight = Number.POSITIVE_INFINITY,
- listenOrientation = true,
- includeScrollbar = true,
- } = options;
- const width = ref(initialWidth);
- const height = ref(initialHeight);
- const update = () => {
- if (window2) {
- if (includeScrollbar) {
- width.value = window2.innerWidth;
- height.value = window2.innerHeight;
- } else {
- width.value = window2.document.documentElement.clientWidth;
- height.value = window2.document.documentElement.clientHeight;
- }
- }
- };
- update();
- tryOnMounted(update);
- useEventListener('resize', update, { passive: true });
- if (listenOrientation) {
- const matches = useMediaQuery('(orientation: portrait)');
- watch(matches, () => update());
- }
- return { width, height };
- }
- export {
- DefaultMagicKeysAliasMap,
- StorageSerializers,
- TransitionPresets,
- assert,
- computedAsync as asyncComputed,
- refAutoReset as autoResetRef,
- breakpointsAntDesign,
- breakpointsBootstrapV5,
- breakpointsMasterCss,
- breakpointsPrimeFlex,
- breakpointsQuasar,
- breakpointsSematic,
- breakpointsTailwind,
- breakpointsVuetify,
- breakpointsVuetifyV2,
- breakpointsVuetifyV3,
- bypassFilter,
- camelize,
- clamp,
- cloneFnJSON,
- computedAsync,
- computedEager,
- computedInject,
- computedWithControl,
- containsProp,
- computedWithControl as controlledComputed,
- controlledRef,
- createEventHook,
- createFetch,
- createFilterWrapper,
- createGlobalState,
- createInjectionState,
- reactify as createReactiveFn,
- createReusableTemplate,
- createSharedComposable,
- createSingletonPromise,
- createTemplatePromise,
- createUnrefFn,
- customStorageEventName,
- debounceFilter,
- refDebounced as debouncedRef,
- watchDebounced as debouncedWatch,
- defaultDocument,
- defaultLocation,
- defaultNavigator,
- defaultWindow,
- directiveHooks,
- computedEager as eagerComputed,
- executeTransition,
- extendRef,
- formatDate,
- formatTimeAgo,
- get,
- getLifeCycleTarget,
- getSSRHandler,
- hasOwn,
- hyphenate,
- identity,
- watchIgnorable as ignorableWatch,
- increaseWithUnit,
- injectLocal,
- invoke,
- isClient,
- isDef,
- isDefined,
- isIOS,
- isObject,
- isWorker,
- makeDestructurable,
- mapGamepadToXbox360Controller,
- noop,
- normalizeDate,
- notNullish,
- now,
- objectEntries,
- objectOmit,
- objectPick,
- onClickOutside,
- onKeyDown,
- onKeyPressed,
- onKeyStroke,
- onKeyUp,
- onLongPress,
- onStartTyping,
- pausableFilter,
- watchPausable as pausableWatch,
- promiseTimeout,
- provideLocal,
- rand,
- reactify,
- reactifyObject,
- reactiveComputed,
- reactiveOmit,
- reactivePick,
- refAutoReset,
- refDebounced,
- refDefault,
- refThrottled,
- refWithControl,
- resolveRef,
- resolveUnref,
- set2 as set,
- setSSRHandler,
- syncRef,
- syncRefs,
- templateRef,
- throttleFilter,
- refThrottled as throttledRef,
- watchThrottled as throttledWatch,
- timestamp,
- toReactive,
- toRef2 as toRef,
- toRefs2 as toRefs,
- toValue,
- tryOnBeforeMount,
- tryOnBeforeUnmount,
- tryOnMounted,
- tryOnScopeDispose,
- tryOnUnmounted,
- unrefElement,
- until,
- useActiveElement,
- useAnimate,
- useArrayDifference,
- useArrayEvery,
- useArrayFilter,
- useArrayFind,
- useArrayFindIndex,
- useArrayFindLast,
- useArrayIncludes,
- useArrayJoin,
- useArrayMap,
- useArrayReduce,
- useArraySome,
- useArrayUnique,
- useAsyncQueue,
- useAsyncState,
- useBase64,
- useBattery,
- useBluetooth,
- useBreakpoints,
- useBroadcastChannel,
- useBrowserLocation,
- useCached,
- useClipboard,
- useClipboardItems,
- useCloned,
- useColorMode,
- useConfirmDialog,
- useCounter,
- useCssVar,
- useCurrentElement,
- useCycleList,
- useDark,
- useDateFormat,
- refDebounced as useDebounce,
- useDebounceFn,
- useDebouncedRefHistory,
- useDeviceMotion,
- useDeviceOrientation,
- useDevicePixelRatio,
- useDevicesList,
- useDisplayMedia,
- useDocumentVisibility,
- useDraggable,
- useDropZone,
- useElementBounding,
- useElementByPoint,
- useElementHover,
- useElementSize,
- useElementVisibility,
- useEventBus,
- useEventListener,
- useEventSource,
- useEyeDropper,
- useFavicon,
- useFetch,
- useFileDialog,
- useFileSystemAccess,
- useFocus,
- useFocusWithin,
- useFps,
- useFullscreen,
- useGamepad,
- useGeolocation,
- useIdle,
- useImage,
- useInfiniteScroll,
- useIntersectionObserver,
- useInterval,
- useIntervalFn,
- useKeyModifier,
- useLastChanged,
- useLocalStorage,
- useMagicKeys,
- useManualRefHistory,
- useMediaControls,
- useMediaQuery,
- useMemoize,
- useMemory,
- useMounted,
- useMouse,
- useMouseInElement,
- useMousePressed,
- useMutationObserver,
- useNavigatorLanguage,
- useNetwork,
- useNow,
- useObjectUrl,
- useOffsetPagination,
- useOnline,
- usePageLeave,
- useParallax,
- useParentElement,
- usePerformanceObserver,
- usePermission,
- usePointer,
- usePointerLock,
- usePointerSwipe,
- usePreferredColorScheme,
- usePreferredContrast,
- usePreferredDark,
- usePreferredLanguages,
- usePreferredReducedMotion,
- usePrevious,
- useRafFn,
- useRefHistory,
- useResizeObserver,
- useScreenOrientation,
- useScreenSafeArea,
- useScriptTag,
- useScroll,
- useScrollLock,
- useSessionStorage,
- useShare,
- useSorted,
- useSpeechRecognition,
- useSpeechSynthesis,
- useStepper,
- useStorage,
- useStorageAsync,
- useStyleTag,
- useSupported,
- useSwipe,
- useTemplateRefsList,
- useTextDirection,
- useTextSelection,
- useTextareaAutosize,
- refThrottled as useThrottle,
- useThrottleFn,
- useThrottledRefHistory,
- useTimeAgo,
- useTimeout,
- useTimeoutFn,
- useTimeoutPoll,
- useTimestamp,
- useTitle,
- useToNumber,
- useToString,
- useToggle,
- useTransition,
- useUrlSearchParams,
- useUserMedia,
- useVModel,
- useVModels,
- useVibrate,
- useVirtualList,
- useWakeLock,
- useWebNotification,
- useWebSocket,
- useWebWorker,
- useWebWorkerFn,
- useWindowFocus,
- useWindowScroll,
- useWindowSize,
- watchArray,
- watchAtMost,
- watchDebounced,
- watchDeep,
- watchIgnorable,
- watchImmediate,
- watchOnce,
- watchPausable,
- watchThrottled,
- watchTriggerable,
- watchWithFilter,
- whenever,
- };
- /*! Bundled license information:
- vitepress/lib/vue-demi.mjs:
- (**
- * vue-demi v0.14.7
- * Copyright (c) 2020-present, Anthony Fu
- * @license MIT
- *)
- */
- //# sourceMappingURL=vitepress___@vueuse_core.js.map
|