diff --git a/.gitignore b/.gitignore index 1bd5e34..0943b27 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ pnpm-debug.log* *.bak tree.txt + +App.tsx diff --git a/astro.config.mjs b/astro.config.mjs index 3b8ec31..182085f 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,8 @@ // @ts-check import tailwindcss from '@tailwindcss/vite'; +import remarkDirective from 'remark-directive'; +import { remarkAlert } from 'remark-github-beta-blockquote-admonitions'; import { defineConfig } from 'astro/config'; import react from '@astrojs/react'; @@ -11,6 +13,12 @@ export default defineConfig({ vite: { plugins: [tailwindcss()], }, + markdown: { + remarkPlugins: [ + remarkDirective, + remarkAlert, + ], + }, integrations: [react()], }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f786470..952fa5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,8 @@ "lucide-react": "^0.562.0", "react": "^19.2.3", "react-dom": "^19.2.3", + "remark-directive": "^4.0.0", + "remark-github-beta-blockquote-admonitions": "^3.1.2", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18" }, @@ -268,7 +270,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -1021,7 +1022,6 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.1.0.tgz", "integrity": "sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==", "license": "MIT", - "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "7.1.0" }, @@ -3108,7 +3108,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3118,7 +3117,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3160,7 +3158,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3327,7 +3324,6 @@ "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.9.tgz", "integrity": "sha512-gJvoZv0v8xCcKBcsxz1ZfXqoJ7sJJcyoKP8bUTjkuD4vDShLe0N26em4LQxitVv/2HLOpldQg67bEHB/qGoxJA==", "license": "MIT", - "peer": true, "dependencies": { "@astrojs/compiler": "^2.13.0", "@astrojs/internal-helpers": "0.7.5", @@ -3564,7 +3560,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4870,7 +4865,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -4931,7 +4925,6 @@ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", "license": "MPL-2.0", - "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -5258,6 +5251,27 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -5620,6 +5634,25 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -6609,7 +6642,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6619,7 +6651,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -6885,6 +6916,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -6903,6 +6950,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-github-beta-blockquote-admonitions": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/remark-github-beta-blockquote-admonitions/-/remark-github-beta-blockquote-admonitions-3.1.2.tgz", + "integrity": "sha512-4t5uhMnhXp9/B0RdI+seIO8v9KCsOcoua+7MX5naDq2RTJDr4VsRZ8RgB0URCATvLlayoAl0rAU/SxFpcuna4g==", + "license": "Apache-2.0", + "dependencies": { + "unist-util-visit": "^5.0.0" + } + }, "node_modules/remark-mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", @@ -7334,8 +7390,7 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -7952,6 +8007,7 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } @@ -7968,6 +8024,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -7984,6 +8041,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -8000,6 +8058,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -8016,6 +8075,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -8032,6 +8092,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -8048,6 +8109,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8064,6 +8126,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8080,6 +8143,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8096,6 +8160,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8112,6 +8177,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8128,6 +8194,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8144,6 +8211,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8160,6 +8228,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8176,6 +8245,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8192,6 +8262,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8208,6 +8279,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -8224,6 +8296,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8240,6 +8313,7 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8256,6 +8330,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8272,6 +8347,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -8288,6 +8364,7 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } @@ -8304,6 +8381,7 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } @@ -8320,6 +8398,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -8336,6 +8415,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -8352,6 +8432,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -8362,6 +8443,7 @@ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -8532,7 +8614,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index f85cf14..666fdd1 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "lucide-react": "^0.562.0", "react": "^19.2.3", "react-dom": "^19.2.3", + "remark-directive": "^4.0.0", + "remark-github-beta-blockquote-admonitions": "^3.1.2", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18" }, diff --git a/public/images/puppeteer.png b/public/images/puppeteer.png new file mode 100644 index 0000000..376ddfe Binary files /dev/null and b/public/images/puppeteer.png differ diff --git a/src/components/Menu.astro b/src/components/Menu.astro index cb34828..2c294bf 100644 --- a/src/components/Menu.astro +++ b/src/components/Menu.astro @@ -1,9 +1,16 @@ --- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { faHouse, faUser, faBlog, faEnvelope } from '@fortawesome/free-solid-svg-icons' +import { faHouse, faUser, faBlog, faEnvelope, faCode } from '@fortawesome/free-solid-svg-icons' --- -