index.mjs 185 KB

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