1import{A as e,D as t,E as n,K as r,M as i,O as a,S as o,T as s,_t as c,gt as l,k as u,m as d,mt as f,nt as p,q as m,w as h}from"./app-i8bZJj9W.js";import{n as g,t as _}from"./vue.BHyNcdic-D2KugMlH.js";import{t as ee}from"./Slidev-Dzr2UuGQ.js";import{t as v}from"./SponsorButtons-BS_4bhNf.js";var y={},b={viewBox:`0 0 121.9 121.9`,height:`1em`,width:`1em`};function x(e,n){return r(),t(`svg`,b,[...n[0]||=[h(`g`,null,[h(`path`,{d:`M94.2,5.6C88.3-5,78.3,17.1,76.2,21.7c-4.4,10-7.3,20.1-9.6,30.7c-2.6-2.8-4.4-6.1-6.4-9.3c-1.1-2-1.6-7.8-4.9-4.8 c-1.4-2.4-2.1-5.7-5.4-6.3c-12.1-1.1-23.9,21.8-22.2,32.3c2.7,15.1,21.1,0.2,25.4-6.7c-0.4,3.8-0.4,9.1,3.4,10.9 c4.4,2,5.9-1.6,8.5-4.2c-1.5,15.7-3.4,32,1.8,47.4c2.4,8.8,10.9,11,11.8,0.2c1.2-13.4-2.1-26.5-6.1-39.1c-1.1-3.6-2.9-6.7-4-10.3 c-0.6-5.2,2.2-0.6,3.5,0.8c2.2,2.4,7.1,8.1,10.8,7.8c0.5-0.3-0.9-1.6-1.2-1.9c-3.2-4-7-7.7-10.4-11.6c6.9-10,13.6-20.9,18.2-32.4 C91.4,19.3,95.6,11.8,94.2,5.6z M53.8,48.1c-2.2,6.1-4.8,10.8-9.9,15c-14.3,12.5-16.4-2.3-9.7-13.7C40.2,36.8,52.9,25.6,53.8,48.1z M55.8,40.2c0.4,0.6,0.8,1.1,1.1,1.7C56.1,42,55.3,41,55.8,40.2z M65.3,59.5c-1.6,2.3-2.5,5.4-5.2,6.3c-2.2,0.6-3.7-1.1-4.1-3.1 c-1.2-6.6,0.9-13.1,1.8-19.5c2.2,4.2,4,8.4,6.5,12.6C64.8,56.9,66,58.3,65.3,59.5z M65.8,56.9c-0.3-0.2-0.3-0.6-0.4-0.9 C65.8,56.2,66.2,56.5,65.8,56.9z M69.4,68.5c4.3,13.1,7.2,26.8,6,40.5c-1.2,12-5,3.3-6.5-2.8c-3.1-13.4-1.7-27.2-0.7-40.8 C68.6,66.4,69.1,67.8,69.4,68.5z M91.1,8.3c-2.1,14.2-12.5,34.2-21.3,45.4c1.8-9.4,4.4-18.5,8-27.4C78.1,24.5,91.3-1.9,91.1,8.3z`,fill:`currentColor`})],-1)]])}var S=d(y,[[`render`,x]]),C={},w={xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 250 250`,height:`1em`,width:`1em`};function T(e,n){return r(),t(`svg`,w,[...n[0]||=[a(`<mask id="a" width="240" height="234" x="4" y="1" maskUnits="userSpaceOnUse" style="mask-type:alpha;"><path fill="#D9D9D9" d="M244 123c0 64.617-38.383 112-103 112-64.617 0-103-30.883-103-95.5C38 111.194-8.729 36.236 8 16 29.46-9.959 88.689 6 125 6c64.617 0 119 52.383 119 117Z"></path></mask><g mask="url(#a)"><path fill="currentColor" d="M116.94 88.1c-13.344 1.552-20.436-2.019-24.706 10.71 0 0 14.336 21.655 52.54 21.112-2.135 8.848-1.144 15.368-1.144 23.207 0 26.079-20.589 48.821-65.961 48.821-23.03 0-51.015 4.191-72.367 15.911-15.175 8.305-27.048 20.336-32.302 37.023l5.956 8.461 11.4.155v47.889l-13.91 21.966L-19.556 387h13.192l1.144-51.227c6.558-3.881 21.58-13.971 34.391-29.494 17.386-20.879 30.731-51.227 15.022-88.793l11.744-5.045c12.887 30.814 8.388 57.514-2.898 79.013 21.58-.698 40.11-2.095 55.819-4.734l-3.584-43.698 12.659-1.087L129.98 387h13.116l2.212-94.459c10.447-4.502 34.239-21.034 45.372-78.47 1.372-6.986 2.135-12.885 2.516-17.93 1.754-12.806 2.745-27.243 3.051-43.698l-18.683-5.976h57.42l5.567-12.807c-5.414.233-11.896-2.639-11.896-2.639l1.297-6.209H242l-65.199-34.384c-7.244 2.794-14.87 6.442-20.208 10.866-4.27-3.105-19.063-12.807-39.653-13.195Z"></path><path fill="currentColor" d="M6.217 24.493 18.494 21c5.948 21.577 13.345 33.375 22.648 39.352 8.388 5.099 19.75 5.239 31.799 4.579-3.508-1.164-6.787-2.794-9.837-5.045-6.787-5.045-12.582-13.428-16.929-28.64l12.201-3.649c3.279 11.488 7.092 18.085 12.201 21.888 5.11 3.726 11.286 4.657 18.606 5.433 13.726 1.553 30.884 2.174 52.312 12.264 2.898 1.086 5.872 2.483 8.769 4.036-.381-.776-.762-1.553
1-1.296-2.406-3.66-5.822-10.828-11.953-24.097-16.92l4.27-12.109c21.581 7.917 30.121 19.171 33.553 28.097 3.965 10.168 1.525 18.124 1.525 18.124-3.05 1.009-6.1 2.406-9.608 3.492-6.634-4.579-12.887-8.033-18.835-10.75-21.962-8.304-43.466-2.638-62.53-.853-14.336 1.32-27.452.698-38.814-6.598-11.21-7.14-21.047-20.8-28.215-46.802Z"></path><path fill="currentColor" d="M90.098 45.294c-2.516-5.744-4.041-12.807-3.355-21.5l12.659.932c-.763 10.555 2.897 17.696 7.015 22.353-5.338-.931-10.447-1.04-16.319-1.785Zm80.069-1.32 8.312-9.702c21.58 19.094 8.159 46.415 8.159 46.415l-11.819-1.32c-.382-6.24-1.144-17.836-6.635-24.371 3.584 1.84 6.635 3.865 9.99 6.908 0-5.666-1.754-12.341-8.007-17.93Z"></path></g>`,2)]])}var E=d(C,[[`render`,T]]),D={},O={width:`1em`,height:`1em`,viewBox:`0 0 152 142`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`};function k(e,n){return r(),t(`svg`,O,[...n[0]||=[h(`path`,{d:`M113.831 45.2543L77.6931 97.5051C77.3099 98.0593 76.7558 98.4742 76.1148 98.6869C75.4738 98.8996 74.7809 98.8985 74.1412 98.6837C73.5016 98.4689 72.95 98.0522 72.5702 97.4967C72.1905 96.9413 72.0033 96.2774 72.037 95.6059L73.4834 66.7582L50.1344 61.8064C49.6353 61.7007 49.1704 61.474 48.7807 61.1465C48.391 60.8191 48.0885 60.4009 47.9002 59.929C47.7118 59.4571 47.6432 58.9461 47.7006 58.4412C47.758 57.9364 47.9395 57.4532 48.2292 57.0345L84.3675 4.7837C84.7507 4.22944 85.3048 3.81448 85.9459 3.60177C86.5869 3.38906 87.2799 3.39022 87.9196 3.60507C88.5593 3.81991 89.1109 4.23673 89.4906 4.79225C89.8704 5.34778 90.0575 6.0117 90.0237 6.68327L88.5773 35.5314L111.926 40.4827C112.425 40.5885 112.89 40.8152 113.28 41.1426C113.67 41.4701 113.972 41.8883 114.161 42.3602C114.349 42.8321 114.417 43.3431 114.36 43.8479C114.303 44.3528 114.121 44.836 113.831 45.2547L113.831 45.2543Z`,fill:`currentColor`},null,-1),h(`path`,{d:`M75.9866 141.343C75.0254 141.344 74.0735 141.156 73.1855 140.788C72.2975 140.42 71.4909 139.88 70.8122 139.2L36.6658 105.056C35.2998 103.683 34.5341 101.824 34.5366 99.8867C34.5392 97.9496 35.3098 96.0925 36.6796 94.7227C38.0493 93.3528 39.9064 92.5821 41.8435 92.5794C43.7807 92.5767 45.6399 93.3423 47.0134 94.7083L75.9866 123.678L139.105 60.5626C140.481 59.2088 142.336 58.4536 144.266 58.4615C146.197 58.4693 148.046 59.2396 149.41 60.6045C150.775 61.9695 151.546 63.8184 151.554 65.7487C151.561 67.679 150.806 69.5342 149.452 70.9101L81.1597 139.2C80.4811 139.881 79.6747 140.42 78.7869 140.788C77.8992 141.156 76.9475 141.344 75.9866 141.343Z`,fill:`currentColor`},null,-1),h(`path`,{d:`M75.9572 141.343C76.9184 141.344 77.8703 141.156 78.7583 140.788C79.6463 140.42 80.4528 139.88 81.1316 139.2L115.278 105.056C116.644 103.683 117.41 101.824 117.407 99.8867C117.405 97.9496 116.634 96.0925 115.264 94.7227C113.894 93.3528 112.037 92.5821 110.1 92.5794C108.163 92.5767 106.304 93.3423 104.93 94.7083L75.9572 123.678L12.8389 60.5626C11.4629 59.2088 9.60774 58.4536 7.67747 58.4615C5.7472 58.4693 3.89823 59.2396 2.53331 60.6045C1.16839 61.9695 0.398111 63.8184 0.390251 65.7487C0.382391 67.679 1.13759 69.5342 2.49135 70.9101L70.784 139.2C71.4627 139.881 72.2691 140.42 73.1568 140.788C74.0446 141.156 74.9963 141.344 75.9572 141.343Z`,fill:`currentColor`,"fill-opacity":`0.5`},null,-1)]])}var A=d(D,[[`render`,k]]),j={},M={width:`1em`,height:`1em`,viewBox:`0 0 220 220`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`};function N(e,n){return r(),t(`svg`,M,[...n[0]||=[h(`path`,{d:`M117.722 167.444C117.722 139.83 140.108 117.444 167.722 117.444V117.444C195.336 117.444 217.722 139.83 217.722 167.444V167.444C217.722 195.058 195.336 217.444 167.722 217.444V217.444C140.108 217.444 117.722 195.058 117.722 167.444V167.444Z`,fill:`currentColor`,"fill-opacity":`0.6`},null,-1),h(`path`,{d:`M117.722 52.5561C117.722 24.9419 140.108 2.55614 167.722 2.55614V2.55614C195.336 2.55614 217.722 24.9419 217.722 52.5561V97.5561C217.722 100.318 215.483 102.556 212.722 102.556H122.722C119.961 102.556 117.722 100.318 117.722 97.5561V52.5561Z`,fill:`currentColor`,"fill-opacity":`0.3`},null,-1),h(`path`,{d:`M102.278 167.444C102.278 195.058 79.8922 217.444 52.278 217.444V217.444C24.6637 217.444 2.27796 195.058 2.27796 167.444L2.27796 122.444C2.27796 119.682 4.51654 11
17.444 7.27796 117.444L97.278 117.444C100.039 117.444 102.278 119.682 102.278 122.444L102.278 167.444Z`,fill:`currentColor`},null,-1)]])}var P=d(j,[[`render`,N]]),F={},I={width:`1em`,height:`1em`,viewBox:`0 0 1000 1000`};function L(e,n){return r(),t(`svg`,I,[...n[0]||=[h(`path`,{d:`M114.65,326.49H17.36v-3.41q0-101.85,70.55-173.54T280.23,77.85q116.07,0,187.2,65.15t71.12,164.72q0,37.54-9.39,70.27t-33,69.41q-23.62,36.71-42.67,59.75t-58.32,68L160.74,846v7.4H699.05V941H20.2V878.41l319.2-371q31.29-35.26,48.37-57.75t33.57-60.31q16.5-37.85,16.5-74.83,0-68.84-44.95-109.52T278,164.33q-74.53,0-118.91,46.09T114.65,323.08Z`,fill:`currentColor`,style:{opacity:`0.5`}},null,-1),h(`path`,{d:`M605.91,538.55V450.93H692.4q69.4,0,115.22-43.24c30.53-28.82,45.8-73.65,45.8-117.66q-1.14-64.29-45.52-104.41c-29.59-26.74-68.09-38-115.5-38-30,0-57,9.9-81.08,21.28s-40.57,28.27-53.66,46.48-20.77,37.94-23,59.18h-95c2.27-55.38,23.68-112,68.45-152.94S613.88,59.78,691.26,59q114.38-1.14,186.63,60.31T954.13,273c1.51,55.39-14.7,110.26-48.65,147.81s-69.89,59.56-107.82,66v5.69q28.46,2.28,58,15.93t58.6,36.7q29,23,47.8,62.87c12.51,26.56,19.34,47.54,20.48,79.78q2.26,108.69-80.8,180.94T688.41,941q-118.35,0-192.88-59.75T416.44,730.42h93.32q6.25,51.78,56.32,87.34t125.18,35.56q87.62,1.15,139.69-45t50.92-119.48c0-47.41-17.17-77.31-51.49-106.52S752,538.55,698.09,538.55Z`,fill:`currentColor`},null,-1),h(`path`,{d:`M339.4,507.43q31.29-35.26,48.37-57.75t33.57-60.31q16.5-37.85,16.5-74.83,0-68.84-44.95-109.52T278,164.33q-74.53,0-118.91,46.09T114.65,323.08v3.41H17.36v-3.41q0-101.85,70.55-173.54T280.23,77.85q116.07,0,187.2,65.15t71.12,164.72q0,37.54-9.39,70.27t-33,69.41q-23.62,36.71-42.67,59.75`,fill:`currentColor`,style:{opacity:`0.5`}},null,-1)]])}var R=d(F,[[`render`,L]]),z={},B={width:`1em`,height:`1em`,viewBox:`0 0 283.46 283.46`};function V(e,n){return r(),t(`svg`,B,[...n[0]||=[h(`path`,{d:`M205.67,137.51a91.5,91.5,0,0,0-3.9-18.31,90.15,90.15,0,0,0-3.68-9.45A78.68,78.68,0,0,0,174.67,80q-15.16-11.8-35.81-15a89.48,89.48,0,0,0-9.73-1.29c-2.9-.2-5.74-.29-8.52-.29H15.45V234.84H141.24l3.17-2.78a82.73,82.73,0,0,0,11.17-3.29,72.16,72.16,0,0,0,19.16-10.59,74.69,74.69,0,0,0,14.91-15.48q16.66-23,16.66-53.57A102.85,102.85,0,0,0,205.67,137.51Zm-23,41.88a63.53,63.53,0,0,1-17,24.1q-11.2,9.91-27.68,13.1c-3.17.53-6.31.92-9.42,1.19s-5.78.39-8,.39H32.12V80.08h88.49c2.25,0,4.92.11,8,.3a65.94,65.94,0,0,1,9.42,1.29q16.47,3.18,27.68,13.1A63.15,63.15,0,0,1,181.93,117c.27.6.52,1.21.77,1.83A77.14,77.14,0,0,1,187.1,134a82.7,82.7,0,0,1,1.36,15.14A79.69,79.69,0,0,1,182.7,179.39Z`,fill:`currentColor`},null,-1),h(`path`,{d:`M264.73,171.15q-11.61-26.37-33.44-40.28a86.21,86.21,0,0,0-29.52-11.67A110.89,110.89,0,0,0,181.93,117c-1.06,0-2.13-.05-3.22-.05q-30.54,0-52.47,13.59t-33.73,39q-9.76,21-11.43,48.6c-.26,3.88-.37,7.84-.37,11.91,0,1.6,0,3.19.06,4.76H276.34Q276.34,197.55,264.73,171.15ZM99,218.18h0q2.43-37.32,20.64-59.21,21-25.31,59.12-25.31c2.88,0,5.67.11,8.39.34a82.18,82.18,0,0,1,18.57,3.52,65.07,65.07,0,0,1,31.08,20.85q18,21.63,21.14,59.82Z`,fill:`currentColor`,style:{opacity:`0.5`}},null,-1)]])}var H=d(z,[[`render`,V]]),U={},W={width:`1em`,height:`1em`,viewBox:`0 0 1000 1000`};function te(e,n){return r(),t(`svg`,W,[...n[0]||=[h(`path`,{fill:`currentColor`,d:`M735.07,67.05V531.58c0,129.83-105.24,235.07-235.07,235.07S264.93,661.41,264.93,531.58V67.05h166.3V531.58a68.77,68.77,0,1,0,137.54,0V67.05Z`},null,-1),h(`path`,{fill:`currentColor`,style:{opacity:`0.5`},d:`M901.36,67.05V531.58C901.36,753.25,721.67,933,500,933S98.64,753.25,98.64,531.58V67.05H264.93V531.58c0,129.83,105.25,235.07,235.07,235.07S735.07,661.41,735.07,531.58V67.05Z`},null,-1)]])}var G=d(U,[[`render`,te]]),K={},q={width:`1em`,height:`1em`,viewBox:`0 0 500 500`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`};function J(e,n){return r(),t(`svg`,q,[...n[0]||=[h(`path`,{d:`M238.464 40H66V236.007H104.577C220.688 236.007 232.79 158.437 232.79 121.733C232.79 108.867 243.38 108.867 243.38 121.733C251.318 236.701 356.35 245.457 365.527 246.223L365.542 246.224C374.619 246.981 382.561 251.521 365.542 254.548C253.592 264.765 243.758 364.282 243.38 375.634C243.002 386.986 235.438 399.851 232.79 375.634C222.957 274.603 144.289 257.954 104.577 257.954H66V460.772H238.464C358.356 460.772 452.152 371.472 452.152 251.521C452.152 131.571 356.465 40 238.464 40Z`,fill:`currentColor`},null,-1)]])}var Y=d(K,[[`render`,J]]),X={class:`max-w-300 mx-auto`},Z=[`id`],Q={"text-5em":``,"color-transparent":``,absolute:``,"left--1rem":``,"top-0rem":``,"font-bold":``,"leading-1em":``,"text-stroke-1.5":``,"text-stroke-hex-aaa":``,op35:``,"dark:op20":``},ne={class:`project-grid py-2 max-w-500 w-max mx-auto`,grid:`~ cols-1 md:cols-2 gap-4 lg:cols-3`},re=[`href`,`title`],ie={key:0,class:`pt-2 pr-5`},ae={class:`flex-auto`},oe={class:`text-normal`},$=[`innerHTML`],se={class:`prose pb5 mx-auto mt10 text-center`},ce={class:`table-of-contents`},le=[`href`],ue=d(i({__name:`ListProjects`,props:{projects:{}},setup(i){function a(e){return e.toLowerCase().replace(/[\s\\/]+/g,`-`)}return(d,p)=>{let g=ee,_=Y,y=G,b=H,x=R,C=P,w=A,T=E,D=S,O=v;return r(),t(o,null,[h(`div`,X,[p[2]||=h(`p`,{"text-center":``,"mt--6":``,mb5:``,op50:``,"text-lg":``,italic:``},` Projects that I created or maintaining. `,-1),p[3]||=h(`div`,{class:`prose pb5 mx-auto mt10 text-center`},[h(`div`,{flex:`~ gap-2 justify-center`},[h(`a`,{href:`https://github.com/antfu`,target:`_blank`,class:`group btn-blue inline-block`},[h(`div`,{"i-ph-github-logo-duotone":``,"group-hover":`i-ph-github-logo-fill text-blue`}),u(` GitHub `)]),h(`a`,{href:`https://releases.antfu.me`,target:`_blank`,class:`group btn-amber inline-block`},[h(`div`,{"i-ph-rocket-launch-duotone":``,"group-hover":`i-ph-rocket-launch-fill text-amber`}),u(` Recent Releases `)]),h(`a`,{href:`https://yak.antfu.me`,target:`_blank`,class:`group btn-lime inline-block`},[h(`div`,{"i-ph-cow-duotone":``,"group-hover":`i-ph-cow-duotone-fill text-lime`}),u(` Yak Map `)])]),h(`hr`)],-1),(r(!0),t(o,null,m(Object.keys(i.projects),(e,u)=>
1(r(),t(`div`,{key:e,"slide-enter":``,style:l({"--enter-stage":u+1})},[h(`div`,{id:a(e),"select-none":``,relative:``,h18:``,mt5:``,"pointer-events-none":``,"slide-enter":``,style:l({"--enter-stage":u-2,"--enter-step":`60ms`})},[h(`span`,Q,c(e),1)],12,Z),h(`div`,ne,[(r(!0),t(o,null,m(i.projects[e],(e,i)=>(r(),t(`a`,{key:i,class:`item relative flex items-center`,href:e.link,target:`_blank`,title:e.name},[e.icon?(r(),t(`div`,ie,[e.icon===`slidev`?(r(),s(g,{key:0,class:`text-4xl opacity-50`})):e.icon===`devframe`?(r(),s(_,{key:1,class:`text-4xl opacity-50`})):e.icon===`vueuse`?(r(),s(y,{key:2,class:`text-4xl opacity-50`})):e.icon===`vue-reactivity`?(r(),s(b,{key:3,class:`text-4xl opacity-50`})):e.icon===`vue-demi`?(r(),s(x,{key:4,class:`text-4xl opacity-50`})):e.icon===`unocss`?(r(),s(C,{key:5,class:`text-4xl opacity-50`})):e.icon===`vitest`?(r(),s(w,{key:6,class:`text-4xl opacity-50`})):e.icon===`elk`?(r(),s(T,{key:7,class:`text-4xl opacity-50`})):e.icon===`af`?(r(),s(D,{key:8,class:`text-4xl opacity-50`})):(r(),t(`div`,{key:9,class:f([`text-3xl opacity-50`,e.icon||`i-carbon-unknown`])},null,2))])):n(``,!0),h(`div`,ae,[h(`div`,oe,c(e.name),1),h(`div`,{class:`desc text-sm opacity-50 font-normal`,innerHTML:e.desc},null,8,$)])],8,re))),128))])],4))),128)),h(`div`,se,[p[0]||=h(`div`,{block:``,"mt-5":``},[h(`a`,{href:`https://antfu.me/stars-rank`,target:`_blank`,op50:``},`All projects sort by Stars`)],-1),p[1]||=h(`hr`,null,null,-1),e(O)])]),h(`div`,null,[h(`div`,ce,[p[4]||=h(`div`,{class:`table-of-contents-anchor`},[h(`div`,{class:`i-ri-menu-2-fill`})],-1),h(`ul`,null,[(r(!0),t(o,null,m(Object.keys(i.projects),e=>(r(),t(`li`,{key:e},[h(`a`,{href:`#${a(e)}`},c(e),9,le)]))),128))])])])],64)}}}),[[`__scopeId`,`data-v-56a9b67f`]]),de={__name:`projects`,setup(t){let n={title:`Projects - Anthony Fu`,display:`Projects`,description:`List of projects that I am proud of`,wrapperClass:`text-center`,art:`dots`,projects:{"Current Focus":[{name:`Devframe`,link:`https://github.com/devframes/devframe`,desc:`Framework-neutral foundation for building generic DevTools`,icon:`devframe`},{name:`Vite DevTools`,link:`https://github.com/vitejs/devtools`,desc:`Inspect the intermediate state of Vite bundle and pipeline`,icon:`i-simple-icons-vite`},{name:`Nuxt DevTools`,link:`https://github.com/nuxt/devtools`,desc:`Unleash Nuxt Developer Experience`,icon:`i-logos-nuxt-icon saturate-0`}],"Nuxt Ecosystem":[{name:`Nuxt`,link:`https://github.com/nuxt/nuxt`,desc:`The intuitive Vue Framework. (Team member)`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Nuxt Playground`,link:`https://github.com/nuxt/learn.nuxt.com`,desc:`Interactive Playground for learning Nuxt`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Nuxt DevTools`,link:`https://github.com/nuxt/devtools`,desc:`Unleash Nuxt Developer Experience`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Nuxt ESLint`,link:`https://github.com/nuxt/eslint`,desc:`All-in-one ESLint module for Nuxt`,icon:`i-simple-icons-eslint`},{name:`Nuxt Icon`,link:`https://github.com/nuxt/icon`,desc:`Use thousands of icons in Nuxt`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Nuxt Test Utils`,link:`https://github.com/nuxt/test-utils`,desc:`Testing utilities for Nuxt powered by Vitest. (In collabration with @danielroe)`,icon:`i-carbon-test-tool`},{name:`Nuxt Server Functions`,link:`https://github.com/antfu/nuxt-server-fn`,desc:`Server functions in client for Nuxt 3`,icon:`i-carbon-function saturate-0`}],DevTools:[{name:`Devframe`,link:`https://github.com/devframes/devframe`,desc:`Framework-neutral foundation for building generic DevTools`,icon:`devframe`},{name:`Nuxt DevTools`,link:`https://github.com/nuxt/devtools`,desc:`Unleash Nuxt Developer Experience`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Node Modules Inspector`,link:`https://github.com/antfu/node-modules-inspector`,desc:`Visualize and inspect your node_modules`,icon:`i-solar-black-hole-line-duotone`},{name:`ESLint Config Inspector`,link:`https://github.com/eslint/config-inspector`,desc:`A visual tool for inspecting and understanding your ESLint flat configs.`,icon:`i-simple-icons:eslint`}
1,{name:`vite-plugin-inspect`,link:`https://github.com/antfu/vite-plugin-inspect`,desc:`Inspect the intermediate state of Vite plugins`,icon:`i-carbon-search-locate`}],"Vite Ecosystem":[{name:`Vite`,link:`https://github.com/vitejs/vite`,desc:`Native-ESM powered web dev build tool`,icon:`i-simple-icons-vite`},{name:`Vitest`,link:`https://vitest.dev`,desc:`A blazing fast unit-test framework powered by Vite`,icon:`vitest`},{name:`vite-plugin-inspect`,link:`https://github.com/antfu/vite-plugin-inspect`,desc:`Inspect the intermediate state of Vite plugins`,icon:`i-carbon-search-locate`},{name:`vite-plugin-pwa`,link:`https://github.com/vite-pwa/vite-plugin-pwa`,desc:`Zero-config PWA for Vite`,icon:`i-ion-logo-pwa`},{name:`vite-plugin-vue-tracer`,link:`https://github.com/antfu/vite-plugin-vue-tracer`,desc:`Trace elements and vdoms back to the source code in Vue SFC`,icon:`i-carbon-select-window`},{name:`vite-ssg`,link:`https://github.com/antfu/vite-ssg`,desc:`Server-side generation for Vite`,icon:`i-carbon-printer`},{name:`vite-plugin-optimize-persist`,link:`https://github.com/antfu/vite-plugin-optimize-persist`,desc:`Persist dynamically analyzed dependencies optimization`,icon:`i-carbon-accumulation-precipitation`}
1,{name:`vite-plugin-package-config`,link:`https://github.com/antfu/vite-plugin-package-config`,desc:"Extend Vite config from your package.json `vite` field",icon:`i-carbon-delivery-parcel`},{name:`vite-plugin-vue-server-ref`,link:`https://github.com/antfu/vite-plugin-vue-server-ref`,desc:`Share state between clients and Vite server`,icon:`i-carbon-registration`},{name:`vite-plugin-remote-assets`,link:`https://github.com/antfu/vite-plugin-remote-assets`,desc:`Bundles your assets from remote urls with your app`,icon:`i-carbon-satellite-weather`},{name:`vite-plugin-psvg`,link:`https://github.com/antfu/vite-plugin-psvg`,desc:`Programmable SVG for Vite`,icon:`i-carbon-svg`},{name:`Vite for VS Code`,link:`https://github.com/antfu/vscode-vite`,desc:`Take one step faster for Vite in VS Code`,icon:`i-carbon-flash`},{name:`Awesome Vite`,link:`https://github.com/vitejs/awesome-vite`,desc:`A curated list of awesome things related to Vite.js`,icon:`i-la-glasses-solid`}],"Vue Ecosystem":[{name:`VueUse`,link:`https://github.com/vueuse/vueuse`,desc:`Collection of Composition API utils for Vue 2 and 3`,icon:`vueuse`},{name:`Vue Demi`,link:`https://github.com/vueuse/vue-demi`,desc:`Creates Universal Library for Vue 2 & 3`,icon:`vue-demi`},{name:`vue-template-promise`,link:`https://github.com/antfu/vue-template-promise`,desc:`Template as Promise in Vue`,icon:`i-carbon-cics-region-routing`},{name:`Vue Starport`,link:`https://github.com/antfu/vue-starport`,desc:`Shared component across routes with animations.`,icon:`i-carbon-plane-sea`},{name:`@vue/composition-api`,link:`https://github.com/vuejs/composition-api`,desc:`Vue 2 Composition API plugin`,icon:`i-uim-vuejs`},{name:`Vue Reactivity`,link:`https://github.com/vue-reactivity`,desc:`Reactivity utils set for @vue/reactivity`,icon:`vue-reactivity`},{name:`ReactiVue`,link:`https://github.com/antfu/reactivue`,desc:`Use Vue Composition API in React components`,icon:`i-ri-reactjs-fill`},{name:`Vue Chemistry`,link:`https://github.com/vueuse/vue-chemistry`,desc:`Reactified JavaScript functions for Vue`,icon:`i-carbon-chemistry`},{name:`v-dollar`,link:`https://github.com/antfu/v-dollar`,desc:`jQuery-like Vue Reactivity API`,icon:`i-tabler-currency-dollar`}],"UnJS Ecosystem":[{name:`unplugin`,link:`https://github.com/unjs/unplugin`,desc:`Unified plugin system for Vite, Rollup, and Webpack`,icon:`i-carbon-plug`},{name:`unimport`,link:`https://github.com/unjs/unimport`,desc:`Unified utils for auto importing APIs in modules.`,icon:`i-carbon-ibm-cloud-event-notification`},{name:`magicast`,link:`https://github.com/unjs/magicast`,desc:`Programmatically modify JavaScript and TypeScript source codes like JSON.`,icon:`i-carbon-ibm-watsonx-code-assistant`},{name:`uqr`,link:`https://github.com/unjs/uqr`,desc:`Generate QR Code universally`,icon:`i-carbon:qr-code`}],Unplugins:[{name:`unplugin`,link:`https://github.com/unjs/unplugin`,desc:`Unified plugin system for Vite, Rollup, and Webpack`,icon:`i-carbon-plug`},{name:`unplugin-icons`,link:`https://github.com/unplugin/unplugin-icons`,desc:`Access thousands of icons as components on-demand`,icon:`i-carbon-thumbnail-2`},{name:`unplugin-vue-components`,link:`https://github.com/antfu/unplugin-vue-components`,desc:`On-demand components auto importing for Vue`,icon:`i-carbon-workspace-import`},{name:`unplugin-auto-import`,link:`https://github.com/unplugin/unplugin-auto-import`,desc:`Auto import APIs on-demand for Vite, Webpack and Rollup`,icon:`i-carbon-row-insert`},{name:`unplugin-vue2-script-setup`,link:`https://github.com/unplugin/unplugin-vue2-script-setup`,desc:`Bring <code><script setup></code> to Vue 2.`,icon:`i-carbon-text-line-spacing`},{name:`unplugin-plugin-vue-markdown`,link:`https://github.com/unplugin/unplugin-vue-markdown`,desc:`Compile Markdown to Vue component`,icon:`i-teenyicons-markdown-outline`}],"ESLint Ecosystem":[{name:`eslint-config`,link:`https://github.com/antfu/eslint-config`,desc:`My ESLint config presets`,icon:`af`},{name:`ESLint Stylistic`,link:`https://github.com/eslint-stylistic/eslint-stylistic`,desc:`Collection of stylistic/formatting ESLint rules for JavaScript and TypeScript`,icon:`i-simple-icons:eslint`},{name:`ESLint Config Inspector`,link:`https://github.com/eslint/config-inspector`,desc:`A visual tool for inspecting and understanding your ESLint flat configs.`,icon:`i-carbon-search-locate-mirror`},{name:`eslint-typegen`,link:`https://github.com/antfu/eslint-typegen`,desc:`Generate types for ESLint rules, auto-completion and type-checking for rule options`,icon:`i-carbon-settings-check`},{name:`eslint-flat-config-utils`,link:`https://github.com/antfu/eslint-flat-config-utils`,desc:`Utilities for ESLint Flat Config`,icon:`i-carbon-tools-alt`},{name:`eslint-config-flat-gitignore`,link:`https://github.com/antfu/eslint-config-flat-gitignore`,desc:`.gitignore support for ESLint Flat Config`,icon:`i-mdi-git`},{name:`eslint-plugin-format`,link:`https://github.com/antfu/eslint-plugin-format`,de
1sc:`Format various languages with formatters in ESLint`,icon:`i-carbon-ibm-watsonx-code-assistant-for-z-refactor`},{name:`eslint-processor-vue-blocks`,link:`https://github.com/antfu/eslint-processor-vue-blocks`,desc:`Create virtual files for each Vue SFC block to lint them individually.`,icon:`i-uim-vuejs`},{name:`eslint-merge-processors`,link:`https://github.com/antfu/eslint-merge-processors`,desc:`Merge multiple ESLint processors to behave like one`,icon:`i-carbon-direction-merge`}],CSS:[{name:`UnoCSS`,link:`https://github.com/unocss/unocss`,desc:`The instant on-demand atomic CSS engine`,icon:`unocss`}],Productivity:[{name:`Slidev`,link:`https://github.com/slidevjs/slidev`,desc:`Presentation slides for developers`,icon:`slidev`},{name:`MultiTranslate for Raycast`,link:`https://github.com/antfu/raycast-multi-translate`,desc:`A Raycast extension that translates text to multiple languages at once`,icon:`i-carbon-ibm-watson-language-translator`}],Games:[{name:`Handle æ±å
`,link:`https://handle.antfu.me`,desc:`A Chinese Hanzi variation of Wordle`,icon:`i-carbon-scatter-matrix`}],"Starter Templates":[{name:`Vitesse`,link:`https://github.com/antfu/vitesse`,desc:`Opinionated Vite Starter Template`,icon:`i-carbon-campsite`},{name:`Vitesse WebExtension`,link:`https://github.com/antfu/vitesse-webext`,desc:`WebExtension Vite Starter Template`,icon:`i-pixelarticons-power`},{name:`Vitesse Lite`,link:`https://github.com/antfu/vitesse-lite`,desc:`Lightweight version of Vitesse`,icon:`i-carbon-cloud-lightning`},{name:`Vitesse Nuxt 3`,link:`https://github.com/antfu/vitesse-nuxt3`,desc:`Vitesse for Nuxt 3`,icon:`i-logos-nuxt-icon saturate-0`},{name:`Starter TypeScript`,link:`https://github.com/antfu/starter-ts`,desc:`My TypeScript Library Starter`,icon:`i-carbon-code`},{name:`Starter VS Code`,link:`https://github.com/antfu/starter-vscode`,desc:`My VS Code Extension Starter`,icon:`i-carbon-code`}],"Design / Generative-Arts":[{name:`100 Day`,link:`https://100.antfu.me/`,desc:`My 100 day challenge of exploring design, compform, and new things.`,icon:`i-carbon-app-switcher`},{name:`Codecember`,link:`https://github.com/codecember-ink/codecember`,desc:`Learn and create computation form, one sketch a day. (In collabration with @octref)`,icon:`i-carbon-checkbox`},{name:`p5i`,link:`https://github.com/antfu/p5i`,desc:`p5.js, but with more friendly instance mode APIs`,icon:`i-carbon-paint-brush`}],TypeScript:[{name:`Type Challenges`,link:`https://github.com/type-challenges/type-challenges`,desc:`Collection of TypeScript type challenges with online judge`,icon:`i-carbon-ai-results-high`},{name:`esno`,link:`https://github.com/antfu/esno`,desc:`TypeScript / ESNext node runtime powered by ESBuild`,icon:`i-mdi-hexagon-slice-4`},{name:`tsnapi`,link:`https://github.com/antfu/tsnapi`,desc:`Public API snapshot testing for runtime exports and type declarations`,icon:`i-carbon-camera`}],"VS Code":[{name:`Iconify IntelliSense`,link:`https://github.com/antfu/vscode-iconify`,desc:`Iconify IntelliSense for VS Code`,icon:`i-carbon-face-wink`},{name:`Vitesse Theme`,link:`https://github.com/antfu/vscode-theme-vitesse`,desc:`Vitesse Theme for VS Code`,icon:`i-carbon-campsite`},{name:`Carbon Product Icons`,link:`https://github.com/antfu/vscode-icons-carbon`,desc:`Carbon product icon theme for VS Code`,icon:`i-carbon-carbon`},{name:`reTypewriter`,link:`https://github.com/antfu/retypewriter`,desc:`Smartly replay the steps of your changes at ease.`,icon:`i-carbon-keyboard`},{name:`Smart Clicks`,link:`https://github.com/antfu/vscode-smart-clicks`,desc:`Smart selection with double clicks for VS Code.`,icon:`i-heroicons-solid-cursor-click`},{name:`i18n Ally`,link:`https://github.com/antfu/i18n-ally`,desc:`All in one i18n extension for VS Code`,icon:`i-carbon-earth`},{name:`Vite for VS Code`,link:`https://github.com/antfu/vscode-vite`,desc:`Take one step faster for Vite in VS Code`,icon:`i-carbon-flash`},{name:`Browse Lite`,link:`https://github.com/antfu/vscode-browse-lite`,desc:`Embedded browser in VS Code`,icon:`i-uim-web-grid`},{name:`æè¨ VS Code`,link:`https://github.com/antfu/wenyan-lang-vscode`,desc:`æè¨ Wenyan Lang for VS Code`,icon:`i-carbon-terminal`},{name:`Where am I ?`,link:`https://github.com/antfu/vscode-where-am-i`,desc:`Don't get lost even you have multiple VS Code opened`,icon:`i-carbon-ma
1p`}],Utilities:[{name:`Shiki`,link:`https://github.com/shikijs/shiki`,desc:`A beautiful syntax highlighter<br>(In collabration with @octref and @orta)`,icon:`i-carbon:code`},{name:`Twoslash`,link:`https://github.com/twoslashes/twoslash`,desc:`Markup for generating rich type information ahead of time<br>(In collabration with @orta)`,icon:`i-simple-icons:typescript`},{name:`magic-string`,link:`https://github.com/Rich-Harris/magic-string`,desc:`Manipulate strings like a wizard. (Maintainer)`,icon:`i-ph-magic-wand-duotone`},{name:`nanovis`,link:`https://github.com/antfu/nanovis`,desc:`Tiny visualization library for tree structures in Treemap, Sunburst, Flame`,icon:`i-carbon-chart-treemap`},{name:`whenexpr`,link:`https://github.com/antfu/whenexpr`,desc:`Tiny when-clause expression evaluator with full type-safety`,icon:`i-carbon-decision-tree`},{name:`fast-npm-meta`,link:`https://github.com/antfu/fast-npm-meta`,desc:`A lightweight API server to get npm package metadata`,icon:`i-simple-icons-npm`},{name:`tsdown-stale-guard`,link:`https://github.com/antfu-collective/tsdown-stale-guard`,desc:`Build freshness validation for tsdown`,icon:`i-carbon-rule-locked`},{name:`qr-scanner-wechat`,link:`https://github.com/antfu/qr-scanner-wechat`,desc:`QR Code scanner in JS with OpenCV and WeChat Algorithm`,icon:`i-carbon-scan-alt`}],CLI:[{name:`ni`,desc:`Use the right package manager`,link:`https://github.com/antfu/ni`,icon:`i-codicon-package`},{name:`sponsorkit`,link:`https://github.com/antfu/sponsorkit`,desc:`Toolkit for generating sponsors images`,icon:`i-carbon-favorite`},{name:`changelogithub`,link:`https://github.com/antfu-collective/changelogithub`,desc:`Generate changelog for GitHub releases`,icon:`i-carbon-catalog`},{name:`ghfs`,link:`https://github.com/antfu/ghfs`,desc:`GitHub issues/PRs as filesystem, for human and agents`,icon:`i-carbon-folder-details`},{name:`pnpm-workspace-utils`,link:`https://github.com/antfu/pnpm-workspace-utils`,desc:`Utilities for managing pnpm catalogs`,icon:`i-simple-icons-pnpm`},{name:`broz`,link:`https://github.com/antfu/broz`,desc:`A simple, frameless browser for screenshots`,icon:`i-carbon-checkbox`},{name:`fsxx`,link:`https://github.com/antfu/fsxx`,desc:`File system in zx style`,icon:`i-carbon-table`},{name:`iroiro`,link:`https://github.com/antfu/iroiro`,desc:`Beautiful colors lookup in CLI è²ã
ãªè²`,icon:`i-carbon-color-palette`},{name:`kaomo`,link:`https://github.com/antfu/kaomo`,desc:"Random kaomoji 顿å in CLI<br>( ´ â½ ` )/",icon:`i-carbon-theater`},{name:`export-size`,link:`https://github.com/antfu/export-size`,desc:`Analysis bundle cost for each export of a package`,icon:`i-carbon-data-vis-1`},{name:`taze`,link:`https://github.com/antfu/taze`,desc:`A modern CLI tool that keeps your deps fresh`,icon:`i-carbon-spine-label`},{name:`svg-packer`,link:`https://github.com/antfu/svg-packer`,desc:`Pack SVGs to Icon Fonts`,icon:`i-carbon-package`},{name:`git-ensure`,link:`https://github.com/antfu/git-ensure`,desc:`Ensure git status before continuing`,icon:`i-teenyicons-git-outline`}],Configurations:[{name:`eslint-config`,link:`https://github.com/antfu/eslint-config`,desc:`My ESLint config presets`,icon:`af`},{name:`vscode-settings`,link:`https://github.com/antfu/vscode-settings`,desc:`My VS Code settings`,icon:`i-simple-icons:visualstudiocode`},{name:`vscode-file-nesting-config`,link:`https://github.com/antfu/vscode-file-nesting-config`,desc:`Config of File Nesting for VS Code`,icon:`i-carbon:tree-view-alt`}],"Websites / Online Tools":[{name:`Elk`,link:`https://github.com/elk-zone/elk`,desc:`A nimble Mastodon web client`,icon:`elk`},{name:`Icônes`,link:`https://icones.js.org/`,desc:`Iconify Explorer with Instant searching`,icon:`i-carbon-type-pattern`},{name:`QR Toolkit`,link:`https://qrcode.antfu.me/`,desc:`Toolkit for QR code generation on stable diffusion`,icon:`i-carbon-qr-code`},{name:`rhein.`,link:`https://rhein.netlify.app/`,desc:`Text editor with freedom of layouting`,icon:`i-carbon-data-vis-4`},{name:`Prism --theme-vars`,link:`https://github.com/antfu/prism-theme-vars`,desc:`A customizable Prism.js theme using CSS variables`,icon:`i-carbon-angle`},{name:`ReX`,link:`https://rex.antfu.me/`,desc:`Transform texts with RegExp like a Pro`,icon:`i-carbon-text-align-mixed`},{name:`Café`,link:`https://cafe-cn.netlify.app/`,desc:`Web App for <a href="https://github.com/ElaWorkshop/awesome-cn-cafe" target="_blank">Awesome CN Café</a>`,icon:`i-carbon-cafe`},{name:`æè¨é½`,link:`https://ide.wy-lang.org`,desc:`Online IDE for wenyan-lang`,icon:`i-carbon-template`},{name:`BreadSplit`,link:`https://app.breadsplit.com/`,desc:`Group bills split made easy, fast and customizable`,icon:`i-carbon-share-knowledge`},{name:`BCP-47 tester`,link:`https://bcp47.antfu.me/`,desc:`Online BCP-47 Tester & Normalizer`,icon:`i-carbon-earth-southeast-asia`}],"Windi CSS Ecosystem":[{name:`Windi CSS`,link:`https://github.com/windicss/windicss`,desc:`Next generation utility-first CSS framework (Maintainer)`,icon:`i-carbon-windy-strong`},{name:`Windi Vite Plugin`,link:`https://github.com/windicss/vite-plugin-windicss`,desc:`Vite plugin for Windi CSS`,icon:`i-carbon-flash`},{name:`Windi PostCSS Plugin`,link:`https://github.com/windicss/postcss-windicss`,desc:`PostCSS plugin for Windi CSS`,icon:`i-simple-icons-postcss`},{name:`Windi Analyzer`,link:`https://github.com/windicss/windicss-analysis`,desc:`A visual analyzer for Windi CSS`,icon:`i-carbon-chart-multitype`},{name:`Windi Runtime DOM`,link:`https://github.com/antfu/windicss-runtime-dom`,desc:`Windi CSS for any site with one-line of code`,icon:`i-carbon-run`}],"Programming Languages":[{name:`æè¨ wenyan-lang`,link:`https://github.com/wenyan-lang/wenyan`,desc:`A programming language for the ancient Chinese`,icon:`i-carbon-translate`}],"User Scripts":[{name:`Refined GitHub Notification`,link:`https://github.com/antfu/refined-github-notifications`,desc:`Enhances the GitHub Notifications, more productive and less noisy.`,icon:`i-carbon:box`},{name:`Clean Twitter`,link:`https://github.com/antfu/userscript-clean-twitter`,desc:`Bring back the peace on Twitter`,icon:`i-ion-logo-twitter`}],Toys:[{name:`1990 Script`,link:`https://github.com/antfu/1990-script`,desc:`Make your GitHub history back to 1990`,icon:`i-carbon-time`}]},image:`https://antfu.me/og/projects.png`,meta:[{property:`og:title`,content:`Projects - Anthony Fu`},{name:`twitter:title`,content:`Projects - Anthony Fu`},{name:`description`,content:`List of projects that I am proud of`},{property:`og:description`,content:`List of projects that I am proud of`},{name:`twitter:description`,content:`List of projects that I am proud of`},{property:`og:image`,content:`https://antfu.me/og/projects.png`},{name:`twitter:image`,content:`https://antfu.me/og/projects.png`},{name:`twitter:card`,content:`summary_large_image`}]};return _({title:`Projects - Anthony Fu`,meta:[{property:`og:title`,content:`Projects - Anthony Fu`},{name:`twitter:title`,content:`Projects - Anthony Fu`},{name:`description`,content:`List of projects that I am proud of`},{property:`og:description`,content:`List of projects that I am proud of`},{name:`twitter:description`,content:`List of projects that I am proud of`},{property:`og:image`,content:`https://antfu.me/og/projects.png`},{name:`twitter:image`,content:`https://antfu.me/og/projects.png`},{name:`twitter:card`,content:`summary_large_image`}]}),(t,i)=>{let a=ue,o=g;return r(),s(o,{frontmatter:n},{default:p(()=>[h(`div`,null,[e(a,{projects:n.projects},null,8,[`projects`])])]),_:1})}}};export{de as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.