diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..524e496 --- /dev/null +++ b/LICENSE @@ -0,0 +1,47 @@ +THE KARKAT PUBLIC LICENSE (KKPL) +Version 2.2, January 2024 + +Copyright (C) 2023-2024 MeowcaTheoRange + + +THIS LICENSE GRANTS PERMISSION TO ANY +TROLL, HUMAN, GROUP, OR ANY OTHER +LEGALLY RECOGNIZED ENTITY ("YOU") TO +MODIFY, USE, AND DISTRIBUTE +("SCHMEEVE", "SCHMEEVING") THIS WORK +WITHIN THE DESIRED SCOPE DEFINED BELOW, +AS LONG AS THE KARKAT PUBLIC LICENSE +PERSISTS WITHIN. + +BY SCHMEEVING THIS WORK, YOU AGREE TO +BE BOUND BY THIS LICENSE'S TERMS AND +CONDITIONS: + +0. YOU WON'T BE A WUSS ABOUT THIS + LICENSE. +1. YOU WILL ONLY SCHMEEVE WITHIN THE + WORK'S DESIRED SCOPE FOR THIS + LICENSE. +2. YOU ACKNOWLEDGE THAT THE DEFINED + SCOPE OF THIS WORK COMES WITH NO + WARRANTY. +3. YOU FROND PROMISE THAT YOU WON'T + SUE IF YOUR COMPUTER EXPLODES + BECAUSE OF THIS PROGRAM. +4. YOU AGREE THAT KARKAT IS THE BEST + HACKER ON ALTERNIA. +5. YOU AGREE THAT BY WRITING IN THE + FORM BELOW, YOU ARE THE RIGHTFUL + OWNER OF THIS WORK. + +WHAT PARTS OF THE WORK DOES THIS DAMNED +LICENSE APPLY TO: + All of it, except /public. +WRITE THE WORK'S NAME HERE: + abtmtr.link + (Version 9, April 2024) +WRITE THE NAME(S) OF THE WORK'S +AUTHOR(S) HERE: + MeowcaTheoRange + +FUCK FUCK FUCK FUCK FUCK FUCK FUCK. \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs index 4678774..e9d0b61 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + trailingSlash: true +}; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 9348fbc..b01a2cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,10 @@ "dependencies": { "next": "14.1.4", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "react-markdown": "^9.0.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.0" }, "devDependencies": { "@types/node": "^20", @@ -167,6 +170,48 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", @@ -179,14 +224,12 @@ "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { "version": "18.2.73", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", - "dev": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -201,6 +244,25 @@ "@types/react": "*" } }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -231,27 +293,374 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -263,6 +672,810 @@ "loose-envify": "cli.js" } }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.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.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -325,6 +1538,41 @@ } } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -357,6 +1605,15 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -380,6 +1637,107 @@ "react": "^18.2.0" } }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -396,6 +1754,15 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -404,6 +1771,27 @@ "node": ">=10.0.0" } }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -426,6 +1814,24 @@ } } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -449,6 +1855,158 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 2357a15..472ed24 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,17 @@ "lint": "next lint" }, "dependencies": { + "next": "14.1.4", "react": "^18", "react-dom": "^18", - "next": "14.1.4" + "react-markdown": "^9.0.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.0" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", - "@types/react-dom": "^18" + "@types/react-dom": "^18", + "typescript": "^5" } } diff --git a/public/88x31/acidicalchemist_neocities_org.gif b/public/88x31/acidicalchemist_neocities_org.gif new file mode 100644 index 0000000..b975fba Binary files /dev/null and b/public/88x31/acidicalchemist_neocities_org.gif differ diff --git a/public/88x31/arimelody_me.gif b/public/88x31/arimelody_me.gif new file mode 100644 index 0000000..6227206 Binary files /dev/null and b/public/88x31/arimelody_me.gif differ diff --git a/public/88x31/esoteric/gnu-linux.gif b/public/88x31/esoteric/gnu-linux.gif new file mode 100644 index 0000000..89e3562 Binary files /dev/null and b/public/88x31/esoteric/gnu-linux.gif differ diff --git a/public/88x31/esoteric/html.gif b/public/88x31/esoteric/html.gif new file mode 100644 index 0000000..dd832a0 Binary files /dev/null and b/public/88x31/esoteric/html.gif differ diff --git a/public/88x31/esoteric/ublock.png b/public/88x31/esoteric/ublock.png new file mode 100644 index 0000000..5ce5191 Binary files /dev/null and b/public/88x31/esoteric/ublock.png differ diff --git a/public/88x31/esoteric/vivaldi.gif b/public/88x31/esoteric/vivaldi.gif new file mode 100644 index 0000000..ba52da7 Binary files /dev/null and b/public/88x31/esoteric/vivaldi.gif differ diff --git a/public/88x31/esoteric/xkcd.gif b/public/88x31/esoteric/xkcd.gif new file mode 100644 index 0000000..f484402 Binary files /dev/null and b/public/88x31/esoteric/xkcd.gif differ diff --git a/public/88x31/freeplay_floof_company.png b/public/88x31/freeplay_floof_company.png new file mode 100644 index 0000000..5fbaf74 Binary files /dev/null and b/public/88x31/freeplay_floof_company.png differ diff --git a/public/88x31/invoxiplaygames_uk.png b/public/88x31/invoxiplaygames_uk.png new file mode 100644 index 0000000..e64f0ab Binary files /dev/null and b/public/88x31/invoxiplaygames_uk.png differ diff --git a/public/88x31/ioletsgo_gay.gif b/public/88x31/ioletsgo_gay.gif new file mode 100644 index 0000000..8edb51c Binary files /dev/null and b/public/88x31/ioletsgo_gay.gif differ diff --git a/public/88x31/jaiden_sh.png b/public/88x31/jaiden_sh.png new file mode 100644 index 0000000..0cf875e Binary files /dev/null and b/public/88x31/jaiden_sh.png differ diff --git a/public/88x31/mae_wtf.png b/public/88x31/mae_wtf.png new file mode 100644 index 0000000..7a30c3d Binary files /dev/null and b/public/88x31/mae_wtf.png differ diff --git a/public/88x31/micro_pages_gay.png b/public/88x31/micro_pages_gay.png new file mode 100644 index 0000000..0c00824 Binary files /dev/null and b/public/88x31/micro_pages_gay.png differ diff --git a/public/88x31/moth_monster.png b/public/88x31/moth_monster.png new file mode 100644 index 0000000..4a8fe10 Binary files /dev/null and b/public/88x31/moth_monster.png differ diff --git a/public/88x31/owenzimmerman_com.png b/public/88x31/owenzimmerman_com.png new file mode 100644 index 0000000..1cdac5b Binary files /dev/null and b/public/88x31/owenzimmerman_com.png differ diff --git a/public/88x31/sneexy_pages_gay.gif b/public/88x31/sneexy_pages_gay.gif new file mode 100644 index 0000000..166ebf4 Binary files /dev/null and b/public/88x31/sneexy_pages_gay.gif differ diff --git a/public/88x31/translunar_academy.png b/public/88x31/translunar_academy.png new file mode 100644 index 0000000..d4df1bf Binary files /dev/null and b/public/88x31/translunar_academy.png differ diff --git a/public/88x31/whois_slipfox_xyz.png b/public/88x31/whois_slipfox_xyz.png new file mode 100644 index 0000000..29e5e90 Binary files /dev/null and b/public/88x31/whois_slipfox_xyz.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..b491051 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/fonts/Lexend Deca/Variable.ttf b/public/fonts/Lexend Deca/Variable.ttf new file mode 100644 index 0000000..e895baf Binary files /dev/null and b/public/fonts/Lexend Deca/Variable.ttf differ diff --git a/public/fonts/Material Symbols/Variable.ttf b/public/fonts/Material Symbols/Variable.ttf new file mode 100644 index 0000000..0a03e21 Binary files /dev/null and b/public/fonts/Material Symbols/Variable.ttf differ diff --git a/public/fonts/OpenDyslexic/Bold.otf b/public/fonts/OpenDyslexic/Bold.otf new file mode 100644 index 0000000..7d074cb Binary files /dev/null and b/public/fonts/OpenDyslexic/Bold.otf differ diff --git a/public/fonts/OpenDyslexic/BoldItalic.otf b/public/fonts/OpenDyslexic/BoldItalic.otf new file mode 100644 index 0000000..41aee2d Binary files /dev/null and b/public/fonts/OpenDyslexic/BoldItalic.otf differ diff --git a/public/fonts/OpenDyslexic/Italic.otf b/public/fonts/OpenDyslexic/Italic.otf new file mode 100644 index 0000000..2b15f8f Binary files /dev/null and b/public/fonts/OpenDyslexic/Italic.otf differ diff --git a/public/fonts/OpenDyslexic/Regular.otf b/public/fonts/OpenDyslexic/Regular.otf new file mode 100644 index 0000000..ebef13c Binary files /dev/null and b/public/fonts/OpenDyslexic/Regular.otf differ diff --git a/public/fonts/Renogare/Regular.otf b/public/fonts/Renogare/Regular.otf new file mode 100644 index 0000000..3e11402 Binary files /dev/null and b/public/fonts/Renogare/Regular.otf differ diff --git a/public/headers/about.png b/public/headers/about.png new file mode 100644 index 0000000..d87888d Binary files /dev/null and b/public/headers/about.png differ diff --git a/public/headers/blog.png b/public/headers/blog.png new file mode 100644 index 0000000..5f2ffba Binary files /dev/null and b/public/headers/blog.png differ diff --git a/public/headers/characters.png b/public/headers/characters.png new file mode 100644 index 0000000..683d834 Binary files /dev/null and b/public/headers/characters.png differ diff --git a/public/headers/gallery.png b/public/headers/gallery.png new file mode 100644 index 0000000..8ea0402 Binary files /dev/null and b/public/headers/gallery.png differ diff --git a/public/headers/links.png b/public/headers/links.png new file mode 100644 index 0000000..8d17c48 Binary files /dev/null and b/public/headers/links.png differ diff --git a/public/headers/oao.png b/public/headers/oao.png new file mode 100644 index 0000000..04f7612 Binary files /dev/null and b/public/headers/oao.png differ diff --git a/public/headers/projects.png b/public/headers/projects.png new file mode 100644 index 0000000..b0ee962 Binary files /dev/null and b/public/headers/projects.png differ diff --git a/public/headers/stories.png b/public/headers/stories.png new file mode 100644 index 0000000..2c33055 Binary files /dev/null and b/public/headers/stories.png differ diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..b721bcf --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,96 @@ +# https://seirdy.one/robots.txt + +User-agent: * +Disallow: /noindex/ +Disallow: /misc/ + +# I opt out of online advertising so malware that injects ads on my site won't get paid. +# You should do the same. my ads.txt file contains a standard placeholder to forbid any +# compliant ad networks from paying for ad placement on my domain. +User-Agent: Adsbot +Disallow: / +Allow: /ads.txt +Allow: /app-ads.txt + +## IP-violation scanners ## + +# The next three are borrowed from https://www.videolan.org/robots.txt + +# > This robot collects content from the Internet for the sole purpose of # helping educational institutions prevent plagiarism. [...] we compare student papers against the content we find on the Internet to see if we # can find similarities. (http://www.turnitin.com/robot/crawlerinfo.html) +# --> fuck off. +User-Agent: TurnitinBot +Disallow: / + +# > NameProtect engages in crawling activity in search of a wide range of brand and other intellectual property violations that may be of interest to our clients. (http://www.nameprotect.com/botinfo.html) +# --> fuck off. +User-Agent: NPBot +Disallow: / + +# iThenticate is a new service we have developed to combat the piracy of intellectual property and ensure the originality of written work for# publishers, non-profit agencies, corporations, and newspapers. (http://www.slysearch.com/) +# --> fuck off. +User-Agent: SlySearch +Disallow: / + +# BLEXBot assists internet marketers to get information on the link structure of sites and their interlinking on the web, to avoid any technical and possible legal issues and improve overall online experience. (http://webmeup-crawler.com/) +# --> fuck off. +User-Agent: BLEXBot +Disallow: / + +# Providing Intellectual Property professionals with superior brand protection services by artfully merging the latest technology with expert analysis. (https://www.checkmarknetwork.com/spider.html/) +# "The Internet is just way to big to effectively police alone." (ACTUAL quote) +# --> fuck off. +User-agent: CheckMarkNetwork/1.0 (+https://www.checkmarknetwork.com/spider.html) +Disallow: / + +# Stop trademark violations and affiliate non-compliance in paid search. Automatically monitor your partner and affiliates’ online marketing to protect yourself from harmful brand violations and regulatory risks. We regularly crawl websites on behalf of our clients to ensure content compliance with brand and regulatory guidelines. (https://www.brandverity.com/why-is-brandverity-visiting-me) +# --> fuck off. +User-agent: BrandVerity/1.0 +Disallow: / + +## Misc. icky stuff ## + +# Pipl assembles online identity information from multiple independent sources to create the most complete picture of a digital identity and connect it to real people and their offline identity records. When all the fragments of online identity data are collected, connected, and corroborated, the result is a more trustworthy identity. +# --> fuck off. +User-agent: PiplBot +Disallow: / + +## Gen-AI data scrapers ## + +# Eat shit, OpenAI. +User-agent: ChatGPT-User +Disallow: / +User-agent: GPTBot +Disallow: / + +# Official way to opt-out of Google's generative AI training: +# +User-agent: Google-Extended +Disallow: / + +# There isn't any public documentation for this AFAICT. +# Reuters thinks this works so I might as well give it a shot. +User-agent: anthropic-ai +Disallow: / +User-agent: Claude-Web +Disallow: / + +# FacebookBot crawls public web pages to improve language models for our speech recognition technology. +# +User-Agent: FacebookBot +Disallow: / + +# I'm not blocking CCBot for now. It publishes a free index for anyone to use. +# Googe used this to train the initial version of Bard (now called Gemini). +# I allow CCBot since its index is also used for upstart/hobbyist search engines +# like Alexandria and for genuinely useful academic work I personally like. +# I allow Owler for similar reasons: +# +# . +# Omgilibot/Omgili is similar to CCBot, except it sells the scrape results. +# I'm not familiar enough with Omgili to make a call here. +# In the long run, my embedded robots meta-tags and headers could cover gen-AI + +# I don't block cohere-ai or Perplexitybot: they don't appear to actually scrape data for LLM training purposes. The crawling powers search engines with integrated pre-trained LLMs. +# TODO: investigate whether YouBot scrapes to train its own in-house LLM. + +Sitemap: https://seirdy.one/sitemap.xml \ No newline at end of file diff --git a/public/sfx/s_alternative.mp3 b/public/sfx/s_alternative.mp3 new file mode 100644 index 0000000..bf19cfc Binary files /dev/null and b/public/sfx/s_alternative.mp3 differ diff --git a/public/sfx/s_busy.mp3 b/public/sfx/s_busy.mp3 new file mode 100644 index 0000000..c4b78eb Binary files /dev/null and b/public/sfx/s_busy.mp3 differ diff --git a/public/sfx/s_happy.mp3 b/public/sfx/s_happy.mp3 new file mode 100644 index 0000000..33f7d96 Binary files /dev/null and b/public/sfx/s_happy.mp3 differ diff --git a/public/sfx/s_hover.mp3 b/public/sfx/s_hover.mp3 new file mode 100644 index 0000000..b43f6d2 Binary files /dev/null and b/public/sfx/s_hover.mp3 differ diff --git a/public/sfx/s_impossible.mp3 b/public/sfx/s_impossible.mp3 new file mode 100644 index 0000000..0997c60 Binary files /dev/null and b/public/sfx/s_impossible.mp3 differ diff --git a/public/sfx/s_notice.mp3 b/public/sfx/s_notice.mp3 new file mode 100644 index 0000000..d900029 Binary files /dev/null and b/public/sfx/s_notice.mp3 differ diff --git a/public/sfx/s_open.mp3 b/public/sfx/s_open.mp3 new file mode 100644 index 0000000..dd474db Binary files /dev/null and b/public/sfx/s_open.mp3 differ diff --git a/public/sfx/s_possible_alt.mp3 b/public/sfx/s_possible_alt.mp3 new file mode 100644 index 0000000..9a8587d Binary files /dev/null and b/public/sfx/s_possible_alt.mp3 differ diff --git a/public/sfx/s_sad.mp3 b/public/sfx/s_sad.mp3 new file mode 100644 index 0000000..bfef481 Binary files /dev/null and b/public/sfx/s_sad.mp3 differ diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/welcome.png b/public/welcome.png new file mode 100644 index 0000000..00bf5e2 Binary files /dev/null and b/public/welcome.png differ diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx new file mode 100644 index 0000000..239ce55 --- /dev/null +++ b/src/app/about/page.tsx @@ -0,0 +1,17 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; + +export default async function Home() { + return ( + + ABOUT +

abtmtr.link

+

Created by MeowcaTheoRange

+

Licensed under the Karkat Public License (KKPL) v2.2.

+

Renogare font by Graphite

+

Lexend Deca font from Google Fonts

+
+ ) +} \ No newline at end of file diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..06f209c --- /dev/null +++ b/src/app/blog/[slug]/page.tsx @@ -0,0 +1,27 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import { notFound } from "next/navigation"; +import Markdown from 'react-markdown'; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + params +}:{ + params: { + slug: string + } +}) { + const blog = await fetch(`https://blog.abtmtr.link/api/collections/mtr/posts/${params.slug}`).then(x=>x.json()); + if (blog.data == null) + return notFound(); + return ( + +

{blog.data.title}

+

Posted {new Date(blog.data.created).toLocaleString()} - {blog.data.views} views

+
+ {blog.data.body} +
+
+ ) +} diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx new file mode 100644 index 0000000..b589201 --- /dev/null +++ b/src/app/blog/page.tsx @@ -0,0 +1,57 @@ +import { ConditionalNull } from "@/components/utility/Conditional"; +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; +import { notFound } from "next/navigation"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + searchParams +}: { + searchParams: { + page: string + } +}) { + const curPage = parseInt(searchParams?.page) || 1; + + const blogs = await fetch(`https://blog.abtmtr.link/api/collections/mtr/posts?page=${curPage}`).then(x=>x.json()); + return ( + + BLOG + {blogs.data.posts.map((post:{ + title: string, + body: string, + created: string, + updated: string, + tags: string[], + views: number, + slug: string + }) => ( +
+

{post.title}

+

Posted {new Date(post.created).toLocaleString()} - {post.views} views

+ + {post.body.split("\n").slice(0, 2).join("\n")} + +
+ ))} +

+ 1}> + Previous + + {" "} + + Next + +

+
+ ) +} diff --git a/src/app/characters/[slug]/page.tsx b/src/app/characters/[slug]/page.tsx new file mode 100644 index 0000000..c0aa0f1 --- /dev/null +++ b/src/app/characters/[slug]/page.tsx @@ -0,0 +1,94 @@ +import { ConditionalNull } from "@/components/utility/Conditional"; +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import { HeightConverter } from "@/lib/utility/language"; +import Link from "next/link"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; +import styles from "../style.module.css"; +import { notFound } from "next/navigation"; + +export default async function Home({ + params +}: { + params: { + slug: string + } +}) { + const charblogs = await fetch(`https://blog.abtmtr.link/api/collections/characters/posts/${params.slug}`).then(x=>x.json()); + + if (charblogs.data == null) return notFound(); + + const character:{ + id: string, + name: string, + description?: string[], + picture: string, + gender: string, + pronunciation: string, + pronouns: string, + spec?: string, + species: string, + age: number, + height: number, + relationships: { + id: string, + status: string, + }[] + } = JSON.parse(charblogs.data.body.replace(/[“”]/g, "\"")); + const images = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts/${character.picture}`).then(x=>x.json()); + + // // REQSPAMMER + // let allPosts = []; + // let currentPage = 1; + + // const initReq = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts`).then(x=>x.json()); + // const totalPosts:number = initReq.data.total_posts; + + // while (currentPage * 10 < totalPosts) { + // const newPostList = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts?page=${currentPage}`).then(x=>x.json()); + // allPosts.push(...newPostList.data.posts); + + // currentPage++; + // } + + // const myPosts = allPosts.filter(post => post.tags?.includes(character.id)); + + return ( + +
+ +

{character.name}

+ {character.pronunciation} + +

Spec: #{character.spec}

+
+

{character.pronouns}, {character.age}

+

{character.species}, {character.gender}, {HeightConverter(character.height)}

+ + {`*${character.description?.join("\n")}*`} + +
+

Gallery

+

Feature coming soon...

+ {/*
+ {myPosts.map(async (img:{ + slug: string, + title: string, + created: string, + images: string[] + }) => { + return ( + +
+

{img.title}

+

{new Date(img.created).toLocaleDateString()}

+
+ + ); + })} +
*/} +
+ ) +} \ No newline at end of file diff --git a/src/app/characters/page.tsx b/src/app/characters/page.tsx new file mode 100644 index 0000000..759db10 --- /dev/null +++ b/src/app/characters/page.tsx @@ -0,0 +1,66 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import styles from "./style.module.css"; +import Link from "next/link"; +import { ConditionalNull } from "@/components/utility/Conditional"; + +export default async function Home({ + searchParams +}: { + searchParams: { + page: string + } +}) { + const curPage = parseInt(searchParams?.page) || 1; + + const charblogs = await fetch(`https://blog.abtmtr.link/api/collections/characters/posts?page=${curPage}`).then(x=>x.json()); + const characters = charblogs.data.posts.map((post:{body:string}) => JSON.parse(post.body.replace(/[“”]/g, "\""))); + + return ( + + CHARACTERS +
+ {characters.map(async (character:{ + id: string, + name: string, + description?: string[], + picture: string, + gender: string, + pronunciation: string, + pronouns: string, + spec?: string, + species: string, + age: number, + height: number, + relationships: { + id: string, + status: string, + }[] + }) => { + const charblogs = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts/${character.picture}`).then(x=>x.json()); + console.log(charblogs?.data?.images?.[0]); + return ( + +
+

{character.name}

+

{character.pronouns}

+
+ + ); + })} +
+

+ 1}> + Previous + + {" "} + + Next + +

+
+ ) +} \ No newline at end of file diff --git a/src/app/characters/style.module.css b/src/app/characters/style.module.css new file mode 100644 index 0000000..ab7940b --- /dev/null +++ b/src/app/characters/style.module.css @@ -0,0 +1,18 @@ +.CharacterContainerGrid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + margin: 16px 0; +} + +.CharacterContainerLink { + color: white; + text-decoration: none; +} + +.CharacterContainer { + aspect-ratio: 1/1; + overflow: hidden; + padding: 16px; + background-size: cover; +} \ No newline at end of file diff --git a/src/app/favicon.ico b/src/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/src/app/favicon.ico and /dev/null differ diff --git a/src/app/gallery/[slug]/page.tsx b/src/app/gallery/[slug]/page.tsx new file mode 100644 index 0000000..26b4eb3 --- /dev/null +++ b/src/app/gallery/[slug]/page.tsx @@ -0,0 +1,27 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import { notFound } from "next/navigation"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + params +}:{ + params: { + slug: string + } +}) { + const blog = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts/${params.slug}`).then(x=>x.json()); + if (blog.data == null) + return notFound(); + return ( + +

{blog.data.title}

+

Posted {new Date(blog.data.created).toLocaleString()} - {blog.data.views} views

+
+ {blog.data.body} +
+
+ ) +} diff --git a/src/app/gallery/page.tsx b/src/app/gallery/page.tsx new file mode 100644 index 0000000..c5e979e --- /dev/null +++ b/src/app/gallery/page.tsx @@ -0,0 +1,56 @@ +import { ConditionalNull } from "@/components/utility/Conditional"; +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + searchParams +}: { + searchParams: { + page: string + } +}) { + const curPage = parseInt(searchParams?.page) || 1; + + const blogs = await fetch(`https://img.abtmtr.link/api/collections/mtr/posts?page=${curPage}`).then(x=>x.json()); + return ( + + GALLERY + {blogs.data.posts.map((post:{ + title: string, + body: string, + created: string, + updated: string, + tags: string[], + views: number, + slug: string + }) => ( +
+

{post.title}

+

Posted {new Date(post.created).toLocaleString()} - {post.views} views

+ + {post.body.split("\n").slice(0, 2).join("\n")} + +
+ ))} +

+ 1}> + Previous + + {" "} + + Next + +

+
+ ) +} diff --git a/src/app/globals.css b/src/app/globals.css deleted file mode 100644 index f4bd77c..0000000 --- a/src/app/globals.css +++ /dev/null @@ -1,107 +0,0 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", - "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", - "Fira Mono", "Droid Sans Mono", "Courier New", monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient( - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0) - ); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3314e47..c9d68bb 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,12 +1,13 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; -import "./globals.css"; +import localFont from "next/font/local"; +import "@/styles/style.css"; -const inter = Inter({ subsets: ["latin"] }); +const lexendDeca = localFont({ src: "../../public/fonts/Lexend Deca/Variable.ttf"}); +const materialSymbols = localFont({ src: "../../public/fonts/Material Symbols/Variable.ttf"}); +const renogare = localFont({ src: "../../public/fonts/Renogare/Regular.otf"}); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "abtmtr.link", }; export default function RootLayout({ @@ -15,8 +16,12 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - {children} + + {children} ); } diff --git a/src/app/links/page.tsx b/src/app/links/page.tsx new file mode 100644 index 0000000..e122d44 --- /dev/null +++ b/src/app/links/page.tsx @@ -0,0 +1,22 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; + +export default async function Home() { + const data = await fetch("https://pronouns.cc/api/v1/users/mtr").then(x=>x.json()); + + return ( + + LINKS + {data.links.map((link:string) => ( +
+

{new URL(link).host}

+

{link}

+
+ ))} +
+ ) +} \ No newline at end of file diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx new file mode 100644 index 0000000..d873fd9 --- /dev/null +++ b/src/app/not-found.tsx @@ -0,0 +1,9 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; + +export default function NotFound() { + return ( + +

Page not found.

+
+ ); +} \ No newline at end of file diff --git a/src/app/oao/page.tsx b/src/app/oao/page.tsx new file mode 100644 index 0000000..fd686d2 --- /dev/null +++ b/src/app/oao/page.tsx @@ -0,0 +1,28 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; + +export default async function Home() { + return ( + + OPINIONS & OBJECTIONS +

As a sentient, living being with thoughts, I have opinions on certain things. Here are mine.

+
    +
  • +

    + I don't mind Chromium-based browsers. Google is evil, sure, but I think it's good to design for what's popular. Plus, I like using Vivaldi over Firefox. + Vivaldi crashes less (except when I open a private tab for some reason), works smoothly, is incredibly customizable, and even though it's not open source, the community is small enough where I can get a reasonable amount of dynamic contact with the creators/maintainers. +

    +

    Really, it's all a matter of personal opinion. (oh my gosh like the page name !!!)

    +
  • +
  • +

    + I do mind it when people don't put a CW certain things. USpol, lewdness, that kind of thing. +

    +
  • +
+

More may be coming soon.

+
+ ) +} \ No newline at end of file diff --git a/src/app/page.module.css b/src/app/page.module.css deleted file mode 100644 index 5c4b1e6..0000000 --- a/src/app/page.module.css +++ /dev/null @@ -1,230 +0,0 @@ -.main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - padding: 6rem; - min-height: 100vh; -} - -.description { - display: inherit; - justify-content: inherit; - align-items: inherit; - font-size: 0.85rem; - max-width: var(--max-width); - width: 100%; - z-index: 2; - font-family: var(--font-mono); -} - -.description a { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; -} - -.description p { - position: relative; - margin: 0; - padding: 1rem; - background-color: rgba(var(--callout-rgb), 0.5); - border: 1px solid rgba(var(--callout-border-rgb), 0.3); - border-radius: var(--border-radius); -} - -.code { - font-weight: 700; - font-family: var(--font-mono); -} - -.grid { - display: grid; - grid-template-columns: repeat(4, minmax(25%, auto)); - max-width: 100%; - width: var(--max-width); -} - -.card { - padding: 1rem 1.2rem; - border-radius: var(--border-radius); - background: rgba(var(--card-rgb), 0); - border: 1px solid rgba(var(--card-border-rgb), 0); - transition: background 200ms, border 200ms; -} - -.card span { - display: inline-block; - transition: transform 200ms; -} - -.card h2 { - font-weight: 600; - margin-bottom: 0.7rem; -} - -.card p { - margin: 0; - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - max-width: 30ch; - text-wrap: balance; -} - -.center { - display: flex; - justify-content: center; - align-items: center; - position: relative; - padding: 4rem 0; -} - -.center::before { - background: var(--secondary-glow); - border-radius: 50%; - width: 480px; - height: 360px; - margin-left: -400px; -} - -.center::after { - background: var(--primary-glow); - width: 240px; - height: 180px; - z-index: -1; -} - -.center::before, -.center::after { - content: ""; - left: 50%; - position: absolute; - filter: blur(45px); - transform: translateZ(0); -} - -.logo { - position: relative; -} -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - .card:hover { - background: rgba(var(--card-rgb), 0.1); - border: 1px solid rgba(var(--card-border-rgb), 0.15); - } - - .card:hover span { - transform: translateX(4px); - } -} - -@media (prefers-reduced-motion) { - .card:hover span { - transform: none; - } -} - -/* Mobile */ -@media (max-width: 700px) { - .content { - padding: 4rem; - } - - .grid { - grid-template-columns: 1fr; - margin-bottom: 120px; - max-width: 320px; - text-align: center; - } - - .card { - padding: 1rem 2.5rem; - } - - .card h2 { - margin-bottom: 0.5rem; - } - - .center { - padding: 8rem 0 6rem; - } - - .center::before { - transform: none; - height: 300px; - } - - .description { - font-size: 0.8rem; - } - - .description a { - padding: 1rem; - } - - .description p, - .description div { - display: flex; - justify-content: center; - position: fixed; - width: 100%; - } - - .description p { - align-items: center; - inset: 0 0 auto; - padding: 2rem 1rem 1.4rem; - border-radius: 0; - border: none; - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient( - to bottom, - rgba(var(--background-start-rgb), 1), - rgba(var(--callout-rgb), 0.5) - ); - background-clip: padding-box; - backdrop-filter: blur(24px); - } - - .description div { - align-items: flex-end; - pointer-events: none; - inset: auto 0 0; - padding: 2rem; - height: 200px; - background: linear-gradient( - to bottom, - transparent 0%, - rgb(var(--background-end-rgb)) 40% - ); - z-index: 1; - } -} - -/* Tablet and Smaller Desktop */ -@media (min-width: 701px) and (max-width: 1120px) { - .grid { - grid-template-columns: repeat(2, 50%); - } -} - -@media (prefers-color-scheme: dark) { - .vercelLogo { - filter: invert(1); - } - - .logo { - filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); - } -} - -@keyframes rotate { - from { - transform: rotate(360deg); - } - to { - transform: rotate(0deg); - } -} diff --git a/src/app/page.tsx b/src/app/page.tsx index d2c63a4..5dd49a8 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,95 +1,133 @@ -import Image from "next/image"; -import styles from "./page.module.css"; +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; +import buttons from "@/buttons.json"; -export default function Home() { +export default async function Home() { + const data = await fetch("https://pronouns.cc/api/v1/users/mtr").then(x=>x.json()); + const domainreq = await fetch("https://blog.abtmtr.link/api/collections/paste/posts/domain") + .then(x=>x.json()); + const domains = JSON.parse(domainreq?.data?.body.replace(/[“”]/g, "\"")) ?? []; + + const goodNames = data.names.filter((x:{status:string})=>x.status == "okay"); return ( -
-
-

- Get started by editing  - src/app/page.tsx -

-
- - By{" "} - Vercel Logo - + + WELCOME! Enjoy your stay at abtmtr.link! +

abtmtr.link is a domain for a suite of services, ranging from micro-blogging to web search.

+

I'm {goodNames[0].value}, otherwise known as {goodNames.slice(1).map((name:{value:string}, idx:number) => ( + idx == goodNames.length - 2 ? (<>or {name.value}) : (<>{name.value}{goodNames.length <= 2 ? ", " : " "}) + ))}.

+

It proves very useful for anything and everything that I want to do. It also tends to provide service for others when they need it.

+

Subdomains

+ {domains.map((domain:{ + name: string, + description: string[], + url: string, + src: string + }) => ( +
+

{domain.name}

+

{domain.description.join("\n")}

-
- -
- Next.js Logo -
- - -
- ); + ))} +
{buttons.map((button) => ( + + {button.alt} + + ))}
+ + ) } + +/* +{ + "id": "clhd8desmggedm3q1t3g", + "id_new": "251576323070604865", + "sid": "qftsk", + "name": "mtr", + "display_name": "abtmtr.link: FURRY REVOLUTION", + "bio": "https://abtmtr.link/\nminor (16)\nabtmtr.link sysadmin\n🇩🇴 & 🏳️‍⚧️-ish & pluralflux ND 󠁛󠀣󠀰󠀰󠀰󠀰󠀰󠀰󠀬󠀣󠁦󠁦󠀴󠀰󠀰󠀰󠁝", + "member_title": "Managers", + "avatar": "dfa7038db301508df749772f07ae9302fb0b9d71dff6770f9a6fefb6cf16f2e3", + "links": [ + "https://last.fm/user/MeowcaTheoRange", + "https://liberapay.com/abtmtr.link/", + "https://beta.trollcall.xyz/clan/meowcatheorange", + "https://movie-web.app/", + "https://picrew.me/en/image_maker/92646", + "https://pronouns.cc/@mtr" + ], + "names": [ + { + "value": "MeowcaTheoRange", + "status": "okay" + }, + { + "value": "abtmtr.link", + "status": "okay" + }, + { + "value": "Theo", + "status": "okay" + } + ], + "pronouns": [ + { + "pronouns": "[any]", + "display_text": null, + "status": "okay" + } + ], + "members": [ + { + "id": "cng1h37m985pb3k8ohe0", + "id_new": "286009441537261082", + "sid": "shdvoo", + "name": "MeowcaTheoRange", + "display_name": "MeowcaTheoRange", + "bio": "totality in association.", + "avatar": "a686a0bfeeb19ce6591a3bef6bb0f4ff38586f0d75b857cb21c3d86ae42b39e4", + "links": [ + + ], + "names": [ + { + "value": "Theo", + "status": "okay" + }, + { + "value": "Thea", + "status": "okay" + } + ], + "pronouns": [ + { + "pronouns": "[any]", + "display_text": null, + "status": "okay" + } + ] + } + ], + "fields": [ + + ], + "custom_preferences": { + + }, + "flags": [ + + ], + "badges": 0, + "utc_offset": -18000 +} +*/ \ No newline at end of file diff --git a/src/app/projects/item/[slug]/page.tsx b/src/app/projects/item/[slug]/page.tsx new file mode 100644 index 0000000..b387b57 --- /dev/null +++ b/src/app/projects/item/[slug]/page.tsx @@ -0,0 +1,17 @@ +import { notFound, redirect, RedirectType } from "next/navigation"; + +export default async function Home({ + params +}:{ + params: { + slug: string + } +}) { + const projects = await fetch("https://projects.abtmtr.link/projects.json").then(x=>x.json()); + + const curProject = projects.items.find((x:{url:string}) => x.url.includes("projects.abtmtr.link/item/" + params.slug)); + + if (curProject) + return redirect(curProject.url, RedirectType.replace); + return notFound(); +} diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx new file mode 100644 index 0000000..b920a54 --- /dev/null +++ b/src/app/projects/page.tsx @@ -0,0 +1,30 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home() { + const projects = await fetch("https://projects.abtmtr.link/projects.json").then(x=>x.json()); + return ( + + PROJECTS + {projects.items.map((project:{ + name: string, + date: number, + description: string[], + url: string, + hotlink?: boolean + }) => ( +
+

{project.name}

+

Hosted on {new URL(project.url).host} - Created {new Date(project.date).toLocaleDateString()}

+ {project.description.join("\n")} +
+ ))} +
+ ) +} diff --git a/src/app/stories/[slug]/page.tsx b/src/app/stories/[slug]/page.tsx new file mode 100644 index 0000000..150a327 --- /dev/null +++ b/src/app/stories/[slug]/page.tsx @@ -0,0 +1,27 @@ +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import { notFound } from "next/navigation"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + params +}:{ + params: { + slug: string + } +}) { + const blog = await fetch(`https://blog.abtmtr.link/api/collections/stories/posts/${params.slug}`).then(x=>x.json()); + if (blog.data == null) + return notFound(); + return ( + +

{blog.data.title}

+

Posted {new Date(blog.data.created).toLocaleString()} - {blog.data.views} views

+
+ {blog.data.body} +
+
+ ) +} diff --git a/src/app/stories/page.tsx b/src/app/stories/page.tsx new file mode 100644 index 0000000..da8dcf8 --- /dev/null +++ b/src/app/stories/page.tsx @@ -0,0 +1,55 @@ +import { ConditionalNull } from "@/components/utility/Conditional"; +import { MainLayout } from "@/layout/MainLayout/MainLayout"; +import Link from "next/link"; +import Markdown from "react-markdown"; +import rehypeRaw from "rehype-raw"; + +export default async function Home({ + searchParams +}: { + searchParams: { + page: string + } +}) { + const curPage = parseInt(searchParams?.page) || 1; + const blogs = await fetch(`https://blog.abtmtr.link/api/collections/stories/posts?page=${curPage}`).then(x=>x.json()); + return ( + + STORIES + {blogs.data.posts.map((post:{ + title: string, + body: string, + created: string, + updated: string, + tags: string[], + views: number, + slug: string + }) => ( +
+

{post.title}

+

Posted {new Date(post.created).toLocaleString()} - {post.views} views

+ + {post.body.split("\n").slice(0, 2).join("\n")} + +
+ ))} +

+ 1}> + Previous + + {" "} + + Next + +

+
+ ) +} diff --git a/src/buttons.json b/src/buttons.json new file mode 100644 index 0000000..bbae06b --- /dev/null +++ b/src/buttons.json @@ -0,0 +1,92 @@ +[ + { + "href": "https://jaiden.sh/", + "img": "/88x31/jaiden_sh.png", + "alt": "jaiden.sh" + }, + { + "href": "https://owenzimmerman.com/", + "img": "/88x31/owenzimmerman_com.png", + "alt": "owenzimmerman.com" + }, + { + "href": "https://acidicalchemist.neocities.org/", + "img": "/88x31/acidicalchemist_neocities_org.gif", + "alt": "acidicalchemist.neocities.org" + }, + { + "href": "https://arimelody.me/", + "img": "/88x31/arimelody_me.gif", + "alt": "arimelody.me" + }, + { + "href": "https://freeplay.floof.company/", + "img": "/88x31/freeplay_floof_company.png", + "alt": "freeplay.floof.company" + }, + { + "href": "https://invoxiplaygames.uk/", + "img": "/88x31/invoxiplaygames_uk.png", + "alt": "invoxiplaygames.uk" + }, + { + "href": "https://ioletsgo.gay/", + "img": "/88x31/ioletsgo_gay.gif", + "alt": "ioletsgo.gay" + }, + { + "href": "https://mae.wtf/", + "img": "/88x31/mae_wtf.png", + "alt": "mae.wtf" + }, + { + "href": "https://micro.pages.gay/", + "img": "/88x31/micro_pages_gay.png", + "alt": "micro.pages.gay" + }, + { + "href": "https://sneexy.pages.gay/", + "img": "/88x31/sneexy_pages_gay.gif", + "alt": "sneexy.pages.gay" + }, + { + "href": "https://whois.slipfox.xyz/", + "img": "/88x31/whois_slipfox_xyz.png", + "alt": "whois.slipfox.xyz" + }, + { + "href": "https://moth.monster/", + "img": "/88x31/moth_monster.png", + "alt": "moth.monster" + }, + { + "href": "https://translunar.academy/", + "img": "/88x31/translunar_academy.png", + "alt": "translunar.academy" + }, + { + "href": "https://ultramarine-linux.org/", + "img": "/88x31/esoteric/gnu-linux.gif", + "alt": "Made on GNU/Linux" + }, + { + "href": "https://abtmtr.link/projects/item/normalize", + "img": "/88x31/esoteric/html.gif", + "alt": " - Learn it today!" + }, + { + "href": "https://vivaldi.com", + "img": "/88x31/esoteric/vivaldi.gif", + "alt": "I use Vivaldi" + }, + { + "href": "https://ublockorigin.com", + "img": "/88x31/esoteric/ublock.png", + "alt": "uBlock Origin Now!" + }, + { + "href": "https://channelstore.roku.com/details/7da3fa0c2209746730df8a4e21e83b02", + "img": "/88x31/esoteric/xkcd.gif", + "alt": "xkcd" + } +] \ No newline at end of file diff --git a/src/components/utility/Conditional/index.tsx b/src/components/utility/Conditional/index.tsx new file mode 100644 index 0000000..2765ec5 --- /dev/null +++ b/src/components/utility/Conditional/index.tsx @@ -0,0 +1,35 @@ +import React from "react"; + +export function Conditional({ + condition, + truthy, + falsy +}:{ + condition: boolean, + truthy: React.ReactNode, + falsy: React.ReactNode +}) { + return condition ? truthy : falsy; +} + +export function ConditionalNull({ + condition, + children +}:{ + condition: boolean, + children: React.ReactNode, +}) { + return condition ? children : <>; +} + +export function ConditionalParent({ + condition, + parent, + children +}:{ + condition: boolean, + parent: (childNode:React.ReactNode) => React.ReactNode, + children: React.ReactNode +}) { + return condition ? parent(children) : children; +} diff --git a/src/layout/MainLayout/Desktop.tsx b/src/layout/MainLayout/Desktop.tsx new file mode 100644 index 0000000..2462171 --- /dev/null +++ b/src/layout/MainLayout/Desktop.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { ConditionalNull } from "@/components/utility/Conditional"; +import { useState } from "react"; +import styles from "./MainLayout.module.css"; +import { useRouter } from "next/navigation"; + +export function Desktop({ + title, + subtitle, + backButton = false, + children, + sidebar +}:{ + title: string, + subtitle?: string, + backButton?: boolean, + children: React.ReactNode, + sidebar: React.ReactNode +}) { + const [menuOpen, setMenuOpen] = useState(false); + const router = useRouter(); + + return ( +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+

{title}

+ {subtitle} +
+
+
+
+ {children} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/layout/MainLayout/MainLayout.module.css b/src/layout/MainLayout/MainLayout.module.css new file mode 100644 index 0000000..9749ad7 --- /dev/null +++ b/src/layout/MainLayout/MainLayout.module.css @@ -0,0 +1,186 @@ +@keyframes slidein { + 0% { + position: relative; + top: 10px; + opacity: 0; + } + + 99% { + position: relative; + top: 0; + opacity: 1; + } + + 100% { + position: static; + top: unset; + } +} + +@keyframes slidein_header { + 0% { + position: relative; + left: -10px; + opacity: 0; + } + + 99% { + position: relative; + left: 0; + opacity: 1; + } + + 100% { + position: static; + top: unset; + } +} + +.MainLayout { + width: 100vw; + max-width: 100vw; + height: 100vh; + max-height: 100vh; + margin: 0; + padding: 0; + + overflow: hidden; + display: grid; + grid-template-columns: 256px 1fr; +} + +.MainLayout_Aside { + padding: 4px 16px; + background-color: var(--bg-1); + color: var(--fg-1); + border-right: 1px solid var(--neutral); +} + +.MainLayout_Inner { + max-width: 100%; + max-height: 100%; + + overflow: hidden; + + display: grid; + grid-template-rows: 48px auto; +} + +.MainLayout_Inner_Header { + padding: 6px 16px; + background-color: var(--bg-2); + color: var(--fg-2); + border-bottom: 1px solid var(--neutral); + + display: grid; + grid-template-columns: auto; + gap: 8px; + align-items: center; +} + +.MainLayout_Inner_Header>* { + animation-duration: 0.25s; + animation-name: slidein_header; +} + +.MainLayout_Inner_Header.Modifier_Back { + padding: 6px 8px; + grid-template-columns: 32px auto; +} + +.MainLayout_Inner_Header_Back_Button { + font-family: var(--font-MaterialSymbols); + font-size: 24px; + width: 32px; + height: 32px; +} + +.MainLayout_Inner_Header_Menu { + display: none; +} + +.MainLayout_Inner_Header_Title { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + align-content: center; +} + +.MainLayout_Inner_Header_Title h1 { + margin: 0; + vertical-align: middle; + font-size: 1em; +} + +.MainLayout_Inner_Header_Title span { + margin: 0; + vertical-align: middle; + font-size: 0.75em; +} + +.MainLayout_Inner_Main { + display: inline-block; + background-color: var(--bg-1); + color: var(--fg-1); + width: 100%; + + overflow: hidden; + overflow-y: auto; + text-align: center; + position: relative; +} + +.MainLayout_Inner_Main_Content { + display: inline-block; + text-align: left; + overflow: hidden; + background-color: var(--bg-2); + color: var(--fg-2); + padding: 0 16px; + max-width: 50em; + width: 100%; + min-height: 100%; + margin-bottom: -4px; + + /* border-left: 1px solid var(--neutral); + border-right: 1px solid var(--neutral); */ +} + +.MainLayout_Inner_Main_Content>* { + animation-duration: 0.25s; + animation-name: slidein; +} + +.MainLayout_Inner_Main_Content img { + max-width: 100%; +} + +@media screen and (max-width: 800px) { + .MainLayout { + grid-template-columns: 1fr; + } + + .MainLayout_Aside { + position: absolute; + height: calc(100% - 48px); + width: 100%; + top: 48px; + z-index: 50; + left: -100%; + transition: left 0.125s; + } + + .MainLayout_Inner_Header_Menu { + display: inline-block; + } + + .MainLayout_Inner_Header { + padding: 6px 8px; + grid-template-columns: 32px auto; + } + + .MainLayout_Aside.Modifier_Open { + left: 0; + } +} \ No newline at end of file diff --git a/src/layout/MainLayout/MainLayout.tsx b/src/layout/MainLayout/MainLayout.tsx new file mode 100644 index 0000000..8710773 --- /dev/null +++ b/src/layout/MainLayout/MainLayout.tsx @@ -0,0 +1,22 @@ +import { SidebarMain } from "./Sidebar/Main/Main"; +import { Desktop } from "./Desktop"; + +export function MainLayout({ + title, + subtitle, + backButton = false, + children, + sidebar, + currentPage +}:{ + title: string, + subtitle?: string, + backButton?: boolean, + children: React.ReactNode, + sidebar?: React.ReactNode, + currentPage: string +}) { + return (<> + {children} + ) +} \ No newline at end of file diff --git a/src/layout/MainLayout/Sidebar/Main/Main.module.css b/src/layout/MainLayout/Sidebar/Main/Main.module.css new file mode 100644 index 0000000..fb7670e --- /dev/null +++ b/src/layout/MainLayout/Sidebar/Main/Main.module.css @@ -0,0 +1,26 @@ +.Main_Image { + text-align: center; + margin: 16px 0; +} + +.Main_Image img { + border-radius: 8px; +} + +.Main_List { + display: flex; + flex-direction: column; + gap: 8px; +} + +.Main_List_CurrentLink button { + background-color: var(--bg-2); +} + +.Main_List_Button { + transition: scale 0.0625s; +} + +.Main_List_Button:active { + scale: 0.95; +} \ No newline at end of file diff --git a/src/layout/MainLayout/Sidebar/Main/Main.tsx b/src/layout/MainLayout/Sidebar/Main/Main.tsx new file mode 100644 index 0000000..817b5ad --- /dev/null +++ b/src/layout/MainLayout/Sidebar/Main/Main.tsx @@ -0,0 +1,58 @@ +import Link from "next/link"; +import styles from "./Main.module.css"; + +export function SidebarMain({currentPage}:{currentPage:string}) { + return <> +

abtmtr.link

+ {/*
+ +
*/} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +} \ No newline at end of file diff --git a/src/lib/utility/LanguageUtils.ts b/src/lib/utility/LanguageUtils.ts new file mode 100644 index 0000000..e520615 --- /dev/null +++ b/src/lib/utility/LanguageUtils.ts @@ -0,0 +1,12 @@ +export class LanguageUtils_ENG { + static possess(owner: string, possession: string) { + return owner + (owner.endsWith("s") ? "'" : "'s") + " " + possession; + } + static pluralize(string: string) { + if (string.match(/(?:s|ch|sh|x|z|[^aeiou]o)$/)) return string + "es"; + else if (string.match(/[aeiou](?:y|o)$/)) return string + "s"; + else if (string.match(/[^aeiou]y$/)) return string.slice(0, -1) + "ies"; + else if (string.match(/(?:f|fe)$/)) return string.slice(0, -1) + "ves"; + else return string + "s"; + } +} diff --git a/src/lib/utility/TypeUtils.ts b/src/lib/utility/TypeUtils.ts new file mode 100644 index 0000000..77397e7 --- /dev/null +++ b/src/lib/utility/TypeUtils.ts @@ -0,0 +1,47 @@ +export class ArrayUtils { + static pick(array: T[]): T { + return array[Math.round(Math.random() * (array.length - 1))]; + } + static pickMultiple(array: T[], amount: number): T[] { + return array.toSorted(() => 0.5 - Math.random()).slice(0, amount); + } +} + +export class NumberUtils { + static clamp(number: number, min: number, max: number) { + return Math.max(min, Math.min(number, max)); + } + static isBetween(number: number, min: number, max: number) { + return number >= min && number <= max; + } + static pickRandom(min: number, max: number) { + return min + (Math.random() * (max - min)); + } +} + +export class StringUtils { + static truncate(string: string, length: number) { + if (string.length <= length) { + return string; + } else { + return string.slice(0, length - 3) + "..."; + } + } +} + +export class ObjectUtils { + static isObject(object: any) { + if (object == null) return false; + return object.constructor === Object; + } + + static isEmpty(object: any) { + return Object.keys(object).length === 0; + } + + static navigatePath(object: any, path: string) { + return path.split(".").reduce((objnav: any, pathseg: string) => { + return objnav[pathseg]; + }, object); + } +} diff --git a/src/lib/utility/language.ts b/src/lib/utility/language.ts new file mode 100644 index 0000000..5f03a2e --- /dev/null +++ b/src/lib/utility/language.ts @@ -0,0 +1,62 @@ +export function AdaptivePossessive(owner: string, possession: string) { + return owner + (owner.endsWith("s") ? "'" : "'s") + " " + possession; +} + +export function PronounGrouper( + pronouns: [string, string, string][], + sep?: string, + amount?: number +) { + if (pronouns.length > 1) + return pronouns.map(pronounSet => pronounSet[0]).join("/"); + else return pronouns[0].slice(0, amount ?? 2).join(sep ?? "/"); +} + +export function HeightConverter(inches: number) { + var feetandinches = Math.floor(inches / 12) + "'" + (inches % 12) + '"'; + var meters = Math.floor((inches / 39.37) * 100) / 100 + "m"; + return feetandinches + " (" + meters + ")"; +} +export function HeightConverterImperial(inches: number) { + return Math.floor(inches / 12) + "'" + (inches % 12) + '"'; +} + +export function HeightConverterMetric(inches: number) { + return Math.floor((inches / 39.37) * 100) / 100 + "m"; +} + +export function AgeConverter(age: number, years?: boolean) { + if (years) return `${Math.round((age / 2.1667) * 10) / 10} sweeps`; + else if (years == null) return `${Math.round(age)} years`; + else return `${Math.round(age * 2.1667 * 10) / 10} years`; +} + +export function Pluralize(stringe: string) { + if (stringe.match(/(?:s|ch|sh|x|z|[^aeiou]o)$/)) return stringe + "es"; + else if (stringe.match(/[aeiou](?:y|o)$/)) return stringe + "s"; + else if (stringe.match(/[^aeiou]y$/)) return stringe.slice(0, -1) + "ies"; + else if (stringe.match(/(?:f|fe)$/)) return stringe.slice(0, -1) + "ves"; + else return stringe + "s"; +} + +export function ArraySample(array: any[]) { + return array[Math.floor(Math.random() * array.length)]; +} + +export function ProperNounCase(string: string) { + return string + .split(" ") + .map(x => x.charAt(0).toUpperCase() + x.slice(1).toLowerCase()) + .join(" "); +} + +export function PesterchumNameFormatter(string: string) { + return ( + string + + " [" + + string + .replace(/^(([a-z])[a-z]+)(([A-Z])[a-z]+)$/, "$2$4") + .toUpperCase() + + "]" + ); +} \ No newline at end of file diff --git a/src/styles/style.css b/src/styles/style.css new file mode 100644 index 0000000..4da6369 --- /dev/null +++ b/src/styles/style.css @@ -0,0 +1,84 @@ +:root { + --accent-color: hsl(120, 40%, 75%); + --bg-0: hsl(120, 20%, 0%); + --bg-1: hsl(120, 20%, 6.25%); + --bg-2: hsl(120, 20%, 12.5%); + --bg-3: hsl(120, 20%, 25%); + --neutral: #80808080; + --fg-0: hsl(120, 20%, 50%); + --fg-1: hsl(120, 20%, 62.5%); + --fg-2: hsl(120, 20%, 75%); + --fg-3: hsl(120, 20%, 87.5%); +} + +body { + width: 100vw; + height: 100vh; + margin: 0; + padding: 0; + box-sizing: border-box; + background-color: var(--bg-2); + color: var(--fg-2); +} + +* { + box-sizing: border-box; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--font-Renogare); + font-weight: normal; +} + +a { + color: var(--accent-color); +} + +h1, +h2, +h3, +p { + margin: 0.5em 0; +} + +p { + white-space: pre-wrap; +} + +button { + border: none; + padding: 0; + margin: 0; + background-color: transparent; + color: unset; + font-family: unset; + font-size: unset; + cursor: pointer; + transition: all 0.125s; +} + +button:hover { + opacity: 0.75; +} + +button.fw { + padding: 8px; + width: 100%; + border-radius: 4px; + text-align: left; + text-decoration: none; +} + +button.fw a { + text-decoration: none; +} + +button.fw:hover { + background-color: var(--bg-2); + opacity: 1; +} \ No newline at end of file