diff --git a/astro.config.mjs b/astro.config.mjs index 8fdd21e..7527ab6 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -2,12 +2,54 @@ import { defineConfig } from 'astro/config'; import react from '@astrojs/react'; - import tailwind from '@astrojs/tailwind'; - import mdx from '@astrojs/mdx'; +import m2dx from 'astro-m2dx'; + +import rehypeSlug from 'rehype-slug'; +import rehypeMdxCodeProps from 'rehype-mdx-code-props'; + +import icon from 'astro-icon'; + +import node from '@astrojs/node'; + +/** @type {import('astro-m2dx').Options} */ +const m2dxOptions = { + frontmatter: true, + exportComponents: true, +}; // https://astro.build/config export default defineConfig({ - integrations: [react(), tailwind(), mdx()] + site: "https://eleboog.com", + + redirects: { + '/about': '/me', + '/slashes': '/me', + '/why': '/me#why', + '/uses': '/me#everyday', + '/carry': '/me#everyday', + '/tip': '/me#tip', + '/contact': '/me#contact', + '/verify': '/me#contact', + '/colophon': '/me#colophon', + '/now': '/journal#now', + '/links': '/sharefeed', + '/ideas': '/me#ideas', + '/feed.xml': '/feeds/feed.xml', + '/feeds': '/feeds/feed.xml', + }, + + integrations: [react(), tailwind(), mdx({ + syntaxHighlight: 'false', + remarkPlugins: [[m2dx, m2dxOptions]], + rehypePlugins: [rehypeSlug, [rehypeMdxCodeProps, {tagName: 'code'}]], + extendDefaultPlugins: true, + }), icon()], + + output: 'server', + + adapter: node({ + mode: 'standalone' + }) }); \ No newline at end of file diff --git a/package.json b/package.json index 31c8f5e..892c647 100644 --- a/package.json +++ b/package.json @@ -11,16 +11,42 @@ }, "dependencies": { "@astrojs/check": "^0.9.4", - "@astrojs/mdx": "^3.1.7", + "@astrojs/mdx": "^3.1.9", + "@astrojs/node": "^8.3.4", + "@astrojs/prism": "^3.1.0", "@astrojs/react": "^3.6.2", - "@astrojs/tailwind": "^5.1.1", + "@astrojs/rss": "^4.0.9", + "@astrojs/tailwind": "^5.1.2", + "@fontsource/libre-baskerville": "^5.1.0", + "@fontsource/nunito": "^5.1.0", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", - "astro": "^4.15.11", + "astro": "^4.16.10", + "astro-icon": "^1.1.1", + "astro-m2dx": "^0.7.16", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "feed": "^4.2.2", + "github-slugger": "^2.0.0", + "linkedom": "^0.18.5", + "lodash": "^4.17.21", + "prism": "^4.1.2", + "prism-react-renderer": "^2.4.0", "react": "^18.3.1", + "react-code-block": "^1.0.0", "react-dom": "^18.3.1", + "react-icons": "^5.3.0", + "rehype-mdx-code-props": "^3.0.1", + "rehype-pretty-code": "^0.14.0", + "rehype-slug": "^6.0.0", "tailwindcss": "^3.4.13", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.6.2" }, - "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c" + "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c", + "devDependencies": { + "astro-auto-import": "^0.4.4", + "astro-mdx-code-blocks": "^0.0.6", + "node-html-parser": "^6.1.13" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5251293..fad0b75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,14 +12,29 @@ importers: specifier: ^0.9.4 version: 0.9.4(typescript@5.6.2) '@astrojs/mdx': - specifier: ^3.1.7 - version: 3.1.7(astro@4.15.11(rollup@4.24.0)(typescript@5.6.2)) + specifier: ^3.1.9 + version: 3.1.9(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)) + '@astrojs/node': + specifier: ^8.3.4 + version: 8.3.4(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)) + '@astrojs/prism': + specifier: ^3.1.0 + version: 3.1.0 '@astrojs/react': specifier: ^3.6.2 - version: 3.6.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8) + version: 3.6.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.11(@types/node@18.19.55)) + '@astrojs/rss': + specifier: ^4.0.9 + version: 4.0.9 '@astrojs/tailwind': - specifier: ^5.1.1 - version: 5.1.1(astro@4.15.11(rollup@4.24.0)(typescript@5.6.2))(tailwindcss@3.4.13) + specifier: ^5.1.2 + version: 5.1.2(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2))(tailwindcss@3.4.13) + '@fontsource/libre-baskerville': + specifier: ^5.1.0 + version: 5.1.0 + '@fontsource/nunito': + specifier: ^5.1.0 + version: 5.1.0 '@types/react': specifier: ^18.3.11 version: 18.3.11 @@ -27,20 +42,78 @@ importers: specifier: ^18.3.0 version: 18.3.0 astro: - specifier: ^4.15.11 - version: 4.15.11(rollup@4.24.0)(typescript@5.6.2) + specifier: ^4.16.10 + version: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) + astro-icon: + specifier: ^1.1.1 + version: 1.1.1 + astro-m2dx: + specifier: ^0.7.16 + version: 0.7.16 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + date-fns-tz: + specifier: ^3.2.0 + version: 3.2.0(date-fns@4.1.0) + feed: + specifier: ^4.2.2 + version: 4.2.2 + github-slugger: + specifier: ^2.0.0 + version: 2.0.0 + linkedom: + specifier: ^0.18.5 + version: 0.18.5 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + prism: + specifier: ^4.1.2 + version: 4.1.2(react@18.3.1) + prism-react-renderer: + specifier: ^2.4.0 + version: 2.4.0(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 + react-code-block: + specifier: ^1.0.0 + version: 1.0.0(prism-react-renderer@2.4.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.3.0 + version: 5.3.0(react@18.3.1) + rehype-mdx-code-props: + specifier: ^3.0.1 + version: 3.0.1 + rehype-pretty-code: + specifier: ^0.14.0 + version: 0.14.0(shiki@1.22.2) + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 tailwindcss: specifier: ^3.4.13 version: 3.4.13 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.13) typescript: specifier: ^5.6.2 version: 5.6.2 + devDependencies: + astro-auto-import: + specifier: ^0.4.4 + version: 0.4.4(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)) + astro-mdx-code-blocks: + specifier: ^0.0.6 + version: 0.0.6(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)) + node-html-parser: + specifier: ^6.1.13 + version: 6.1.13 packages: @@ -52,6 +125,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@astrojs/check@0.9.4': resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} hasBin: true @@ -76,15 +155,20 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@5.2.0': - resolution: {integrity: sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==} + '@astrojs/markdown-remark@5.3.0': + resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==} - '@astrojs/mdx@3.1.7': - resolution: {integrity: sha512-8lGdCt+S0TrZgQpbcP3fQJc4cTeacAirtz9TpAMtHCWrQGW8slKt3WG4/0N+bhZgYRC4h5AT5drzFz+y3wvmsg==} + '@astrojs/mdx@3.1.9': + resolution: {integrity: sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: astro: ^4.8.0 + '@astrojs/node@8.3.4': + resolution: {integrity: sha512-xzQs39goN7xh9np9rypGmbgZj3AmmjNxEMj9ZWz5aBERlqqFF3n8A/w/uaJeZ/bkHS60l1BXVS0tgsQt9MFqBA==} + peerDependencies: + astro: ^4.2.0 + '@astrojs/prism@3.1.0': resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} @@ -98,8 +182,11 @@ packages: react: ^17.0.2 || ^18.0.0 || ^19.0.0-beta react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0-beta - '@astrojs/tailwind@5.1.1': - resolution: {integrity: sha512-LwurA10uIKcGRxQP2R81RvAnBT0WPKzBntXZBF4hrAefDgM5Uumn0nsGr6tdIjSARgYz4X+Cq/Vh78t3bql3yw==} + '@astrojs/rss@4.0.9': + resolution: {integrity: sha512-W1qeLc/WP1vMS5xXa+BnaLU0paeSeGjN8RJVAoBaOIkQuKXjIUA9hvPno89heo73in5i67g40gy70oeeHMqp6A==} + + '@astrojs/tailwind@5.1.2': + resolution: {integrity: sha512-IvOF0W/dtHElcXvhrPR35nHmhyV3cfz1EzPitMGtU7sYy9Hci3BNK1To6FWmVuuNKPxza1IgCGetSynJZL7fOg==} peerDependencies: astro: ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0 tailwindcss: ^3.0.24 @@ -115,40 +202,74 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.7': resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.25.7': resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.25.7': resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.7': - resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.7': resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.7': resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.7': resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.25.7': resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.25.7': resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} @@ -157,18 +278,34 @@ packages: resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.7': resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.7': resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.7': resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} @@ -178,8 +315,13 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.25.7': - resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -196,8 +338,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.7': - resolution: {integrity: sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==} + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -206,14 +348,26 @@ packages: resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.7': resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.7': resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -376,6 +530,21 @@ packages: cpu: [x64] os: [win32] + '@fontsource/libre-baskerville@5.1.0': + resolution: {integrity: sha512-+NWyl39FNbrJDQixcJJAnnGMWBJZWtnLWjH2OLp+0VnHdsuVH2jnBPIqID0xschDYC497oKtQiVy0s0UUjb5/g==} + + '@fontsource/nunito@5.1.0': + resolution: {integrity: sha512-+FuA/uyHXZPHAgNOmLq0GtsCAqx9IQjNnUyuGJYDl6xe+B2UIQO2pUFbWiWPfpYM7UfiPU9DBIT7s7Z9iGFoRw==} + + '@iconify/tools@4.0.7': + resolution: {integrity: sha512-zOJxKIfZn96ZRGGvIWzDRLD9vb2CsxjcLuM+QIdvwWbv6SWhm49gECzUnd4d2P0sq9sfodT7yCNobWK8nvavxQ==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.1.33': + resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -503,8 +672,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -525,8 +694,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -614,21 +783,25 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.21.1': - resolution: {integrity: sha512-scBQo4V4O4WZLEDg11e75UPmXoCMq4Ya2A16U6efi/aTiR4o7T/GMNWZs2rq1U8dEvFKGxJZxiUy+tXgmr/4vw==} + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} - '@shikijs/engine-javascript@1.21.1': - resolution: {integrity: sha512-29EG4KYKlAona8yikEx8uoKbK7N2YoXUO26LS1GOIxpMMIAlQS9UFONg95lkGmIfp1rRcvCvSpYYIJ/blsQxvg==} + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} - '@shikijs/engine-oniguruma@1.21.1': - resolution: {integrity: sha512-PvfEtXCDbQZc9ud0SC0bPiuMbul44Cv0Ky2go4SsvVkYAAKYJsMe/Hx7nxThW8yS0r+w8USa0WfOtQKsD9DU9A==} + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} - '@shikijs/types@1.21.1': - resolution: {integrity: sha512-yLuTJTCHmYznerJ0nxF+f2rBKHQf2FMAd08QL/3du2xNBy/7yQ8CjuKN4Zc+Pk0vfIFzdBoxdzvEXE4JtXoR4Q==} + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -656,9 +829,15 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -671,6 +850,15 @@ packages: '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + '@types/node@18.19.55': + resolution: {integrity: sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -680,12 +868,18 @@ packages: '@types/react@18.3.11': resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} + '@types/tar@6.1.13': + resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -731,6 +925,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -780,15 +979,38 @@ packages: array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - astro@4.15.11: - resolution: {integrity: sha512-uA9fenaRR+j6ksPFsmhM88ttz94a66SET1TZxAJLxctxWkDlgz58BxZYUc1gNlt0azhgzOgh4hP3q9M4YzAmBA==} + astro-auto-import@0.4.4: + resolution: {integrity: sha512-tiYe1hp+VusdiyaD3INgZgbvXEPamDFiURnQR5Niz+E9fWa6IHYjJ99TwGlHh/evfaXE/U/86jp9MRKWTuJU1A==} + engines: {node: '>=16.0.0'} + peerDependencies: + astro: ^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta + + astro-icon@1.1.1: + resolution: {integrity: sha512-HKBesWk2Faw/0+klLX+epQVqdTfSzZz/9+5vxXUjTJaN/HnpDf608gRPgHh7ZtwBPNJMEFoU5GLegxoDcT56OQ==} + + astro-m2dx@0.7.16: + resolution: {integrity: sha512-yJ1N8P4h2oRLvQmCAJ8qzb6cg1OjWAwL2H8AfvK7mV2d+vAOpOJACjCGCxHBIvDMM6iC1PyBDqsHAgRwvf+BNA==} + + astro-mdx-code-blocks@0.0.6: + resolution: {integrity: sha512-lo35a4ZchThKeMVcFncyJMTZDlbUbMhnwMjrX9bNSNUx91LPuiJBjs941Re4x9BfSXXlcVvyu3BlmjGBCb/Obw==} + peerDependencies: + astro: '>=2.0.11' + + astro@4.16.10: + resolution: {integrity: sha512-a+nB4bZE50NXHLzVXUHtx/lYct2Aa8kbqZnWNrWqkU97RuhBuWJ5H5/LQbKRnBWGvqChKfJBiMWJe53TY9ieYQ==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -796,6 +1018,9 @@ packages: peerDependencies: postcss: ^8.1.0 + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -813,6 +1038,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} @@ -829,6 +1057,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -851,6 +1082,9 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-emitter@0.1.6: + resolution: {integrity: sha512-YXzt1cQ4a2jqazhcuSWEOc1K2q8g9H6eWNsyZgi640LDzRWVQ2eDe+Y/kVdftH+vYdPF2rgDb3dLdpxE1jvAxw==} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -863,6 +1097,13 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -871,6 +1112,10 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + ci-info@4.0.0: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} @@ -918,6 +1163,10 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -925,28 +1174,77 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + core-js@1.2.7: + resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} + peerDependencies: + date-fns: ^3.0.0 || ^4.0.0 + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -959,10 +1257,22 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -987,6 +1297,19 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -994,6 +1317,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.32: resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==} @@ -1009,6 +1335,19 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1016,6 +1355,12 @@ packages: es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1025,6 +1370,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1044,12 +1392,24 @@ packages: estree-util-build-jsx@3.0.1: resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-value-to-estree@3.1.2: + resolution: {integrity: sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==} + + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -1059,6 +1419,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -1069,6 +1433,11 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1079,9 +1448,23 @@ packages: fast-uri@3.0.2: resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + fast-xml-parser@4.5.0: + resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + hasBin: true + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fbjs@0.8.18: + resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1101,13 +1484,34 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1128,6 +1532,10 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1165,51 +1573,105 @@ packages: hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-properties-to-mdx-jsx-attributes@1.0.0: + resolution: {integrity: sha512-MZEdAYiXC8wDBfntAc7syyWHbcg/X1h03DQ7IQ6MKagMttpYhnKqOZR/nia0657Dt2v2vuXB8YuKNExw0Fljew==} + + hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + hast-util-raw@9.0.4: resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hoist-non-react-statics@1.2.0: + resolution: {integrity: sha512-r8huvKK+m+VraiRipdZYc+U4XW43j6OFG/oIafe7GfDbRpCduRoX9JI/DRxqgtBSCeL+et6N6ibZoedHS2NyOQ==} + html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -1229,6 +1691,10 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -1277,8 +1743,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} @@ -1295,6 +1762,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-fetch@2.2.1: + resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1344,6 +1814,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -1355,10 +1828,17 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkedom@0.18.5: + resolution: {integrity: sha512-JGLaGGtqtu+eOhYrC1wkWYTBcpVWL4AsnwAtMtgO1Q0gI0PuPJKI0zBBE+a/1BrhOE3Uw8JI/ycByAv5cLrAuQ==} + load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1383,8 +1863,11 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + m2dx-utils@0.2.6: + resolution: {integrity: sha512-781OSenjcxPlxEcXKf7hp+3EJZugCo8szLYUeH1tNSjICJomRIjgPS9+756nEZfBpNVg+lN8bfezPpQYO7+lxA==} + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -1396,12 +1879,21 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + mdast-util-directive@2.2.4: + resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} + mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} @@ -1423,37 +1915,73 @@ packages: mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + mdast-util-mdx-jsx@3.1.3: resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-extension-directive@2.2.1: + resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -1475,84 +2003,165 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + micromark-extension-mdx-md@2.0.0: resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + micromark-extension-mdxjs-esm@3.0.0: resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + micromark-extension-mdxjs@3.0.0: resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@2.0.0: resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + micromark-factory-mdx-expression@2.0.2: resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@2.0.0: resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@2.0.0: resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@2.0.0: resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@2.1.0: resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@2.0.0: resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@2.0.0: resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@2.0.0: resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@2.0.1: resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@2.0.0: resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + micromark-util-events-to-acorn@2.0.2: resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.0: resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.0: resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.0.1: resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} @@ -1560,6 +2169,19 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -1568,14 +2190,45 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.2: + resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1597,6 +2250,12 @@ packages: nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -1608,6 +2267,9 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -1616,6 +2278,13 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -1623,8 +2292,8 @@ packages: oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} - ora@8.1.0: - resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} engines: {node: '>=18'} p-limit@2.3.0: @@ -1654,12 +2323,27 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.2: + resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} + parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} @@ -1681,8 +2365,11 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -1691,6 +2378,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -1707,6 +2398,9 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -1757,10 +2451,29 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + prism-react-renderer@2.4.0: + resolution: {integrity: sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==} + peerDependencies: + react: '>=16.0.0' + + prism-react@1.0.2: + resolution: {integrity: sha512-OoBo0kX55Fi+M4oGuYQ+AkU4/xSvB357mLXbYGP3j4oi4RtsdY5Rn3ViJ6gGU8IkZKs5cnmF7IteWWwUFyVd7Q==} + peerDependencies: + react: ^15.0.2 || ^0.14.8 + + prism-redux@1.0.2: + resolution: {integrity: sha512-e1DGRK+V/dxL6n6M25Py1QrAQLHkeueXyNxDTURT1y+KAMwSJdnlNvGU3ZLY2RIaA+ZdFTc9oTvTSR+mS88VyQ==} + + prism@4.1.2: + resolution: {integrity: sha512-SsqrfKkYKYEYz/7RRET2KVZd9O22Rnj3331Al06ClLMycKWoM+MpfrjQrKuHGoIJ9IOy+k27kPEFnqPoAeFZpA==} + prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -1768,14 +2481,36 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + react-code-block@1.0.0: + resolution: {integrity: sha512-/u9QspD0qhZNKbW1+Nek42//LwrekrFjHi4Fk1Dv7L8oz3X4FRXO/oUh119OrUlA0vybDjcXJPj3xJ1mZXV/rw==} + peerDependencies: + prism-react-renderer: ^2 + react: ^18 + react-dom: ^18 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: react: ^18.3.1 + react-icons@5.3.0: + resolution: {integrity: sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==} + peerDependencies: + react: '*' + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -1795,27 +2530,68 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + recompose@0.22.0: + resolution: {integrity: sha512-QjNK/CgNg6wa7sqaQelgkRdl7ktIYbOV4xp0m2n8TexmHI5h3gjOc5a6nNQhtH3Js63hGZ1HfvJ3DUErrvZ2yg==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 + regex@4.3.3: resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + rehype-mdx-code-props@3.0.1: + resolution: {integrity: sha512-BWWKn0N6r7/qd7lbLgv5J8of7imz1l1PyCNoY7BH0AOR9JdJlQIfA9cKqTZVEb2h2GPKh473qrBajF0i01fq3A==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + rehype-pretty-code@0.14.0: + resolution: {integrity: sha512-hBeKF/Wkkf3zyUS8lal9RCUuhypDWLQc+h9UrP9Pav25FUm/AQAVh4m5gdvJxh4Oz+U+xKvdsV01p1LdvsZTiQ==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.3.0 + rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} rehype@13.0.2: resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + remark-directive@2.0.1: + resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} + remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + remark-mdx@3.0.1: resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -1826,9 +2602,15 @@ packages: resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} engines: {node: '>=16.0.0'} + remark-stringify@10.0.3: + resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark@14.0.3: + resolution: {integrity: sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==} + request-light@0.5.8: resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} @@ -1875,6 +2657,16 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -1891,6 +2683,19 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.19.1: + resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} + engines: {node: '>= 0.8.0'} + + server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1903,8 +2708,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.21.1: - resolution: {integrity: sha512-jSOKRHyQJxGOW3kJflmwzHJbp/kjg6hP8LYuVbCPw5oyX+fSNNoCywvcCD3w9eHbj2rvNljt7YMa5BP5Xi+nHg==} + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -1930,6 +2735,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} @@ -1965,6 +2774,12 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} @@ -1984,11 +2799,29 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tailwindcss@3.4.13: resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} engines: {node: '>=14.0.0'} hasBin: true + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1999,6 +2832,9 @@ packages: tinyexec@0.3.0: resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -2007,6 +2843,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2016,8 +2856,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfck@3.1.3: - resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} + tsconfck@3.1.4: + resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -2044,39 +2884,83 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@0.7.39: + resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@6.20.0: + resolution: {integrity: sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==} + engines: {node: '>=18.17'} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-children@3.0.0: resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -2089,17 +2973,31 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@5.4.8: - resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2129,10 +3027,10 @@ packages: terser: optional: true - vitefu@1.0.2: - resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 peerDependenciesMeta: vite: optional: true @@ -2249,6 +3147,17 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} @@ -2278,6 +3187,13 @@ packages: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + xxhash-wasm@1.0.2: resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} @@ -2288,6 +3204,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml-language-server@1.15.0: resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} hasBin: true @@ -2309,12 +3228,15 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yocto-queue@1.1.1: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod-to-json-schema@3.23.3: - resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} + zod-to-json-schema@3.23.5: + resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} peerDependencies: zod: ^3.23.3 @@ -2339,6 +3261,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/install-pkg@0.4.1': + dependencies: + package-manager-detector: 0.2.2 + tinyexec: 0.3.0 + + '@antfu/utils@0.7.10': {} + '@astrojs/check@0.9.4(typescript@5.6.2)': dependencies: '@astrojs/language-server': 2.15.0(typescript@5.6.2) @@ -2377,7 +3306,7 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/markdown-remark@5.2.0': + '@astrojs/markdown-remark@5.3.0': dependencies: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 @@ -2391,7 +3320,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.1 remark-smartypants: 3.0.2 - shiki: 1.21.1 + shiki: 1.22.2 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -2400,12 +3329,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.7(astro@4.15.11(rollup@4.24.0)(typescript@5.6.2))': + '@astrojs/mdx@3.1.9(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2))': dependencies: - '@astrojs/markdown-remark': 5.2.0 - '@mdx-js/mdx': 3.0.1 - acorn: 8.12.1 - astro: 4.15.11(rollup@4.24.0)(typescript@5.6.2) + '@astrojs/markdown-remark': 5.3.0 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + acorn: 8.14.0 + astro: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) es-module-lexer: 1.5.4 estree-util-visit: 2.0.0 gray-matter: 4.0.3 @@ -2420,15 +3349,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@astrojs/node@8.3.4(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2))': + dependencies: + astro: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) + send: 0.19.1 + server-destroy: 1.0.1 + transitivePeerDependencies: + - supports-color + '@astrojs/prism@3.1.0': dependencies: prismjs: 1.29.0 - '@astrojs/react@3.6.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8)': + '@astrojs/react@3.6.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.11(@types/node@18.19.55))': dependencies: '@types/react': 18.3.11 '@types/react-dom': 18.3.0 - '@vitejs/plugin-react': 4.3.2(vite@5.4.8) + '@vitejs/plugin-react': 4.3.2(vite@5.4.11(@types/node@18.19.55)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.5.3 @@ -2436,9 +3373,14 @@ snapshots: - supports-color - vite - '@astrojs/tailwind@5.1.1(astro@4.15.11(rollup@4.24.0)(typescript@5.6.2))(tailwindcss@3.4.13)': + '@astrojs/rss@4.0.9': dependencies: - astro: 4.15.11(rollup@4.24.0)(typescript@5.6.2) + fast-xml-parser: 4.5.0 + kleur: 4.1.5 + + '@astrojs/tailwind@5.1.2(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2))(tailwindcss@3.4.13)': + dependencies: + astro: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) autoprefixer: 10.4.20(postcss@8.4.47) postcss: 8.4.47 postcss-load-config: 4.0.2(postcss@8.4.47) @@ -2467,8 +3409,16 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.1.0 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.0 + '@babel/compat-data@7.25.7': {} + '@babel/compat-data@7.26.2': {} + '@babel/core@7.25.7': dependencies: '@ampproject/remapping': 2.3.0 @@ -2489,6 +3439,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.25.7': dependencies: '@babel/types': 7.25.7 @@ -2496,9 +3466,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.25.7': + '@babel/generator@7.26.2': dependencies: - '@babel/types': 7.25.7 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.0 '@babel/helper-compilation-targets@7.25.7': dependencies: @@ -2508,6 +3486,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.0 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-module-imports@7.25.7': dependencies: '@babel/traverse': 7.25.7 @@ -2515,6 +3501,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 @@ -2525,8 +3518,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.25.7': {} + '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-simple-access@7.25.7': dependencies: '@babel/traverse': 7.25.7 @@ -2536,15 +3540,26 @@ snapshots: '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.25.7': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helpers@7.25.7': dependencies: '@babel/template': 7.25.7 '@babel/types': 7.25.7 + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + '@babel/highlight@7.25.7': dependencies: '@babel/helper-validator-identifier': 7.25.7 @@ -2556,10 +3571,14 @@ snapshots: dependencies: '@babel/types': 7.25.7 - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.7)': + '@babel/parser@7.26.2': dependencies: - '@babel/core': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/types': 7.26.0 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx-self@7.25.7(@babel/core@7.25.7)': dependencies: @@ -2571,14 +3590,14 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.7 - '@babel/helper-annotate-as-pure': 7.25.7 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.7) - '@babel/types': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -2588,6 +3607,12 @@ snapshots: '@babel/parser': 7.25.7 '@babel/types': 7.25.7 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@babel/traverse@7.25.7': dependencies: '@babel/code-frame': 7.25.7 @@ -2600,12 +3625,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.7': dependencies: '@babel/helper-string-parser': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -2703,6 +3745,41 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@fontsource/libre-baskerville@5.1.0': {} + + '@fontsource/nunito@5.1.0': {} + + '@iconify/tools@4.0.7': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.1.33 + '@types/tar': 6.1.13 + axios: 1.7.7 + cheerio: 1.0.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 0.5.0 + pathe: 1.1.2 + svgo: 3.3.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.1.33': + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.7.2 + transitivePeerDependencies: + - supports-color + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 @@ -2804,7 +3881,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -2812,14 +3889,15 @@ snapshots: '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 hast-util-to-jsx-runtime: 2.3.0 markdown-extensions: 2.0.0 - periscopic: 3.1.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 remark-mdx: 3.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.1 @@ -2830,6 +3908,7 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: + - acorn - supports-color '@nodelib/fs.scandir@2.1.5': @@ -2849,11 +3928,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/pluginutils@5.1.2(rollup@4.24.0)': + '@rollup/pluginutils@5.1.3(rollup@4.24.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: rollup: 4.24.0 @@ -2905,33 +3984,35 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true - '@shikijs/core@1.21.1': + '@shikijs/core@1.22.2': dependencies: - '@shikijs/engine-javascript': 1.21.1 - '@shikijs/engine-oniguruma': 1.21.1 - '@shikijs/types': 1.21.1 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.21.1': + '@shikijs/engine-javascript@1.22.2': dependencies: - '@shikijs/types': 1.21.1 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.21.1': + '@shikijs/engine-oniguruma@1.22.2': dependencies: - '@shikijs/types': 1.21.1 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 - '@shikijs/types@1.21.1': + '@shikijs/types@1.22.2': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@9.3.0': {} + '@trysound/sax@0.2.0': {} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.6 @@ -2969,10 +4050,18 @@ snapshots: '@types/estree@1.0.6': {} + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -2985,6 +4074,14 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/node@18.19.55': + dependencies: + undici-types: 5.26.5 + + '@types/parse5@6.0.3': {} + + '@types/prismjs@1.26.4': {} + '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.0': @@ -2996,20 +4093,30 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/tar@6.1.13': + dependencies: + '@types/node': 18.19.55 + minipass: 4.2.8 + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 18.19.55 + optional: true + '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.2(vite@5.4.8)': + '@vitejs/plugin-react@4.3.2(vite@5.4.11(@types/node@18.19.55))': dependencies: '@babel/core': 7.25.7 '@babel/plugin-transform-react-jsx-self': 7.25.7(@babel/core@7.25.7) '@babel/plugin-transform-react-jsx-source': 7.25.7(@babel/core@7.25.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8 + vite: 5.4.11(@types/node@18.19.55) transitivePeerDependencies: - supports-color @@ -3067,8 +4174,14 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.12.1: {} + acorn@8.14.0: {} + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -3113,29 +4226,60 @@ snapshots: array-iterate@2.0.1: {} + asap@2.0.6: {} + astring@1.9.0: {} - astro@4.15.11(rollup@4.24.0)(typescript@5.6.2): + astro-auto-import@0.4.4(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)): + dependencies: + '@types/node': 18.19.55 + acorn: 8.12.1 + astro: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) + + astro-icon@1.1.1: + dependencies: + '@iconify/tools': 4.0.7 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.1.33 + transitivePeerDependencies: + - debug + - supports-color + + astro-m2dx@0.7.16: + dependencies: + estree-util-visit: 1.2.1 + gray-matter: 4.0.3 + js-yaml: 4.1.0 + m2dx-utils: 0.2.6 + mdast-util-mdx: 2.0.1 + transitivePeerDependencies: + - supports-color + + astro-mdx-code-blocks@0.0.6(astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2)): + dependencies: + astro: 4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2) + + astro@4.16.10(@types/node@18.19.55)(rollup@4.24.0)(typescript@5.6.2): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 - '@astrojs/markdown-remark': 5.2.0 + '@astrojs/markdown-remark': 5.3.0 '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.25.7 - '@babel/plugin-transform-react-jsx': 7.25.7(@babel/core@7.25.7) - '@babel/types': 7.25.7 + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 - acorn: 8.12.1 + acorn: 8.14.0 aria-query: 5.3.2 axobject-query: 4.1.0 boxen: 8.0.1 ci-info: 4.0.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 - cookie: 0.6.0 + cookie: 0.7.2 cssesc: 3.0.0 debug: 4.3.7 deterministic-object-hash: 2.0.2 @@ -3147,7 +4291,6 @@ snapshots: esbuild: 0.21.5 estree-walker: 3.0.3 fast-glob: 3.3.2 - fastq: 1.17.1 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 @@ -3155,32 +4298,30 @@ snapshots: http-cache-semantics: 4.1.1 js-yaml: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.11 + magic-string: 0.30.12 magicast: 0.3.5 micromatch: 4.0.8 mrmime: 2.0.0 neotraverse: 0.6.18 - ora: 8.1.0 + ora: 8.1.1 p-limit: 6.1.0 p-queue: 8.0.1 preferred-pm: 4.0.0 prompts: 2.4.2 rehype: 13.0.2 semver: 7.6.3 - shiki: 1.21.1 - string-width: 7.2.0 - strip-ansi: 7.1.0 - tinyexec: 0.3.0 - tsconfck: 3.1.3(typescript@5.6.2) + shiki: 1.22.2 + tinyexec: 0.3.1 + tsconfck: 3.1.4(typescript@5.6.2) unist-util-visit: 5.0.0 vfile: 6.0.3 - vite: 5.4.8 - vitefu: 1.0.2(vite@5.4.8) + vite: 5.4.11(@types/node@18.19.55) + vitefu: 1.0.3(vite@5.4.11(@types/node@18.19.55)) which-pm: 3.0.0 xxhash-wasm: 1.0.2 yargs-parser: 21.1.1 zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) + zod-to-json-schema: 3.23.5(zod@3.23.8) zod-to-ts: 1.2.0(typescript@5.6.2)(zod@3.23.8) optionalDependencies: sharp: 0.33.5 @@ -3197,6 +4338,8 @@ snapshots: - terser - typescript + asynckit@0.4.0: {} + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.24.0 @@ -3207,6 +4350,14 @@ snapshots: postcss: 8.4.47 postcss-value-parser: 4.2.0 + axios@1.7.7: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} bail@2.0.2: {} @@ -3217,6 +4368,8 @@ snapshots: binary-extensions@2.3.0: {} + boolbase@1.0.0: {} + boxen@8.0.1: dependencies: ansi-align: 3.0.1 @@ -3243,6 +4396,8 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) + buffer-crc32@0.2.13: {} + camelcase-css@2.0.1: {} camelcase@8.0.0: {} @@ -3259,6 +4414,8 @@ snapshots: chalk@5.3.0: {} + change-emitter@0.1.6: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -3267,6 +4424,29 @@ snapshots: character-reference-invalid@2.0.1: {} + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.20.0 + whatwg-mimetype: 4.0.0 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3283,6 +4463,8 @@ snapshots: dependencies: readdirp: 4.0.2 + chownr@2.0.0: {} + ci-info@4.0.0: {} cli-boxes@3.0.0: {} @@ -3327,15 +4509,25 @@ snapshots: color-string: 1.9.1 optional: true + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} commander@4.1.1: {} + commander@7.2.0: {} + common-ancestor-path@1.0.1: {} + confbox@0.1.8: {} + convert-source-map@2.0.0: {} - cookie@0.6.0: {} + cookie@0.7.2: {} + + core-js@1.2.7: {} cross-spawn@7.0.3: dependencies: @@ -3343,10 +4535,46 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + cssesc@3.0.0: {} + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + cssom@0.5.0: {} + csstype@3.1.3: {} + date-fns-tz@3.2.0(date-fns@4.1.0): + dependencies: + date-fns: 4.1.0 + + date-fns@4.1.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.3.7: dependencies: ms: 2.1.3 @@ -3355,8 +4583,14 @@ snapshots: dependencies: character-entities: 2.0.2 + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} + detect-libc@2.0.3: optional: true @@ -3376,10 +4610,30 @@ snapshots: dlv@1.1.3: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dset@3.1.4: {} eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + electron-to-chromium@1.5.32: {} emmet@2.4.11: @@ -3393,10 +4647,39 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + entities@4.5.0: {} es-module-lexer@1.5.4: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -3425,6 +4708,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@5.0.0: {} @@ -3442,14 +4727,30 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 + estree-util-is-identifier-name@2.1.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.9.0 source-map: 0.7.4 + estree-util-value-to-estree@3.1.2: + dependencies: + '@types/estree': 1.0.6 + + estree-util-visit@1.2.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 2.0.11 + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -3461,6 +4762,8 @@ snapshots: dependencies: '@types/estree': 1.0.6 + etag@1.8.1: {} + eventemitter3@5.0.1: {} extend-shallow@2.0.1: @@ -3469,6 +4772,16 @@ snapshots: extend@3.0.2: {} + extract-zip@2.0.1: + dependencies: + debug: 4.3.7 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -3481,10 +4794,32 @@ snapshots: fast-uri@3.0.2: {} + fast-xml-parser@4.5.0: + dependencies: + strnum: 1.0.5 + fastq@1.17.1: dependencies: reusify: 1.0.4 + fbjs@0.8.18: + dependencies: + core-js: 1.2.7 + isomorphic-fetch: 2.2.1 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.39 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3503,13 +4838,27 @@ snapshots: flattie@1.1.1: {} + follow-redirects@1.15.9: {} + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + fraction.js@4.3.7: {} + fresh@0.5.2: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fsevents@2.3.3: optional: true @@ -3521,6 +4870,10 @@ snapshots: get-east-asian-width@1.2.0: {} + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -3566,6 +4919,16 @@ snapshots: vfile: 6.0.3 vfile-message: 4.0.2 + hast-util-from-parse5@7.1.2: + dependencies: + '@types/hast': 2.3.10 + '@types/unist': 2.0.11 + hastscript: 7.2.0 + property-information: 6.5.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 @@ -3577,14 +4940,49 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-properties-to-mdx-jsx-attributes@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + estree-util-value-to-estree: 3.1.2 + mdast-util-mdx-jsx: 3.1.3 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + transitivePeerDependencies: + - supports-color + + hast-util-raw@7.2.3: + dependencies: + '@types/hast': 2.3.10 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-raw@9.0.4: dependencies: '@types/hast': 3.0.4 @@ -3622,6 +5020,20 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-html@8.0.4: + dependencies: + '@types/hast': 2.3.10 + '@types/unist': 2.0.11 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 7.2.3 + hast-util-whitespace: 2.0.1 + html-void-elements: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-html@9.0.3: dependencies: '@types/hast': 3.0.4 @@ -3656,6 +5068,15 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-parse5@7.1.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 @@ -3666,6 +5087,10 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 @@ -3673,10 +5098,20 @@ snapshots: hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 + hast-util-whitespace@2.0.1: {} + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + hastscript@8.0.0: dependencies: '@types/hast': 3.0.4 @@ -3685,14 +5120,41 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + + hoist-non-react-statics@1.2.0: {} + html-escaper@3.0.3: {} + html-void-elements@2.0.1: {} + html-void-elements@3.0.0: {} + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + http-cache-semantics@4.1.1: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + import-meta-resolve@4.1.0: {} + inherits@2.0.4: {} + inline-style-parser@0.1.1: {} inline-style-parser@0.2.4: {} @@ -3711,6 +5173,8 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-buffer@2.0.5: {} + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -3741,9 +5205,7 @@ snapshots: is-plain-obj@4.1.0: {} - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.6 + is-stream@1.1.0: {} is-unicode-supported@1.3.0: {} @@ -3755,6 +5217,11 @@ snapshots: isexe@2.0.0: {} + isomorphic-fetch@2.2.1: + dependencies: + node-fetch: 1.7.3 + whatwg-fetch: 3.6.20 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -3790,12 +5257,22 @@ snapshots: kleur@4.1.5: {} + kolorist@1.8.0: {} + lilconfig@2.1.0: {} lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} + linkedom@0.18.5: + dependencies: + css-select: 5.1.0 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 9.1.0 + uhyphen: 0.2.0 + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -3803,6 +5280,11 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + local-pkg@0.5.0: + dependencies: + mlly: 1.7.2 + pkg-types: 1.2.1 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -3826,26 +5308,57 @@ snapshots: dependencies: yallist: 3.1.1 - magic-string@0.30.11: + m2dx-utils@0.2.6: + dependencies: + acorn: 8.12.1 + estree-util-visit: 1.2.1 + hast-util-to-html: 8.0.4 + mdast-util-mdx: 2.0.1 + mdast-util-to-hast: 12.3.0 + remark: 14.0.3 + remark-directive: 2.0.1 + remark-mdx: 2.3.0 + transitivePeerDependencies: + - supports-color + + magic-string@0.30.12: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 magicast@0.3.5: dependencies: '@babel/parser': 7.25.7 - '@babel/types': 7.25.7 + '@babel/types': 7.26.0 source-map-js: 1.2.1 markdown-extensions@2.0.0: {} markdown-table@3.0.3: {} + mdast-util-definitions@5.1.2: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + unist-util-visit: 4.1.2 + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 unist-util-visit: 5.0.0 + mdast-util-directive@2.2.4: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-visit-parents: 5.1.3 + transitivePeerDependencies: + - supports-color + mdast-util-find-and-replace@3.0.1: dependencies: '@types/mdast': 4.0.4 @@ -3853,6 +5366,23 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -3927,6 +5457,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-expression@1.3.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -3938,6 +5478,23 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx-jsx@2.1.4: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-jsx@3.1.3: dependencies: '@types/estree-jsx': 1.0.5 @@ -3955,6 +5512,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdx@2.0.1: + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx@3.0.0: dependencies: mdast-util-from-markdown: 2.0.1 @@ -3965,6 +5532,16 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-mdxjs-esm@1.3.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -3976,11 +5553,27 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-phrasing@3.0.1: + dependencies: + '@types/mdast': 3.0.15 + unist-util-is: 5.2.1 + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 + mdast-util-to-hast@12.3.0: + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -3993,6 +5586,17 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-markdown@1.5.0: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.4 @@ -4004,12 +5608,39 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + merge2@1.4.1: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-core-commonmark@2.0.1: dependencies: decode-named-character-reference: 1.0.2 @@ -4029,6 +5660,16 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-directive@2.2.1: + dependencies: + micromark-factory-space: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + parse-entities: 4.0.1 + uvu: 0.5.6 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.0 @@ -4087,6 +5728,17 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-mdx-expression@1.0.8: + dependencies: + '@types/estree': 1.0.6 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -4098,6 +5750,19 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-mdx-jsx@1.0.5: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + micromark-extension-mdx-jsx@3.0.1: dependencies: '@types/acorn': 4.0.6 @@ -4112,10 +5777,26 @@ snapshots: micromark-util-types: 2.0.0 vfile-message: 4.0.2 + micromark-extension-mdx-md@1.0.1: + dependencies: + micromark-util-types: 1.1.0 + micromark-extension-mdx-md@2.0.0: dependencies: micromark-util-types: 2.0.0 + micromark-extension-mdxjs-esm@1.0.5: + dependencies: + '@types/estree': 1.0.6 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -4128,6 +5809,17 @@ snapshots: unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 + micromark-extension-mdxjs@1.0.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + micromark-extension-mdxjs@3.0.0: dependencies: acorn: 8.12.1 @@ -4139,12 +5831,25 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 @@ -4152,6 +5857,17 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-mdx-expression@1.0.9: + dependencies: + '@types/estree': 1.0.6 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + micromark-factory-mdx-expression@2.0.2: dependencies: '@types/estree': 1.0.6 @@ -4164,11 +5880,23 @@ snapshots: unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 @@ -4176,6 +5904,13 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 @@ -4183,30 +5918,61 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-character@2.1.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 @@ -4214,8 +5980,21 @@ snapshots: micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 + micromark-util-encode@1.1.0: {} + micromark-util-encode@2.0.0: {} + micromark-util-events-to-acorn@1.2.3: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 2.0.11 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 @@ -4227,22 +6006,45 @@ snapshots: micromark-util-types: 2.0.0 vfile-message: 4.0.2 + micromark-util-html-tag-name@1.2.0: {} + micromark-util-html-tag-name@2.0.0: {} + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + micromark-util-subtokenize@2.0.1: dependencies: devlop: 1.1.0 @@ -4250,10 +6052,36 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.0: {} + micromark-util-types@1.1.0: {} + micromark-util-types@2.0.0: {} + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 @@ -4281,16 +6109,50 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + mimic-function@5.0.1: {} minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.7.2: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + + mri@1.2.0: {} + mrmime@2.0.0: {} + ms@2.0.0: {} + ms@2.1.3: {} muggle-string@0.4.1: {} @@ -4309,16 +6171,38 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 + node-fetch@1.7.3: + dependencies: + encoding: 0.1.13 + is-stream: 1.1.0 + + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + node-releases@2.0.18: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -4327,7 +6211,7 @@ snapshots: dependencies: regex: 4.3.3 - ora@8.1.0: + ora@8.1.1: dependencies: chalk: 5.3.0 cli-cursor: 5.0.0 @@ -4362,6 +6246,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.2: {} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.11 @@ -4382,6 +6268,19 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 + parse-numeric-range@1.3.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.1.2 + + parse5@6.0.1: {} + parse5@7.1.2: dependencies: entities: 4.5.0 @@ -4399,16 +6298,16 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 + pathe@1.1.2: {} + + pend@1.2.0: {} picocolors@1.1.0: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -4419,6 +6318,12 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.2 + pathe: 1.1.2 + postcss-import@15.1.0(postcss@8.4.47): dependencies: postcss: 8.4.47 @@ -4465,8 +6370,32 @@ snapshots: prettier@2.8.7: optional: true + prism-react-renderer@2.4.0(react@18.3.1): + dependencies: + '@types/prismjs': 1.26.4 + clsx: 2.1.1 + react: 18.3.1 + + prism-react@1.0.2(react@18.3.1): + dependencies: + react: 18.3.1 + recompose: 0.22.0(react@18.3.1) + + prism-redux@1.0.2: {} + + prism@4.1.2(react@18.3.1): + dependencies: + prism-react: 1.0.2(react@18.3.1) + prism-redux: 1.0.2 + transitivePeerDependencies: + - react + prismjs@1.29.0: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -4474,14 +6403,33 @@ snapshots: property-information@6.5.0: {} + proxy-from-env@1.1.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + queue-microtask@1.2.3: {} + range-parser@1.2.1: {} + + react-code-block@1.0.0(prism-react-renderer@2.4.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + prism-react-renderer: 2.4.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 + react-icons@5.3.0(react@18.3.1): + dependencies: + react: 18.3.1 + react-refresh@0.14.2: {} react@18.3.1: @@ -4498,20 +6446,96 @@ snapshots: readdirp@4.0.2: {} + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + recompose@0.22.0(react@18.3.1): + dependencies: + change-emitter: 0.1.6 + fbjs: 0.8.18 + hoist-non-react-statics: 1.2.0 + react: 18.3.1 + symbol-observable: 1.2.0 + regex@4.3.3: {} + rehype-mdx-code-props@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-properties-to-mdx-jsx-attributes: 1.0.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + unified: 11.0.5 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 hast-util-from-html: 2.0.3 unified: 11.0.5 + rehype-pretty-code@0.14.0(shiki@1.22.2): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 1.22.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 hast-util-raw: 9.0.4 vfile: 6.0.3 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 @@ -4525,6 +6549,15 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 + remark-directive@2.0.1: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-directive: 2.2.4 + micromark-extension-directive: 2.2.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + remark-gfm@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4536,6 +6569,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@2.3.0: + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + remark-mdx@3.0.1: dependencies: mdast-util-mdx: 3.0.0 @@ -4543,6 +6583,14 @@ snapshots: transitivePeerDependencies: - supports-color + remark-parse@10.0.2: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -4567,12 +6615,27 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 + remark-stringify@10.0.3: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + unified: 10.1.2 + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 unified: 11.0.5 + remark@14.0.3: + dependencies: + '@types/mdast': 3.0.15 + remark-parse: 10.0.2 + remark-stringify: 10.0.3 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + request-light@0.5.8: {} request-light@0.7.0: {} @@ -4645,6 +6708,14 @@ snapshots: dependencies: queue-microtask: 1.2.3 + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -4658,6 +6729,30 @@ snapshots: semver@7.6.3: {} + send@0.19.1: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + server-destroy@1.0.1: {} + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + sharp@0.33.5: dependencies: color: 4.2.3 @@ -4691,12 +6786,12 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.21.1: + shiki@1.22.2: dependencies: - '@shikijs/core': 1.21.1 - '@shikijs/engine-javascript': 1.21.1 - '@shikijs/engine-oniguruma': 1.21.1 - '@shikijs/types': 1.21.1 + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -4717,6 +6812,8 @@ snapshots: sprintf-js@1.0.3: {} + statuses@2.0.1: {} + stdin-discarder@0.2.2: {} string-width@4.2.3: @@ -4754,6 +6851,12 @@ snapshots: strip-bom@3.0.0: {} + strnum@1.0.5: {} + + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 @@ -4778,6 +6881,22 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.0 + + symbol-observable@1.2.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.13): + dependencies: + tailwindcss: 3.4.13 + tailwindcss@3.4.13: dependencies: '@alloc/quick-lru': 5.2.0 @@ -4805,6 +6924,15 @@ snapshots: transitivePeerDependencies: - ts-node + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -4815,19 +6943,23 @@ snapshots: tinyexec@0.3.0: {} + tinyexec@0.3.1: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + trim-lines@3.0.1: {} trough@2.2.0: {} ts-interface-checker@0.1.13: {} - tsconfck@3.1.3(typescript@5.6.2): + tsconfck@3.1.4(typescript@5.6.2): optionalDependencies: typescript: 5.6.2 @@ -4844,8 +6976,28 @@ snapshots: typescript@5.6.2: {} + ua-parser-js@0.7.39: {} + + ufo@1.5.4: {} + + uhyphen@0.2.0: {} + ultrahtml@1.5.3: {} + undici-types@5.26.5: {} + + undici@6.20.0: {} + + unified@10.1.2: + dependencies: + '@types/unist': 2.0.11 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -4861,6 +7013,12 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-generated@2.0.1: {} + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -4870,19 +7028,36 @@ snapshots: '@types/unist': 3.0.3 array-iterate: 2.0.1 + unist-util-position-from-estree@1.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-position@4.0.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-remove-position@4.0.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-visit: 4.1.2 + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-visit: 5.0.0 + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -4891,11 +7066,22 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -4910,32 +7096,57 @@ snapshots: util-deprecate@1.0.2: {} + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + vfile-location@4.1.0: + dependencies: + '@types/unist': 2.0.11 + vfile: 5.3.7 + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 vfile: 6.0.3 + vfile-message@3.1.4: + dependencies: + '@types/unist': 2.0.11 + unist-util-stringify-position: 3.0.3 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 + vfile@5.3.7: + dependencies: + '@types/unist': 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + vfile@6.0.3: dependencies: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.8: + vite@5.4.11(@types/node@18.19.55): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.24.0 optionalDependencies: + '@types/node': 18.19.55 fsevents: 2.3.3 - vitefu@1.0.2(vite@5.4.8): + vitefu@1.0.3(vite@5.4.11(@types/node@18.19.55)): optionalDependencies: - vite: 5.4.8 + vite: 5.4.11(@types/node@18.19.55) volar-service-css@0.0.61(@volar/language-service@2.4.5): dependencies: @@ -5050,6 +7261,14 @@ snapshots: web-namespaces@2.0.1: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-fetch@3.6.20: {} + + whatwg-mimetype@4.0.0: {} + which-pm-runs@1.1.0: {} which-pm@3.0.0: @@ -5082,12 +7301,20 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + xxhash-wasm@1.0.2: {} y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + yaml-language-server@1.15.0: dependencies: ajv: 8.17.1 @@ -5119,9 +7346,14 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yocto-queue@1.1.1: {} - zod-to-json-schema@3.23.3(zod@3.23.8): + zod-to-json-schema@3.23.5(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/public/audio/test/stephano_draft.mp3 b/public/audio/test/stephano_draft.mp3 new file mode 100644 index 0000000..9ae0206 Binary files /dev/null and b/public/audio/test/stephano_draft.mp3 differ diff --git a/public/auth/passkey.svg b/public/auth/passkey.svg new file mode 100644 index 0000000..be2e9b4 --- /dev/null +++ b/public/auth/passkey.svg @@ -0,0 +1,35 @@ + + + + diff --git a/public/blog/banner_sept19.png b/public/blog/banner_sept19.png new file mode 100644 index 0000000..afe6082 Binary files /dev/null and b/public/blog/banner_sept19.png differ diff --git a/public/blog/blogbanner.png b/public/blog/blogbanner.png new file mode 100644 index 0000000..323f3eb Binary files /dev/null and b/public/blog/blogbanner.png differ diff --git a/public/blog/blogbkglow.png b/public/blog/blogbkglow.png new file mode 100644 index 0000000..261bf2a Binary files /dev/null and b/public/blog/blogbkglow.png differ diff --git a/public/blog/hello-again/banner-lake.png b/public/blog/hello-again/banner-lake.png new file mode 100644 index 0000000..e40acfe Binary files /dev/null and b/public/blog/hello-again/banner-lake.png differ diff --git a/public/blog/hello-again/meme-podcasts.png b/public/blog/hello-again/meme-podcasts.png new file mode 100644 index 0000000..bd97f35 Binary files /dev/null and b/public/blog/hello-again/meme-podcasts.png differ diff --git a/public/blog/hello-again/meme-vtec.png b/public/blog/hello-again/meme-vtec.png new file mode 100644 index 0000000..a4de7cd Binary files /dev/null and b/public/blog/hello-again/meme-vtec.png differ diff --git a/public/blog/hello-again/new-site-homepage.png b/public/blog/hello-again/new-site-homepage.png new file mode 100644 index 0000000..a32dd18 Binary files /dev/null and b/public/blog/hello-again/new-site-homepage.png differ diff --git a/public/blog/hello-again/old-next-shot-login.png b/public/blog/hello-again/old-next-shot-login.png new file mode 100644 index 0000000..e15fed5 Binary files /dev/null and b/public/blog/hello-again/old-next-shot-login.png differ diff --git a/public/blog/hello-again/old-next-shot-main.png b/public/blog/hello-again/old-next-shot-main.png new file mode 100644 index 0000000..8b95d51 Binary files /dev/null and b/public/blog/hello-again/old-next-shot-main.png differ diff --git a/public/blog/hello-again/old-next-shot-menu.png b/public/blog/hello-again/old-next-shot-menu.png new file mode 100644 index 0000000..8c5b866 Binary files /dev/null and b/public/blog/hello-again/old-next-shot-menu.png differ diff --git a/public/blog/hello-again/old-next-shot-mobile.png b/public/blog/hello-again/old-next-shot-mobile.png new file mode 100644 index 0000000..8775073 Binary files /dev/null and b/public/blog/hello-again/old-next-shot-mobile.png differ diff --git a/public/blog/hello-again/old-next-shot-nav.png b/public/blog/hello-again/old-next-shot-nav.png new file mode 100644 index 0000000..c75ba41 Binary files /dev/null and b/public/blog/hello-again/old-next-shot-nav.png differ diff --git a/public/blog/hello-again/xe-iaso-blog.png b/public/blog/hello-again/xe-iaso-blog.png new file mode 100644 index 0000000..ca859c9 Binary files /dev/null and b/public/blog/hello-again/xe-iaso-blog.png differ diff --git a/public/blog/kebo_ref.jpg b/public/blog/kebo_ref.jpg new file mode 100644 index 0000000..a02c278 Binary files /dev/null and b/public/blog/kebo_ref.jpg differ diff --git a/public/blog/python-lab/banner-explode.png b/public/blog/python-lab/banner-explode.png new file mode 100644 index 0000000..2ef37ac Binary files /dev/null and b/public/blog/python-lab/banner-explode.png differ diff --git a/public/blog/python-lab/banner-explode2.png b/public/blog/python-lab/banner-explode2.png new file mode 100644 index 0000000..3dae6dd Binary files /dev/null and b/public/blog/python-lab/banner-explode2.png differ diff --git a/public/blog/python-lab/screenshot-output.png b/public/blog/python-lab/screenshot-output.png new file mode 100644 index 0000000..8a640f4 Binary files /dev/null and b/public/blog/python-lab/screenshot-output.png differ diff --git a/public/blog/screenshot_calckey.png b/public/blog/screenshot_calckey.png new file mode 100644 index 0000000..2f8b8b8 Binary files /dev/null and b/public/blog/screenshot_calckey.png differ diff --git a/public/blog/screenshot_nova.png b/public/blog/screenshot_nova.png new file mode 100644 index 0000000..2067daa Binary files /dev/null and b/public/blog/screenshot_nova.png differ diff --git a/public/blog/shipment.png b/public/blog/shipment.png new file mode 100644 index 0000000..b9dfbc6 Binary files /dev/null and b/public/blog/shipment.png differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index f157bd1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/public/feed.xsl b/public/feed.xsl new file mode 100644 index 0000000..489b985 --- /dev/null +++ b/public/feed.xsl @@ -0,0 +1,75 @@ + + + + + + + + + <xsl:value-of select="/atom:feed/atom:title"/> + + + +

+ feed icon  + +

+ +

+ +

+ +

+ This is the Atom news feed for the  + + + +   + website. +

+ +

It is meant for news readers, not humans. Please copy-and-paste the URL into your news reader!

+ +

+

+				
+			
+ +

+ + +
+ + + + + +  -  + + + + + + + + + + +
+
+

news items.

+

Powered by RSS.Style

+ + + + +
+
diff --git a/public/fonts/monof55.ttf b/public/fonts/monof55.ttf new file mode 100644 index 0000000..9aebf80 Binary files /dev/null and b/public/fonts/monof55.ttf differ diff --git a/public/fonts/monofur.ttf b/public/fonts/monofur.ttf new file mode 100644 index 0000000..baf799e Binary files /dev/null and b/public/fonts/monofur.ttf differ diff --git a/public/moffsoft.svg b/public/moffsoft.svg new file mode 100644 index 0000000..1517055 --- /dev/null +++ b/public/moffsoft.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + diff --git a/public/moffsoft_64.png b/public/moffsoft_64.png new file mode 100644 index 0000000..01f4701 Binary files /dev/null and b/public/moffsoft_64.png differ diff --git a/public/moffsoft_adaptive.svg b/public/moffsoft_adaptive.svg new file mode 100644 index 0000000..76f99e2 --- /dev/null +++ b/public/moffsoft_adaptive.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + diff --git a/public/moffsoft_dark_64.png b/public/moffsoft_dark_64.png new file mode 100644 index 0000000..9094281 Binary files /dev/null and b/public/moffsoft_dark_64.png differ diff --git a/public/moffsoft_light_64.png b/public/moffsoft_light_64.png new file mode 100644 index 0000000..b34cf39 Binary files /dev/null and b/public/moffsoft_light_64.png differ diff --git a/src/_components.ts b/src/_components.ts new file mode 100644 index 0000000..2c6652d --- /dev/null +++ b/src/_components.ts @@ -0,0 +1,12 @@ +import HR from '/src/components/HR.astro' +import MDXImage from '/src/components/mdx/MDXImage.astro' +import MDXCallout from '/src/components/mdx/MDXCallout.astro' +import MDXCodeBlock from '/src/components/mdx/MDXCodeBlock.astro' + +export const components = { + hr: HR, + img: MDXImage, + MDXImage: MDXImage, + MDXCallout: MDXCallout, + pre: MDXCodeBlock, +} \ No newline at end of file diff --git a/src/_frontmatter.yaml b/src/_frontmatter.yaml new file mode 100644 index 0000000..a34458f --- /dev/null +++ b/src/_frontmatter.yaml @@ -0,0 +1 @@ +layout: '/src/layouts/PostLayout.astro' \ No newline at end of file diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..6ec3ffe --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,34 @@ +--- + +import Icon from "../components/Icon.astro"; +import HR from "../components/HR.astro"; + +const iconClass = 'fill-current hover:fill-crusta-800 dark:hover:fill-night-400' + +--- + +
+
+
contact —  + + + +   + + + +   + + + + + +  |  tips appreciated! +
+

The writing contained within this site may contain the author's personal opinions. These opinions do not represent any of the author's employers or other organizations the author is a part of — past, present, or future.

+

© 2023-2024 Kebo Kitanari — All Rights Reserved

+
\ No newline at end of file diff --git a/src/components/HR.astro b/src/components/HR.astro new file mode 100644 index 0000000..b14c614 --- /dev/null +++ b/src/components/HR.astro @@ -0,0 +1,5 @@ +--- + +--- + +
\ No newline at end of file diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 0000000..848562c --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,31 @@ +--- + +const {current} = Astro.props; + +--- + +
+ +
+ + eleboog.com + +
+

{current}

+
+ + +

+ newest + / + archive + / + journal + / + sharefeed + / + me + / + rss +

+
\ No newline at end of file diff --git a/src/components/Icon.astro b/src/components/Icon.astro new file mode 100644 index 0000000..d27b4cd --- /dev/null +++ b/src/components/Icon.astro @@ -0,0 +1,41 @@ +--- +import { parse } from 'node-html-parser'; + +// Thank you David Warrington! +// https://ellodave.dev/blog/article/using-svgs-as-astro-components-and-inline-css/ + +export interface Props { + icon: string; +} + +function getSVG(name: string) { + const filepath = `/src/svg/${name}.svg`; + const files = import.meta.glob('/src/svg/**/*.svg', { + as: 'raw', eager: true, + }); + + if (!(filepath in files)) { + throw new Error(`${filepath} not found`); + } + + const root = parse(files[filepath]); + + const svg = root.querySelector('svg'); + const { attributes, innerHTML } = svg; + + return { + attributes, + innerHTML, + }; +} + +const { icon, ...attributes } = Astro.props as Props; +const { attributes: baseAttributes, innerHTML } = getSVG(icon); + +const svgAttributes = { ...baseAttributes, ...attributes }; +--- + + \ No newline at end of file diff --git a/src/components/mdx/MDXCallout.astro b/src/components/mdx/MDXCallout.astro new file mode 100644 index 0000000..3f11547 --- /dev/null +++ b/src/components/mdx/MDXCallout.astro @@ -0,0 +1,58 @@ +--- +import { MdInfoOutline, MdOutlineWarningAmber, MdOutlineStarBorder, MdCheck } from "react-icons/md"; + +import colors from 'tailwindcss/colors'; + +/*export type MDXCalloutProps = { + preset?: string, + // --- custom --- + color?: string, + title?: string, + icon?: any, + children: any, +}*/ + +const props = Astro.props + +function parsePresets(preset?: string): {color: string, title: string, Icon: any} { + if (preset == null) return {color: 'blue', title: 'note', Icon: MdInfoOutline}; + + if (preset.match('note')) { + return {color: 'blue', title: 'note', Icon: MdInfoOutline}; + } else if (preset.match('warning')) { + return {color: 'orange', title: 'warning', Icon: MdOutlineWarningAmber}; + } else if (preset.match('important')) { + return {color: 'amber', title: 'important', Icon: MdOutlineStarBorder}; + } else if (preset.match('new')) { + return {color: 'green', title: 'new', Icon: MdCheck}; + } else return {color: 'blue', title: 'note', Icon: MdInfoOutline}; +} + +let {color, title, Icon} = parsePresets(props.preset); + +if (props.color) color = props.color; +if (props.title) title = props.title; +if (props.icon) Icon = props.icon; + +let class_colors = "bg-[var(--props-bg-color)] border-[var(--props-border-color)] dark:bg-[var(--props-dark-bg-color)] dark:bg-opacity-70"; + +--- + +
+
+ {/**/} +

{title}

+ +
+
\ No newline at end of file diff --git a/src/components/mdx/MDXCodeBlock.astro b/src/components/mdx/MDXCodeBlock.astro new file mode 100644 index 0000000..4a136dc --- /dev/null +++ b/src/components/mdx/MDXCodeBlock.astro @@ -0,0 +1,125 @@ +--- + +import React, { ReactNode } from 'react'; +//import { CodeBlock } from 'react-code-block'; +//import { themes } from 'prism-react-renderer'; +import { Highlight } from 'prism-react-renderer'; +import type {PrismTheme} from "prism-react-renderer"; + +import { parseHTML } from 'linkedom'; + +import pkg from 'lodash'; +const {unescape} = pkg; + +import { Prism } from '@astrojs/prism' + +const theme: PrismTheme = { + plain: { + + }, + styles: [ + + ], +}; + +const props = Astro.props; + +/*export type MDXCodeBlockProps = { + children: any, + class: string, + language?: string, + filename?: string, + lines?: [string], + words?: [string], + showLineNumbers?: boolean, + startLine?: number, +}*/ + +/*let darkMode = useMediaQuery( + { query: "(prefers-color-scheme: dark)" }, + undefined, + (isDark) => { darkMode = isDark } +);*/ + +let lang: string = ''; +let filename: string = ''; + +const code_html = await Astro.slots.render('default'); + +const renderCode = (html) => { + const { document } = parseHTML(html); + const child = document.children + const match = /language-(\w+)/.exec(child[0].className); + lang = match ? match[1] : 'plaintext'; + + const match2 = /filename="(.*?)"/.exec(child[0].getAttribute('metastring')) + filename = match2 ? match2[1] : null; + //console.log(match) + return unescape(child[0].innerHTML); +} + +const code: string = renderCode(code_html); + +/* +(typeof props.children === 'string') + ? props.children + : React.Children.toArray(props.children).reduce((acc: any, child: ReactNode) => { + if (React.isValidElement(child) && typeof child.props.children === 'string') { + const match = /language-(\w+)/.exec(child.props.class); + lang = match ? match[1] : 'plaintext'; + return acc + child.props.children; + } + return acc; + }, ''); +*/ + +const lineNumbers = props.showLineNumbers ?? false; +const wrap = props.wrap ?? false; +const codeBackgroundTW = 'p-2 bg-neutral-300 bg-opacity-50 dark:bg-slate-800 dark:bg-opacity-100 rounded-lg font-mono'; + + /* bg-neutral-300 bg-opacity-50 dark:bg-slate-600 dark:bg-opacity-100 + text-neutral-800 dark:text-slate-300 + theme={darkMode ? themes.vsDark : themes.vsLight}*/ + +/* + + {({ class, style, tokens, getLineProps, getTokenProps }) => ( + <> + {props.filename ? ( +
+ {props.filename} +
+ ) : ''} +
+            {tokens.slice(0,-1).map((line, i) => (
+                
+ {line.map((token, key) => ( + + ))} +
+ ))} +
+ + )} +
+*/ + +--- +<> +{filename ? ( +
+ {filename} +
+) : ''} + + diff --git a/src/components/mdx/MDXImage.astro b/src/components/mdx/MDXImage.astro new file mode 100644 index 0000000..e4903f1 --- /dev/null +++ b/src/components/mdx/MDXImage.astro @@ -0,0 +1,22 @@ +--- +const className = 'relative -z-10 border-4 border-crusta-200 dark:border-night-800 rounded-lg shadow-lgr shadow-crusta-400/20 dark:shadow-night-400/50 my-2' + + ' sm:w-[var(--props-size)]' + + ' sm:m-[var(--props-center)]' + +const props = Astro.props + +--- + +
+ {props.alt} +

{props.alt}

+
\ No newline at end of file diff --git a/src/components/mdx/PostHeader.tsx b/src/components/mdx/PostHeader.tsx new file mode 100644 index 0000000..0e3e7a9 --- /dev/null +++ b/src/components/mdx/PostHeader.tsx @@ -0,0 +1,48 @@ +import { Post } from "@/.contentlayer/generated" +import MDXImage from "./MDXImage" + +import { format, parseISO } from 'date-fns' + +export default function PostHeader(post: Post) { + + const numberToWord = (num: number) => { + switch(num) { + case 1: return "one"; + case 2: return "two"; + case 3: return "three"; + case 4: return "four"; + } + } + + return (<> + { ( post.cover && post.cover_alt ) ? ( +
+ +
+ ) : '' } + +

{post.title}

+

— {format(parseISO(post.date), 'LLLL d, yyyy')} + {(post.updated) ? ( + , updated {format(parseISO(post.updated), 'LLLL d, yyyy')} + ) : ''} +

+

{post.summary}

+ + {(post.toc) ? ( <> +

table of contents

+
+ {post.headings.map((heading: {level: number, text: string, slug: string}) => { + return ( +
+ + {(heading.level > 1) ? '> ' : ''} + {heading.text} + +
+ ) + })} +
+ ):''} + ) +} \ No newline at end of file diff --git a/src/content/archives/2023-02-18-shipment.mdx b/src/content/archives/2023-02-18-shipment.mdx new file mode 100644 index 0000000..371ca32 --- /dev/null +++ b/src/content/archives/2023-02-18-shipment.mdx @@ -0,0 +1,49 @@ +--- +date: 2023-02-18 +tags: cod video_games game_design rant skub +title: Shipment is the Worst COD Map +summary: A rant about the infamous Call of Duty map "Shipment" and why I believe it is the worst map in the franchise. +toc: true +--- +Yes. You heard me correctly. Shipment is the worst map in Call of Duty. Let me explain my reasoning. + +# Wait, what *is* Shipment? + +Shipment is a very smol map that is literally just a square arena with four shipping containers creating a four-way intersection in the middle, along with some more shipping containers on the sides to make those parts of the math not just complete sniper death zones. + +![An overhead shot of Shipment from Modern Warfare 2019.](/blog/shipment.png) + +In actuality, it's a very interesting map. Removed with all of the context surrouding COD's camo and weapon grind, I would say Shipment is a pretty cool map. Not the best or pentultimate COD map (right now that crown goes to Farm 18 but I'm probably showing my zoomer cringe nae-nae baby-ness for saying that), but a fun excursion. + +The problem is that Shipment doesn't exist in a bubble. The whole reason Shipment is so popular is solely because of the fact that camos exist. + +# A quick recap of COD's camo system + +If you haven't played COD, you might not know that since Call of Duty 4: Modern Warfare, you can apply different paint jobs to your guns to show everyone how Operator™ you are. In that game, you only had to get headshots to get camos, but over time, players had to dance many more different types of dances in order to get all of the coolest camos. + +In the most recent Modern Warfare games, you have to complete certain achievements with your gun in order to unlock camos. These achievements include headshots (again) but also kills from far away, killing multiple people in quick succession, killing multiple people without dying, etc. + +Obviously, it takes a while to unlock all of these achievements. If only there was a way to get into fights more quickly to allow for unlocking these achievements faster. Oh wait. + +# Shipment is great for camo grinding... +The map is extremely small for 12 players to occupy at once. Thus, you get into a lot more fights a lot more quickly. This, of course, makes it easier to accomplish certain camo challenges like double kills, headshots, hipfire kills, etc. You may have trouble getting longshot kills due to the map size, and you may have trouble saying alive long enough to get multiple kills without dying... but otherwise, it is a great map for grinding out those camo challenges and unlocking them all for a particular weapon. + +# ...and that's a problem. + +[Players like to optimize the fun out of a game](https://www.designer-notes.com/game-developer-column-17-water-finds-a-crack/). If they wanna do something, and there is a better way to do that thing, they will do that thing in an attempt to be better at the game... even if it's A. not what the developers want the players to do and/or B. it just makes the game worse to play. A great example is in stealth games: there is a large section of players who bypass an entire section of a stealth game's design and reload their save whenever they get detected. + +In COD, Shipment presents this exact same problem. Part of COD's design is the varied maps that are on offer. A good COD game needs good maps in order to shine. The Modern Warfare reboot released in 2019 (which I will from now on refer to as MW19) is a good example of this: the mechanics are tight, but the maps are shit. If there are lots of fun maps on offer, they supplement the core gameplay by providing the player with a steady feed of varied arenas to run around and shoot people in. + +But there's also that camo grind to think about. Obviously, you'll get through the camo grind faster if you play on Shipment. So... what if you... *only. played. on Shipment?* + +Sure, you'll get the camo grind done faster. But it will also suck. Cause you're playing on the exact same map over and over again. You'll start to get bored. You'll start to get annoyed at all of the little mistakes the developers made with the core gameplay because that's all that's left after you stripped out the variable of different maps. Congratulations. You just optimized the fun out of Call of Duty. + +# Quick aside about Modern Warfare II +Like I said before, MW19 had shit maps. So, of course, one of the things Infinity Ward aimed to fix with the new Modern Warfare II (which I will from now on refer to as MW22) was to make the maps... not shit. And they did it! The maps are... not actually trash this time! I've already shouted out Farm 18 as one of the best COD maps ever made. Shoothouse is also brilliant (tho that kinda doesn't count because it actually came from MW19, shockingly). Crown Raceway, Fortress, and Las Almas are very solid as well. The only maps that I feel are "meh" are Museum and El Asilo, but the fact that there are no maps as bad as Picadilly, Hackney Yard, or Azhir Cave is a massive plus in my book. + +Of course... you won't realize any of that... if the only map you play on... *is fucking **Shipment.*** + +This is why I feel a bunch of ppl who complain about MW22 are somewhat misguided: if you purposefully ignore one of the best parts about MW22, of course the scales are going to be scewed towards the negatives. The maps are one the biggest reasons why I want to play MW22 and have massively enjoyed my time with the MW22 beta and free trial. Sure, MW22 is not perfect (see: Activision doing everything in their power to leave MP players stranded in the desert starving and dehydrated while offering every single Warzone player a private villa and a million COD Points)... but actively ignoring one of the best parts about the game is doing the game a massive disservice and paints you as disingenuous. + +# Conclusion +Shipment sucks, suck my cock, ok goodbye diff --git a/src/content/archives/2023-03-26-fastmail.mdx b/src/content/archives/2023-03-26-fastmail.mdx new file mode 100644 index 0000000..08c8028 --- /dev/null +++ b/src/content/archives/2023-03-26-fastmail.mdx @@ -0,0 +1,21 @@ +--- +date: 2023-03-26 +tags: selfhost tech nerd email fedi fediverse mastodon +title: I gave up (I'm using Fastmail now) +summary: A little update about establishing eleboog.com email through Fastmail. +--- +I wanted to make my own email server so I could be independent from big tech's monopoly in email. I quickly found out that it was not worth it. + +It was such a pain in the ass to set up, and I couldn't send emails to my GMail account because my home-rolled email looked too sus to GMail's filters. + +So... I gave up. On a recommendation from someone else, I started my free trial of Fastmail and got it set up. After configuring my domain's DNS records, it works flawlessly! + +Feel free to send me emails through my listed email: [kebokyo@eleboog.com](mailto:kebokyo@eleboog.com). Plaintext, personal emails are prefered. + +Next on my list is getting PeerTube up and running and possibly getting a Fediverse instance going as well. I also need to use the Fediverse a little more lol. Currently I'm at [@kebokyo@plush.city](https://plush.city/@kebokyo), so feel free to hit me up on there! + +so yee, cya later + +p.s. i love how the day after i get the email set up, someone emails me out of the blue hehe + +p.p.s. if you sent me an email within the past few months, send it again bc i probably didn't get it ;w; diff --git a/src/content/archives/2023-03-28-jekyll-to-gemini.mdx b/src/content/archives/2023-03-28-jekyll-to-gemini.mdx new file mode 100644 index 0000000..4d4bd54 --- /dev/null +++ b/src/content/archives/2023-03-28-jekyll-to-gemini.mdx @@ -0,0 +1,57 @@ +--- +date: 2023-03-28 +tags: jekyll meta open_source blog gemini +title: New project! jekyll-to-gemini +summary: An announcment of a project I was working on that would allow me to port a Jekyll website to Geminispace. +--- +Hey! I'm gonna start working on a plugin for Jekyll called [jekyll-to-gemini](https://gitea.eleboog.com/kebokyo/jekyll-to-gemini) that automatically generates a Gemini capsule from the Markdown that forms your website. This is so I can have a Gemini mirror of my blog for Cooler Dans to check out. + +I would tell you about my plans for it, but I literally wrote all of them in the README, so imma just copy that into here lol. + +## Notice: This is still a massive WIP and is currently non-functional. + +## Intro + +I wanted to create a Gemini version of my Jekyll blog in order to show my support for the open, indie web. However, as far as I can tell, there currently is no plugin that provides that functionality. The closest thing is [jekyll-gemtext](https://github.com/jebw/jekyll-gemtext), but that allows you to use Gemtext in place of Markdown for writing your pages and is more suited from making a Jekyll site out of an already existing Gemini capsule. I'm wanting the other way around: to automatically generate a Gemini capsule out of my Jekyll website. + +So, I'm making it myself. With blackjack and hookers. Yeeee. + +## Formatting + +Gemtext has a few quirks that make converting an existing website to it a bit difficult. Luckily, there's some ways we can work around that. + +The most notable limitation is that Gemtext does not support inline links. Yup. You can't do something [like this](http://picard.ytmnd.com/) in Gemtext. Instead, links have to go on their own separate line. The default solution will be to convert inline links into footnotes, like this: + +``` +The most notable limitation is that Gemtext does not support inline links. Yup. You can't do something like this[1] in Gemtext. Instead, links have to go on their own separate line. +... (bottom of page) ... +# Footnotes +=> http://picard.ytmnd.com/ [1] like this +``` +There will also be a few ways to customize how footnotes are generated, like where / how footnotes are placed, how much of the original text is included in the footnote for context, etc. + +Images will be rendered as links with their alt text used as the display text. For example, an image like this: + +![it's the funny bald man](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Jean-Luc_Picard_2.jpg/200px-Jean-Luc_Picard_2.jpg) + +Will be converted to Gemtext like this: + +``` +=> https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Jean-Luc_Picard_2.jpg/200px-Jean-Luc_Picard_2.jpg it's the funny bald man +``` + +Some Gemini clients allow for the rendering of images linked like this, so doing this lets Gemini clients that support that view the image like HTTP normies can. + +In terms of other formatting, like italics, bold, etc, the Markdown syntax is generally left alone. Why? Y'all know that `*this*` means *this*, so even if it doesn't look like *this*, you'll still know what it's supposed to mean. Plus, the asterisks still perform their function of emphasizing a bit of text even if they don't work like they were meant to. Life hack! + +## Compatability + +I'm going to be focusing on getting this to work on [my own website](https://gitea.eleboog.com/kebokyo/eleboog.com) first, which is a personal blog built on Jekyll 4.3.2 and a slightly modified version of Minima 2.5.1. If your website doesn't fit that bill, it might not be the most ideal for now. Feel free to suggest improvements, tho! + +Most notably in terms of compatability, this plugin parses the Markdown files used to build your website in order to generate the proper Gemtext. This obviously means that if you don't use Markdown for your site, this isn't gonna work. I don't plan on supporting any alternative languages right now, but feel free to shout if you're using something else. If enough people say they use X thing and they wanna be able to use this, I may add support for X thing to this plugin. Alternatively... fork this! + +## License + +This plugin will use GPLv3 as its license. TL;DR: you can make any changes you want to this, but if you share your fork with others, you have to provide the source somewhere too. Part of me wants to do AGPLv3, but I don't think everyone is crazy enough to publish their website's source on the internet like me lol. + +so yee! hopefully this goes somewhere. cyall l8r diff --git a/src/content/archives/2023-07-06-fediverse-and-nova.mdx b/src/content/archives/2023-07-06-fediverse-and-nova.mdx new file mode 100644 index 0000000..1944d35 --- /dev/null +++ b/src/content/archives/2023-07-06-fediverse-and-nova.mdx @@ -0,0 +1,29 @@ +--- +date: 2023-07-06 +title: "The Fediverse! + Nova editor impressions" +tags: fedi mastodon fediverse nova mac csci calckey meta +summary: Thoughts about Calckey and the Nova text editor. +--- + +I've been continuously carving out my online presence in ways that is not beholden to any one corporation or organization. I see it as a way to learn real-world software engineering skills as well as contribute to the re-democratization of the internet. Yesterday, I took another big step towards those goals by setting up my own ActivityPub (or "fediverse") instance running [Calckey](https://calckey.org/). You can find it at [fedi.eleboog.com](https://fedi.eleboog.com)! + +![A screenshot of my Calckey instance as it is currently set up. My profile picture is in the top-left corner on top of a side bar containing numerous icons linking to different sections of the app. A "Federation" ticker is on the top of the screen, showcasing the instances that I am actively federating with. The main feed shows a post from zenith containing the text "Gonna be furry trash at my ML presentation today [smiley face]" and a picture of a t-shirt zenith is wearing featuring multiple anthro characters. Another side bar on the right has numerous widgets, including the time, date, notifications, and server stats such as CPU and RAM usage.](/blog/screenshot_calckey.png) + +Currently, the instance is just for me, but if you really want to join it, shoot me and email and I'll think about it. Alternatively, you can send me a message on fedi through my new handle [@kebokyo@fedi.eleboog.com](https://fedi.eleboog.com/@kebokyo). + +Sadly, due to the high ram utilization of both Calckey and Discourse, I can't have both running at the same time. So, the Discourse forums that I had up for about a month has been shut down for now. Calckey has a bunch of cool features like local-only posts and "pages" that could make it a decent replacement (and one that's definitely more future-proof). + +I've also been checking out ways to improve my workflow. I've been trying out [Sublime Merge](https://www.sublimemerge.com/) to make managing my website's git repo a bit easier, and I've enjoyed it so far! However, I recently also decided to give [Nova](https://nova.app) a shot... and it blew me away. + +![A screenshot of my Nova setup for website maintenance. A list of all of my website's project files are on a sidebar to the left. The rest of the editor is divided up into three sections: a main editor view (at the time of capture, showing a shorter journal entry I was writing before Nova crashed as I detail further in this blog post), a preview of my live website, and a terminal view with tabs for both my local machine's terminal and my VPS's terminal accessed through SSH.](/blog/screenshot_nova.png) + +The layout of Nova is very flexible, allowing you to add multiple different sections to the screen with different content such as terminals and a web view. It also has a pretty neat source control system that can replace Sublime Merge for simple tasks. + +Sadly, it does have some bugs. I tried CTRL+S on a .png file (for some reason) and the app crashed. Whoops. On top of that, it is a paid, closed-source app that costs $99, but it's a one-time payment! You do have to subscribe for $49/yr if you want updates after the first year, but if you don't, you still keep the last version you got forever. It's a much better model than a lot of apps nowadays (where once you stop paying the subscription, you lose access to the app). + +Overall, I'm really enjoying my time with Nova, and I will continue to use it until at least my free trial expires. + +Finally, I want to briefly shout out something that I added to the site a bit ago that I never made a blog post about: the [sharefeed](/sharefeed/). It's essentially a place for me to share articles, blog posts, websites, and other links that I find interesting. It also has an [Atom](/sharefeed/rss/) feed that you can use in pretty much any RSS/Atom reader to keep up to date with the things I share in it. I don't update it as much as I would like to, but I plan to keep this around for a long time. If you have any suggestions for things I could add to it, let me know! + +See y'all again in... fuck, four months i guess + diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..5e77fc3 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,38 @@ +import {z, defineCollection} from 'astro:content'; + +const Posts = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + date: z.date(), + updated: z.date().optional(), + summary: z.string().optional(), + cover: z.string().optional(), + cover_alt: z.string().optional(), + tags: z.string().optional(), + draft: z.boolean().optional(), + toc: z.boolean().optional(), + narration: z.string().optional(), + narration_date: z.date().optional(), + }) +}) + +const Archives = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + date: z.date(), + updated: z.date().optional(), + summary: z.string().optional(), + cover: z.string().optional(), + cover_alt: z.string().optional(), + tags: z.string().optional(), + draft: z.boolean().optional(), + toc: z.boolean().optional(), + }) +}) + +export const collections = { + 'posts': Posts, + 'archives': Archives +} \ No newline at end of file diff --git a/src/content/posts/2024-06-16-hello-again.mdx b/src/content/posts/2024-06-16-hello-again.mdx new file mode 100644 index 0000000..265c030 --- /dev/null +++ b/src/content/posts/2024-06-16-hello-again.mdx @@ -0,0 +1,307 @@ +--- +title: Hello Again +date: 2024-06-18 +updated: 2024-07-05 +cover: '/blog/hello-again/banner-lake.png' +cover_alt: A picture of a lake surrounded by trees, with an orange kayak visible on the right side. Photo by Alice Triquet on Unsplash. +summary: "The first post to go on my new blog. Remarks on the development of this website, why it took so long for me to rework it, and where I want to go from here." +toc: true +--- + +Every time I do one of these posts, it is woefully short and vague. +The last one was just a short list of all the new stuff that's online. I don't want to do that this time. +I put way too much effort into figuring this out for me to just say "hey, new blog pogchamp, go bookmark it or something i guess". +Cause yeah... this took *way* too long to figure out. + +Let's start at the beginning: + +# Why do a redesign in the first place? + +I actually like Jekyll a lot. It's one of the simpler static site generators to get up and running (after you wrangle past ruby). +It's also very customizable, though I wish the plugin ecosystem was more documented. + +The big problems started around the time I implemented the Chirpy theme. +I wanted to expand the functionality of the site with things like the sharefeed and do some heavy visual customization in order to make the site look +less like a cookie-cutter clone-template-send-tweet kinda site and more like its own thing with its own graphic design vision. + +Once I started messing with that stuff, I quickly realized that Jekyll wasn't really designed for making fancy UX, +and it *especially* was not designed for working with bespoke data like, say, an array of links to other websites with custom descriptions. + +At the end of the day, Jekyll's web pages are still mostly made using static markup languages like HTML or Markdown. There can be dynamic functionality +built out using Ruby and Liquid, but that's more of an extension on top of the static pages. If I want to enable more dynamic content within my site, it +would require libraries on top of libraries on top of ruby gem extensions on top of *aaaaaaaaaaaa* + +Oh, and it doesn't help that the Chirpy theme is not very friendly on mobile. +I noticed *two different levels of scrollbars* when trying to navigate on mobile, and the responsive design is still a bit too scaled up with many +elements overly padded taking up too much space. If I want to build a site ideal for both desktop *and* mobile, +it would be more ideal to roll my own UX rather than relying on a template someone else created... and that's not easy to do with just HTML + CSS, even +with Jekyll's built-in support for preprocessors like SASS. + +At that point, what I need is less a static site generator and more... + +## A modern web framework + +Oh god. Oh fuck. I need to learn Javascript. And React. I'm going to die. + +Well, I'm not going to die, I've done this before in a college course about databases. And I did just fine in the end. +There was just one small problem: learning React was not on the curriculum. + +Our final for this course was not an exam but a group project where up to four people had to make a fake e-commerce website +requiring the use of not one but *two* databases (we had to copy a database the professor provided into our own database that we then worked with). +My group project partners decided that instead of making the website in PHP like we were taught, we needed to use "modern web frameworks" like React +and Tailwind and host our database on a serverless database host like Supabase and generally make everything needlessly complicated for the sake +of "this is what we oughtta do cause everyone else (in the industry, not our class) is doing it!!1!" + +Of course, I had never done any of this before. So getting familiar with Javascript and React took some getting used to. I still hate the whole +`boo = () => far` syntax with a passion. It just looks so stupid and makes no sense to me. + +We also ended up being so focused on getting our "modern web framework" to actually, well, *work* that we ended up missing a very +obvious-in-hindsight sanity check. +One of the "products" that we copied from the legacy database just had a datetime +for the name. Tuns out that datetime updated every couple hours or so on the legacy database, so if we were making sure to pull from the legacy +database occasionally to make sure everything was gucci, that product's name on *our* database would more or less tell you the current date. +We didn't do that. So our sanity check product was way behind. The TA ended up docking some points on our project for that, and all of my project +partners were super salty in the group Discord about it, calling the TA incompetent and all that jazz. I have a feeling their response had something +to do with the fact that the TA was clearly South Asian... + +Anyways, looking back on all that mess, I guess I can thank it for introducing me to React and Javascript. Without that foundation to build off of, +doing this website rework would have taken a lot longer... though that isn't saying much. + +The group project was done in base React (using `create-react-app` as a starting point). That was hell. So if I was going to use React, I would want +to use a different "wrapper" framework that would make building my site a lot easier. I ended up landing on Next.js because it was one of the more +popular metaframeworks and it seemed easy enough to hop into. + +# My Next.js journey + +This isn't the first time I tried remaking my website with Next.js. Originally, I intended to design my website much like contemporary webapps \- +navbar at the top with fancy shadcn/ui hover menus, a detailed footer, a detailed account menu (I'll get into where "accounts" come into the equation shortly), +and lots of nested divs and Cards and stuff. + +![A screenshot of the original Next.js blog redesign. It showcases a navigation bar at the top of the screen designed to look like a floating bar on top of the main page, a home page featuring the newest post & latest comment, and a footer that contains the sitemap.](/blog/hello-again/old-next-shot-main.png) +![Another screenshot of the orignal Next.js blog redesign, this time showcasing the navigation bar in more detail. Hovering over one of the navbar links pops out a menu that includes links to different parts of the site. Here, a link to the three most recent comments are shown, along with links to an about page on the comment system, a guide to "Flexdown", the specific Markdown dialect I was working on, and a "town square", which would be a static page containing its own comment section for general discussions.](/blog/hello-again/old-next-shot-nav.png) + +There were two main goals with this redesign: +- 1) Design a homegrown comments system using Postgres & Auth.js. Essentially, allow visitors to make an eleboog.com account and leave comments on my blog posts. +- 2) Use responsive design to make the site easy to navigate on both desktop & mobile. The main way I accomplished this is turning the sitemap into a pullout menu you can access by tapping a hamburger on the navbar. + + + + +I ended up dropping this version of the redesign before I fully implemented the sitemap / mobile menu nor the comment system. + +The big reason why was because I bit off *slightly* more than I could chew. In my attempt to be "trendy", I used shadcn/ui components +for a large majority of the site's design. This worked well... until I needed to edit the components to work better for my usecases. For example, +the mobile menu was created using the Drawer component, but I had to edit the component to allow for a variant that comes out from the top rather +than the bottom. The fact that I *could* edit the component is indeed a perk of shadcn/ui, but the fact that I *had to* rather than that functionality +already being accounted for in the original component just ended up reminding me of why I tend to shy away from WYSIWYG-style solutions: +once I start bumping up against the boundaries of what the tool is capable with, my patience can run incredibly thin. + +I think another reason why things fell apart was that instead of making sure I had a "minimal viable product" before expanding the project's scope, +I started work on multiple different aspects of my site at the same time, expanding my project's scope too early. +I didn't start figuring out mobile UX until *after* I had started implementing the account features. +I started writing a guide on "Flexdown" before I even started actually implementing it, even on the supposed "Flexdown guide" itself. +I was so ambitious with what I wanted to do that even though I had been using [Linear](https://linear.app) to plan out the development of my +project, I still ended up putting my eggs into too many baskets. +I ended up perpetually [halfway to Malamaroo](https://www.youtube.com/watch?v=PmWUAIr3VdY&pp=ygUdaGFsZndheSB0byBrYWxhbWF6b28gZHIgc2V1c3M%3D) +once again with seemingly no escape in sight. + +## Can we start over? + +After a brief stint with SvelteKit (which I may make a blog post about later), I decided that the problem wasn't Next.js but instead the way I was +approaching the project. + +I was chasing trends and "staple webdev libraries" without thinking about how they would benefit me first. +I saw a bunch of people using shadcn/ui and ranting and raving about how cool it is, and I got swept up in the hype. +I thought it would make the development process so much easier when in reality it just made things more complicated. + +In a way, I fell into the same trap my group project partners did: they got swept up in doing the things the way everyone else does them, and +ended up working so hard on getting those tools working that they missed crucial details staring them right in the face. I was so caught up in +getting shadcn/ui and Auth.js and Neon and all that stuff working... that I forgot to put actual links in the sitemap or make the blog archive link +actually go anywhere. I spread myself too thin, and the scope of everything balooned so much that it got very overwhelming very quick. + +Instead, I needed to start small and work my way *up* to more tools as I need them. Instead of adding a new tool because I think it *would* help me, +I need to add tools that I *know* will help me. I also needed to focus my work on one area of the site at a time. I needed to make sure one section +was *completely done* before I moved on to the next (of course, nothing is ever "completely done", but the focus here is on the *feeling* of being done, +something I rarely get to experience because I keep hopping between different projects and never finishing what I start... like that alien from the +kids show clip I linked lol). + +I had to start over. And this time, I needed to do things right. + +# How I designed this version of the site + +I was heavily inspired by [the personal website & blog of Xe Iaso](https://xeiaso.net). The minimal UX "fluff" and emphasis on text +along with a cream-colored light theme that's easy on the eyes were the main aspects I wanted to ~~rip off~~ *make homages to*, as you may +be able to tell from the home page. + +![A screenshot of Xe Iaso's website. It features a simple navigation bar, their name and job title, a brief bio, and a list of recent articles. Not shown in the screenshot are lists of featured articles Xe has writen for current and past employers, featured projects, social websites Xe is also on, and a list of common tags that describe articles featured on the website.](/blog/hello-again/xe-iaso-blog.png) +![A screenshot of the current homepage of eleboog.com. It features the website title, the type of page the user is on, a simple navigation section, A brief description of the website, a list of recent posts (including this one!), and a brief section containing social links.](/blog/hello-again/new-site-homepage.png) + +It's also very much influenced by how much trouble I had wrangling shadcn/ui: while I reluctantly added +it to my project to fix some CSS variable shennanigans, I'm trying very hard to minimize the usage of it. +The UX style of shadcn/ui, while visually appealing, is a bit too... "samey"? Waltz into any hobbyist "webapp" developed in the past couple years +and you'll see tons of UI elements imported from shadcn/ui and slapped onto the page without much modification other than color palletes. + +It's also contradictory to the "text-first" theming I'm giving to this current vision of the site. For example, you may have already noticed a +distinct lack of buttons on this site in favor of text links. It not only makes the site easier to operate w/ screen readers & keyboard +navigation (accessibility is definitely something I want to work on for this version of the site), but it also results in less visual clutter. +This is another aspect I ~~ripped~~ *borrowed* from le orca's website. I'm already trying to incorporate a "think smarter, not harder" philosophy +into the development of this site, so what better way to visually represent that than to make the site look like it came from both 1999 and 2099 +at the same time? + +## Compare & Contrast + +Even though the original Next.js iteration of this site didn't last very long, it still taught me a lot, and a lot of elements of that site +have been caried forward into the verison you see now. + +I kept the same font selection in order to make my blog stand out from others. +I'm especially proud of using the mono font ([Monofur](https://www.dafont.com/monofur.font)) in more parts of the site, +as it is my prefered terminal font. +I am also (for now) using MDX to power my blog posts, but instead of wrangling `next/mdx`, I decided to try Contentlayer... and I'm very impressed! +It made implementing and extending MDX very easy, and I would definitely recommend it for anyone wanting to make a similar site to mine. + +There are, however, a couple of key differences. First of all, right now I'm focusing squarely on getting my blog exactly where I want it to be, +*including the amount of content available*, before I start developing the other systems of the site, such as the comment and account systems. +I want to actually, ya know, *write stuff* more often this time, and the perpetual busywork of adding new features to my blog directly contributes +to me not writing jack shit for the blog itself. I also want to make sure the formatting of my blog and the accessibility of my content is at a +good place before I throw two brand-new full-stack systems into the mix. Accessibility is something I suspect was lacking in the earlier form of this blog, +so I want to focus on making sure the blog is fully accessible through screen readers and keyboard navigation. + +# Where to go from here + +Right now, the focus is on making sure the base features are in order and that I'm actually writing instead of constantly working on new features +that don't matter. So, until I have at least **two to five additional articles published on this website**, I will soely work on maintaining and +improving the existing functionality of this website. This includes the MDX rendering, overall site performance & responsiveness, UX tweaks, etc. + +After I feel like I'm ready, I want to start delivering new features that are either supplemental to my blog or allow me to add more things to my articles. + +The following is a list of planned features, starting with... + +## Sharefeed 2.0 + +Last time on Dragon Ball Z, I introduced a "sharefeed", essentially a collection of links to other websites that I thought were interesting. +It had its own RSS feed so, if you wanted, you could subscribe to it and get a currated collection of random shit in your Feedly or whatever. + +My main problems with the sharefeed were how rarely I updated it (of course) and how exactly it was implemented. The Chirpy theme for Jekyll had +functionality built in to generate an RSS feed along with the rest of the site. It was basically a whole bunch of Liquid magic. +To create the sharefeed, I duplicated this functionality and tweaked it to instead work with a YAML array of bespoke data I crafted myself. I also +duped the functionality that powered the home page listing of posts, card formatting and all, to power the sharefeed's page on my site. +It worked! But it always felt slightly hacky. Jekyll is definitely not designed for stuff like this, and implementing the sharefeed just reinforced +how hard it is to get Jekyll to do exactly what you want. + +Now that I'm using an actual fullstack framework, I think it's time to give the sharefeed another shot. This time, I'll be using JSON to format +the data instead of YAML since there are better tools for handling JSON in JS/TS (it's almost like JavaScript is *in the freakin' name*). +This will make it much easier to display the sharefeed on the website as well as build a RSS feed off of it. + +One detail I want to fix with this version of the sharefeed, though, is related to the RSS feed. I want to allow people to subscribe to one feed for +all of my content instead of having to subscribe to multiple feeds. So while my blog posts and the sharefeed will each get their own separate feeds, +there will also be **one shared RSS feed that contains all of the "feedable" content I post on the site.** There's one more feed that will +eventually be incorporated into this as well, but that warrants more explanation... + +## Embedded media + +One thing I didn't really do too much on Jekyll was embed content within my articles. The most I ever did was static images. I want to change that. + +Now that I am working with MDX, implementing embedded media is as simple as creating a new component for that embed, then adding that component into +the list of `mdxComponents` available to me. After that, all I need to do is just call it with something like `` and boom, +I got a YouTube video embedded in my article. It isn't the *most* elegant looking solution, but its implementation is so smooth that I'm not too +nitpicky about it anymore. + +The main use for embedded media that I'm excited about, though, is embedding audio through an audio player. Why? + + + +Okay, maybe not podcasts necessarily, but close. Basically, one problem I see with screen reading my articles is that if I include visual elements +like images, the only description you can get of them is whatever I can fit inside the alt text (which, if you may have noticed, pulls double duty +as the image caption... at least for now). You also probably know of the struggles of conveying tone through text. I try to do that with +*fancy* **formatting** techniques, but obviously if you can't see the text, you can't see whether that +text is bold or italic or whatever. This isn't just an accessibility issue: what if you're out on a walk and want to catch up with something I wrote +without having to stare at your phone the entire time? You can't easily just put it on in the background and listen to it like you can a YouTube video. + +But you know what YouTube videos have? People talking. What if... get this... *I talked?* + +Something I want to start doing with my blog posts, especially longer ones (like this one lol) is providing "narrated" versions that you can listen +to either on the website itself or through an RSS feed. Once the narration is available, all you need to do is click or tap on an embedded +audio player at the top of the page and my lovely voice will start reading the article out loud to you. +I will try to convey the tone that may be hard to convey over text, describe any visual elements such as images with +more detail than I may put in the alt tags, and generally provide a quality, enjoyable, and (most importantly) fun narration. + +It would also be a good idea to put these narrated articles up on their own RSS feed. +Of course, they will also be a part of the "main" feed along with my text posts and sharefeed, +but I want to give it its own RSS feed for one specific purpose: podcast players. Many podcasts are delivered in the form of an RSS feed, +so in turn many podcast players allow users to import RSS feeds into the app to subscribe to a podcast directly without having to +go through third-party platforms like Apple Podcasts, Spotify, etc. + +If I make an RSS feed for my narrated articles, you could subscribe to it on, say, your iOS Podcasts app, or any other podcasts app that you choose. +Not only will you get notified when a new narrated article is out, but you'll also be able to listen to it through the app, +either right there and then or whenever the hell you want. On top of that, if I do publish my narrated articles through Apple Podcasts, Spotify, etc., +it will mean that content is now officially part of a content recommendation algorithm. Somebody can stumble across my dumb bullshit ramblings +just by the will of the ghost of Steve Jobs. Woa. + +This whole concept is really cool to me, and I really want to try to get it implemented. Once I do, I'll be sure to write up an article about it. +I'll also make sure that the narrated version of that article is published at the exact same time as the text version, so you can hear me talk about +the system as you are using it. Wild stuff. + +## The journal, or "shittenings" + +Before I wrap things up, I briefly want to touch on my half-baked attempt at a ["HTML Journal"](https://journal.miso.town), a page I called "shittenings". +It was essentially a single page where I would occassionally post small updates on what I was working on. I really like the concept of it, but +I'm not sure whether to make it again or try to transition over to social media like fedi, bluesky, cohost, etc. If I do implement it, I'd want to make +a habit of updating it every week even if I don't post a full article. I may even put it on its own RSS feed or mix it with audio rambles that would +also be posted on my "podcast" RSS feed. I don't know for sure. + +And now, for something completely different... + +# A reflection + +Usually, whenever I get to the end of a blog post, I'm not really sure how to end it. Most of the time they're just a stream of consciousness, a +loosely linked list of thoughts and ideas and concepts and opinions that just go on and on until I run out of things to say... and +it's not like you can tie rabbit holes up in a neat little bow unless you're a god or something. + +To be fair, this particular post still falls under that general template. I didn't know exactly what I wanted to write going into this. +I just knew I didn't want this to be as short as most of my other blog posts, +and I wanted to give some idea as to how the hell I got here (for prosperity!). + +You can probably tell I'm getting tired and out of my element. It's taking me a bit too much of my being to not end this on one of those zingers +like I usually do. + +But I don't want to blog like I usually do anymore. I want to blog like someone who actually has stuff to say. Sure, I still want to be relatively +casual with what I talk about (I'm certainly not an expert in much of anything right now), but I want what I put out there to be meaningful and +substantial. I don't think I'll ever get to Professional™ YouTube® Video™ Essayist™ levels of "substantial"... but checking the word count I've +got in this thing so far, around 2500 words is way more than I ever imagined I'd put out for a first post. + +The problem is that specific desire to be "meaningful" and "substantial" in what I have to say... is one of the meanest and toughest obstacles +between me and actually saying anything at all. + +There's a reason why "Updates once or twice a week I guess" has become my version of ["YGS Every Friday"](https://www.urbandictionary.com/define.php?term=YGS%20Every%20friday): +to post an update is to have something I want to talk about. When I have something I want to talk about, I need to be able to talk about it in a way +that feels "meaningful" and "substantial". Of course, I also need to actually finish what I start, which as I have already established is close to impossible on a good day. +I may *start* on a good idea, but as I whittle away at that idea, I almost instantly get discouraged. I inevitably come towards a "Now what?" moment that +puts a dampener on the whole thing. So I put it down. And then I never pick it back up. + +Still... once in a while... I start something. And then I keep going. And going. And going. Never letting off the gas. +Because I know in the back of my mind as soon as I let go, the spark is lost. So surely... eventually... through hours and hours of hyperfocus... +I actually finish what I start. + +At first, I thought this post was one of those moments. I started working on this post in the morning. It is now 11:11PM. I worked on this. The. Entire. Day. + +But I can't do that every day, let alone "once or twice a week". +I need to find a way to motivate myself to actually finish the articles I write. And I think through writing this, I finally figured out how. + +I don't *need* to be "meaningful" or "substantial". +The fact that I started this article means that the idea is already meaningful enough **to me** to be worth exploring. + +When I inevitably get to a "Now what?" moment, I don't have to push through no matter what. I can allow myself to put it down. I can allow myself to rest. +It's how this article got made. When I felt like my wheels were spinning fruitlessly, I stood up. +I made myself food. I joined a voice chat and listened to people talk. I listened to good music. +I did something to refresh my mind, and suddenly it became a lot easier to pick up the article again and start writing from where I left off. +It's also how this website got made. When what I was doing wasn't working, I put it down, let it sit there for a while, then came back to it with fresh eyes. + +What you're seeing is the result of allowing myself to rest. When you find meaning through rest, the substance isn't that hard to find. +The motivation and meaning come from your ability to step back and regroup, and the substance comes from letting your brain cool off before working it again. + +I don't need to seek meaning or substance. I don't need to persue it, afraid if I let go that it will float away, never to be seen again. +Once I sit down for a second to live a little, the magic finds *me*. + +...It's almost like that's how you deal with ADHD or something. Wild. + +Thanks for reading. [Here's an album suggestion as a gift for sitting down yourself.](https://www.youtube.com/watch?v=nU55ar-O2V0&list=PLEz_mLoNZMeRJxPMw7JRs9w-9GG-rCGi6) See ya in a week or two. \ No newline at end of file diff --git a/src/content/posts/2024-09-19-what-am-i-doing.mdx b/src/content/posts/2024-09-19-what-am-i-doing.mdx new file mode 100644 index 0000000..7cbee63 --- /dev/null +++ b/src/content/posts/2024-09-19-what-am-i-doing.mdx @@ -0,0 +1,72 @@ +--- +title: "Wait, what am I actually doing?" +date: 2024-09-19 +summary: "A quick update post thinking about the blog aspect of my site... and wondering if I'm going about this the right way." +cover: "/blog/banner_sept19.png" +cover_alt: "A mysterious sattelite tower standing in the center of a dense dark fog, a sickly yellow sky peering from behind. Photo by Julian Zwengel on Unsplash." +--- + + +Lower your expectations. Dumbness lies ahead. + + +I might have lied. + +I thought I was going to be able to pump out an article once a month, maybe two a month. Turns out that did not happen. +Instead, I'm now just three days off of exactly three months since my last article. Whoops. + +# How could this happen??!?! + +This summer was weirdly stressful for me. Everyone was talking about "hot girl summer", "brat summer", all that stuff... to me it all +just felt aimless and endless. Every day I wanted the summer to end so I could go back to some sort of routine that I could fit myself in. + +Now that it's the fall and I'm back in school, my mental health has improved considerably. Even though I technically have less free time, +I feel like I can do *more* with that free time because I have a structure around that free time I can plan around. Without a +consistent schedule, my time blindness gets jacked up to 11 and I have no idea how to organize that extra time that I have. + +Part of it is probably just me not being used to adulting yet. Now in my fifth year of college, I feel like I'm just starting to find my +footing in this "adulting" business. Every time I thought I was getting closer, reality taught me I had a much longer way to go... but now, +I think I am *actually* making progress this time. Trial and error with time management and general organization is slowly giving way +to actual understanding, though I really wish I didn't have to learn all of this the hard way. + +The result of all of this is that I feel like I have more focus and energy *to* focus, which means I can make better progress on the +creative projects I want to work on... which includes this blog. It's a shame it took this long to (mostly) figure everything out, though. + +## So what were all of those new features added to the site for? + +That was me reaching for tasks related to my site that would give me more dopamine / a greater sense of accomplishment from engaging in that work. +Adding new features to the site is frankly more fun than writing new blog posts. + +I think for the forseeable future, I'm pausing my idea for narrated articles — in fact, I'm hiding the feed for that so there's less random stuff +that doesn't do anything on my site. It's actually way more difficult than I thought it would be to read through an entire blog post out loud +and edit the resulting audio to remove stutters, random pauses, and other unpleasantries. I might do it one day if I make a post specifically for +conversion into a podcast, but for right now I think it would be too much work for not enough benefits back. If there is anyone who would benefit from +narrated articles who would like to provide feedback regarding this and/or tips on how to make them more easily, please reach out! + +I *do* want to implement my comments seciton idea at some point, but that will require a lot of work, so what I'm going to do is make a new branch +in my repo for implementing it **after** I publish this post so all of that mess is on its own separated verison of the codebase. As always, you can +see what exactly I'm doing by visiting [the repo on my Forgejo instance](https://forgejo.eleboog.com/kebokyo/eleboog-refresh). + +Finally, I still really like the idea of the sharefeed, but the reality is that I have such a flood of stuff that could be cool coming in that it's +hard to choose what to read. Most of my sharefeed posts come from a Telegram bot that showcases top Hacker News posts, and while I really +appreciate that resource... it's a lot to take in. I need to start currating this stuff more, and I think what I really need is to turn NetNewsWire +into a Cool Shit from People I Like & Trust Aggregator™. I'm not sure how, but I want to make it work. And hey, if I do end up getting it working, +I could turn *that* into a blog post! Eh? Eeehh??? + +## ...okay, so where *have* you been posting? + +Here, mostly, just in [my journal page](/journal/) instead of actual blog posts. + +I feel less pressure writing there because that page is +specifically designed for shorter, less professional-looking posts. This kinda ends up being a self-fulfilling prophecy, though, because +if I keep writing in my journal, I keep reinforcing that the place where I can write anything is in the journal, and actual posts need +to be reserved for Big Stuff™... which isn't true. Hell, there's [a whole hashtag about how that isn't true](https://100daystooffload.com) +(that I won't be participating in just yet because 100 posts in a year sounds like a lot lmao). + +Still, I find writing in this journal a lot better than posting to social media such as Fedi or Bluesky. + +--- + +Not sure if I shared this album yet in my journal, but +[here's a really cool J-rock album](https://www.youtube.com/playlist?list=OLAK5uy_lI4xDv36-meW-Z8s1nxRvpH1OaHG5DbzM) +with a surprising amount of English lyrics and one song that got featured in an (imo) underated anime. \ No newline at end of file diff --git a/src/content/posts/2024-10-01-python-lab.mdx b/src/content/posts/2024-10-01-python-lab.mdx new file mode 100644 index 0000000..61ed25d --- /dev/null +++ b/src/content/posts/2024-10-01-python-lab.mdx @@ -0,0 +1,495 @@ +--- +title: Here's a Python Function I Wrote Out of Spite +summary: Importing LoggerPro data into Google Colab is weridly complicated, so I wrote a Python function to fix that. I break down how it works so you can understand how it works even with minimal Python experience. +date: 2024-10-01 6:00:00 +cover: /blog/python-lab/banner-explode2.png +cover_alt: An old laptop exploding. Sloppily edited from a photo by Hugo Clément on Unsplash & a green screen explosion video on YouTube. +toc: true +--- + +Last week, I did a lab for my intro to physics course. This was the first experimental lab, and so I had to learn how to work a +piece of software named [Vernier LoggerPro](https://www.vernier.com/product/logger-pro-3/). Since we use Vernier sensors for all of our +data collection, we use Vernier's LoggerPro software to actually record the data. + +The lab manual for this particular lab specifically stated that we needed to log all of the data we collected for nine different trials in a +document made using [Google's Colab service](https://colab.research.google.com). Colab (one 'l', not two) is a cloud-based webapp that +allows you to make Jupyter-compatible Python notebooks online and store those notebooks in your Google Drive. In non-tech speak, it lets +you write blocks of Python code, run those blocks of code individually so you can immediately see the results of that code, and insert +rich text inbetween those blocks of code so you can give further context as to what you are doing. + +When you copy data from LoggerPro into a Colab document, you end up with a blob of text formatted as a vertically-oriented table. +Each column represents a different type of data (in my case: time, position, & velocity), and each row represents a specific sample of data +(like, in my case, the position & velocity of an object 0.5 seconds after the start data collection). + +``` +0.85 0.1932805 0.446948055556 +0.9 0.227066 0.668087777778 +0.95 0.265139 0.786518055556 +1 0.3068135 0.867027777778 +1.05 0.3517465 0.940296388889 +1.1 0.4007955 1.01394611111 +1.15 0.4532745 1.085595 +1.2 0.509355 1.15772027778 +1.25 0.5688655 1.23432361111 +1.3 0.632492 1.32293194444 +1.35 0.7002345 1.41468444444 +1.4 0.773465 1.46260916667 +1.45 0.859901 1.2219375 +1.5 0.9139235 0.638075277778 +``` + +To use this data in graphing libraries such as [Matplotlib](https://matplotlib.org), I need to convert this data into a set of arrays, or +"lists" as they are called in Python. Problem: Matplotlib wants each *type* of data to be in its *own list*... which means I need to rotate +this graph 90° (or, as the math kids call it, "transpose" the table). + +I've talked to other students who took this class about it, and their solutions were something like this: + +1. Make an Excel spreadsheet. +2. Put the data in that spreadsheet. +3. Use Excel's transpose tool to rotate the table. +4. Export the spreadsheet as a CSV file or just leave it as is. +5. Upload the spreadsheet to Google Drive and read it using file management functions, either by Google or by a third-party library. + +I originally did the same... but I put the data into a code editor first....... and then I converted it into a CSV.............. +and then I imported the CSV into Excel................... and then I translated the graph......................... and then I copy and pasted +the text into Colab to manually convert into lists........................................ + +Obviously, all of this was incredibly tedious and convoluted and absolutely **not** the right way to do any of this. There's got to be a better way!!1!1!!!! + +So, I made a function in Python to do all of this for me. It's actually way simpler than I thought it would be and I feel incredibly dumb +both for myself and everyone else who tried to rope Excel into being the solution. + +I'm going to be annoying and not show you the actual function until the very end of this post. However, I will be *more* than happy to +walk you through how I wrote it! + +# How I Did the Thing + +This function does not require **any** third-party libraries or even any standard libraries/modules. All you need is some basic knowledge +of Python and a healthy software engineering spirit. + +Also, quick disclaimer: I am assuming that you are like my fellow physics students — *not* good at Python or programming in general. +Thus, I will overexplain a lot of stuff so that I can help make you *somewhat* good at Python. If you are already fluent in programming +mumbo-jumbo, I will kindly suggest to just skip to the end of this article (the table of contents can take you right there) and just +look up the parts of the code that you don't understand. If you know other programming languages but *don't* know Python and you're still +just getting started with this whole "programming" thing, I still recommend you read through the whole article just to get familiar with +Python and its [quirks and features](https://www.youtube.com/watch?v=2aiopbNnyF8). + +## At the beginining + +We start off by defining the variable we will use to store our new set of lists: + +```python +out = [] +``` + +It is given the name "out" because it is the "*out*put" of the function. Get it? Eh? Eh???? + +I initialize this variable by making the variable equal to an empty list. If I wanted to put stuff in the list from the getgo, I could put +numbers or values inbetween the square brackets (so, doing `out = [1, 2, 3]` would make `out` a list with three numbers: 1, 2, & 3). +But I don't want to do that here because I don't actually *know* how much stuff we're actually going to put in here. All I want to do is +establish that `out` is a list for use later when we actually start filling it up. Thus, I make it equal to an empty list with nothing +inbetween the brackets. + +In my actual function, I put a type hint on this variable so that it's obvious what's supposed to go in it. You don't have to do this, +but I think it's a good idea regardless. For this variable, it will be a list containing lists of floating point numbers (yes, I know, +Listception, get your [bwwaaaahhh](https://www.youtube.com/watch?v=Vl1b1sXMyRE)'s out now cause I'm not allowing you to do it again). +So, the type hint for this variable should be `list[list[float]]`. + +```python +out: list[list[float]] = [] +``` + +In most other programming languages, we would call this list of lists +a "two-dimensional array", or "2D array" for short. I'm going to be using that term interchangably with "table" from now on — +just wanted to let you know so I don't confuse you. + +----- + +But how do we put stuff *in* this variable? That's what the rest of this function is for: to parse through the blob of text from LoggerPro +and store it as our desired transposed 2D array in the `out` variable. + +We need to solve a small problem first: how do we store our raw LoggerPro dump? Luckily, Python lets us define a string with multiple lines +in it pretty easily: just flank the text with three quote marks (single or double, doesn't matter as long as both ends match). + +```python +test_dump = '''0.85 0.1932805 0.446948055556 +0.9 0.227066 0.668087777778 +0.95 0.265139 0.786518055556 +1 0.3068135 0.867027777778 +1.05 0.3517465 0.940296388889 +1.1 0.4007955 1.01394611111 +1.15 0.4532745 1.085595 +1.2 0.509355 1.15772027778 +1.25 0.5688655 1.23432361111 +1.3 0.632492 1.32293194444 +1.35 0.7002345 1.41468444444 +1.4 0.773465 1.46260916667 +1.45 0.859901 1.2219375 +1.5 0.9139235 0.638075277778''' +``` + +We're doing it this way because Python has built-in functions for iterating over multi-line strings pretty easily. I'll show you what they +are later. Plus, it's the easiest way (imo) to go from raw dump to usable input: just add a variable name, an equals sign, and three quote +marks around the data. Boom. Shrimple. + +Now that we've got our data stored in a way that's easily parsable, all we need to do is feed it into our function as an argument. +I decided to add type hints to the top of the function so it is super duper obvious what we're putting into it and what we're getting +out of it. We're feeding the function a single string (which has the type name `str` for some reason) and getting back our 2D array of +floating-point numbers (type name `float`) that we defined at the top of the function. So, the header line for the function would look +something like this: + +```python +def LoggerProToArray(text: str) -> list[list[float]]: +``` + +Again, we don't have to do fancy type hinting like this. We could just do... + +```python +def LoggerProToArray(text): +``` + +and that's it. The function will still work the same. + +The type hints are only there to make it obvious what **types** of data we are working +with and should expect. Sadly, Google Colab doesn't do type checking with its interpreter, but other apps that let you write Python code +may have support for "linting" utilities that take type hints into account and yell at you if you're passing in conflicting types of +data. I won't go into how they work here, but if you really want to know, I suggest you look it up. + +## Let's start parsing! + +First, let's take our text and divide it up by its lines. To do this, we can just slap `.splitlines()` at the end of our input variable. + +```python +lines: list[str] = text.splitlines() +``` + +This will take our single string and split it up into a *list* of strings, where each line becomes its own entry in the list. That's pretty easy, right? + +We also want to keep track of whether we are currently reading the **first line** of our data or not. Why? I'll get to that soon. +I used to do this by keeping track of the line number through a function we're going to learn about later (`enumerate()`) but I +realized that was dumb if I only want to focus on the very first line. So, I made a boolean for it. + +```python +first: bool = True +``` + +If you don't know already, a "boolean" (type name `bool` in Python) is a value that is either true or false. On or off. 1 or 0. Yes or no. +Here, we set our variable to `True` since, when we start iterating through our lines, the first line we read... will be the first line +of the data. Duh. + +Note that the 'T' in `True` is capitalized. This is a quirk of Python compared to other languages: the names for the base values of +"true" and "false" are capitalized. So, if you want to define a boolean to be true, you can't use `var = true` — you have to use +`var = True`. I learned that the hard way. Whoops. + +Alternatively, you could just say screw it and use numbers instead: + +```python +first: bool = 1 +``` + +Remember that third example I gave? "1 or 0"? That works here. `1` is always read as equivalent to `True` (in other words, it is a "truthy" +value). On the other hand, `0` is always read as equivalent to `False` (in other words, it is a "falsy" value). So, whenever you need to use +`True` and `False`, you can use `1` and `0` respectively. This is very helpful if you are allergic to capital letters. + +I don't do this in my function as I feel like `True` and `False` are easier to read from an outside persepctive, but for your own code, it +doesn't really matter as long as *you* understand it and it gets the job done. + +----- + +Anyways, now it's time to go through the text line-by-line. To do this, we can use what is called a `for` loop. + +```python +for line in lines: +``` + +There are two main types of "for" loops in programming. There's the one you mostly see in C, C++, and other languages like it with +`i=0; i>n; i++` or something like that, but that's not what we're doing here. + +This version lets us loop through a list of values and do something with each value in the list. This is what is usually called an +"iterator-based" for loop and is also included in some languages with the keyword `foreach` instead of `for`. + +So, `for` each `line` contained `in` our list of `lines`, we need to parse that line and plop the data within it into our output array. + +How do we do that? *WE SPLIT IT AGAIN, HAHAHAHAHA* + +But this time, we can't just use `.splitlines()` because the data within each line isn't separated by a line break. We know what each +value *is* separated by, though... + +----- + +Scroll back up to the raw dump as pasted from LoggerPro. Try highlighting the space inbetween each value. Notice how the highlight can't +end halfway inside the whitespace — it always highlights the full amount of space present. + +The reason why is because each value is separated from the others by a "tab" character, i.e. the whitespace character that (should) come out +when you press the "tab" key on your keyboard. If they were separated by space characters (the whitespace character that comes out when you press +the spacebar), you would be able to select only *part* of the space inbetween values since it would usually take multiple space characters to +fill up the space taken up by a tab. + +Tab characters can change in size so that it is easier to vertically orient text. Space characters are always the same size. + +Here's a little example to show you the difference: + +``` +This sentence is broken up by a tab. +This sentence is broken up by spaces. +``` + +Try highlighting only *part* of the space that breaks up both sentences. In the first sentence, you *can't* because all of that space is being +taken up by a single tab character. In the second sentence. you *can* because that space is being filled with multiple space characters. +In this instance, it takes four space characters to fill the same space that a single tab character can. + +What if we changed the actual text of both sentences? + +``` +This sentence isn't broken up by a tab. +This sentence isn't broken up by spaces... wait a second... +``` + +Look at that magic! In both of these scenarios, I converted `is` into `isn't` by adding the `n't` to the end of `is` in each sentence. +In the sentence with a tab, the tab *shrunk* automatically to keep the second half of the sentence in the same place. +Now, the tab character taking up the equivalent of a single space character. + +On the other hand, when I did the same thing to the sentence with space characters, all of the spaces were moved to the right, misaligning the +second part of the sentence. There are still four spaces, taking up the same amount of space as it did the first time. + +I know all of this sounds dumb (and it kinda is; it's so dumb that [there is an entire nerd war over it](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?utm_source=anzwix&id=d5cf50dafc9dd5faa1e61e7021e3496ddf7fd61e)), +but it is actually significant in this case because of the fact that there is only **one** (1) tab character inbetween each value. Feel +free to check for yourself again: every time you highlight between the data values, you only highlight the entire width of the space because +that space is only being taken up by *one* character. + +What can we do with that infomation? Well, all we need to do to split each line into its own list of values is to do this: + +```python +split: list[str] = line.split("\t") +``` + +This is just like `.splitlines()` from earlier, but instead of splitting the string using line returns, it splits the string by looking for +whatever character or other string we want. In our case, we want this function to look for tab characters, so we use the shorthand code +`\t` to tell the function that we want to look for tab characters. + +When it does split up the string, all of the values within the table will +be perfectly contained without any whitespace around it. Why? The only whitespace that exists per line of data are the tab characters that go +between each value... and since there's only one of them per pair of values, we already got rid of it when we did the split! + +Thus, we have ended up with *another* list of strings that we are *again* going to iterate through to do what we want. Yay. + +## The Home Stretch + +First, we need to check if we are on the first line of data. We can check this very easily: + +```python +if (first): +``` + +This is a neat shorthand for `if (first == True)`. If our `first` boolean is true, then we will execute the code indented under this +`if` statement. What are we going to do? Another `for` loop! + +```python +if (first): + for e in split: + out.append( [float(e)] ) + first = False +``` + +Let's break this down real quick: + +- We want to iterate through our list of values. This time, I got lazy and named our iterator variable `e`, short for "entry". +- Our `out` table was previously defined as just an empty list (`[]`). I didn't want to define how *many* lists are inside it, just in case +our input had a different amount of columns than the three that we had in our example data. So, to start off inserting our data into our +`out` table, we need to first **create** new lists within the table. To do this, we can simply `.append()` a new list to the end of our +`out` table containing just one element... +- That element is `e`... in a function named `float()`. Wait, what are we doing here? + +We could just put `e` inside this list and call it a day, but if we do that, we will be storing text inside our array, not a number. +Why? We started off by storing our +data as a big string, so even though we've gradually whittled down that big block of text into the individual values... it's still being stored +as text right now. + +This may not seem like a big deal, but in my original version of the function, I ran into issues working with my data because certain library functions were expecting a list +of numbers when I was *actually* giving it a list of *strings*. **This is the one instance in which knowing what type a variable is or contains +is actually important in this function.** + +So, to fix that, I can use a built-in cheat code: just wrap `e` in a function named after the type +I want to convert `e` into — in this case, a `float`. This function will parse the string `e`, see that the text inside the string is +indeed a floating point number, and give us that floating point number as an *actual* number of type `float`. That number is exactly what +we want: the values within `out` need to be actual numbers we can do actual math with, *not* the text representing those values within our +input string. + +----- + +Anyways, to wrap up: after we have parsed our entire list of values, we want to make sure we know we are moving on to a new line that *isn't* +the first line. If we didn't, we would just add new one-member lists to the end of `out` over and over again!! So, at the end of the if +statement, we need to set our `first` boolean to `False`. + +One very important thing to note here: our last line for this chunk of code is one indent **behind** the code we are executing in the `for` +loop. **Python is dumb and actually cares about indents.** If you use something like an `if`, `for`, or `def` statement, you *must* indent all of +the code that is meant to be executed under that statement. If you're not sure whether you need to indent, check to see if the line ends in a colon. +**If a line of code ends in a colon, the following code that you want to run under the conditions of that line likely needs to be indented.** + +If that code *isn't* indented far enough, the Python interpreter won't recognize that the code +should be executed under that `if`, `for`, or `def` statement, so it won't run that code under those parameters. + +So, wait... why are we intentionally *not* indenting that last line enough? Well, it's simple: that line of code **shouldn't** be executed +after every run of our `for` loop. If it *was* indented all the way, that line of code would run after *each value* is processed instead of +after we've processed all of the values. It wouldn't change anything if that happened in this specific instance, but since we only need to +update this boolean once, +it's probably a good idea to make *sure* it only updates once. + +By moving this line of code back an indent, we are telling the interpreter that we only want the code to run under the conditions of our +`if` statement and our `def` statement, *not* under the conditions of our `for` statement. + +This idea of code only +being ran under a particular set of parameters is called "scope", and it is a very important concept in programming. I suggest that you look +up more information about it and how it specifically applies to Python, as mishandling scope is a very easy way +for your code to completely fall apart if you do not watch out for it. + +To the CS students in the audience, I know that this should be bare basic knowledge, but the fact that indents actually matter is a quirk of +Python that still trips me up sometimes and likely will trip you up as well. +Most other programming languages don't care: Python does. That distinction is important to keep in mind. + +----- + +Now that we know what to do if `first` is true... What if it's `false`? Like, after we run that first bit of code that +sets `first` to `False` at the end... What do we do after that? + +We can easily define what to do in that case by putting `else:` after our `if` statement's code: + +```python +else: +``` + +The `else` statement only executes if the condition given to the previous `if` statement is *not* true. So, if our `first` boolean is found +to be true, the code directly under the `if` statement is ran. However, if our `first` boolean is found to be `false`, then we run the code +under `else`. You can think of it like "**If** this is true, do this... or **else**, do *this* instead." + +So, what *else* are we cooking? + +```python +else: + for i, e in enumerate(split): + out[i].append(float(e)) +``` + +Hey, there's that `enumerate()` function I talked about earlier! If we give a `for` statement a list wrapped in this function, we will +get *two* variables to work with instead of one: our single value variable `e` and the "index" of that value in the list, which I have +shortened to `i`. + +The "index" is the number given to our value's "place" within the order of the list. In Python and most other programming languages +(except for the bad ones /j), lists start at an index of `0`. This means that the first entry of a list will always be given the index `0`. +That may seem dumb at first, but it is actually really handy when you start working with the other type of `for` loops and other +programming tasks like it. I won't get into why here, but if you're curious, say it with me: *"Look it up!"* That's right. + +So, let's say we wanted to get the first element of our list `split`. To do that, all we need to do is call it as `split[0]`. The number in +the square brackets tells Python to look through the list and grab the element at that index number. Since the number this time is `0`, we will +grab the element at index `0`... the first one! + +The last line of this chunk of code utilizes our `i` variable to determine which of our new rows within `out` we should put this value +into. Remember that `out` is now a list *containing other lists*. In the case of Python, the outer list represents the **rows** of our table, +while the individual values within that row represent the **columns** of our table. So, if we wanted to get the second row of `out`, +all we need to do is call `out[2]`. That will give us a *list* of all of the values in row 2. If we wanted to grab just the third element of that +row, we can call `out[2][3]`. Since `out[2]` is itself a list, we can just slap another number in square brackets at the end of it to grab an +element within *that* list. I know. I know you really want to do it. I know you really want to say it. But I gave you that one chance. I am not +giving you another one. Weep. + +We can use the fact that `out` is a list of lists to our advantage. Also remember that we want the *columns* of our old table to become +the *rows* of our new table. In our old table, each row represented a particular set of data, and each column represented a type of data. +We want things to be the opposite: the rows should contain individual *types* of data, and the columns should contain individual *samples* of data. + +The easiest way to make this happen is to switch the indexes of our new table around. So, when we are iterating by *columns* through +our old table, the index of that *column* will become the index of the new *row* we want to insert our value into. That is why we are +using `enumerate()` here: As we go through each value, we are given the index of that value **within our old table's columns**. All we +need to do to translate our old table's columns into our new table's rows... is to just use that fancy shmancy index we got to specify +which row of `out` to insert our data into. + +For example, if we are on the second value on this particular line of data, when we add it to `out`, we want to add it to the second row +of `out`. To do that, we can `.append()` our value to the end of the second list contained within `out` — in other words: + +```python +out[1].append(value) +``` + +Rember that since list indexes start from `0`, to get the second row of `out`, we need to use index `1`. An easy way to keep track of what +index number to use is to just subtract the numbered version of your place by one. The `1st` row minus one gives you `0`. The `2nd` row minus one +gives you `1`, so that's the index number we need to use. + +Of course, we still don't know how many columns of values we will get in our original data table, so instead of hard-coding each of those +index numbers, we will just use our index variable `i`, since we know `i` will represent the index of our data value within our current +`for` loop. + +Oh, and again, we want the value we slot in to be an actual number, not text, so we're converting it into a `float` first with `float()`. + +## We did it! + +We are on. The last line. Of our function. We came a long way. But now it is time to finish this. + +At the end of the function, with only one indent (since we're only under our function's `def` statement from the very top now), we +need to send out the two-dimensional array we made. To do that, we only need two words: + +```python +return out +``` + +This will make our function "return" our variable `out` when it is ran without issues up to this point. If you were to just call this +function by itself, without anything else around it, you could get `out` printed to the standard output. + +![A screenshot showing the output of LoggerProToArray when ran by itself in Google Colab.](/blog/python-lab/screenshot-output.png) + +You can also store the output into a variable: + +```python +test_output = LoggerProToArray(test_dump) +``` + +Now the data within the `out` array we were working with inside our function is stored within our new variable, `test_output`. And we +didn't have to write *all of that code* again! Yay for reduced redundancy!!! + +Hopefully this ramble helped you learn some stuff about coding in Python. I encourage you to try writing this code yourself, step by step, +using this article as a guide. Don't copy and paste each line from my code examples; write it by hand. It helps you absorb the information +better. I would cite a study here about it but it's midnight and I'm tired and I want to go to beb. + +If you would rather just grab the entire function and use it in your own code... + +# The thing you actually came here for + +Ok fine, here's the code you want. All I ask is that if you use this anywhere, leave a link to either me or this particular webpage +in a comment above this. **If you are a student like me, I do not want you to get in trouble for using code that you did not write.** + +```python filename="LoggerProToArray.ipynb" +def LoggerProToArray(text: str) -> list[list[float]]: + '''Converts a Logger Pro dump into a 2D array / table of values, + translated for use in graphing. + + Written by kebokyo - https://eleboog.com/posts/2024-10-01-python-lab + + Args + ------ + text : str + The Logger Pro dump imported as a multiline string. + + Returns + ---------- + list[list[float]] + A two-dimensional array that contains lists of floats. + + ''' + out: list[list[float]] = [] # The 2D array we are returning + + lines: list[str] = text.splitlines() # Let's split our text into lines + first: bool = True # & keep track of whether we're on the first line or not + + line: str + for line in lines: # Time to go through the text line by line! + split: list[str] = line.split("\t") # First, split each line by tab-delimitated values + + if (first): # If we're on the first row... + for e in split: # For each value in this row, + out.append([float(e)]) # Make a new array for each *new* row + first = False # When we're done, make sure we know we're done w/ the first line + else: + for i, e in enumerate(split): # For all other rows... + out[i].append(float(e)) # Append the values to each new row + + return out # Then just return the new array! +``` + +Oh, and in case you're curious, I found the footage for the silly green screen explosion [here](https://www.youtube.com/watch?v=2zZFmfcLyNA). diff --git a/src/data/sharefeed.json b/src/data/sharefeed.json new file mode 100644 index 0000000..fbfb218 --- /dev/null +++ b/src/data/sharefeed.json @@ -0,0 +1,186 @@ +{ + "sharefeed" : [ + { + "url": "https://github.com/dplanitzer/Serena", + "author": "Dietmar Planitzer", + "title": "Serena - An experimental operating system for 32bit Amiga computers.", + "date": "2024-08-14 13:00", + "note": "If I had an Amiga, I would be geeking out so much about this. You would not see me for days." + }, + { + "url": "https://chuck.is/news/", + "author": "Chuck Carrol", + "title": "The News is Information Junk Food", + "pubDate": "2022-09-16", + "date": "2024-08-09 16:00", + "note": "A discussion about the negative affects the 24 hour news cycle has on us. I want to dissect this further cause I have a feeling there's some nuggets of bad takes in here, but the overall takeway I agree with. If I had a nickel for every time my social media feed ended up getting overrun by political nonsense, I would have... uh... five nickels? What can you buy for a quarter nowadays? ...hmm" + }, + { + "url": "https://github.com/vpand/icpp", + "author": "VPAND Team", + "title": "icpp - Running C++ in anywhere like a script.", + "date": "2024-08-09 15:00", + "note": "I just think it's funny okay" + }, + { + "url": "https://jon.bo/posts/digital-tools/", + "author": "Jonathan Borichevskiy", + "title": "Digital Tools I Wish Existed", + "pubDate": "2019-11-28", + "date": "2024-08-09 14:00", + "note": "Interesting exploration of digital information gathering, consumption, and archive tools that the author wish existed. I want to make a response to this one day with my own ideas and critiques of the particular features he wants (whether they make sense to me or not and if not what alternatives I think would be good instead)." + }, + { + "url": "https://stack-auth.com", + "author": "Stackframe Inc.", + "title": "Stack Auth - Open-source Clerk/Auth0 alternative", + "date": "2024-08-09 13:00", + "note": "A really promising open source alternative to WYSIWIG auth solutions like Clerk and Auth0. I would need to confirm its security and its flexibility, but the fact that they specifically say \"hey, you can totally just use your own frontend and use our SDK in the background\" makes me very excited. All of the user-facing elements can be styled my own way, while the internal admin elements can just be the defaults so I don't have to code it all. I might end up using this instead of Auth.js for phase 2 of my site if this lives up to my expectations." + }, + { + "url": "https://tonsky.me/blog/diagrams/", + "author": "Niki Tonsky", + "title": "Where Should Visual Programming Go?", + "pubDate": "2024-07-18", + "date": "2024-07-27 14:00", + "note": "A discussion about what incorporating diagrams and other visualizations into your codebase could and should look like. I think the idea of embedding diagrams into your comments is a very good idea (in fact, we should be using markdown in our docs already), but I'm not sure how useful creating parsable visual state machines and etc. would be. Fun fact: there seems to be a pseudo-collab-tool built into the site where you can see where other readers' cursors are. I kept trying to hold digital hands with the other cursor but it kept running away from me. Why are you so mean ;w;" + }, + { + "url": "https://blog.singleton.io/posts/2022-10-17-otp-on-wrist/", + "author": "David Singleton", + "title": "TOTP tokens on my wrist with the smartest dumb watch.", + "pubDate": "2022-10-17", + "date": "2024-07-27 13:00", + "note": "A demonstration of the Sensor Watch, a replacement motherboard for the famous Casio F-91W digital watch that turns it into a programmable ARM Cortex M0+ powered smartwatch. It is absolutely wild, and I want one now even though the motherboard costs more than the watch itself. The idea of a wearable version of those Square Enix TOTP devices is so fascinating to me." + }, + { + "url": "https://semanticdiff.com/blog/language-aware-diff-how-far/", + "author": "Michael Müller", + "title": "How far should a programming language aware diff go?", + "pubDate": "2024-07-17", + "date": "2024-07-25", + "note": "A fun look on what differences in code could be considered \"irrelevant changes\" and the consequences of ignoring such changes. Note: This is a corporate blog post made for a VSCode and GitHub extension for \"language aware diff\" that includes premium software support." + }, + { + "url": "https://scrapscript.org", + "author": "Max Bernstein", + "title": "scrapscript - A functional, content-addressable programming language", + "date": "2024-07-24", + "note": "An interesting new scripting language that's basically Haskell but if it was even weirder. I want to make a blog post about this one day discussing how it compares to other programming languages and how it could be used." + }, + { + "url": "https://thetinypod.com", + "title": "tinypod - an iPod-style case for the Apple Watch", + "date": "2024-07-20", + "note": "A really cute concept for taking a computer on your wrist and adapting it into a digital detox device. The regular model is a little too expensive for my liking, but the \"lite\" model is cheap enough that I could justify trying it out with my own Apple Watch (once I find it again lol)." + }, + { + "url": "https://simonwillison.net/2024/Jul/13/give-people-something-to-link-to/", + "author": "Simon Willson", + "title": "Give people something to link to so they can talk about your features and ideas", + "pubDate": "2024-07-13", + "date": "2024-07-14", + "note": "If you want people to be able to talk about an idea, concept, or feature that you develop, you should have a resource about it for people to easily reference. ChatGPT being used as an example is slightly cringe, but it works to show what not to do." + }, + { + "url": "https://openpipe.ai/blog/hn-ai-crypto", + "author": "Kyle Corbitt", + "title": "Is AI the Next Crypto? Insights from 2M HN comments", + "pubDate": "2023-11-08", + "date": "2023-11-08", + "note": "An analysis of Hacker News' sentiment towards AI compared to NFT's... using AI. Big note: this is a very cleverly disguised ad for OpenPipe, the service which is hosting this article, but I actually appreciated how it broke down the details of how the author computed his data. I wish there was a bit more analysis of the results, though." + }, + { + "url": "https://mariusbancila.ro/blog/2023/09/12/formatting-text-in-c-the-old-and-the-new-ways/", + "author": "Marius Brancila", + "title": "Formatting Text in C++: The Old and The New Ways", + "pubDate": "2023-09-12", + "date": "2023-11-07 14:00:00", + "note": "C++20 introduced some new std functions to format strings: std::format and std::format_to. In practice, they work much like a streamlined version of C's printf. However, their implementation (based on the library {fmt}) results in much higher efficiency! Apparently the guys at C++ really like it because the new std::print function in C++23 has the functionality of std::format built in. I'm curious to see how this will change C++ devs' workflows, including newbies coming to C++ from other languages like Java or Python." + }, + { + "url": "https://github.com/jesseduffield/horcrux", + "author": "Jesse Duffield", + "title": "horcrux - Split your file into encrypted fragments so that you don't need to remember a passcode", + "date": "2023-11-07 13:00:00", + "note": "A simple terminal program that allows you to split files into encrypted chunks that can later be re-combined into the original file. Think of it like a RAID setup but for individual files or archives, inspired by an everything-phobic fantasy media franchise. I actually find the concept really facinating: it could be a good way to split up large media files and share them over the internet. Even if one horcrux gets corrupted, the others can still make up the original file, and since it is encrypted, it's tougher to discern what the original file is without enough pieces to put it together." + }, + { + "url": "https://stytch.com/blog/open-sourcing-sqx-a-way-to-build-flexible-database-models-in-go/", + "author": "Logan Gore", + "title": "Open-sourcing SQX, a way to build flexible database models in Go", + "pubDate": "2023-08-31", + "date": "2023-09-09 14:00:00", + "note": "A really cool SQL interface for Go that both simplifies a lot of the boilerplate and allows for quickly building complex models through OOP. I don't have any experience in Go, but I'm honestly tempted to start learning Go just to try this library out and see if a port of it to other languages like C++ or Rust is possible." + }, + { + "url": "https://muldoon.cloud/2023/09/06/software-keeps-failing.html", + "author": "Mickey Muldoon", + "title": "Every Software Project is a Startup That Will Probably Fail", + "pubDate": "2023-09-06", + "date": "2023-09-09 13:00:00", + "note": "A short retrospective on the reality of software projects: the value you get out of most of them is the lessons you learn when they crumble. I feel like this lesson could be told in a way less intrinsic to our dumb economic system, but I don't have enough brain capacity to write that up right now." + }, + { + "url": "https://ploum.net/2023-07-06-stop-trying-to-make-social-networks-succeed.html", + "author": "Lionel Dricot", + "title": "Stop Trying to Make Social Networks Succeed", + "pubDate": "2023-07-06", + "date": "2023-07-06", + "note": "Social networks will never become universal or ubiquitous in the way companies and VC's want them to. Every social network will appeal to certain people more than others, so the best social network is the one that works best for you and your contacts. If one doesn't exist... make one! (or have someone else make it for you)." + }, + { + "url": "https://www.reproof.app/blog/notes-apps-help-us-forget", + "author": "Matthew Guay", + "title": "Notes apps are where ideas go to die. And that’s good.", + "pubDate": "2022-02-15", + "date": "2023-06-03 14:00:00", + "note": "Notes apps always market themselves as tools to remember important things before they leave your mind. But maybe we should think of it the other way instead: notes afford us the ability to let thoughts leave our mind since we have already saved the information elsewhere." + }, + { + "url": "https://kapeli.com/dash", + "title": "Dash for macOS - an API Documentation Browser and Code Snippet Manager", + "date": "2023-06-03 13:00:00", + "note": "Really cool offline documentation viewer for macOS... that's also $30 for some reason. DESPITE THERE BEING AN OFFICAL OPEN SOURCE PORT TO WINDOWS AND LINUX. I AM GOING TO COMBUST" + }, + { + "url": "https://blog.jim-nielsen.com/2023/deadlines-as-technology/", + "author": "Jim Nielsen", + "title": "Deadlines as Technology", + "pubDate": "2023-03-09", + "date": "2023-05-20", + "note": "My ADHD means I always procrastinate things until the last minute. Well, if there is no 'last minute' -- i.e. there is no deadline -- shit won't get done. If you try to pace yourself to hit certain self-set deadlines, you may find that work becomes easier." + }, + { + "url": "https://tech.news.am/eng/news/510/worlds-first-portable-quantum-computers-on-sale-in-japan-prices-start-at-$8700.html", + "author": "News.am", + "title": "World's first portable quantum computers on sale in Japan: Prices start at $8,700", + "pubDate": "2022-12-21", + "date": "2023-05-20 15:00:00", + "note": "they put an android tablet on a fucking quantum computer, i'm shitting and cumming rn" + }, + { + "url": "https://userinyerface.com/", + "author": "Verhaert", + "title": "User Inyerface", + "date": "2023-05-20 14:00:00", + "note": "Want to hate technology and how all of its innovations can be used for great evil? Try to work your way through this." + }, + { + "url": "https://walkingtheworld.substack.com/p/why-the-us-cant-have-nice-things", + "author": "Chris Arnade", + "title": "Why the US can't have nice things - A rant on bus stops", + "pubDate": "2023-05-20", + "date": "2023-05-20 13:00:00", + "note": "A blog post on why US public works suck so much: the government doesn't trust its citizens to utilize public works properly nor make their own organic solutions for public issues. Really good read!" + }, + { + "url": "https://fortelabs.com/blog/the-secret-power-of-read-it-later-apps/", + "author": "Tiago Forte", + "title": "The Secret Power of 'Read-It-Later' Apps", + "pubDate": "2022-12-06", + "date": "2023-05-19", + "note": "An article on the benefits of using 'read-it-later' apps. There are so many things wrong with this article that I'm definitely going to make a blog post responding to it at some point. Despite that, it is part of the inspiration for this feed... so thanks, I guess?" + } + ] +} \ No newline at end of file diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..f3b83d2 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,30 @@ +--- + +import '@fontsource/nunito' +import '@fontsource/libre-baskerville' +import '../styles/globals.css' + +import Header from '../components/Header.astro' +import Footer from '../components/Footer.astro' + +const { title } = Astro.props + +--- + + + + + + + + + {title ? title + ' - eleboog.com' : 'eleboog.com'} + + +
+
+ +
+