{"format":1,"manifest":{"name":"nextjs-snippets","publisher":"vyloxi","version":"1.0.0","displayName":"Next.js Snippets","description":"App Router pages, layouts, route handlers, server actions, metadata and data fetching.","engines":{"ferrum":"^0.1.0"},"categories":["Snippets"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","contributes":{"snippets":[{"language":"TypeScript","path":"snippets/typescript.json"},{"language":"JavaScript","path":"snippets/javascript.json"}]}},"files":{"icon.png":{"encoding":"base64","content":"iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAhTklEQVR42u19e5BcVbnv71tr7d2P6Z7umTB5YxQCCEmICSEEsAxgiUflHFAMuR4CiBC9HDgcqAQqBQUcVKIXBTQXQV4X7oG6FIb4oECcQGESLJQo5ARMQEiAwjwkgZnpmZ5+7b3Xd//o3jv9fsx0zyPMruqax9699t7r+9b3+H2PRRjisWzZMrl+/XoNgAFg6dKlKp1OH6+1Po2IFmqtF2itpxPRDGZmAFRprOzpyket8/UeI3GfJo7BAIiZ9xLRPiLaRkSvKqVeCoVCb2zevNnOXU7Lli0T69evd4ZyLxrCd0Tu4RgAlixZMs9xnBXM/CUAxyqlfEIIEBGYGUKIYU1Ws4g2zojvHVpr7/9aaziOk2bmt4QQzxqG8dgrr7zyeh4tCYBuGQPkVr0DAIsXLz6bma8DcJZhGEIIASklpJSaiJhyR6tX/nDHGCnCD+M52D201uQ4jnAcB1prWJaliegFIcSPtm/fvrGYRs1kAG/VL1q0aC4R3U5EXzIMA1JKmKZpE5FwubDSy4zUih8vRB/KsxKRywzatm1l2zZs2wYzPyuEuP611177ayPSQNaz6nfu3KkB4OSTT/5PInpUKfVpv9+vfT6fNgyDAEhmHtZq/7gRfxhjUJYPSEgpOSdxAeBYx3Eu7+rqUgcPHtyUW7DSVdVDkgCuODnppJOmSSkfFkJ8USkFv9/vCCEkM48rwo4E8UdDbRERtNZOOp2WjuPAcZxu27YvffPNN/fXUgkVGWDp0qVq8+bN9qJFi04WQvxGSjnN5/PZpmlKZqYJwo+9dyEiTqfTjmVZynGc/cx87o4dO/7s0rKSbi+78l3iE1G3UmpaMBi0TdNUWmuq50WqXVOP5BiJMeol/Hh4l5yXQKZpKr/fbyulpgkhuufMmXPy5s2b7WXLlsm6GOCWW24RObG/mIi6DcPoCAQCjhBCuS7JBOHH1rvkn2dmSCmV3+93pJQdQojuE044YfH69eudW265RdRSAQIAn3LKKZO11q8ZhjE5R3xZ60UmDLwxpw6gtXZSqZS0LOsAEZ3417/+9UCxdyDKMYTW+lEp5WS/329XI/5YEn+tXvHjUSoIIaTP57OVUpOZ+dFyi17k630AzqJFi24WQnzBNE1bSqnK3WiC8ONDtbnqwDAMWyn1hblz594MwMm3B0S+3l+0aNFxAG5USmmfzycrEb+ZOqtVYzTLsh8L7zIcRmdmGIYhhRBaa33jvHnzjsu3ByiPEfRJJ53UbRjG2cFg0BFCyAmX7vCxaZjZSSaT0rbtjTt37vyiS3OREwd68eLFZwohzjZN05FSygnL/vBSbUIIaRiGI4Q4e86cOWcC0MuWLZOeDWDb9s2GYcAwDO/LE4QfXZeumRKOmaGUgpQSWuubAWD9+vVZFbB48eITtNav+f1+4ff7aSQibBMu3ci+LzODiJBOpzmVSmkiOnHnzp07RW71X6KUkoZhOMPh8gnLfuxKuDwp4BiGIbXWlwAAnXDCCabP53s1EAjMCQQCuhw6OLHiDytjVqdSKZFOp3cIIRYqn893NBHNllKCiEQxrDhh2Y/MGES1xm3Oc+TCyCCi2UR0tALwOaWUT0rprf4Jwo/sGESA7VSO3DMAQYAQjFqPUidCqIUQPmb+nCKiU4QQEEJwrWDPBOGbPwYR4DhAextBuHlXVLjySTBSKUY6U1lSNPIcRMRCCFiWdYpi5jn1JIdMEL751wgBDAwyTvuMwg+vDwIZhiiiAhOQsYErbh3EO3s0fObw1cGhdE3MUQBmVGOAob4oEYHy2NV1Q/IzXes58rOK3TEqWb3jzcDTGgj4Cdes8CMSJSBZZII7AMKErS9Z+Nt7DsJtBHfqhmkHuISZoYhoRi6Nm5plABIRLMtCOp0uey4YDNY9/sDAQMn/fT4flFIF7s14s+ylBHpjjG982cRxcyWcPoaQhWmcWgPCBp550YLmpr4L5RboDFVctNGMOLRlWejq6sKsWbMKVj4ApFIpvP766x7iWHl1aJimiVNPPbWktuCdd95BT08PpJQYD3kK5fR+JgNM7RL4n8t90Mks8alI90sf0PMPjc1/sRD0AVo3B6Bz6cHMrBohfj0vSkRIJBJYsmQJrr/++rLXXHPNNXjppZcQDofhOOXzFW3bxuTJk7Fu3bqSczfffDOefvppRCKRit8fy9iFEEA8ybj+Uh8mTRfQMQbJUvUgfYQXX83gYK9GNEyo8KrDyjAWrUC0iAi2bbvFC9BaQ2sN287mJa5atQqhUAi2bZfYCcVqKJFIuBUx3pjF3xtPaKUQwGCCcfJcifO+aELHS4nvUSYDPLUpAylQ1v1rxruIVkGqRISce+l9lFJwHAdHHnkkvvOd72BgYABCiKr3KR7DLTsbrzA1mGE7jP/4Vx+kjwCn1PrWGhA+4J13bezY5SDoP2T8NftdxEhj2EIIaK2xbNkyLF682GOC4SRKjIcoHXMWyOkbYPzLGSYWLDCgB3OGXznUzyQ886KFWJwhZfOSR0rCxCMdvHBXrxACq1evht/vh9a6ZFU3CGyUfOoxVst9v1XBGiKGZQGdUcK/fcMHdioDL0IB6Rhjy18s+HPGX7MYvaIKGImoVR4UCcdxMHv2bFx66aXo7+8vUAWNpkFblgW3Rs6yLO/vakf+d/K/26oonWv4XX6eD9M/JaGTnLPASsU/BQivvG7hjXccBHxANdhkuItW1RtKbNbhrrJcYgJWrFiBzZs3Y+fOnQgGgw2BRMwM0zTR1tZWluD9/f0lRqbrYkaj0bIJE319fU0hfLHhl0gCJxwt8Y1zfdADDKFQGfhnoPslC5oZ2ZLL1nkxaqQaMxAR9u7di1QqhaOPPtob2zAMrF69GitXrmz4fq40ueOOOzBt2jTvPlprCCHw0EMP4eGHH/bcRSklYrEYzjnnHKxZs8a7TmsNwzDwzDPPYO3atWhra2uIEeuZL8thXLHMByNI0APlLX/mrPHX8w+N32/NoM1PFa3/ZiWZilaI+0rfdRwH9957L7TWBapg7ty5WLFiBWKxGJRSdWe4SCnx4Ycf4pFHHkE4HEZ7ezvC4TAikQjC4TAuvvhidHV1IZPJgIjgOA7a2tqwcuXKgusikQgSiQQeeOCBmgBVo/MlBNAfZ5y1WOGspVm3T8jK0DB8hBdfsfBhH8MwSnH/ZtsBohUGT6Wjs7MTf/rTn/Dkk096xHdX4GWXXYZPf/rTGBwc9PD+Wi+qtUZ7ezt++9vf4vnnn/eYjJlh2zY6Oztx/vnnY3BwEIZhYGBgAOeccw4++clPete5QNJtt92G/fv3w+fzNdR1pPq1DMdhBAPAqosD4BpC5ZDvny7w/Vvp6YiRTsMKhUK45557sG/fvgIo1+/3Y/Xq1Q2LXmaG3+/HT3/60wKd7469fPlyTJ8+HYlEAh0dHbjkkksKVIWUEr/61a/w3HPPIRqNVkQWhxZ3B2JxxrfO8+ETx2QNv0odczzf/x0bf835/o7T+poCMRKEzz8Mw0BfXx/uvPPOAmzAcRwsWrQIF1xwAfr6+gpUQa37+3w+vPfee/j5z3/uSRSXwJ2dnVi+fDn279+P888/HzNmzPCeV0qJPXv24K677kIoFEK9+RD1rEYiIJ0BZk0X+MZXfOAqxPd8fx/h6Rcz6OvXEKK1oFVVIKgVhM+3A9rb2/HCCy/g6aefLlEFV1xxBY466igkk8mKcG/xc9i2jUgkgl/84hfYtm2b52G4ruV5552H+fPn4+tf/3pBBJGZsXbtWsRisZq6v2GARQCJFOPqfw2gfbKAzlRP+3J9/81/ziBQhPy1AvGsCwpuFbLmOA4CgQDWrVuHAwcOeIQCgFAohFWrViGTyTQkhl274cc//rH3XRfc6ezsxNq1azFt2rQCFfH4449jy5YtNYNKjU64a/h9bqGBf/q8CT1QiOZV8v3/sv2Q7198y1bZAWI0aulc//3gwYO48847C1rKOY6D008/Heeddx5isRhkhZkr104tFAph+/bteOyxxzyJ4h7z5s0rcBF37dqFn/3sZxUjksOBh7UGAj7CtRf7sxk+dQrK7pcy4JKUsNbaAWKkKmvKSYFIJILu7m5s3LgRUkpPFTAzrr76akyZMgXJZLLuMW3bRnt7Ox588EG88cYbBUxQjB7+6Ec/QjweL0gsaYaEkxKIDWj8yxkGjpur4CRq635hAj37c75/IBv2HanglRjN6JjWGn6/H3fddRc++ugjLyjEzOjq6sK3v/1txOPxuhk0H+nLX/3lmiqdcsopJdcMX8Ix0mnG1C6BK74RqGr1F/v+W16x8GGvhlIjG7UUrbQwa72Em/Wzb98+rFu3rkBEMzPOOOMMTJkypSR4U+k+LtJ35ZVXYs6cOd5Y+YEed+xvfvObWLhwIeLxeE1js/6GDFm8/8rlfkyaLoBM7Xx/EgBs4Knfpzw7gajMJw8nzv//cNFb0Ypa9kZsCVcVPPXUU9i0aZNnwecba/UQREqJgYEBnH766bjwwgsLxkgmk+jp6SmQFEIIXH/99VXTyhqRCtlED+CUeQpf/SdfxUSPEt/fT9j1lo1tb1gwFSFjAbZ96GPZDMtiZGyGZReds1CQKzik8Hyr4syNVq6apok77rgDsVisYU52M5BCoRBuuOEGT5W4Iv6FF17AT37ykxJjc86cObjoootKcIehqAMC4GjGNRcGKiZ6lPX9FfD8yxlISZjUQYiGCdH27CcShvd3R+7jnouGCZM6CX6zdq5gtWPY0cBmBIy01h6Yc/fdd+PGG2/0gjeoK8M2K/pvuukmD+Z1JYnWGk8++SS2b9+OlStXYubMmQVBoJUrV2LTpk14//334fP5UE8ntHKGX18/47yzTCxYWDnRo9z3MMhYcY4fF37FX/985Rint1fjmzf0IZEElAIaJUVVIGika9kdx0E0GsWGDRvwxz/+0SNgvcQ/44wzsHz5co/4rkfx/PPPY9u2bXAcB/fff7+nFtyfwWAQq1evLsgFaCz1LSuKOyOEKy8MVE30qHSEwoRwe/2fSIgQmSrx2FNJ7PnAgWk2Rvyq0cDhWsP55/J1bqX/lyPo7bffjsHBQU86lBvDJWImk0EkEsGaNWsKxnfPPfjggxBCIBQK4dlnn8XOnTu9yKCrOk4//XSce+656OvrK5E6NbF0AgYGNS7/mh8zjqqc6FF1Pu36P04GQICw9cU0Hv9tEtGwQJ3hi+pAULP8znwCEBGUUp4lXgvfdxHCt99+G/fcc09BEigRIVfVWrCKk8kkrrvuOsycObPgGiEEnnrqKezYsQPBYBAAkMlkcN999xVc5z7TqlWrcOSRRyKdTletPiqo2SPGYFJjzmyJC7/qh+6vkuhRo06gng8AkALi/Yzv/XygoifQEBBUXLjRDAPQXX0DAwOIxWLo7+/3fq/FZC6u/8QTT+APf/iD9738n5ZlQUqJwcFBLF26FGeeeaZ3zr3X/v378cgjjyAQCHi2QCgUwpYtW7Bp06aC8fr6+mCaJr71rW81AEFz7nmBf1sehBGsz/Abnq0EiLDAoxsS2LnbRluwcsygnuotIgJNnz6du7q60NHRUQKJDteq9/l8Jf8fHBws+U45oMbV5aFQqKS6KJlMuj3yEQ6HS2oPgWzOXyKR8Ny8oi4ZnlQoTjCpxqSFmAPQP8D4/BIT674bzhp+osXEDxL+9qaF/7G6F1JQVYS5Gu1cl/ngwYOgKVOmsJQSnZ2diEajngE13LhAMRqXf/P6yqap4hj5tQEuIxRLMVfMF3+/eNxiGLicmqrMEMCTd0XwiVkCnELLGIDdkkFJuGhVL/77TQuhIMHRaOBZ2QPB+vv78eGHH8KyrGxOoBACsVgMiUQCnZ2dXvHmcNK1K+n8RvCCesZwdXklpLHSRFSrLKr1rlICPX2May8KYNYxEk6serRv2KvfAWRUYP36BLa+nsGkqMg2lGiALlJKpFIpfPTRR0gkEofmYcqUKayUglLKs7hDoRCi0ShM0/T+N542ZmplXWA20YNxRJTw5E+jCIcIsOszxuo12kpCxT7Cnr0Oll3Tg7SFknSxWnmTtm2jr68PsVjMy4Jy9x1SxTV9RIR4PI5kMon29na0t7eXhFY/zg2gCFlo9oaVIURnSaCPAV+91ASQ4YbFvzCA/3X/AHr7GZHwoWhhrWxpIkJ/fz96e3uRyWQ8r6rAW5s8eTIrpUoyYvKDNZFIBKFQyNOfY6kjyEhXAjNnVcBnjlMgQXlWf+X+PURZTL+rQ+DWq8IwjfpyBBwHkBHC88+lcNXafrS3EWynNuEBIJFIoK+vD4lEwnOLi2MwWuvSuoDi6JplWTh48CDi8TgikQgCgcCYWfWjwRxEWbH84qtWA61gGH39jHPP8sFsJzhxhhS14wRkAh/t17jtgThMozLmn7/i0+m0597mM0SlZhqqmnGWD+gkk0kkk0kEAgG0t7d7blSxavi49AEKB7OpPlymu05+EhAzQ0mCbTGWnmQCguq6t6MBFRT43+tieH+fg0lRKjH88tW2S/h4PO7FOmpVXnsMUM9kuVZzIpEoYIRAIOD57ZVApXqTO6tdX+v8SI+RXYxUkVny/7YY8PsJJx5nAFZpI6hyVr8KE7b+MY31G5PoiJQS3322coR3sY96Yimq0Uhgvo5JJBLw+/0IhUJoa2sruHFO77DjOOTi7vXAx9XO1yJKpWuGOka538sloubcVWZmKsUdssGiIzoEPjFNAhZX9QTcEHE8xvjuPf2eJejex13Vg4OD6O/vRzKZLCF8I7kBaugtzrIPkkqlkEwmEYvF0NbWhlAoBMMwAADxeJwikYg2TVNrrYmIeLR69LiTVO7/zWi61NPTIw3DKMkxJALSFuOYWQaCUVEzTUxrQEYE/uu+AezYbaOrQ8DRBCkFbNvGwMAABgYGkEqlPB3fCOGLGVkNd7JdHWRZFnp7e9Hf349AIMDBYBAXXXTRvhUrVnzg8/lcBmg+SlYjltHs6uYKi4G7u7s71q1bN2twcFDlM4EgwLYZC483QCZlk0SrET9IeHN7BvdvSGBSVEFrRjqdRjweRzwe98LWxTp+qAtFNa/j5aFeU/v376errrpq36pVq94BYODwP2j58uX7jjjiCOvaa689rmADLgZ8JmHB8QZgV9b/jGxTSK0J37tvEIMJGwJJxGIDSKfT+Wq1KVlYdWcENQr/2rZNXV1dztVXX/0PAIZt20LUqnM6DA6tte/zn/987/HHHz+4Y8eOUCAQYGZNtg10RgWOmaWq6n/tMGSHwn/934P4TfceBH0ZpNI2iFAg5ptdJq6a7UrlAiqcaz1PQggWrQyTjZHDsizK7ausDy2ILGw8Z7ZCOCrAFRhAa4YICLz7ZgKrb98NYge2LaCULGt8NtNuUs30oXM7VPHBgwfVhg0bOi+77LK9tm37ciAFc6V2F8PoNDIWDsdx4PP5Mrt27Qrt2LEjZJoma61JScBygAXHG5BBgt3HULIS3Cuw6rb38FGvjc6IyiJ+TV7xDQNBQ2GM3P61+MEPfvCJqVOnZr7yla/0Hu6rX0qJ3bt3h9asWTPbsizh9/tZaw3NGtq2MP9YAejygSDHYcgOA7/ZcABPvdCDDpf4IxXc6urqYillzQzcRrt22bYNx3Ewf/78eCAQcLTWVI+rVsnlNE0TpmnCjVsUF3wU5xs2u/F18e/592Vm7NixIxyPx0kphWQyiUwmg1Q6DSU0XvnlPEyf6YfO6AIjMJvdS/iwx8KSr76GAz0WfAY1uy9wxbmuaQMM0w6AUgqvvvpqqDivIN91q9bwuRwAk990UkoJ0zQhhPCwB9M0CxJChtLupdiwzU8gsSzLK0m3bRuZTKYghd1z0whIpBknHtuGIyabYEuXeADaYaiowq037ca7f0+ha5KBjM11pfg2SyqoVt3AnbBgMMjNFl35vm8qlSrJAnIBkvwt8KSUHpPU4cnAsqyCrCO3Pa0LeRfHShzHofxsJSkIVtzC4vlhmO0STp8NKalA9Kuowpbne/B/NhxAR4dCxhq5DTsqGoHNFjuVRH8r9Jq7Ml2ipdPpprXAy4d9i9HQcs/hpo2etjAEUGH+HjMAgzDQY+Hfv/tu9vvD3ApmqHOqmu1XjqVIX3H3z+LmU/XGHyp5HhVh5Bz6Fw0LnDIvBKQ1hCha/R0G1t39Hl57I44jJhmwbB6VOVX19tsdJtEYAOX2JihZTfUGc4YTNCrODM4xB+U9WxOzhoBUxsGnZvoxfZoPyGgvbqgdhgpLvPZyDLc/sBeRqCpL/NZvVEWtAYKKbqIdxxF5/j+Nwf17KOfKefw53PkQREhnGAtOaEOgQ8EZsL00bhYEO8O46tZ3kUw7CIcUHIdHfL8id0GoVt4gmUyKUChkG4ZhFweDxsrGTQBYa039/f0+wzCGBLmWzRpyGJ89KQzIQ90+tc2Qkww8+MBevLg1hkmTDNg2j1JqW5OigRXOs9YaF1xwwctr1qzZFggEHMdxyoaDR/NwJZNhGPqhhx6afffdd5+RTCb9OSagoc6Ho4G2kMSSz4SBnPunNUMEJd55YxA33Pk+wuFDK380bSvV7MYQQgidSCTE8uXLX77vvvt+B6BtHIB5dMMNN7w8derUxDXXXPO14gTKRtPGM5bGlEkGjp7lB9JuU0qGMAirb3sXH/Za6IjIgtU/avsWTpo0qSoS2MhDEBHnoGDr97///YOzZ8+Op1Ip5ff7tW3bNBYpn9swk2zbJr/fn1mwYMElb7/99lSfz1c2dlHPXoCxfhtfPqMDv35kDpBwwBqQnQZ+veEDfP3f/4b2sCzQ+6PhLdVEAocD0kgpdTgctgGQUooBwP05Vpkgx6Da7/dbQ9mTMN+7cGzGaQvbIXwC1oADGRD44P0Url37LkyDwJrHjKutit2C4dyAmUlKybFYzPfwww8fs2bNmj/Zth0Z6/I/t/oHt27dOu2tt96aapqm162v0fnQGjB9AqctCAM2QzPDaJO49cZdeO/vKXR2GmVF/2jZAaoVDQmVUrj33nuXTp8+PX7xxRfvGusMoJTirVu3Trv88svPyWQyRi6ci8bT4wDL1pjcaWDOMQEg4cDXYWDzcz146MkPEI2WEn/US906OztrRgMbd4PIqzw56qij9vv9/ozjOKJWQGiE3L7iZ2Bmpt27d89Ip9PCjeUP5R5SEPoHbZy+sB3PPz4XQgPxtMZnv7Ydf3s3iWBAesUdo034qjhAk+wASCl5165d08pVGQ/Vb60ULRzuhJmmCcMwqhK/5nwQYGc0Tl0QgvJLQADr7v47Xn9zEJMmGchkuK6asJFSBy0FgnIilHL6tOHuFcMlfD1jFO0jRJUyluqOsGlASMKSz7QDbRLbNvXi9gf2or1dwbJqE3807ADVavRtKK7UWNoEsv7AU7YAtDOqcPLcEHjAxlXf3Y1EykE4VN3tG011oJrZEu7jPAYBSGc0jjoygOnHBvHQ/Xvw0l9i6OgwKgI+Y+Fd1AgYXnyYMEdVt1AIgmVpnHVqFAf2pHHd7e+irU2VXflj6V1Viy1urbUWtUK4Y6f2v3KVERHpnDorbydkC/hw5pII1tz2DnpjFjqi5ogmeI56WnjxNbkM2YxSyiq2BZpRk9eKBJIKtgIlEomAlLLCPseMVIrxiZl+vLE7gcefOYj2dqOA+GNVAno4wHACIOWigcyMM88885mbbrrphXA4bNeTFYwW5OtXwzfcbmjuNZW6oxmGwevWrfvMo48+ekE6nW7LMQEVIoCMUFu2YVVswIah3B5+Y5Pw3uZWHR0d7JYeNeMGRKQzmYw466yzfvvLX/7yIQDRfFtgnB4CQN8Pf/jDz37/+9//DzdcXK64k5FtCFGrg/dYAYJqMkCDD8HMTEqpVHd3943z58/vTaVShmEY4742MJ1OUzAYTB1zzDH/uXfv3k8ZhqGZWZS1BnjsezrDjgbW6ESpOzs7MwCEYRgspRz3DOA4jgCgTdNMDydaONqErwoENeEGJITQg4ODwTvvvHPhXXfd9Uw6nT4iVyDK43j1i3A4HPvd73531J49e44yDMPLFRjv2IZqQcEBSSnxxBNPLJs5c2bfqlWr/nuc638yTVNv3LjxU1deeeVKy7LMWjGD8SQVKBqNDtsILHfe1THTpk171zTNVE5fcqs6ebTYraS9e/ceY1mWcHsBjXfCe0ZgNQYY5kMykK2bHyoQVC3gU09tYVMhU6VqlriPN3Uw5GhgnTfwMm5HayKaPFliuNHCsSQ1Wp0Wnv+3mAgajd0x1OFaFzgxRn3nR2TbuIkxxu4Yyi2O/DhP1seROdyYjSom/sRkfazGIMXMewHMcHH8icn6WIzhSv29ioj2ApiRq42micn6WIzh9kTYK5h5h6sPWrF97MQYY28Mzh4AsEMAeLm4McJIZd1OjDE6Y7i0JqKXldZ6i5QyrbX2Nbqxw4QYHrdjCABp27a3iHg8vpuZd+Uu0OOdwyfUQc0x3F7GuwDsFgAyAJ6pxADj7UUn1EHNazSy0dNnAGQIADo7O0+wbfs1kT1oQoQevmPkDECttT4RwE4BQPb09Oxk5hdzfXGciVVy2I7h5Gj8IoCduV1wIQCwYRjvA7gEABORmFhJh88Yeec52xBFfIuZ38u1NPasQh0Oh7uJ6GwppQNATkz4YTWGw8ySmTcy8xddmhczwHEAXhdCSCEE1bPBw8SEj4sxXOTH0VrPA/A3l+YyTzTITCZz0O/3C2Y+E4BTSRVMROnG1xjM7Er07zHzhtzvulxbVAlAh0KhbiL6ghDCJiI1MeHjegybmRUzP5cn+h1U6N0rAHBbW9tkInqNiCa79sDEhI/LMRxmlgAO5Ny+Azma63yCF4MENDg4+IEQ4p+11r22bcucCJlwpcbRGDmXTwLo1Vr/M4APiolfrTO2BOAEAoGTiahbCNExoQ7G1Rg2svmevVrrLwL4s0tTlOt6gcrdQ+xAIHCyEOI3RDQtxwRywjsYs2NwjsgKwH6t9bk54isAdqWVXunQAKRt23sMw/h/AOYCOJaZiYicMupjgmijO4ZLE8HM3cz85Zy7V3bl18MAnntoWVa/ZVmPGYZBAE5Ddj9gTUQ6J0VogiijgvBxnk6XADLM/H1mvhxAvBbx62EADz4EAMuyNpmm+WsAn2LmY3PcRsxs5+USTCSZtnYMzhP1LpRPzPwsMy8D8IscDUS18H49NkBF4xAAgsHg2cx8HRGd5QJGuX14dF7OGQ1nC5YJ5ji0sXhe0q4oiu2/IIT4keM4G4tpVM9BQ2yX4rW9bGtrmwdghdb6S0R0LABfrY2KmlENPFJIZHETqXK/FzeZqrUhVr1jVDjSAN7KrfjHALyeR0uqZ9UPlwEKUEMcSiZVbW1tx2utT2PmhQAWAJhORDOKd+ZqJeGbxRxj4Dm81G0A+5h5GxG9qrV+CcAbeVY9FaN7jRz/Hw2AY6DWCHWiAAAAAElFTkSuQmCC"},"snippets/typescript.json":{"encoding":"utf8","content":"{\n  \"Page\": {\n    \"prefix\": \"nxpage\",\n    \"body\": [\n      \"export default function ${1:Page}() {\",\n      \"  return (\",\n      \"    <main>\",\n      \"      <h1>${2:Title}</h1>\",\n      \"      $0\",\n      \"    </main>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"A page\"\n  },\n  \"Async server page\": {\n    \"prefix\": \"nxspage\",\n    \"body\": [\n      \"export default async function ${1:Page}() {\",\n      \"  const ${2:data} = await ${3:getData}();\",\n      \"  return <main>$0</main>;\",\n      \"}\"\n    ],\n    \"description\": \"An async server component page\"\n  },\n  \"Layout\": {\n    \"prefix\": \"nxlayout\",\n    \"body\": [\n      \"export default function RootLayout({ children }: { children: React.ReactNode }) {\",\n      \"  return (\",\n      \"    <html lang=\\\"${1:en}\\\">\",\n      \"      <body>{children}</body>\",\n      \"    </html>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"A root layout\"\n  },\n  \"Metadata\": {\n    \"prefix\": \"nxmeta\",\n    \"body\": [\n      \"export const metadata = {\",\n      \"  title: '${1:Title}',\",\n      \"  description: '${2:Description}',\",\n      \"};\"\n    ],\n    \"description\": \"Page metadata\"\n  },\n  \"Route handler GET\": {\n    \"prefix\": \"nxget\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"\",\n      \"export async function GET(request: Request) {\",\n      \"  return NextResponse.json({ ${1:ok}: true });\",\n      \"}\"\n    ],\n    \"description\": \"A GET route handler\"\n  },\n  \"Route handler POST\": {\n    \"prefix\": \"nxpost\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"\",\n      \"export async function POST(request: Request) {\",\n      \"  const body = await request.json();\",\n      \"  return NextResponse.json({ received: body }, { status: 201 });\",\n      \"}\"\n    ],\n    \"description\": \"A POST route handler\"\n  },\n  \"Server action\": {\n    \"prefix\": \"nxaction\",\n    \"body\": [\n      \"'use server';\",\n      \"\",\n      \"export async function ${1:save}(formData: FormData) {\",\n      \"  const ${2:name} = formData.get('${2:name}');\",\n      \"  $0\",\n      \"}\"\n    ],\n    \"description\": \"A server action\"\n  },\n  \"Client component\": {\n    \"prefix\": \"nxclient\",\n    \"body\": [\n      \"'use client';\",\n      \"\",\n      \"import { useState } from 'react';\",\n      \"\",\n      \"export default function ${1:Counter}() {\",\n      \"  const [n, setN] = useState(0);\",\n      \"  return <button onClick={() => setN(n + 1)}>{n}</button>;\",\n      \"}\"\n    ],\n    \"description\": \"A client component\"\n  },\n  \"Loading\": {\n    \"prefix\": \"nxloading\",\n    \"body\": [\n      \"export default function Loading() {\",\n      \"  return <p>Loading...</p>;\",\n      \"}\"\n    ],\n    \"description\": \"A loading UI\"\n  },\n  \"Error boundary\": {\n    \"prefix\": \"nxerror\",\n    \"body\": [\n      \"'use client';\",\n      \"\",\n      \"export default function Error({ error, reset }: { error: Error; reset: () => void }) {\",\n      \"  return (\",\n      \"    <div>\",\n      \"      <p>{error.message}</p>\",\n      \"      <button onClick={reset}>Try again</button>\",\n      \"    </div>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"An error page\"\n  },\n  \"Dynamic route params\": {\n    \"prefix\": \"nxparams\",\n    \"body\": [\n      \"export default async function Page({ params }: { params: Promise<{ ${1:id}: string }> }) {\",\n      \"  const { ${1:id} } = await params;\",\n      \"  return <p>{${1:id}}</p>;\",\n      \"}\"\n    ],\n    \"description\": \"Params of a dynamic page\"\n  },\n  \"Fetch with revalidate\": {\n    \"prefix\": \"nxfetch\",\n    \"body\": [\n      \"const res = await fetch('${1:https://api.example.com/items}', { next: { revalidate: ${2:60} } });\",\n      \"const ${3:data} = await res.json();\"\n    ],\n    \"description\": \"fetch with caching\"\n  },\n  \"Link\": {\n    \"prefix\": \"nxlink\",\n    \"body\": [\n      \"import Link from 'next/link';\",\n      \"\",\n      \"<Link href=\\\"/${1:about}\\\">${2:About}</Link>\"\n    ],\n    \"description\": \"A Link\"\n  },\n  \"Image\": {\n    \"prefix\": \"nximg\",\n    \"body\": [\n      \"import Image from 'next/image';\",\n      \"\",\n      \"<Image src=\\\"${1:/photo.jpg}\\\" alt=\\\"${2:description}\\\" width={${3:800}} height={${4:600}} />\"\n    ],\n    \"description\": \"An optimized image\"\n  },\n  \"Middleware\": {\n    \"prefix\": \"nxmw\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"import type { NextRequest } from 'next/server';\",\n      \"\",\n      \"export function middleware(request: NextRequest) {\",\n      \"  $0\",\n      \"  return NextResponse.next();\",\n      \"}\",\n      \"\",\n      \"export const config = { matcher: ['${1:/dashboard/:path*}'] };\"\n    ],\n    \"description\": \"A middleware\"\n  }\n}\n"},"snippets/javascript.json":{"encoding":"utf8","content":"{\n  \"Page\": {\n    \"prefix\": \"nxpage\",\n    \"body\": [\n      \"export default function ${1:Page}() {\",\n      \"  return (\",\n      \"    <main>\",\n      \"      <h1>${2:Title}</h1>\",\n      \"      $0\",\n      \"    </main>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"A page\"\n  },\n  \"Async server page\": {\n    \"prefix\": \"nxspage\",\n    \"body\": [\n      \"export default async function ${1:Page}() {\",\n      \"  const ${2:data} = await ${3:getData}();\",\n      \"  return <main>$0</main>;\",\n      \"}\"\n    ],\n    \"description\": \"An async server component page\"\n  },\n  \"Layout\": {\n    \"prefix\": \"nxlayout\",\n    \"body\": [\n      \"export default function RootLayout({ children }: { children: React.ReactNode }) {\",\n      \"  return (\",\n      \"    <html lang=\\\"${1:en}\\\">\",\n      \"      <body>{children}</body>\",\n      \"    </html>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"A root layout\"\n  },\n  \"Metadata\": {\n    \"prefix\": \"nxmeta\",\n    \"body\": [\n      \"export const metadata = {\",\n      \"  title: '${1:Title}',\",\n      \"  description: '${2:Description}',\",\n      \"};\"\n    ],\n    \"description\": \"Page metadata\"\n  },\n  \"Route handler GET\": {\n    \"prefix\": \"nxget\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"\",\n      \"export async function GET(request: Request) {\",\n      \"  return NextResponse.json({ ${1:ok}: true });\",\n      \"}\"\n    ],\n    \"description\": \"A GET route handler\"\n  },\n  \"Route handler POST\": {\n    \"prefix\": \"nxpost\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"\",\n      \"export async function POST(request: Request) {\",\n      \"  const body = await request.json();\",\n      \"  return NextResponse.json({ received: body }, { status: 201 });\",\n      \"}\"\n    ],\n    \"description\": \"A POST route handler\"\n  },\n  \"Server action\": {\n    \"prefix\": \"nxaction\",\n    \"body\": [\n      \"'use server';\",\n      \"\",\n      \"export async function ${1:save}(formData: FormData) {\",\n      \"  const ${2:name} = formData.get('${2:name}');\",\n      \"  $0\",\n      \"}\"\n    ],\n    \"description\": \"A server action\"\n  },\n  \"Client component\": {\n    \"prefix\": \"nxclient\",\n    \"body\": [\n      \"'use client';\",\n      \"\",\n      \"import { useState } from 'react';\",\n      \"\",\n      \"export default function ${1:Counter}() {\",\n      \"  const [n, setN] = useState(0);\",\n      \"  return <button onClick={() => setN(n + 1)}>{n}</button>;\",\n      \"}\"\n    ],\n    \"description\": \"A client component\"\n  },\n  \"Loading\": {\n    \"prefix\": \"nxloading\",\n    \"body\": [\n      \"export default function Loading() {\",\n      \"  return <p>Loading...</p>;\",\n      \"}\"\n    ],\n    \"description\": \"A loading UI\"\n  },\n  \"Error boundary\": {\n    \"prefix\": \"nxerror\",\n    \"body\": [\n      \"'use client';\",\n      \"\",\n      \"export default function Error({ error, reset }: { error: Error; reset: () => void }) {\",\n      \"  return (\",\n      \"    <div>\",\n      \"      <p>{error.message}</p>\",\n      \"      <button onClick={reset}>Try again</button>\",\n      \"    </div>\",\n      \"  );\",\n      \"}\"\n    ],\n    \"description\": \"An error page\"\n  },\n  \"Dynamic route params\": {\n    \"prefix\": \"nxparams\",\n    \"body\": [\n      \"export default async function Page({ params }: { params: Promise<{ ${1:id}: string }> }) {\",\n      \"  const { ${1:id} } = await params;\",\n      \"  return <p>{${1:id}}</p>;\",\n      \"}\"\n    ],\n    \"description\": \"Params of a dynamic page\"\n  },\n  \"Fetch with revalidate\": {\n    \"prefix\": \"nxfetch\",\n    \"body\": [\n      \"const res = await fetch('${1:https://api.example.com/items}', { next: { revalidate: ${2:60} } });\",\n      \"const ${3:data} = await res.json();\"\n    ],\n    \"description\": \"fetch with caching\"\n  },\n  \"Link\": {\n    \"prefix\": \"nxlink\",\n    \"body\": [\n      \"import Link from 'next/link';\",\n      \"\",\n      \"<Link href=\\\"/${1:about}\\\">${2:About}</Link>\"\n    ],\n    \"description\": \"A Link\"\n  },\n  \"Image\": {\n    \"prefix\": \"nximg\",\n    \"body\": [\n      \"import Image from 'next/image';\",\n      \"\",\n      \"<Image src=\\\"${1:/photo.jpg}\\\" alt=\\\"${2:description}\\\" width={${3:800}} height={${4:600}} />\"\n    ],\n    \"description\": \"An optimized image\"\n  },\n  \"Middleware\": {\n    \"prefix\": \"nxmw\",\n    \"body\": [\n      \"import { NextResponse } from 'next/server';\",\n      \"import type { NextRequest } from 'next/server';\",\n      \"\",\n      \"export function middleware(request: NextRequest) {\",\n      \"  $0\",\n      \"  return NextResponse.next();\",\n      \"}\",\n      \"\",\n      \"export const config = { matcher: ['${1:/dashboard/:path*}'] };\"\n    ],\n    \"description\": \"A middleware\"\n  }\n}\n"},"README.md":{"encoding":"utf8","content":"# Next.js Snippets\n\nApp Router pages, layouts, route handlers, server actions, metadata and data fetching.\n\nType a prefix and press Tab. 30 snippets.\n\n| Language | Prefix | What it inserts |\n| --- | --- | --- |\n| TypeScript | `nxpage` | A page |\n| TypeScript | `nxspage` | An async server component page |\n| TypeScript | `nxlayout` | A root layout |\n| TypeScript | `nxmeta` | Page metadata |\n| TypeScript | `nxget` | A GET route handler |\n| TypeScript | `nxpost` | A POST route handler |\n| TypeScript | `nxaction` | A server action |\n| TypeScript | `nxclient` | A client component |\n| TypeScript | `nxloading` | A loading UI |\n| TypeScript | `nxerror` | An error page |\n| TypeScript | `nxparams` | Params of a dynamic page |\n| TypeScript | `nxfetch` | fetch with caching |\n| TypeScript | `nxlink` | A Link |\n| TypeScript | `nximg` | An optimized image |\n| TypeScript | `nxmw` | A middleware |\n| JavaScript | `nxpage` | A page |\n| JavaScript | `nxspage` | An async server component page |\n| JavaScript | `nxlayout` | A root layout |\n| JavaScript | `nxmeta` | Page metadata |\n| JavaScript | `nxget` | A GET route handler |\n| JavaScript | `nxpost` | A POST route handler |\n| JavaScript | `nxaction` | A server action |\n| JavaScript | `nxclient` | A client component |\n| JavaScript | `nxloading` | A loading UI |\n| JavaScript | `nxerror` | An error page |\n| JavaScript | `nxparams` | Params of a dynamic page |\n| JavaScript | `nxfetch` | fetch with caching |\n| JavaScript | `nxlink` | A Link |\n| JavaScript | `nximg` | An optimized image |\n| JavaScript | `nxmw` | A middleware |\n\nThis extension runs no code and asks for no permissions.\n"}}}