{"version":3,"sources":["utils/check.ts","utils/setting.ts","components/CardV2/index.tsx","components/SearchBar/index.tsx","components/Loading/index.tsx","utils/api.tsx","components/TagSelector/index.tsx","components/GithubLink/index.tsx","utils/theme.ts","components/DarkSwitch/index.tsx","utils/serachEngine.ts","components/Content/index.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["getLogoUrl","url","startsWith","setJumpTarget","target","window","localStorage","setItem","getJumpTarget","getItem","Card","title","des","logo","catelog","onClick","index","isSearching","el","useMemo","src","alt","split","pop","includes","type","showNumIndex","href","undefined","rel","className","SearchBar","props","onKeyDown","ev","code","test","key","document","getElementById","focus","useEffect","addEventListener","removeEventListener","id","placeholder","value","searchString","onChange","v","setSearchText","Loading","FetchList","axios","get","raw","data","catelogs","push","forEach","item","name","tools","setting","hideAdmin","desc","jumpTargetBlank","jumpTarget","TagSelector","tags","onTagChange","currTag","renderTags","useCallback","map","each","GithubLink","viewBox","version","xmlns","width","height","d","decodeTheme","t","Date","getHours","night","matchMedia","matches","decodeAuto","applyTheme","source","disableLog","querySelector","classList","toggle","console","log","initTheme","theme","DarkSwitch","showGithub","useState","setTheme","current","useRef","hasInit","currentTimer","timer","clearInterval","realTheme","setInterval","useLayoutEffect","iTheme","lightIcon","fill","darkIcon","autoIcon","generateSearchEngineCard","trim","searchBaidu","hide","searchBing","searchGoogle","q","mutiSearch","s","toLowerCase","rawInclude","pinYinInlcude","Boolean","pinyin","match","Content","setData","loading","setLoading","setCurrTag","setSearchString","val","setVal","filteredDataRef","hideGithub","loadData","r","tagInLocalStorage","resetSearch","notSetTag","filteredData","localResult","filter","onKeyEnter","renderCardsV2","thisTarget","toggleJumpTarget","cards","keyCode","length","open","ctrlKey","metaKey","num","Number","isNaN","preventDefault","Helmet","charSet","favicon","handleSetSearch","tag","govRecord","App","isLocalhost","location","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","catch","error","ReactDOM","render","URL","process","origin","fetch","response","contentType","headers","status","indexOf","ready","unregister","reload","checkValidServiceWorker"],"mappings":"wWAIaA,G,YAAa,SAACC,GACzB,OAAIA,EAAIC,WAAW,QACX,gBAAN,OAAuBD,GAEhBA,CAEX,GCKME,EAAgB,SAACC,GACrBC,OAAOC,aAAaC,QAAQ,aAAcH,EAC5C,EAEaI,EAAgB,WAC3B,OAAOH,OAAOC,aAAaG,QAAQ,aACrC,E,OC4BeC,EA7CF,SAAH,GAAyE,IAAnEC,EAAK,EAALA,MAAOV,EAAG,EAAHA,IAAKW,EAAG,EAAHA,IAAKC,EAAI,EAAJA,KAAMC,EAAO,EAAPA,QAASC,EAAO,EAAPA,QAASC,EAAK,EAALA,MAAOC,EAAW,EAAXA,YACxDC,EAAKC,mBAAQ,WACjB,MAAY,UAARlB,EACK,qBAAKmB,IAAKP,EAAMQ,IAAKV,IAExBE,EAAKS,MAAM,KAAKC,MAAMC,SAAS,OAC1B,uBAAOJ,IAAKpB,EAAWa,GAAOY,KAAK,kBAEnC,qBAAKL,IAAKpB,EAAWa,GAAOQ,IAAKV,GAG9C,GAAG,CAACE,EAAMF,EAAOV,IACXyB,EAAeV,EAAQ,IAAMC,EACnC,OACE,oBACEU,KAAc,qBAAR1B,OAA6B2B,EAAY3B,EAC/Cc,QAAS,WACPA,GACF,EACAX,OAA4B,UAApBI,IAA8B,SAAW,QACjDqB,IAAI,aACJC,UAAU,WAAU,UAEnBJ,GAAgB,sBAAMI,UAAU,aAAY,SAAEd,EAAQ,IACvD,sBAAKc,UAAU,eAAc,UAC3B,qBAAKA,UAAU,YAAW,SACvBZ,IAOH,sBAAKY,UAAU,aAAY,UACzB,sBAAKA,UAAU,iBAAgB,UAC7B,sBAAMA,UAAU,mBAAmBnB,MAAOA,EAAM,SAAEA,IAClD,sBAAMmB,UAAU,WAAWnB,MAAOG,EAAQ,SAAEA,OAE9C,qBAAKgB,UAAU,oBAAoBnB,MAAOC,EAAI,SAAEA,YAK1D,ECLemB,G,MAlCG,SAACC,GACjB,IAAMC,EAAY,SAACC,GAEjB,GAAgB,UAAZA,EAAGC,MADK,+BACmBC,KAAKF,EAAGG,KAAM,CAC3C,IAAMnB,EAAKoB,SAASC,eAAe,cAC/BrB,GACFA,EAAGsB,OAEP,CACF,EAOA,OANAC,qBAAU,WAER,OADAH,SAASI,iBAAiB,UAAWT,GAC9B,WACLK,SAASK,oBAAoB,UAAWV,EAC1C,CACF,IAEE,qBAAKH,UAAU,gBAAe,SAC5B,qBAAKA,UAAU,gBAAe,SAC5B,uBACEc,GAAG,aACHnB,KAAK,SACLoB,YAAY,+DACZC,MAAOd,EAAMe,aACbC,SAAU,SAACd,GACT,IAAMe,EAAIf,EAAG9B,OAAO0C,MACpBd,EAAMkB,cAAcD,EACtB,OAKV,GCvCaE,G,MAAU,SAACnB,GACtB,OACE,qBAAKF,UAAU,iBAAgB,SAC7B,sBAAKA,UAAU,WAAU,UACvB,wBACA,wBACA,wBACA,4BAIR,G,yBCLasB,EAAS,iDAAG,wHACOC,IAAMC,IANtB,SAMmC,KAAD,EAsCrB,OAtCqB,SAAhCC,EAAG,EAATC,KACAA,EAASD,EAATC,MAEFC,EAAW,IACRC,KAAK,4BACdF,EAAKC,SAASE,SAAQ,SAAAC,GAClBH,EAASC,KAAKE,EAAKC,KACvB,IACAL,EAAKM,MAAMH,SAAQ,SAAAC,GACVH,EAASjC,SAASoC,EAAK9C,UACxB2C,EAASC,KAAKE,EAAK9C,QAE3B,IACiB,QAAb,EAAC0C,EAAKO,eAAO,OAAZ,EAAcC,WACfR,EAAKM,MAAMJ,KAAK,CACZd,GAAI,aACJ9B,QAAS,2BACT+C,KAAM,uCACNI,KAAM,+DACNhE,IAAK,QACLY,KAAK,u6KAGT2C,EAAKO,UJP8BA,EIQRP,EAAKO,QJPjC1D,OAAOC,aAAaG,QAAQ,4BAC/BJ,OAAOC,aAAaC,QAAQ,yBAA0B,aACtBqB,IAA5BmC,EAAQG,sBAA6DtC,IAA5BmC,EAAQG,kBAA4D,IAA3BH,EAAQG,gBAC5F/D,EAAc,SAEdA,EAAc,UIKVgE,EAAa3D,IAEnBgD,EAAKM,MAAMJ,KAAK,CACZd,GAAI,aACJa,SAAU,2BACVI,KAAqB,UAAfM,EAAyB,2BAAS,2BACxCF,KAAK,mDACLhE,IAAK,mBACLY,KAAqB,UAAfsD,EArCK,q9GADD,m+GAyCdX,EAAKC,SAAWA,EAAS,kBAClBD,GAAI,kCJvB2B,IAACO,CIuB5B,UACd,kBAzCqB,mCA0CPX,ICbAgB,G,MA7BK,SAACpC,GACnB,MAAiDA,EAAzCqC,YAAI,MAAG,CAAC,OAAM,EAAEC,EAAyBtC,EAAzBsC,YAAaC,EAAYvC,EAAZuC,QAC/BC,EAAaC,uBAAY,WAgB7B,OAfoBJ,EAAKK,KAAI,SAACC,GAC5B,OACE,sBACE7C,UAAS,qBACPyC,IAAYI,EAAO,oBAAsB,IAG3C5D,QAAS,WACPuD,EAAYK,EACd,EAAE,SAEDA,GAAI,UALGA,EAAI,eAQlB,GAEF,GAAG,CAACN,EAAMC,EAAaC,IACvB,OACE,qBAAKzC,UAAU,sBAAqB,SAClC,qBAAKA,UAAU,uBAAsB,SAClC0C,OAIT,G,QCvBeI,G,MATI,WACjB,OACE,qBAAK9C,UAAU,kBAAiB,SAC9B,mBAAGH,KAAK,uCAAuCvB,OAAQ,SAAWyB,IAAI,aAAY,SAClF,qBAAMC,UAAU,OAAO+C,QAAQ,gBAAgBC,QAAQ,MAAMC,MAAM,6BAA6B,OAAK,OAAOC,MAAM,MAAMC,OAAO,MAAK,SAAC,sBAAMC,EAAE,gvCAAivC,OAAK,cAIz4C,GCMO,IAAMC,EAAc,SAACC,GAC1B,MAAU,SAANA,EAjBC,WACL,IAAMF,GAAI,IAAIG,MAAOC,WACfC,EAAQL,EAAI,IAAMA,EAAI,EAC5B,MAAqB,oBAAV7E,OACLkF,EACK,YAEA,aAGPA,GAASlF,OAAOmF,WAAW,gCAAgCC,QACtD,YAEA,YAEX,CAGWC,GAEAN,CAEX,EACaO,EAAa,SAACP,EAAWQ,EAAgBC,GAChDT,EAAE5D,SAAS,UACEc,SAASwD,cAAc,QAC/BC,UAAUC,OAAO,aAAa,GAChCH,GACHI,QAAQC,IAAI,iBAAD,OAAkBN,EAAM,aAAKR,MAG3B9C,SAASwD,cAAc,QAC/BC,UAAUC,OAAO,aAAa,GAChCH,GACHI,QAAQC,IAAI,iBAAD,OAAkBN,EAAM,aAAKR,IAG9C,EACae,EAAY,WACvB,MAA2B,oBAAhB7F,aACF,OAGH,UAAWA,cAAwC,SAAvBA,aAAa8F,MAGlB,SAAvB9F,aAAa8F,MACR,OAEA,QALF,MAQX,ECiCeC,G,MAjFI,SAAH,GAAiD,IAA3CC,EAAU,EAAVA,WACpB,EAA0BC,mBAASJ,KAAY,mBAAxCC,EAAK,KAAEI,EAAQ,KACdC,EAAYC,iBAAY,CAAEC,SAAS,IAAnCF,QACSG,EAAiBF,iBAAY,CAAEG,MAAO,OAA/CJ,QAERhE,qBAAU,WACJmE,EAAaC,QACfC,cAAcF,EAAaC,OAC3BD,EAAaC,MAAQ,MAEvBvG,aAAaC,QAAQ,QAAS6F,GAC9B,IAAMW,EAAY5B,EAAYiB,GAC9BT,EAAWoB,EAAW,YAAY,GAC9BA,EAAUvF,SAAS,UACrBoF,EAAaC,MAAQG,aAAY,WAC/B,IAAMD,EAAY5B,EAAY,QAC9BQ,EAAWoB,EAAW,kBAAkB,EAC1C,GAAG,KAGP,GAAG,CAACX,IAGJa,2BAAgB,WACd,IAAKR,EAAQE,QAEX,GADAF,EAAQE,SAAU,EACXrG,aAAaG,QAAQ,SAGrB,CACL,IAAMyG,EAASf,IACfK,EAASU,EACX,MAJEV,EAAS,OAOf,GAAG,IAEH,IAAMW,EAAa,qBACjBpC,MAAM,6BACNF,QAAQ,gBACRuC,KAAK,eACL,aAAW,aACXpC,MAAO,GACPC,OAAQ,GAAG,SAEX,sBAAMC,EAAE,0nBAEJmC,EAAY,qBAChBtC,MAAM,6BACNF,QAAQ,gBACRuC,KAAK,eACL,aAAW,YACXpC,MAAO,GACPC,OAAQ,GAAG,SAEX,sBAAMC,EAAE,yXAEJoC,EAAY,qBAChBvC,MAAM,6BACNC,MAAO,GACPC,OAAQ,GACRJ,QAAQ,gBACR,aAAW,YAAW,SAEtB,sBAAMK,EAAE,qRAWV,OACE,qBAAKpD,UAAS,2BAAsBwE,EAAa,GAAK,eAAiBvF,QAVpD,WAEjByF,EADY,UAAVJ,EACO,OACU,SAAVA,EACA,OAEA,QAEb,EAE+F,SAChF,UAAVA,EAAoBe,EAAsB,SAAVf,EAAmBiB,EAAWC,GAGrE,GCpFaC,EAA2B,SAACxE,GACvC,OAAKA,EAAayE,OACH,CACb,CACE3D,KAAM,uCACN5D,IAAKwH,EAAY1E,GACjBkB,KAAK,8CAAD,OAAalB,EAAY,UAC7BH,GAAI,WACJ/B,KAAM,YACN6G,MAAM,GAER,CACE7D,KAAM,iCACN5D,IAAK0H,EAAW5E,GAChBkB,KAAK,wCAAD,OAAiBlB,EAAY,UACjCH,GAAI,WACJ/B,KAAM,WACN6G,MAAM,GAER,CACE7D,KAAM,mCACN5D,IAAK2H,EAAa7E,GAClBkB,KAAK,0CAAD,OAAmBlB,EAAY,UACnCH,GAAI,WACJ/B,KAAM,aACN6G,MAAM,IAxBuB,EA4BnC,EAIMD,EAAc,SAACI,GACnB,MAAM,8BAAN,OAAqCA,EACvC,EAEMD,EAAe,SAACC,GACpB,MAAM,mCAAN,OAA0CA,EAC5C,EAEMF,EAAa,SAACE,GAClB,MAAM,gCAAN,OAAuCA,EACzC,EC5BMC,EAAa,SAACC,EAAG3C,GACrB,IAAMQ,EAAUmC,EAAaC,cACvB5H,EAASgF,EAAE4C,cACXC,EAAarC,EAAOpE,SAASpB,GAC7B8H,EAAgBC,QAAQC,IAAOC,MAAMzC,EAAQxF,IACnD,OAAO6H,GAAcC,CACvB,EA0MeI,EAxMC,SAACtG,GAAgB,IAAD,cAC9B,EAAwBuE,mBAAc,CAAC,GAAE,mBAAlC/C,EAAI,KAAE+E,EAAO,KACpB,EAA8BhC,oBAAkB,GAAK,mBAA9CiC,EAAO,KAAEC,EAAU,KAC1B,EAA8BlC,mBAAS,4BAAO,mBAAvChC,EAAO,KAAEmE,EAAU,KAC1B,EAAwCnC,mBAAS,IAAG,mBAA7CxD,EAAY,KAAE4F,EAAe,KACpC,EAAsBpC,mBAAS,IAAG,mBAA3BqC,EAAG,KAAEC,EAAM,KAEZC,EAAkBpC,iBAAY,IAE9BJ,EAAanF,mBAAQ,WAAO,IAAD,EAE/B,SAD2C,KAA1B,OAAJqC,QAAI,IAAJA,GAAa,QAAT,EAAJA,EAAMO,eAAO,WAAT,EAAJ,EAAegF,YAE9B,GAAG,CAACvF,IACEwF,EAAWvE,sBAAW,gCAAC,gGAER,OAFQ,SAEzBgE,GAAW,GAAM,SACDrF,IAAY,KAAD,EAArB6F,EAAC,OACPV,EAAQU,IACFC,EAAoB7I,OAAOC,aAAaG,QAAQ,SACP,KAAtByI,GAClB,OAADD,QAAC,IAADA,KAAGxF,UAAa,OAADwF,QAAC,IAADA,KAAGxF,SAASjC,SAAS0H,IACtCR,EAAWQ,GAEd,kDAEDjD,QAAQC,IAAI,EAAD,IAAI,QAEG,OAFH,UAEfuC,GAAW,GAAO,6EAEnB,CAACF,EAASE,EAAYC,IACzBjG,qBAAU,WACRuG,GACF,GAAG,CAACA,IAEJ,IASMG,EAAc,SAACC,GACnBP,EAAO,IACPF,EAAgB,IAChB,IAAMO,EAAoB7I,OAAOC,aAAaG,QAAQ,QACjD2I,GAAaF,GAA2C,KAAtBA,GAAkD,6BAAtBA,GACjER,EAAWQ,EAEf,EAaMG,EAAelI,mBAAQ,WAC3B,GAAIqC,EAAKM,MAAO,CACd,IAAMwF,EAAc9F,EAAKM,MACtByF,QAAO,SAAC3F,GACP,IAAM8D,EAAO9D,EAAK8D,KAClB,OAAKA,IACDA,GX3FLpH,aAAaG,QAAQ,WW2FU,EAEhC,IACC8I,QAAO,SAAC3F,GACP,MAAgB,6BAAZW,GAGGX,EAAK9C,UAAYyD,CAC1B,IACCgF,QAAO,SAAC3F,GACP,MAAqB,KAAjBb,IAIF+E,EAAWlE,EAAKC,KAAMd,IACtB+E,EAAWlE,EAAKK,KAAMlB,IACtB+E,EAAWlE,EAAK3D,IAAK8C,GAEzB,IACF,MAAM,GAAN,mBAAWuG,GAAW,YAAK/B,EAAyBxE,IACtD,CACE,OAAO,YAAIwE,EAAyBxE,GAExC,GAAG,CAACS,EAAMe,EAASxB,IAEnBN,qBAAU,WACRqG,EAAgBrC,QAAU4C,CAC5B,GAAG,CAACA,IAEJ5G,qBAAU,WAMR,MAL4B,KAAxBM,EAAayE,OACflF,SAASK,oBAAoB,UAAW6G,GAExClH,SAASI,iBAAiB,UAAW8G,GAEhC,WACLlH,SAASK,oBAAoB,UAAW6G,EAC1C,CAEF,GAAG,CAACzG,IAEJ,IAAM0G,EAAgBhF,uBAAY,WAChC,OAAO4E,EAAa3E,KAAI,SAACd,EAAM5C,GAC7B,OACE,cAAC,EAAM,CACLL,MAAOiD,EAAKC,KACZ5D,IAAK2D,EAAK3D,IACVW,IAAKgD,EAAKK,KACVpD,KAAM+C,EAAK/C,KAEXC,QAAS8C,EAAK9C,QACdE,MAAOA,EACPC,YAAqC,KAAxB8B,EAAayE,OAC1BzG,QAAS,WACPoI,IACiB,qBAAbvF,EAAK3D,OVjJW,WAC9B,IAAMyJ,EAAalJ,IACdkJ,GACHvJ,EAAc,SAGdA,EADiB,UAAfuJ,EACY,OAEA,QAGlB,CUuIcC,GACAX,IAEJ,GAVKpF,EAAKhB,GAahB,GAEF,GAAG,CAACyG,EAActG,IAEZyG,EAAa,SAACtH,GAClB,IAG6B,EAHvB0H,EAAQd,EAAgBrC,QAEX,KAAfvE,EAAG2H,UACDD,GAASA,EAAME,SACjBzJ,OAAO0J,KAAa,QAAT,EAACH,EAAM,UAAE,aAAR,EAAU3J,IAAK,UAC3BkJ,MAIJ,GAAIjH,EAAG8H,SAAW9H,EAAG+H,QAAS,CAC5B,IAAMC,EAAMC,OAAOjI,EAAGG,KACtB,GAAI+H,MAAMF,GAAM,OAChBhI,EAAGmI,iBACH,IACwC,EADlCrJ,EAAQmJ,OAAOjI,EAAGG,KAAO,EAC/B,GAAIrB,GAAS,GAAKA,EAAQ4I,EAAME,OAC9BzJ,OAAO0J,KAAiB,QAAb,EAACH,EAAM5I,UAAM,aAAZ,EAAcf,IAAK,UAC/BkJ,GAEJ,CAEF,EAEA,OACE,qCACE,eAACmB,EAAA,EAAM,WACL,sBAAMC,QAAQ,UACd,sBACE1I,IAAI,OACJF,KACwB,QADpB,EACE,OAAJ6B,QAAI,IAAJA,GAAa,QAAT,EAAJA,EAAMO,eAAO,WAAT,EAAJ,EAAeyG,eAAO,QAAI,gBAG9B,gCAA4B,QAA5B,EAAY,OAAJhH,QAAI,IAAJA,GAAa,QAAT,EAAJA,EAAMO,eAAO,WAAT,EAAJ,EAAepD,aAAK,QAAI,eAElC,qBAAKmB,UAAU,SAAQ,SACrB,sBAAKA,UAAU,UAAS,UACtB,cAAC,EAAS,CACRiB,aAAc6F,EACd1F,cAAe,SAACkC,GACdyD,EAAOzD,GA3HK,SAACwD,GACX,KAARA,GAAcA,GAChBF,EAAW,4BACXC,EAAgBC,EAAIpB,SAEpB2B,GAEJ,CAqHYsB,CAAgBrF,EAClB,IAEF,cAAC,EAAW,CACVf,KAAoB,QAAhB,EAAM,OAAJb,QAAI,IAAJA,OAAI,EAAJA,EAAMC,gBAAQ,QAAI,CAAC,4BACzBc,QAASA,EACTD,YApJe,SAACoG,GACxBhC,EAAWgC,GAEC,6BAARA,GACFrK,OAAOC,aAAaC,QAAQ,MAAOmK,GAErCvB,GAAY,EACd,SAiJI,qBAAKrH,UAAU,iBAAgB,SAC7B,qBAAKA,UAAU,gBAAe,SAC3B0G,EAAU,cAAC,EAAO,IAAciB,QAGrC,qBAAK3H,UAAU,gBAAe,SAC5B,mBAAGH,KAAK,4BAA4BvB,OAAO,SAASyB,IAAI,aAAY,SAA0B,QAA1B,EAAM,OAAJ2B,QAAI,IAAJA,GAAa,QAAT,EAAJA,EAAMO,eAAO,WAAT,EAAJ,EAAe4G,iBAAS,QAAI,OAEnGrE,GAAc,cAAC,EAAU,IAC1B,cAAC,EAAU,CAACA,WAAYA,MAG9B,ECjNesE,MAVf,WACE,OACE,qBAAK9I,UAAU,MAAK,SAClB,qBAAKA,UAAU,OAAM,SACnB,cAAC,EAAO,OAIhB,ECEM+I,EAAc1C,QACW,cAA7B9H,OAAOyK,SAASC,UAEe,UAA7B1K,OAAOyK,SAASC,UAEhB1K,OAAOyK,SAASC,SAAS1C,MACvB,2DAsCN,SAAS2C,EAAgBC,EAAOC,GAC9BC,UAAUC,cACPC,SAASJ,GACTK,MAAK,SAAAC,GACJA,EAAaC,cAAgB,WAC3B,IAAMC,EAAmBF,EAAaG,WACd,MAApBD,IAGJA,EAAiBE,cAAgB,WACA,cAA3BF,EAAiBG,QACfT,UAAUC,cAAcS,YAI1B5F,QAAQC,IACN,iHAKEgF,GAAUA,EAAOY,UACnBZ,EAAOY,SAASP,KAMlBtF,QAAQC,IAAI,sCAGRgF,GAAUA,EAAOa,WACnBb,EAAOa,UAAUR,IAIzB,EACF,CACF,IACCS,OAAM,SAAAC,GACLhG,QAAQgG,MAAM,4CAA6CA,EAC7D,GACJ,CC3FAhG,QAAQC,IAAI,iDACZD,QAAQC,IAAI,kEAGZgG,IAASC,OACL,cAAC,EAAG,IAEN7J,SAASC,eAAe,SDQnB,SAAkB2I,GACvB,GAA6C,kBAAmBC,UAAW,CAGzE,GADkB,IAAIiB,IAAIC,GAAwBhM,OAAOyK,SAASnJ,MACpD2K,SAAWjM,OAAOyK,SAASwB,OAIvC,OAGFjM,OAAOqC,iBAAiB,QAAQ,WAC9B,IAAMuI,EAAK,UAAMoB,GAAsB,sBAEnCxB,IAgEV,SAAiCI,EAAOC,GAEtCqB,MAAMtB,GACHK,MAAK,SAAAkB,GAEJ,IAAMC,EAAcD,EAASE,QAAQpJ,IAAI,gBAEnB,MAApBkJ,EAASG,QACO,MAAfF,IAA8D,IAAvCA,EAAYG,QAAQ,cAG5CzB,UAAUC,cAAcyB,MAAMvB,MAAK,SAAAC,GACjCA,EAAauB,aAAaxB,MAAK,WAC7BjL,OAAOyK,SAASiC,QAClB,GACF,IAGA/B,EAAgBC,EAAOC,EAE3B,IACCc,OAAM,WACL/F,QAAQC,IACN,gEAEJ,GACJ,CAxFQ8G,CAAwB/B,EAAOC,GAI/BC,UAAUC,cAAcyB,MAAMvB,MAAK,WACjCrF,QAAQC,IACN,4GAGJ,KAGA8E,EAAgBC,EAAOC,EAE3B,GACF,CACF,CCrCAE,CAAuB,K","file":"static/js/main.c71ee246.chunk.js","sourcesContent":["export const isLogin = () => {\n return localStorage.getItem('_token') ? true : false\n}\n\nexport const getLogoUrl = (url: string) => {\n if (url.startsWith('http')) {\n return `/api/img?url=${url}`\n } else {\n return url;\n }\n} ","type JumpTarget = 'blank' | 'self';\n\nexport const toggleJumpTarget = () => {\n const thisTarget = getJumpTarget();\n if (!thisTarget) {\n setJumpTarget('blank');\n }\n if (thisTarget === 'blank') {\n setJumpTarget('self');\n } else {\n setJumpTarget('blank');\n }\n\n}\n\nconst setJumpTarget = (target: JumpTarget) => {\n window.localStorage.setItem('jumpTarget', target);\n}\n\nexport const getJumpTarget = () => {\n return window.localStorage.getItem('jumpTarget') as JumpTarget;\n}\n\n\nexport const initServerJumpTargetConfig = (setting: any) => {\n if (!window.localStorage.getItem(\"initedServerJumpTarget\")) {\n window.localStorage.setItem(\"initedServerJumpTarget\", \"true\");\n if (setting.jumpTargetBlank === undefined || setting.jumpTargetBlank === undefined || setting.jumpTargetBlank=== true) {\n setJumpTarget(\"blank\")\n } else {\n setJumpTarget(\"self\")\n }\n }\n}","import { useMemo } from \"react\";\r\nimport \"./index.css\";\r\nimport { getLogoUrl } from \"../../utils/check\";\r\nimport { getJumpTarget } from \"../../utils/setting\";\r\nconst Card = ({ title, url, des, logo, catelog, onClick, index, isSearching }) => {\r\n const el = useMemo(() => {\r\n if (url === \"admin\") {\r\n return {title}\r\n } else {\r\n if (logo.split(\".\").pop().includes(\"svg\")) {\r\n return \r\n } else {\r\n return {title}\r\n }\r\n }\r\n }, [logo, title, url])\r\n const showNumIndex = index < 10 && isSearching;\r\n return (\r\n {\r\n onClick();\r\n }}\r\n target={getJumpTarget() === \"blank\" ? \"_blank\" : \"_self\"}\r\n rel=\"noreferrer\"\r\n className=\"card-box\"\r\n >\r\n {showNumIndex && {index + 1}}\r\n
\r\n
\r\n {el}\r\n {/* {url === \"admin\" ? (\r\n {title}\r\n ) : (\r\n {title}\r\n )} */}\r\n
\r\n
\r\n
\r\n {title}\r\n {catelog}\r\n
\r\n
{des}
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Card;\r\n","import { useEffect } from \"react\";\r\nimport \"./index.css\";\r\n// import { useState } from 'react';\r\n\r\ninterface SearchBarProps {\r\n setSearchText: (t: string) => void;\r\n searchString: string;\r\n}\r\nconst SearchBar = (props: SearchBarProps) => {\r\n const onKeyDown = (ev) => {\r\n const reg = /[a-zA-Z0-9]|[\\u4e00-\\u9fa5]/g;\r\n if (ev.code === \"Enter\" || reg.test(ev.key)) {\r\n const el = document.getElementById(\"search-bar\");\r\n if (el) {\r\n el.focus();\r\n }\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyDown)\r\n }\r\n })\r\n return (\r\n
\r\n
\r\n {\r\n const v = ev.target.value\r\n props.setSearchText(v);\r\n }}\r\n >\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SearchBar;\r\n","import \"./index.css\";\nexport const Loading = (props: any) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n","import axios from \"axios\";\r\nimport { getJumpTarget, initServerJumpTargetConfig } from \"./setting\";\r\nconst baseUrl = \"/api/\";\r\n// const baseUrl = \"https://tools.mereith.com/api/\";\r\n\r\nconst selfJumpIcon = `data:image/png;base64,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`\r\nconst blankJumpIcon = `data:image/png;base64,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`\r\nexport const FetchList = async () => {\r\n const { data: raw } = await axios.get(baseUrl);\r\n const { data } = raw;\r\n // 获取分类\r\n const catelogs = [];\r\n catelogs.push(\"全部工具\")\r\n data.catelogs.forEach(item => {\r\n catelogs.push(item.name)\r\n })\r\n data.tools.forEach(item => {\r\n if (!catelogs.includes(item.catelog)) {\r\n catelogs.push(item.catelog);\r\n }\r\n });\r\n if (!data.setting?.hideAdmin) {\r\n data.tools.push({\r\n id: 999999999999,\r\n catelog: \"管理后台\",\r\n name: \"本站管理后台\",\r\n desc: \"本导航站的管理后台哦\",\r\n url: \"admin\",\r\n logo: `data:image/png;base64,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`,\r\n })\r\n }\r\n if (data.setting) {\r\n initServerJumpTargetConfig(data.setting)\r\n }\r\n\r\n const jumpTarget = getJumpTarget();\r\n\r\n data.tools.push({\r\n id: 999099999978,\r\n catelogs: \"偏好设置\",\r\n name: jumpTarget === \"blank\" ? \"新建窗口\" : \"原地跳转\",\r\n desc: `点击切换跳转方式`,\r\n url: \"toggleJumpTarget\",\r\n logo: jumpTarget === \"blank\" ? blankJumpIcon : selfJumpIcon\r\n })\r\n\r\n data.catelogs = catelogs;\r\n return data;\r\n};\r\nexport default FetchList;\r\n\r\n\r\n","import \"./index.css\";\nimport { useCallback } from \"react\";\ninterface TagSelectorProps {\n tags: any;\n onTagChange: (newTag: string) => void;\n currTag: string;\n}\nconst TagSelector = (props: TagSelectorProps) => {\n const { tags = [\"all\"], onTagChange, currTag } = props;\n const renderTags = useCallback(() => {\n const originTags = tags.map((each) => {\n return (\n {\n onTagChange(each);\n }}\n >\n {each}\n \n );\n });\n return originTags;\n }, [tags, onTagChange, currTag]);\n return (\n
\n
\n {renderTags()}\n
\n
\n );\n};\n\nexport default TagSelector;\n","import \"./index.css\";\n\nconst GithubLink = () => {\n return (\n
\n \n \n \n
\n );\n};\nexport default GithubLink;\n","export function decodeAuto() {\n const d = new Date().getHours();\n const night = d > 18 || d < 8;\n if (typeof window == \"undefined\") {\n if (night) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n }\n if (night || window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n}\nexport const decodeTheme = (t: \"auto\" | \"light\" | \"dark\") => {\n if (t === \"auto\") {\n return decodeAuto();\n } else {\n return t;\n }\n};\nexport const applyTheme = (t: string, source: string, disableLog: boolean) => {\n if (t.includes(\"light\")) {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", false);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n } else {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", true);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n }\n};\nexport const initTheme = () => {\n if (typeof localStorage == \"undefined\") {\n return \"auto\";\n }\n // 2种情况: 1. 自动。 2.手动\n if (!(\"theme\" in localStorage) || localStorage.theme === \"auto\") {\n return \"auto\";\n } else {\n if (localStorage.theme === \"dark\") {\n return \"dark\";\n } else {\n return \"light\";\n }\n }\n};\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { applyTheme, decodeTheme, initTheme } from \"../../utils/theme\";\nimport \"./index.css\";\n\nconst DarkSwitch = ({ showGithub }: { showGithub: boolean }) => {\n const [theme, setTheme] = useState(initTheme());\n const { current } = useRef({ hasInit: false });\n const { current: currentTimer } = useRef({ timer: null });\n\n useEffect(() => {\n if (currentTimer.timer) {\n clearInterval(currentTimer.timer);\n currentTimer.timer = null;\n }\n localStorage.setItem(\"theme\", theme)\n const realTheme = decodeTheme(theme as any);\n applyTheme(realTheme, 'setTheme', true);\n if (realTheme.includes(\"auto\")) {\n currentTimer.timer = setInterval(() => {\n const realTheme = decodeTheme(\"auto\");\n applyTheme(realTheme, \"autoThemeTimer\", true);\n }, 10000);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme])\n\n\n useLayoutEffect(() => {\n if (!current.hasInit) {\n current.hasInit = true;\n if (!!!localStorage.getItem(\"theme\")) {\n // 第一次用默认的\n setTheme(\"auto\");\n } else {\n const iTheme = initTheme();\n setTheme(iTheme);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const lightIcon = (\n \n );\n const darkIcon = (\n \n )\n const autoIcon = (\n \n )\n const handleSwitch = () => {\n if (theme === \"light\") {\n setTheme(\"dark\");\n } else if (theme === \"dark\") {\n setTheme(\"auto\");\n } else {\n setTheme(\"light\");\n }\n };\n return (\n
\n {theme === \"light\" ? lightIcon : theme === \"dark\" ? darkIcon : autoIcon}\n
\n );\n};\nexport default DarkSwitch;\n","export const generateSearchEngineCard = (searchString: string) => {\n if (!searchString.trim()) return [];\n const result = [\n {\n name: \"使用百度搜索\",\n url: searchBaidu(searchString),\n desc: `在百度中搜索 「${searchString}」`,\n id: 8800880001,\n logo: \"baidu.ico\",\n hide: false\n },\n {\n name: \"使用 Bing 搜索\",\n url: searchBing(searchString),\n desc: `在 Bing 中搜索 「${searchString}」`,\n id: 8800880002,\n logo: \"bing.ico\",\n hide: false\n },\n {\n name: \"使用 Google 搜索\",\n url: searchGoogle(searchString),\n desc: `在 Google 中搜索 「${searchString}」`,\n id: 8800880003,\n logo: \"google.ico\",\n hide: false\n }\n ]\n return result;\n}\n\n\n\nconst searchBaidu = (q: string) => {\n return `https://www.baidu.com/s?wd=${q}`\n}\n\nconst searchGoogle = (q: string) => {\n return `https://www.google.com/search?q=${q}`\n}\n\nconst searchBing = (q: string) => {\n return `https://cn.bing.com/search?q=${q}`\n}","import \"./index.css\";\r\nimport CardV2 from \"../CardV2\";\r\nimport SearchBar from \"../SearchBar\";\r\nimport { Loading } from \"../Loading\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport FetchList from \"../../utils/api\";\r\nimport TagSelector from \"../TagSelector\";\r\nimport pinyin from \"pinyin-match\";\r\nimport GithubLink from \"../GithubLink\";\r\nimport DarkSwitch from \"../DarkSwitch\";\r\nimport { isLogin } from \"../../utils/check\";\r\nimport { generateSearchEngineCard } from \"../../utils/serachEngine\";\r\nimport { toggleJumpTarget } from \"../../utils/setting\";\r\n\r\nconst mutiSearch = (s, t) => {\r\n const source = (s as string).toLowerCase();\r\n const target = t.toLowerCase();\r\n const rawInclude = source.includes(target);\r\n const pinYinInlcude = Boolean(pinyin.match(source, target));\r\n return rawInclude || pinYinInlcude;\r\n};\r\n\r\nconst Content = (props: any) => {\r\n const [data, setData] = useState({});\r\n const [loading, setLoading] = useState(true);\r\n const [currTag, setCurrTag] = useState(\"全部工具\");\r\n const [searchString, setSearchString] = useState(\"\");\r\n const [val, setVal] = useState(\"\");\r\n\r\n const filteredDataRef = useRef([]);\r\n\r\n const showGithub = useMemo(() => {\r\n const hide = data?.setting?.hideGithub === true\r\n return !hide;\r\n }, [data])\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const r = await FetchList();\r\n setData(r);\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (tagInLocalStorage && tagInLocalStorage !== \"\") {\r\n if (r?.catelogs && r?.catelogs.includes(tagInLocalStorage)) {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [setData, setLoading, setCurrTag]);\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSetCurrTag = (tag: string) => {\r\n setCurrTag(tag);\r\n // 管理后台不记录了\r\n if (tag !== \"管理后台\") {\r\n window.localStorage.setItem(\"tag\", tag);\r\n }\r\n resetSearch(true);\r\n };\r\n\r\n const resetSearch = (notSetTag?: boolean) => {\r\n setVal(\"\");\r\n setSearchString(\"\");\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (!notSetTag && tagInLocalStorage && tagInLocalStorage !== \"\" && tagInLocalStorage !== \"管理后台\") {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n };\r\n\r\n const handleSetSearch = (val: string) => {\r\n if (val !== \"\" && val) {\r\n setCurrTag(\"全部工具\");\r\n setSearchString(val.trim());\r\n } else {\r\n resetSearch();\r\n }\r\n }\r\n\r\n\r\n\r\n const filteredData = useMemo(() => {\r\n if (data.tools) {\r\n const localResult = data.tools\r\n .filter((item: any) => {\r\n const hide = item.hide;\r\n if (!hide) return true;\r\n if (hide && isLogin()) return false;\r\n return false;\r\n })\r\n .filter((item: any) => {\r\n if (currTag === \"全部工具\") {\r\n return true;\r\n }\r\n return item.catelog === currTag;\r\n })\r\n .filter((item: any) => {\r\n if (searchString === \"\") {\r\n return true;\r\n }\r\n return (\r\n mutiSearch(item.name, searchString) ||\r\n mutiSearch(item.desc, searchString) ||\r\n mutiSearch(item.url, searchString)\r\n );\r\n });\r\n return [...localResult, ...generateSearchEngineCard(searchString)]\r\n } else {\r\n return [...generateSearchEngineCard(searchString)];\r\n }\r\n }, [data, currTag, searchString]);\r\n\r\n useEffect(() => {\r\n filteredDataRef.current = filteredData\r\n }, [filteredData])\r\n\r\n useEffect(() => {\r\n if (searchString.trim() === \"\") {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n } else {\r\n document.addEventListener(\"keydown\", onKeyEnter);\r\n }\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n }\r\n // eslint-disable-next-line\r\n }, [searchString])\r\n\r\n const renderCardsV2 = useCallback(() => {\r\n return filteredData.map((item, index) => {\r\n return (\r\n {\r\n resetSearch();\r\n if (item.url === \"toggleJumpTarget\") {\r\n toggleJumpTarget();\r\n loadData();\r\n }\r\n }}\r\n />\r\n );\r\n });\r\n // eslint-disable-next-line\r\n }, [filteredData, searchString]);\r\n\r\n const onKeyEnter = (ev: KeyboardEvent) => {\r\n const cards = filteredDataRef.current;\r\n // 使用 keyCode 防止与中文输入冲突\r\n if (ev.keyCode === 13) {\r\n if (cards && cards.length) {\r\n window.open(cards[0]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n // 如果按了数字键 + ctrl/meta,打开对应的卡片\r\n if (ev.ctrlKey || ev.metaKey) {\r\n const num = Number(ev.key);\r\n if (isNaN(num)) return;\r\n ev.preventDefault()\r\n const index = Number(ev.key) - 1;\r\n if (index >= 0 && index < cards.length) {\r\n window.open(cards[index]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {data?.setting?.title ?? \"Van Nav\"}\r\n \r\n
\r\n
\r\n {\r\n setVal(t);\r\n handleSetSearch(t);\r\n }}\r\n />\r\n \r\n
\r\n
\r\n
\r\n
\r\n {loading ? : renderCardsV2()}\r\n
\r\n
\r\n \r\n {showGithub && }\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Content;\r\n","import \"./App.css\";\r\nimport Content from \"./components/Content\";\r\nfunction App() {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from \"./serviceWorker\"\r\n// import reportWebVitals from './reportWebVitals';\r\n\r\nconsole.log(\"欢迎使用 Van Nav 项目\")\r\nconsole.log(\"项目地址: https://github.com/mereithhh/van-nav\")\r\n\r\n\r\nReactDOM.render(\r\n \r\n,\r\n document.getElementById('root')\r\n);\r\n\r\nserviceWorker.register(null);"],"sourceRoot":""}