From 94abd044dc58688ebe6c3bdbbedc58c1b5ef35ef Mon Sep 17 00:00:00 2001 From: neoapps-dev Date: Tue, 7 Jul 2026 17:02:20 +0300 Subject: [PATCH] feat: extended description and required versions --- index.html | 1 + package.json | 6 +- pnpm-lock.yaml | 1001 ++++++++++++++++++++++++++++++++ public/fonts/Mojangles.ttf | Bin 0 -> 71900 bytes src/App.tsx | 29 +- src/UploadModal.tsx | 1116 +++++++++++++++++++++++++++++++++--- src/api/registry.ts | 36 ++ src/api/types.ts | 2 + src/index.css | 545 ++++++++++++------ 9 files changed, 2489 insertions(+), 247 deletions(-) create mode 100644 public/fonts/Mojangles.ttf diff --git a/index.html b/index.html index f45347f..2367db9 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@ + Piston - Emerald Workshop diff --git a/package.json b/package.json index 4081448..439120c 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,11 @@ "@octokit/rest": "^22.0.1", "lucide-react": "^1.8.0", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "react-markdown": "^10.1.0", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "remark-gfm": "^4.0.1" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 829d873..1fb248e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,18 @@ importers: react-dom: specifier: ^19.2.4 version: 19.2.5(react@19.2.5) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.2.14)(react@19.2.5) + rehype-raw: + specifier: ^7.0.0 + version: 7.0.0 + rehype-sanitize: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 devDependencies: '@eslint/js': specifier: ^9.39.4 @@ -596,12 +608,27 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.11.0': resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} @@ -616,6 +643,12 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.58.1': resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -675,6 +708,9 @@ packages: resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.2': + resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} + '@vercel/build-utils@13.14.1': resolution: {integrity: sha512-H+ZZe4uU45XyI9/LdZAiwe6RuumR0OnttOi0kAYWBSvn1YbCbCjyKqUJrMfXPjuskI4ZgcH7VL2hkpINOPjxAQ==} @@ -755,6 +791,9 @@ packages: async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -796,10 +835,25 @@ packages: caniuse-lite@1.0.30001787: resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -817,6 +871,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -847,13 +904,23 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + edge-runtime@2.5.9: resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} engines: {node: '>=16'} @@ -862,6 +929,10 @@ packages: electron-to-chromium@1.5.334: resolution: {integrity: sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} @@ -881,6 +952,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-plugin-react-hooks@7.0.1: resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} @@ -934,6 +1009,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -945,6 +1023,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -1038,12 +1119,42 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -1064,6 +1175,18 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1072,10 +1195,17 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1201,6 +1331,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lru-cache@11.3.3: resolution: {integrity: sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==} engines: {node: 20 || >=22} @@ -1213,10 +1346,142 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1305,10 +1570,16 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -1356,6 +1627,9 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1368,10 +1642,34 @@ packages: peerDependencies: react: ^19.2.5 + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react@19.2.5: resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -1431,10 +1729,22 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1458,6 +1768,12 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -1509,6 +1825,24 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -1525,6 +1859,15 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite@8.0.8: resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1568,6 +1911,9 @@ packages: yaml: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -1606,6 +1952,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@babel/code-frame@7.29.0': @@ -2074,10 +2423,28 @@ snapshots: tslib: 2.8.1 optional: true + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + '@types/node@20.11.0': dependencies: undici-types: 5.26.5 @@ -2094,6 +2461,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@9.39.4)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -2185,6 +2556,8 @@ snapshots: '@typescript-eslint/types': 8.58.1 eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.2': {} + '@vercel/build-utils@13.14.1': dependencies: '@vercel/python-analysis': 0.11.0 @@ -2302,6 +2675,8 @@ snapshots: async-sema@3.1.1: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -2339,11 +2714,21 @@ snapshots: caniuse-lite@1.0.30001787: {} + ccount@2.0.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chownr@3.0.0: {} cjs-module-lexer@1.2.3: {} @@ -2356,6 +2741,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + concat-map@0.0.1: {} consola@3.4.2: {} @@ -2376,10 +2763,20 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + deep-is@0.1.4: {} + dequal@2.0.3: {} + detect-libc@2.1.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + edge-runtime@2.5.9: dependencies: '@edge-runtime/format': 2.2.1 @@ -2394,6 +2791,8 @@ snapshots: electron-to-chromium@1.5.334: {} + entities@6.0.1: {} + es-module-lexer@1.4.1: {} es-module-lexer@1.5.0: {} @@ -2431,6 +2830,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): dependencies: '@babel/core': 7.29.0 @@ -2512,12 +2913,16 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} esutils@2.0.3: {} etag@1.8.1: {} + extend@3.0.2: {} + fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -2601,12 +3006,95 @@ snapshots: has-flag@4.0.0: {} + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.2 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.2 + unist-util-position: 5.0.0 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -2625,14 +3113,29 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.7: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + is-extglob@2.1.1: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + isexe@2.0.0: {} js-tokens@4.0.0: {} @@ -2730,6 +3233,8 @@ snapshots: lodash.merge@4.6.2: {} + longest-streak@3.1.0: {} + lru-cache@11.3.3: {} lru-cache@5.1.1: @@ -2740,8 +3245,354 @@ snapshots: dependencies: react: 19.2.5 + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.2 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2814,8 +3665,22 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-ms@2.1.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -2851,6 +3716,8 @@ snapshots: dependencies: parse-ms: 2.1.0 + property-information@7.2.0: {} + punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -2860,8 +3727,71 @@ snapshots: react: 19.2.5 scheduler: 0.27.0 + react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.5): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.14 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 19.2.5 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react@19.2.5: {} + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} @@ -2915,8 +3845,23 @@ snapshots: source-map-js@1.2.1: {} + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-json-comments@3.1.1: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2944,6 +3889,10 @@ snapshots: tr46@0.0.3: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: typescript: 6.0.2 @@ -2992,6 +3941,39 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universal-user-agent@7.0.3: {} universalify@2.0.1: {} @@ -3006,6 +3988,21 @@ snapshots: dependencies: punycode: 2.3.1 + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.0)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 @@ -3019,6 +4016,8 @@ snapshots: fsevents: 2.3.3 tsx: 4.21.0 + web-namespaces@2.0.1: {} + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -3045,3 +4044,5 @@ snapshots: zod@3.22.4: {} zod@4.3.6: {} + + zwitch@2.0.4: {} diff --git a/public/fonts/Mojangles.ttf b/public/fonts/Mojangles.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e7b87e9f56cf3459a0942a144142ba2556a15361 GIT binary patch literal 71900 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%0DI7W?dMRAk6DCvSfVG z4Zm??m{;@kq4TOPOAqp+scat#O(;-F5L(E?@|+;Pojh{oIpj&XEyM;D&2!@0MVZlt z1~MQ(rZft3pcT5fhdI(=P|b-+lb>ak-#-Z_qnR!@j2$E)r+NMSKr}8RaAd zx)9BSB6&O|wj2FTS^oAfvMAIp~=Vu9lKF$z2jjiJ=7%-M#11QAyQA zN1^XKiKZ5{Vz8Qf>_#eFM)PVM-+?VIK#k59bk6t~h|Pfv?4}G9!fx0O(jW`PmmCucF_GKjoa9d zxvzuPx(ZVP!i6XB6kbpX_u(b?qb)_6@kh|eUpBH!qh*a!3H7r2SC9!!X`X4Gn7*B2 zJDLlso=_V%3+`S0O#pQ*pYGwg2p*u3XE6JYASi<#w4!UEJxBlDvGFcZ32`$GG7gT) zN##~p4^T-_5T(R)X9X=B7DTzJxQnbchB~;+Jdb92Iw_zR#3@^ct$5rlkN}s!9`A4R zmWz=c4(8VICs^Xgd<1t)OK*#Y933s(SQN|&qHrLKNgRhK+V&LD&likUS3}dGd3DxMr+|ZW`0ZVit71vToaOwS@-U3+xF5

ylB0kAh#iRb57yY31g?ZE%$w(yE$B^_mQy?4y$B9V=71Cw(7+%83uX{9( zs!bW>~b*C7VU`v@IFr5pso00^QUy>u~HcpZ^$T**x(vvF&wVbD0)w$l&4XUf{Ss?B43aqKG}fycW@OhzKwVS zJvVKKcluMnc3e6sW{QIr=SwF?eY_%!viOJCK>*Pb8^J{oVaDB5KzZ(?2Dl~=$3>@@ ziH?GKzGIpdjef75{2qm&8fx)#ShrD4L%L45f`2E{(@eIsq^-Uz`uE%==FUW$sL{c! zy9k3;>#zo~QeFOCBa~UW2jWn3w5k|v>C~YBc9xV!)>st{qYJRNDadsYBM)LG`xwEu zjWURd9p*P|ba)o)d&>@=#5Alrj1a8^18m?Q>L- z!k_{u2L)lRH6niSFS_n&V&gZf!7zfh*AyFrLFHz#}PHhBtAg z=*3un4A*=Pmu3+LT7dfHg@U639~$^|=4rf-_PKm4aYBU|1K=!SC>4}-t-K!#L`P>= zyVBKu7c4}Ra^82l0x5~{P3$5l_T%4(r}e$Lt^z$(?sJ?l2JE&9A_b-EGW6$^Sv2cM7Y=GwME0*gd>Z<(Lw|9; z7DMqr<2Q;iaY&k>?pEhAo-1y>_12+yr*A!RMl+&6Ba*Qk_>T6&Zy>$_Ck5{z6W#+M zpZh2<_hA<#wgkBkTV@1d3)f)>v&A_m*H(1!?VsRm2keGI|H$2 zVz=n?Xfw)#^-$xwja3I@yncL>t3(Zli!3z|TjMSebncEv<@Hv&zSr>_ot*6_tWV~i zBLq|wS{Gxn#aQfm_4KJcCkg>o4Amr7MMm%%cJU}O;ySXRMO2b_HQ52PON4oGg_0d; z*aO}QB>+tX=%YJ?j&Lzbt`FkRsQXNZ;eL7Eb$?pt==wa~LeZggcv*4jD*d$j@8zB1 zV;Y^|>&>~vKEOKZG>A#@>aEXv{_~KTzVzfW+qtRCgok-FVr-X}W^P+=orD$oY;9P!6_mAOFPjxCPjSTX26x zxxt{=dYtI5+;%!?2F?3j9za&e$KoRp)wv-o2$D1gk~H2Fq|ufj@&PIQ)&jN^XGBvZ zB^kxY)S}b=2s-+AagsjU4u%oxjj*S~6KgiRSkmZfFy`so4ZXkq(dBDsN}Ov?j*&%9 zvvF>Z=rZou$3pYk$B9k3Y^Vr3W{L(EfK1>$agr;NBTXY&q-h)(xlfG#P6+F|$;#$CENYN7 z9VCY6&jgsBN7=;GLMl$p^U3#ReN~*@=!W;haU3#^IZiz{)EK>kD_C9#p=d|~?m-BV zBiyAd+y%l_xNctGM+b30Nh4W}juqi z{jR7sZW@HnX-@Ho&6Re-kE$`bE?D0X47l5~`@Q1K)YpeSAoKQ&MX^WB z#qAI-VIs~on2%kOhqx(0cPv?_4-t4h>dAUJuA6s@nsQ7th0&|kZL!a#eN1CaMuO41 zp&IVl5D^HOW6(JeuDS;UA;d-`3|H}JM7`KCbGAgeoM-=}rSuhM2E*KBm_fKJtB7eP z=Itn2S`9mMuV5l_#*po(G4u?GH-md{6K=Wg;igyghYqgj`kKzsL(bu3MUZ|4b%3Kh zo9$Pq6VB2G>O(mQCXb$SKdVkW&rCd$W5S#AOnB4IvLNlAK!3xV1GwiUSuvci=>|aw z+%@A-p0P|x`DvXa159|qo?1~`B zpCCxRYl76f)1-+d$Ue+QbiR6!I6`ujUBo*YIre9*qfliJgQ$Yoz{~{aVKGJ=^Wvkf z5BJD_V=w0n%o#IvmyImRYloD_xbXr7xG|{$&`^k)mx*yOQT(dS4Ox5`d&qa*e{|?w zl$!y0>(&|xb#atjg}@;WSe9ZEC%UvPQ`b9&&IR}(-ChtU%(M0ufsUJe<# zY@iWip*+Syxp{gP+ls3m#Vyh&%dr|NM!R?jI)URXk+N7W7DjhQp2o=27?y}-B3~?$ zday{4Fn?)Qbg*w>vMiH1K2*{AsrnZavnd-~#ZHI3kT~6q|Hpwq zyUqE>J#rp7MCPEAQC|3M!@>H$Q#I$K|GDc))!C~J#%p?WCm%ZApNW5T_Y)cwo}nm2 zXlkCw%I5Z@@k6a2RjB^{h=G~!hsQ9&!}*jGcH zquYpr?hMnz1htOm?Hto2dt8e4e$gk6smw?3MLh^Z(QD*}Cw3)^dLHG>oG<#F?ejRd z=q%IWr9Lk8bcq)hua&|g`p&kB42~Y{vF4zeq}8`EBezFtpb~svPsgQwFF_$ zSpPU|Ywj;&BkoV!{($hB%BhsbsFcbFPB%81T~C$w6xY>P>0f`u%N&n%lx~QgL4GE8 zy~VGwUl6_7@sh0PoSMXJM|psMA-c%AJkUdRw1(ic(Q^%EDWP%H_mf9asR(95 zA9T}bmWhEFXr6V3X2*KB66&+IdBAN`d{LRyFPBF5 zDG%ruZ9Y1N2|+mJS;0&Zf$>~poWy5U%KXf~jsDmBEA(e<|4V3t>1m5W-}W?@MI1BE zH!?z#{bOV3+z>B*@&0XWRKL(G)C9FaO-9uNwXhiE!S>bTW-{EiM*DC0LH~_E+t7cD zAJR9uq-a-nPcSZzYXm=l+Zjv{XWtvi&Obmav;mv==Z*RmZ{pk`JZpILt^J47{g!;O zN2rWNY}Wk}hHO{{fv5!@W*PLMdRIp-u+0umCP7(obK4)?by`vrE*nrG_8^Z;fP_M6 z4?Rn`IF`X0d$bkVunL1W+nlO`;Clx4qq&3lk9h=Hk}nWQ?*;>>`|MTD!5F+E%(dzX z`)SY@DhWQ^d*OJzL3cphr)LD>V9~IFgH;bd*g?lz4{_HA4}&!juJaJyioCrEAa4@) zX38H)`?cFmG-xWv?8bU6R>CaiGkrfB8ed*B|dgdVdA zA0PQ_69tH~AQXbhqg6aW1;kzK$KX1u$@R8qv7G~wh3v&vUJov_Uw~;gRLw+kH-1{D zJ|~8rS)AMo7i<zMv`l{=AFNaVjqI$iCz^SMR8rFNSx=_KkPaWzrRo)YzCruU2yZ6!JFxj@tG{REND(7@si!#A#t^<(;D zT7HVm1*g2KpA!UEAhA8rB?HdT0M1;W608Ukf+M-X%9yN%y=4t}rEbXQ9^)LkDo|l0 zXzHzV=t8BNg3yO5<6ve4Y0%&QvH1|uis#D4WYNYDxX6t?jGKG(UujGvlyJmMwmH4P zLfp0Oc*Zt^cx--B?Wy-w<+eZD=erdnRIyvH5n|&sG{hk^9F{v@Mo17>)3qsoJD@Fe z;+uZ4F!l(wa0Te@6Yh{l3~&cAP&s1YI^5!VdTZcexj5*tSHh$uY2btPq7}v~*~7rE zSHcq|0_iIHiX+IWLhoy72=xQH4%eIlEX8NvDZswL_}+s2pJEo9k}c0?%aklx}Q^-6ya&PmqzbiE z2+ba)&?rlkLlG3(m|heySJCg36!=3A^@c*3*}K35VLr=l-|v(n^PQ6NCmd?AV>qaF&>6W5o zgzxGNwHBArH{q)lMDX4_Aw*^u578MRngvDDK*Sh*lKJXZc$Q0SU}4ZvQd2n zs4Dl5d9Pmhm|r9~M(+zr-)XzwmoOfRV>!lfk$y!KqcVTXfOhDk4IrXmd;kxq7W#=b z822D=y3Fs|`#z~JM50>Pi|_jkbuBT-g@@Yi+<&iMdfZ@Do?tH9uRs&3Q-~X)3UMD4 zKOC1fL~$aii8LcM7OQx%baJ*9F)3!N_OTa7RP6eWTOKNE0u2D#8~PS2BKaf&x%eosH5jk3tfWNVViRyDGubL6t5b9#LsP5`~ZOemA>4ImDigcpQ6 z$eHB=Aj<^YXO)rXSyiOIo?uOIS&-|i+0{hfm*G8%DUJ%_v3STPYz0Avhd~DJ;2_F^ zAcGC#d$H;JTg%`%kmNa#r2gzGBW?RCBgj*4c1aW;0x^_Z5ro)PdCLCWn^`E)9`69f zc}?b>nBPpghy3C}Ux4z(oKmKEv1c2b^!xCBv|f@%Vm(0(yGMm!BnyOLNX5NOJzYnd z5Yqpe33DT*XdekJ;Uu&4;* z8iw#(^$lhwU-y%1?IfAg*WHSq>nGRRiA(_P1SLTPj==C9ICtw2rV|}LDu)3)MB#$| z@SsJ(rXa2cuZr7&R+w31_BZYc6uq)D(Tc=)p~nZ0ywYPG9z8b_qObnHvIacd&H<0* zqMRp10^}A4t3v69=(HPXrf4yGOv|)I7xWdy3xAv2_I0VZ`(k3`F-FJC2+P&*pSIjE zF#=eM3}7S1gpMJb<^!*HN8FGD6;S~)qGu+L(vo+jB@WSO(N-2UiyK!M)4Pt5BrTV- zq%?-6*A2cT0u9XILeGG2Nw?G_v}q?g3?{yfIHE88!l_V65Z;16525DZ3msg?OL3i9 zQRh7?9Gu5q+mwh&TtpGYVR6LqaF28<&pKLm=b^@Wj#aGjRNTG-V8%nobC)RSA6^r& zSsa^2vSrp(?v_o;5z)kQ=tP|VcAd}+cs_MYh$hQB>*ho%vS%k+F4@iY);*ppp_ehxR5g1?RME9t`Dzt*}fv8WsRoY%<-!gw1AJKal zTjZd4AKb9wt1v4UkgQ0ZSc-|zOZVTsa-_)x->R(Y2o6gPwr5CT9D0vut=5fgEL z5EJ$7c(8UKhjz#8`>XDC;1nLEC`d(!1lSY=5kvup;MA-j4a^C$E0;LK|IieCfyW`z zmSjP(7qcnzs5{~dvu~^nif@ClsOAfKx9`U`&N)LFE*l6!AP5JBDHp{)!kL#VVP-Ar z_~^`4q{vwbW!M0+CvZXbIH0)iIF5plJAJjqTH5Q_pS$MOx~Kwn;saIJh%|4oVgH7N zXO;*L2YW)&ILG#nuqyZyQc@MmMqtQ%G6wtF!os^0*UMd`F##u0jbKzc7At$PbaJ)^ zUKFFx&3qXwGILZLuphL;zRQr2Hqwp%5i;{5HV>4$B;kIBnosTqJI+!7YG}H4TtqGm zd{X2_S_!6pi~DX@^f;JL&b(0-wC5??cY!<_LG2)2QXUoVcLchQr@?-*`&@XDgKH>2 zQxIE1A=n^DeFK|{^$zV9_5Cou|JmOxq2UQCP~~ROItMA#n98xQwjkg!~t8KR5_AAF^Y%&vd09`c?50DZldFN^9E1%^n(uA+@ z1q}kiQ%J-|aUYVX6OzzZ42*hx+=hV>3^OF6+yaqM-6A2kRJYt%F^IuCc;>u9U{p-Q zS<5XdkH9D&EjaQH3uZ2ZwRu5Bc5RE0=;V`IirkCNTQ)6QmQUB`Mr^!$Sg{ZBlI!1B z)T}fd+Ra8WHol20Q!Io_b;8Q?gzOA%!UcN+YF!GOO5{{R;UA-O-L>df(0T2nD|8oU z1nHE6r{p0WQf*Y?UXC9N@gCiE55`j|C=>+|7y^WkAP=7q9Q>pa?o&DC)4Zbjc<=e( zp^q(1;|MEJJR7M5d0gfO*w--N6<(chfIM=%y+SK=LJ!d$Xc;;>hhA)wQ5a&y>w_91 z2UT=xT5yZ*Q;y*@d4|)xh{AB1?u#A9T<-~P5nLAJzReA66?XI%zQ--vFgh7O__SRG zou72nOj0n8r_q8Sh`?KPkx+F~kbabgvi9!A0YdN?ff9LO3=qU~5J`O?O1mq9$cS-2 zeXU3N4v9pxzHTEG?lX&>Iauw&d>JV%`XQRwU-%HAB=Yx?LQiL!h zgQOrF>qq&zf?S7SB!f5LKHIO6Fp`83dba_!iR%C^A-+Q&H*g@K!6GUTAR(8COM(W` z?#(1XIS@sHAjJs5P2qFn2kHofaB9XXzH^z%2(ujgVCYZ}W66`LtuPzeHZXyfY z+y9Jj&w~E7@_-%40}I8nUT9HbOBs2(t;2mQmNVE5{=s+y6JK0Yz^phz+x!zBX+KD8QYVcmCA89dK8hs$tGqMa8rPc|14xXCncw^CmD62IrVrM-VeZ z9GDqqi9awi^Lc7k31)2oIf&~Ox>^rMMKBJCr==pg2zomzB=2K4dV1b1_qnzdJ*CB0 zMeiQL<0<2tnzrRlZc_ue^e+DhKQil_?KH-XYmw1r$r@mo?e)Z?MlIujIhtHkx zNdew6fCmdgCCdZySsvi?Ybxiw;C_}D+;8bVc0m+CIeLE&lHn09nd|r_B1wGHj3B;= z=eK8hxHawd@iF3Nx|HQ1!k{8_ieBGB5JCC?%JE*@D37Dxh$G|8bS*|qN=G%$237b9 z*Sp@39cpJv9PwZp@f|Pt0l$G+ev{Ag8=K4WoBLUQb02=gPv^I-!@Cap2q*H*bum7W zwMAFr$hVFB!H;gDgJT)eAH!_W!IAMFiq8iX(8BKqN6S?PfVY2(Ty*;#)h7?NT%YKIv0tut1f82)-^k6# zRqPrr+xxAqhtA!OtsoEdkczGQ(?c|hqlJ_153{z6vUk&cY#EW#7}s$k)HTkwvl3uL zqkbPdxu5lvtAW<9~Cs-m{+%ec=&UlF4mx+TIeQ!xF2qY%-0B~9`uRjn3QLZ5g zIPC7HsXUG1W^miqZRnha3IDkUqI8cS%Co2?NG|CdB&l~rkbAZ!s-EtE`gpe&|4t9K zf~1&7A$p7E!Nfjiy5RECsXoNXm-lUIl08{zWXl{%ZcqLx8)WuTkA|487z8Ge$$*0% z9?0Z6q&9Spf5HkNm3Nzw&#e9+Ro{%Iw->+kx1e6%M?JnTa6*Mp0t5>Wso2M#@S6KH z3PcfTkjg2K<7x_a1(D4>J(u|Puw0zo_W30|v&~7Ss3^l8afr1L1x#@nN37G<){Ji% z?yHCqwzIJ*#)~aA8q_#&QHZlEfZYI$_;b3BU?BzwF+emMK|?J50xt4A93(D4*~mle zq9DX_9U{?YxJ$QlzP2*X;#AXG&dXfq2C4C9$oN0}v# z`|!9yIdZOJdgwOKrY{oJXq@?X8u;?p@9SPvZ4Jz zBGKosZHQl(6O%-?OJq#jp}BAzh|}Tp+##^G4aoqw$zMejla8 zt#TiCO5P)6Tq;V6OQpQchq;Apvk79K2XlWEP04p2;oGqWOcbqW0~S)iBpLE?4U1qz zh7Xz-WQc$TfCTyNg4+Z^hCF_q`{vgr1>Pk&Xntw1-b9p*bS#qem?s)VCYAS!B8es< zk?3oPx<9ayjXrC)5Rn5$0*ud@<%YltGrV8N(X;CETtB(iPVfeHwGnTBT`N&m?piyE z{Q$C~KOo9BN1;42!BGHV5BKq2w1_OpBSY@vK#;9>iObo(IrhcOgvD<$#+kCn_X#~n zWP}B|yx8KBl^Zge(R~yNZ$+czQ5dAF_44#AM+=u5phy75G z)+WSsn~8|ua(A!ftLIdP(NalKkV;D_j|y?U9|$O4RUV{(AO$aJ6eEl=e_UN=7lQa| z>l8ks>_?lKs3mH+sr-Fc=X<8xo2>cd^4}dk!Y}v;ztCalC#>1X&v@U~(6*%gwclx; zVk`*Sj0%0$A3D5{z8*|(JH%h2p)nJr*(DBg`Mu+#Lg973KfH*v8wqM|I znn&l`Hlvvb2QedSyn~ahEI}0LYoZe$Aufl`rCP< zfw<71Q0Vho=kOYy_^LfoJ7luM9f(EN1mQUlo$A@f0Td_6@>8f$bWAPyPTSm$-1O*4eTqK5XCXXh-P&9$-Szk;ZjR3-U%ENfV zZZv^5Y_Ci=%~)u^m(5&w@8n3>d*FJ&R8o)zkv4e{W5{l=ga~Fk0iJi~Z(p5Pw4ynp z-M;g2caHg@xYr*ufH(#Q?4SmOM_h+T zKv2XJ*|%bbJ@4pONn<+hWH{rSjk|M-OMTqL|v@Z#{MEPiFyDn~| z5(SmeD`YAG_2VRmJAnh!g494)Kz>FLj-cJZ^eb8M-TQBiGm%47h=lFi*cna@MHS8^ zhj1V{XcdQ0_W5I^$dmJ`K zeNXT0`#!ffF@qa-apN}V(1AHM1;o^V*{Nt;4eEE&_h512CF0G=w&-r2 zA6K6u-{2$sfp5&D)KVU#$h(l-At6w@SNO?u_zyJ811{nko&&KtLH2l|Y4jFY5vwJ{ zoIZw4Yk;=Zo!$@S6GRVrThca>lKKpn?~feAd(8#E;8@rewpzc)bSP#3Wb_YoX%uwb z12~94BE|%jb7?TjWrPm{=n9E5kP-wlF!#WYfR5`hfa}B=l!pPd*%PGhWkK4s`C*Sd zeV*9Yr{FBe5Xqw+hLj)=W+g)&#ISKB!*fW6^4o+oQeavF%K%~S69`c+2u}-wFe3p} zhv%4=q~7g<+y`+YQV@rb6+z1TKFZCcndXJk8$cr>W!%87$uxbL#Acx9eAF4<>RFUhbB6y*Sw2LZIPPQZ) zP>{h6ule-dX}2XFz&0Qb?*^e%3Nd)7>^wbrkicWnI3q9`<+}Z5pgfqZi<<|Fu`e+_ zu_T@?%}^l#k0-Nd5()Ei{1Mj^JK^IjZsNVpAvx(ASj0`Z0aj1^tuOdXw21G5cg)>G z7S|yOSAa`^-^hnNGPV8fzGG|H??mQO36;?xegeP4!&Cy3Efx};^3=9R8hY{Q_J*H` ziGf4@I!mi zU9@Uabrgm+`+fC{{1}VbVe$WA#;;@d;Qz(_zw=>oNKH8fs2wt^tJzYz2O8wvrK6$@ z9bq~0#I8_Z?1(&ewvJ-o{G@9}yCc*@ygus6wg%I9wl~y0Rvgmn^otQv4s8_}7c0U&IAq~m zf?175knE8pCW3o-9k@Z<2oWh}jK5Fgb2=XL#GN;>@(DdiWr%^sumJLS3wl2L?J;p7 zJ2w`4yG`cA=+4x$k;uOB0)u#Yga>2xz0x$=g2Zu3Xv>_=K@VvAI|Shmd3XZapvyA| zll;iB6bFx z5nL3+8&R$+NXH2ATLtOW;qK7hpzkbqg@hWQhel7w&0YHnulL5MY@(;S%$-qfwFtC7 z#vNHd&x~<>&oF#}_wWIJyS9>t-@q)t$!GaJs;$&#>m;t7?!Uej?L<%rDE`jbM*o$f zlnwT4;dsV>G5oc0*4Q~*_S`&nybbr{y;k%$`n3V5!+R08WVtY^ZQO?lygAy2R-tVx zf@m9gw2gAakkpG(^aOq4T)#!l*HWgfo0-uZKHZITv7~~&isGh&xTu(3U_#J4W!x(b zVHP}xSr8v#76hgAopeJW2qGY8h=~Ejjs&;V$2L7fP>^?qamv6^p8-%c8$=~V-o{M+i_jffG| zxOD}rlY7txsy4^$*5`YFMrq-J0WBM87`3p?Xc)gH-+xCaa@`fwR-lC~(LBC}n5QI& zD@0mAsF@SQ%Cb};siv-X1mOtQg+PX41s@&w$Z3>nDu7KuDxg8{3`TtolEep(m!|m9 z7pSSJBJZCjOR&za8ZAq;a@_K91u8<=_G^^L_8}vxnHcvkU6tSSRB-Ma`&8 z8Q^8o5naB_f%@HnA;GnLF|!-H{uv|o>GnGKF(+bHw?H~VbP${a1emfaP+*JkIqB-!$qeo{Nz zU4#7_E^q*wt_h;SKt_i^7a_eP907SC9+&%Ylo24DBo8OKKNn{}26MfwG-vL5;@@*s99I87j-VbRGyn9J0ayI@ zhMg-YFkB%IH%j_LtZ;;DAWPnnb&uw6%~1w@!aJf*GlIkjcsrkGvR^WFAMg7;eU%>$ z*~m~L;T-*<|91UCB!-CY0}%<04D>1H`K=v%hWBmRHwXJ(5iRPEpa#ooQmeF~f*3V+ zcs`CA<>jXayc`#mvPIbE9u|ZqLI-VlOCG+$Pt3*0668Ak{^|yr41b+Q`@`ez)Qb z*VU+N&UJewNgQX);9LhmxV|Eo z0u1U2GL}FpHkSDA>HMfvgqRxbsc~$B@xeHo7#-=FN8VIY^ivzWiaD0#S4P%z7lYgGVkWv>G{aEh{IVmw|sx-KShuPTbGRiThdWKt6NXafQ#|eY?H}p(AYO zYR2)^wSO~yii;zRWR&ddksITv`}tmr_gPsV4c*@F;Thm5Fst*FnM&8QJfx3p0c z_OZvWCtWL;*FGeuM!RgC<&lbMQ>nPla;+{<3fnKL6d@6%843fj?}{KXLsJl4BtP_R zCEuOob1@XKSYDM7cR30;4F(=m78M&##Mqqp-2LA!Bs(~4(}t!+Y?8pnl=|LOc7MjL zRUNidfmjL<9M%4W5Vfsx0w}P`(`UjlqL&gNlYQ)CyDF&wCH`y7$4ZI!~m11*8{J`du@E-Q*-V1 zrnp|%smn-he29JOTe$r?`PGsk>>dne1Xv~t=zX}c=NST3_G zXb^&j31}X5!3?gu(9tx!u-T>0xVv4totDy9UY)CO5AiU^05{ngPQ_K_8;UKGuY$A2 z-BZK|eFIosPCW49>1`;R`x@m#f94=c9zmLgCR(s6*AT8l8>nGbTn81dLnGHgk-XE2 zRdKz;h{I?89xToHW$2|c=%unve6`We`Y}E#($6$hoQN_`$WzB}bsZV<(`lcIeuuk1 zQ$6adA_b^Blpzct9@n`+4~2l>h6zgdoC}x%J|%KN98w6~C^hhQ&3MmUTc*Rtb0=lZwS14KgHU*QxX5M)thkVQj5 z5>*E|uCwZZa|NM};Ibh13H@Ni34+wKLy&T7f|QHD%^i0GAW83WfcM`E^%dTPt=SA& zetZSNe*Yr9jo{yF+e`;;W$}hZoQM`)fgLfRo)d~_{G=fHf*>+RFR=EKAf%uZTt_D; zhw^eA<#k=)KD{*cAx9Q%2v)Z$k3P`vz*_R?0Rbv3M#jjTd{*Yv1B<}}79;yrL7s=z zQ5WKKJJAX6&q{3U*NT<@x(5}olMh8E{Gy|%>KsCvg4~B7WC%eJhH`@dI>LQ)g!||S z&qD}00U;$p2%$c71%^Nn<gHAGDwQM=EgUPR4( zM9ptW)to&ccd-8=w49|z(^Q~EDPiXVGwzkLpf{(zt|E4 zacl+zu^Gx|I|TADlIJmgo}Uxsd2EQh`&k%URUR9{xcMLp^^bmShifpCHnEpog8Kze zPm}@VI22i9QO~TJPafc1F7e9LFzptMkM_>&waQ?Qg%(F zDTBTWq8Vz-FU!C8S3t5B=$-iB8o%Cdqc0m*GjFZH(ah8)Ncf$C;aK>+Vm}d{P#m|z zu`IOBHU#@(6`K%CRnNG1VJYG*2-+JF{u?P#Pu#Ynk0T^Ro;1n>7*t7+3Xy9q<_*lAtzLzrH~+Tz6+G_6m$_J9tMMN3N8y`^qhADDT9%d$H;>4$Y}>7=RQWxeT*F5Eei5HUKBjM!^C@X-{#TcFGL;Fs+a!)U+mfEG}iGR2!g06 zrw6I1C

*C0+)v1q5**Aqk!eMFKel2y#G>;X24H3gXhKt0zd^D}uDeyc)mQM-SXl z4403i+ylFF2bc5dIxy1{`=c?1PMX{{};L zCK7+yU(Fl0A2RcDw0Xl#c=Fx>PsZ(Z__wW(Ut;#XWXhEN1%3yIHIJS;mhI%~N&5{|oy;hZ#a3 zx0(HZVZ8ma#x<`$*0|`W=|}PI3xYUaV0Jx$E{YxiN9m+i z+U7@`^wg`tgo*T*F;3JxYJaXvqg3~M(C(J2nfO6W=p&vO8^+j)c#u^gi_X*Rs%`30 zK&AJ-Hu=uUzwg;ap2*ij1r!ZAGu%K)iIWKIES4g#>ud)hVjz}cRP|u??4lpGCOH}v z4DZ>^7?>jZG$D+hY-VTwOqk9GNrv?X+ak>K_?KXYFfVIM+$Rp^IyQyAVN+bs#=_jE z=fJMGM?^&^$vYXa%l1$CoUyM9`_9;V9l+vkv9XdMdF+qIK^A#{Ec|Bb7U;1p zNX;qFH&)pX%^s@N^hOTr3fKT6GW$*X{x?14#kH#{t;=XsDo>7E-^2TM{!Z7%KJ+UC zzWP3@Sv8GH;5P76jNyRr8uTFxUXA0m^O*ARnDUTCov0gm+e_tqoKJflztjAq!NK0N z@qF}A|NZb$-Qs|ez9+4$`K&OpbK`th?hNN< z%=209av!CE>o{|y0JmoZ86d%ot%7hLV@A2`9eJ06YqNhD<~uEosLioq5a|kmZGs@o zeynj?F6r1@3?3!-vF!U+Lz+$plNA!$KG64(*kv(%!zFYq`2L2NcAoP`Cse2KE6TCBZYVR*oO~day zcGCXe$k{j}KxpCKc3Kazzn8Z>`5FyJ8z7FCUw(j3p*)?YLxEH==E?Bx_MV&lx|)bS%>OwT|m5K4hC-nv6UBv|s@+Lbgxh}iuLCXh|OCM?;x z4`$3T_-}=Qi$#;dAiith-|(tQTh{MQu!@jDqze?xQ zw@p0>EBkfrb>UcnIqL_Vi~i2Kf0y5JHj6ZVjenQsRnD)0uEGMa zLr1Yjmnx8%HU#Bfi!wv|mfUCG|Jy=Qhx;>T;xX}>#l`)-s_t3ho73=~G55IlfnG77 z!QV}B8gOjP75TnY3>}tn9gl%Fe`nwAO8EC3V?v*AI)MN9xlj2<*ILIM$UxM;G~*QD z<4VFD*X7!b2|)>wWK)n{)cXP`wQsNbj+OYDRF$5A(+YNP%^&8Yr~61mmB08IhY zZ%1cnNbhm6ZwsDhJpc~d2Rq1$eAZ8r$C^M^YgEy7u-DVqsZu2?FOD$U z(VsA9{1|8A>6dxyM!56Q7xl{0yEty#_`4{X*{XldZ=#@SXd*)ipodew@HzBOO`K&X zuw1Z#YJ3ZPpos_*Hn~QcaFr)uL=&x{M19|Pi282QM*mtAeIbDuseN|T-f`={T4)Os zXesun^{9MLaoTnA=(X%R6kO%;{B>52^)$tE{rQ;-lE0VK>Cfvz5ub?`AaTf`Pj_ke zck)tTu$wnJ*`jDNX{Kl^MjJv9Nyc9SmlnpgGkp`=aOk+l=xa^XX*5AtyPwSHX(#Bt z$<5*s?~U*zuzh&vfcWCy6Un8opZa>_gbEk+5DdV3*uyFB-owAD#urQ3pX=jFU$>Mj zqSJ^U3z5#oHIcYaH@i==!>?ESFXW*nSQ`)-z;l{s=O}z1hZ5rs`mAZ9V-a2_L-NRA{Zif#}wMvqj{;)dManYiIi!c!`d^&05S z1AqIb5O*ez`D!HST2vvJ;s&2H%-C9DnA;k1jIm|xi`^fJ2BE*lW;19@D&8Sc>* zz@zW|)SNXXXy4&+UULy%y8s^upZ*p>b*Hjj?OTrDh#%MkhQXRD_Fz6;*jr2t-}|w7 zD`+SDcRD79Vk`+}LOEeAT`SNnE9376e%>QG9;5>NJQa|4kBCZhoeGPBgZ?1qvwITg zmu*jii7#qne4`p?X1|lEy#dGN^GZQ;GUH+oZ(gI4aoW>gi{phX-w4CS?-rzuLg7o$n9Xul69E@ROL9~Pi;1Rr`0#kQEuEQIy!yEE2ojeu7 zGsYH*U2NV&JTi#4)iGd_&OA>0`jG#$wH=RAyw?MjIaLk6`l8agiwI`{8bHQGRl%0> zJWuaQ3}EluM;&lpvr-Xv0#FeZ6I?(a(3J^qL?}*$@BxoYc@F@I+wi)?YkXS~o#0Jo zd-r?dx9>eijwu~Bq~~1bVqb4kH=^H9xWC_1tGVXjO5?x|s^AC^j(`;1Lf<#*9vtWh zat}nCg0q5LCw|~r;s-dxo(fz7lVNB~PmufeyJ`L_#oiZDfpJC+G6guN!b~rke^DO9 zm^wh+3^75TAug;7(m6O6DF-st0}_aMG37ym{IcMZpwIhzM7Amp!)3TGXx|p*tK90F znSJX|LtDtEbs?bj_3;jjk3B!)NE6oBt&KS|F~~VWTYU$+q(C3?`tgVI+R-Rlb(3|k zQ4cer0%c+;;pM+kX7P@ilmRGw5;BVFiILKnYsePfKm6TV_SN`~Meu-)OkE%|9G4sC zuyqgE-cmX1lUwQAEdK3npE009AD<(?h<}{&8Qx4$<2U9~<6b#bzY1u6cPbxfcNKzjVPN%iVOgu^K86aRHcs`OQKNgFeP@)j zmIvSnjulP-X$Tm1Ldn-}vXd!y348VIh_)8(FSp0W2K`M-1Dosf<{4tOM8+>dz;blJ z=X=n5#A0JsK{_FjvDn|&pR;if5A%T8p<;h*afhIdLka!mob9t53cvWWa9aE8{=Y4f*cz#Y2isi=dQX&{or?;<%=4u8${ ztiOiVq4A#gXz>jO-Y1EZp*R5oQ)p)s0OH4nsQ^iGza@x`Bhg_UkD&pG;JZO&PLK|R z`fN>Jd}LHi{D&>@r!k`0ecZvV5t7S4sR6xS9ZwuLkmGKNFCWzYZj(!Xv!NIVvZZphvpV^K|yM{q2*h8WB_E6Q1)wI2ubaJ6$ znVjBcH3p~{+~={ZrXz_VO@FZa2Wb}(!*S;-4RIZ=VtOn&^;d^se$i=e-QY2(~=dbc^tXPhfvB7)!c3kLjXf$@9FPfqre3;pDJKRIeAQ30vR zJF@<0)ICF41z7}xUNkoP^fpyGibqCr$R85a?GM8tDA9gN7MR02eqP1-zE=#Fow#_C}8t`v?oqEp+em;*t?w{EbAR9vIX-8bF^mpT)WV z*&Fl~bttJm^bWg$MD&&GkVqa9xexzn4}FDn+vDte7W^w&9#Q+s3>Be&@CN;|E?1=YmS?jK+(Nnh@)cTvmiQ&qab1@Mm;GP|9F3#ci=k92bVKD?2WC* zaq>1^mwK9Y5~HMV8I8t-8+{@D7@a%ux{u635Bmf?AbN#~pjYq%KH-Mo6XayOEaw;H zaYNkCj@qdYcf|c6Kj=}*y#30#9##Pq7amgS1m}W%Au5kjhHG zZMyc6`qui7H0ByFYOXau+`Oap#@2_Yo;~&b?Ni%Fr{||1F@5#)zjWR;bN$T6XHT1b z$J}Xi&!2nE-1T$s>CSae?>@78+x!#epFMxw{M}osTVAu}GYh9KymfJM@zTZPTkBh2 zx%J~)zqaks+iu?W)ur>7-mrAn_NQ*YsW;zyTknqL>E+ife{SWL)%n#ouYO|nA5M7o z3CB*j{e-Wc@XZ}h-*IHem)5S{IkEHVop0Frm%FBS9o_wu-CsTNmXm&D&-d*)zW2ht zx9$7!{nPtDeDXD?Jmr)xo%+55FF)<9gT;gIJN?VnfR_`M5HzVMkB z-udK9o^t6$KX}mxFS_Mv7e4Lgr+xG3k9+zh&v?Q!Za?(YL;rB`2cLP`GjD%Z@mXJe z_FJEG<|Xw@ZhG#S&;7`A@458qOFwW~@vhn*3{ySdKd%>5lT)Fb+UO4^2cfIh-FZ%fx{pyRK@{;OHUUb#U zRX4o!yqEs{%RX@R%GGbY`i+wNLhcbV)p)#GAfD$m+xhBrKB3U&2h(|8KO6IZ%Db-M zxQQ_Q$#-_#k{R+yNtRG1Va##oG0jw$Q0yE82TTcpk)^$}Y@KvSIvWF_3^hRL5IRE( z1EE7;7(yLF4`l)bhF(Iiro8X~-|npwf@k272Tn86r+@#l`|r0}NvG2-F*r?~nLAka6QjpRvX+vHm^0fk={QsxCxtC3k_~2_6?qjerqw$v#fLj>osnzHQ2)R zn$-r^U|P*OgHvd)S#NL}(^E4IuEpl5oWXUJ_ZnP}EmMmOZorJxn8A%0Pc1XJ3A55m z3~nY~VenMknO@Tsmd7HmIGBjp&K%L2&E>?vm}u(}3zCZKg|V2IxEaxD$I=yHAd*2T z@?IdF$Sx#840uV&E{j4KB+4vrN5hp^%$HFdhe3% zJzOuKPK7@%^=KJ$e;)T;WQaOpQzE%1SQc=d(4*uwPwjxnVH_I;9YuNdh)R@{sZ-E4 zDtjN|Kws+F6zvD(7+zs0QDD(OU?CVTGJkz<`Jm5&_bXZ12!_n)%c&6%LJ3++8%iLJ{wGTf&JNB4|kn;`E)+PT`h(h4b4BcMo>=xB-7D{GAsC5qc>OevnI zu@G^qxG&jGUVrG%A1g_=i8-q(s;+Yhl%Hy@^f)M*5fmLjxX>iuE3Xgi79&?FXAzrg$vjPui|B_!7KO*XW%~GGz^*E z>+m-2gaXf*WaT89*r5MN0xC6K2 z7Au8kaXo&*2UZ$i;{+ZePsC!JgyVVMej|?4REqH}?`u>zcoS0c6r7AxaT>nIc}Q8c zR-HA)s<#@jj^_rS;$ysv_wYVG!iQEPZooBIWi{bST#c*n18&77xE8nJLR^N+@d%#8 zQ&w|&ZY2t*R01!X?dYDy*Cq5uE@ literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index 3b146d4..9894e2d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,7 @@ import { useState, useEffect } from 'react'; -import { fetchRegistry, getRawFileUrl } from './api/registry'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { fetchRegistry, getRawFileUrl, BUILTIN_EDITIONS } from './api/registry'; import type { RegistryResponse, MetaJson } from './api/types'; import { Key, X, Download, Upload, ExternalLink } from 'lucide-react'; import UploadModal from './UploadModal'; @@ -226,6 +228,31 @@ function App() { {selectedItem.description} + {selectedItem.extended_description && selectedItem.extended_description.trim() !== '' && ( +

+

Details

+ + {selectedItem.extended_description} + +
+ )} + + {selectedItem.required_versions && selectedItem.required_versions.length > 0 && ( +
+

Required Editions

+
+ {selectedItem.required_versions.map((verId) => { + const ed = BUILTIN_EDITIONS.find((e) => e.id === verId); + return ( + + {ed?.name || verId} + + ); + })} +
+
+ )} +

Downloads & Installation

{Object.entries(selectedItem.zips).map(([zipName, extractPath]) => ( diff --git a/src/UploadModal.tsx b/src/UploadModal.tsx index 02b76a3..24b190b 100644 --- a/src/UploadModal.tsx +++ b/src/UploadModal.tsx @@ -1,40 +1,77 @@ -import React, { useState } from 'react'; -import { X, UploadCloud, CheckCircle } from 'lucide-react'; -import { GitHubAPI } from './api/github'; -import type { UploadFile } from './api/github'; -import type { MetaJson } from './api/types'; +import React, { useState, useEffect } from "react"; +import { + X, + UploadCloud, + CheckCircle, + Package, + Search, + Eye, + Edit3, +} from "lucide-react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { GitHubAPI } from "./api/github"; +import { + fetchRegistry, + fetchVersionList, + BUILTIN_EDITIONS, +} from "./api/registry"; +import type { UploadFile } from "./api/github"; +import type { MetaJson, RegistryResponse } from "./api/types"; +import type { VersionListEntry } from "./api/registry"; interface UploadModalProps { onClose: () => void; pat: string; } const CATEGORIES = ["Skin", "Texture", "World", "Mod", "DLC"]; -const toBase64 = (file: File): Promise => new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => resolve((reader.result as string).split(',')[1]); - reader.onerror = error => reject(error); -}); +const toBase64 = (file: File): Promise => + new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve((reader.result as string).split(",")[1]); + reader.onerror = (error) => reject(error); + }); export default function UploadModal({ onClose, pat }: UploadModalProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [successLink, setSuccessLink] = useState(null); - const [id, setId] = useState(''); - const [name, setName] = useState(''); - const [description, setDescription] = useState(''); - const [version, setVersion] = useState('1.0.0'); - const [category, setCategory] = useState(['Skin']); + const [id, setId] = useState(""); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [version, setVersion] = useState("1.0.0"); + const [category, setCategory] = useState(["Skin"]); const [thumbnail, setThumbnail] = useState(null); - const [zipFiles, setZipFiles] = useState<{ file: File, extractPath: string }[]>([]); + const [zipFiles, setZipFiles] = useState< + { file: File; extractPath: string }[] + >([]); + const [allPackages, setAllPackages] = useState([]); + const [selectedDeps, setSelectedDeps] = useState([]); + const [depSearch, setDepSearch] = useState(""); + const [showDepPicker, setShowDepPicker] = useState(false); + const [extendedDescription, setExtendedDescription] = useState(""); + const [showPreview, setShowPreview] = useState(false); + const [versionList, setVersionList] = useState([]); + const [selectedVersions, setSelectedVersions] = useState([]); + const [versionSearch, setVersionSearch] = useState(""); + const [showVersionPicker, setShowVersionPicker] = useState(false); + useEffect(() => { + fetchRegistry() + .then((data: RegistryResponse) => setAllPackages(data.packages || [])) + .catch(() => {}); + fetchVersionList() + .then((data) => setVersionList(data.versionlist || [])) + .catch(() => {}); + }, []); const handleZipFiles = (e: React.ChangeEvent) => { if (e.target.files) { - const newFiles = Array.from(e.target.files).map(file => ({ + const newFiles = Array.from(e.target.files).map((file) => ({ file, - extractPath: '{DLCDir}' + extractPath: "{DLCDir}", })); - setZipFiles(prev => [...prev, ...newFiles]); + setZipFiles((prev) => [...prev, ...newFiles]); } }; @@ -51,7 +88,9 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { }; const toggleCategory = (cat: string) => { - setCategory(prev => prev.includes(cat) ? prev.filter(c => c !== cat) : [...prev, cat]); + setCategory((prev) => + prev.includes(cat) ? prev.filter((c) => c !== cat) : [...prev, cat], + ); }; const handleSubmit = async (e: React.FormEvent) => { @@ -81,7 +120,7 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { filesToUpload.push({ path: `${id}/${zf.file.name}`, content: b64, - isBase64: true + isBase64: true, }); } @@ -89,7 +128,7 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { filesToUpload.push({ path: `${id}/${thumbnail.name}`, content: thumbB64, - isBase64: true + isBase64: true, }); const metaObj: MetaJson = { @@ -97,29 +136,32 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { name, author: api.username, description, - extended_description: "", //neo: TODO: implement + extended_description: extendedDescription, category, thumbnail: thumbnail.name, zips: zipsMapping, - version + version, + dependencies: selectedDeps.length > 0 ? selectedDeps : undefined, + required_versions: + selectedVersions.length > 0 ? selectedVersions : undefined, }; filesToUpload.push({ path: `${id}/meta.json`, content: JSON.stringify(metaObj, null, 2), - isBase64: false + isBase64: false, }); const prUrl = await api.forkAndPR( id, filesToUpload, `Add "${name}" (${id})`, - `This PR adds "${name}" to Emerald Workshop. Submitted automatically via [Piston](https://lce-hub.github.io/piston)` + `This PR adds "${name}" to Emerald Workshop. Submitted automatically via [Piston](https://lce-hub.github.io/piston)`, ); setSuccessLink(prUrl); } catch (err: any) { - setError(err.message || 'Failed to upload'); + setError(err.message || "Failed to upload"); } finally { setLoading(false); } @@ -127,20 +169,107 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { if (successLink) { return ( -
-
- +
+
+ - -

Upload Successful!

+ +

+ Upload Successful! +

-
- Your content has been uploaded and sent to the Emerald Workshop repository. It is now awaiting review from our moderators. +
+ Your content has been uploaded and sent to the Emerald Workshop + repository. It is now awaiting review from our moderators.
-
- View Pull Request - +
+ + View Pull Request + +
@@ -148,45 +277,266 @@ export default function UploadModal({ onClose, pat }: UploadModalProps) { } return ( -
-
- -

Upload Content

+
+
+ +

+ Upload Content +

{error && ( -
+
{error}
)} -
-
+ +
- - setId(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, ''))} placeholder="e.g. realistic-sky" /> + + + setId(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, "")) + } + placeholder="e.g. realistic-sky" + />
- - setName(e.target.value)} placeholder="e.g. Realistic Sky" /> + + setName(e.target.value)} + placeholder="e.g. Realistic Sky" + />
- - + +
-
-
- -
- {CATEGORIES.map(cat => ( -