diff --git a/README.md b/README.md index 9f60474..9ba8441 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -https://ajelinek.github.io/about-me/ \ No newline at end of file +https://ajelinek.github.io/about-me/ diff --git a/astro.config.mjs b/astro.config.mjs index 3c8f19f..480303b 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,15 +1,15 @@ -import { defineConfig } from 'astro/config' - -import mdx from "@astrojs/mdx" -import { remarkReadingTime } from './plugins/remark-reading-time.mjs' +import { defineConfig } from 'astro/config'; +import mdx from "@astrojs/mdx"; +import { remarkReadingTime } from './plugins/remark-reading-time.mjs'; +import solidJs from "@astrojs/solid-js"; // https://astro.build/config export default defineConfig({ - integrations: [ mdx() ], + integrations: [mdx(), solidJs()], markdown: { - remarkPlugins: [ remarkReadingTime ], + remarkPlugins: [remarkReadingTime] }, site: 'https://ajelinek.github.io', - base: '/about-me', -}) \ No newline at end of file + base: '/about-me' +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index efac9e9..acbc90d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,16 @@ "version": "0.0.1", "dependencies": { "@astrojs/mdx": "^1.1.2", + "@astrojs/solid-js": "^3.0.2", "@picocss/pico": "^1.5.10", "astro": "^3.2.3", "astro-icon": "^0.8.1", + "dayjs": "^1.11.10", "fast-sort": "^3.4.0", "mdast-util-to-string": "^4.0.0", - "reading-time": "^1.5.0" + "reading-time": "^1.5.0", + "rss-to-json": "^2.1.1", + "solid-js": "^1.8.5" } }, "node_modules/@ampproject/remapping": { @@ -101,6 +105,20 @@ "node": ">=18.14.1" } }, + "node_modules/@astrojs/solid-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/solid-js/-/solid-js-3.0.2.tgz", + "integrity": "sha512-BGTtS/ygAlcopELdjgTURHnxS2AoDRKjpu3Dgp12TOcArBMCiI/rYdHtlB+ligMm9Bbvar8qdzXsT1zlrxK5jQ==", + "dependencies": { + "vite-plugin-solid": "^2.7.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "solid-js": "^1.4.3" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.3.tgz", @@ -223,6 +241,36 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -254,6 +302,17 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", @@ -283,6 +342,17 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", @@ -291,6 +361,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", @@ -302,6 +388,17 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", @@ -388,6 +485,36 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", @@ -406,6 +533,41 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", + "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -1215,12 +1377,64 @@ "svgo": "^2.8.0" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/b4a": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", "optional": true }, + "node_modules/babel-plugin-jsx-dom-expressions": { + "version": "0.37.8", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.37.8.tgz", + "integrity": "sha512-nVHH6g7541aaAQJAsyWHvjH7GCXZ+8tuF3Qu4y9W9aKwonRbcJL+yyMatDJLvjC54iIuGowiiZM6Rm3AVJczGg==", + "dependencies": { + "@babel/helper-module-imports": "7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7", + "html-entities": "2.3.3", + "validate-html-nesting": "^1.2.1" + }, + "peerDependencies": { + "@babel/core": "^7.20.12" + } + }, + "node_modules/babel-plugin-jsx-dom-expressions/node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-solid": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.8.4.tgz", + "integrity": "sha512-TfI09EOFHsbhVqoM+svop3zY4zOUIBlZsGU16Rgd4NsYVXw6lv2VEn7dmlpczMMQy0IeO3PFiXlMQZWutB+uAQ==", + "dependencies": { + "babel-plugin-jsx-dom-expressions": "^0.37.8" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -1622,6 +1836,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "optional": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -1727,6 +1952,11 @@ "node": ">=8.0.0" } }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -1735,6 +1965,11 @@ "node": ">= 12" } }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1787,6 +2022,14 @@ "node": ">=4.0.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2148,6 +2391,27 @@ "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.0.tgz", "integrity": "sha512-c/cMBGA5mH3OYjaXedtLIM3hQjv+KuZuiD2QEH5GofNOZeQVDIYIN7Okc2AW1KPhk44g5PTZnXp8t2lOMl8qhQ==" }, + "node_modules/fast-xml-parser": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -2213,6 +2477,38 @@ "pkg-dir": "^4.2.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -2489,6 +2785,11 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, "node_modules/html-escaper": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", @@ -2787,6 +3088,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -3468,6 +3780,20 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, + "node_modules/merge-anything": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", + "integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4186,6 +4512,25 @@ "node": ">=10.0.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -4861,6 +5206,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5252,6 +5602,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/rss-to-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/rss-to-json/-/rss-to-json-2.1.1.tgz", + "integrity": "sha512-xXf93iDpOadPWMtAUA/bT1iyifscdbIdtAQBGRbXLfnDQ5Z4tWpmbrAhV3p54nWxwm4joGIDeUrj6CLGm8BI3A==", + "dependencies": { + "axios": "^1.2.6", + "fast-xml-parser": "^4.0.15" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5356,6 +5715,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/seroval": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-0.12.3.tgz", + "integrity": "sha512-5WDeMpv7rmEylsypRj1iwRVHE/QLsMLiZ+9savlNNQEVdgGia1iRMb7qyaAagY0wu/7+QTe6d2wldk/lgaLb6g==", + "engines": { + "node": ">=10" + } + }, "node_modules/server-destroy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", @@ -5844,6 +6211,28 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, + "node_modules/solid-js": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.5.tgz", + "integrity": "sha512-xvtJvzJzWbsn35oKFhW9kNwaxG1Z/YLMsDp4tLVcYZTMPzvzQ8vEZuyDQ6nt7xDArVgZJ7TUFrJUwrui/oq53A==", + "dependencies": { + "csstype": "^3.1.0", + "seroval": "^0.12.0" + } + }, + "node_modules/solid-refresh": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.5.3.tgz", + "integrity": "sha512-Otg5it5sjOdZbQZJnvo99TEBAr6J7PQ5AubZLNU6szZzg3RQQ5MX04oteBIIGDs0y2Qv8aXKm9e44V8z+UnFdw==", + "dependencies": { + "@babel/generator": "^7.21.1", + "@babel/helper-module-imports": "^7.18.6", + "@babel/types": "^7.21.2" + }, + "peerDependencies": { + "solid-js": "^1.3" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -6004,6 +6393,11 @@ "node": ">=0.10.0" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/style-to-object": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz", @@ -6355,6 +6749,11 @@ "node": ">=8" } }, + "node_modules/validate-html-nesting": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz", + "integrity": "sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==" + }, "node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -6450,6 +6849,24 @@ } } }, + "node_modules/vite-plugin-solid": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.7.2.tgz", + "integrity": "sha512-GV2SMLAibOoXe76i02AsjAg7sbm/0lngBlERvJKVN67HOrJsHcWgkt0R6sfGLDJuFkv2aBe14Zm4vJcNME+7zw==", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/preset-typescript": "^7.23.0", + "@types/babel__core": "^7.20.2", + "babel-preset-solid": "^1.8.0", + "merge-anything": "^5.1.7", + "solid-refresh": "^0.5.3", + "vitefu": "^0.2.4" + }, + "peerDependencies": { + "solid-js": "^1.7.2", + "vite": "^3.0.0 || ^4.0.0" + } + }, "node_modules/vite/node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", diff --git a/package.json b/package.json index 855bd4d..14de8ae 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,15 @@ }, "dependencies": { "@astrojs/mdx": "^1.1.2", + "@astrojs/solid-js": "^3.0.2", "@picocss/pico": "^1.5.10", "astro": "^3.2.3", "astro-icon": "^0.8.1", + "dayjs": "^1.11.10", "fast-sort": "^3.4.0", "mdast-util-to-string": "^4.0.0", - "reading-time": "^1.5.0" + "reading-time": "^1.5.0", + "rss-to-json": "^2.1.1", + "solid-js": "^1.8.5" } } diff --git a/src/components/MediumBlogs.astro b/src/components/MediumBlogs.astro new file mode 100644 index 0000000..cb670ed --- /dev/null +++ b/src/components/MediumBlogs.astro @@ -0,0 +1,8 @@ +--- +import MediumBlogsDynamic from '@/components/MediumBlogsDynamic' +import { fetchBlogPosts } from '@/store/blogs' + +const blogPosts = await fetchBlogPosts() +--- + + diff --git a/src/components/MediumBlogsDynamic/index.tsx b/src/components/MediumBlogsDynamic/index.tsx new file mode 100644 index 0000000..2b9d4af --- /dev/null +++ b/src/components/MediumBlogsDynamic/index.tsx @@ -0,0 +1,55 @@ +import { createSignal } from 'solid-js' +import s from './style.module.css' + +type Props = { + blogs: BlogPost[] +} +export default function MediumBlogsDynamic(props: Props) { + const [filter, setFilter] = createSignal('') + const filteredBlogs = () => props.blogs.filter(blog => ( + blog.title.toLowerCase().includes(filter().toLowerCase()) || + blog.intro?.toLowerCase().includes(filter().toLowerCase()) || + blog.categories.join(', ').toLowerCase().includes(filter().toLowerCase()) + )) + + return ( + <> +
+

Published Blogs

+ setFilter(e.currentTarget.value)} /> +
+ { + filteredBlogs().map(post => ) + } + + ) +} + +function Post(props: { post: BlogPost }) { + const post = props.post + const categoriesList = props.post.categories.join(', ') + + return ( +
+
+
+ {post.title} +
+ +
+ +
{post.title}
+
+ +

{post.pubDate?.format('MMMM DD, YYYY')}

+

{post.intro}

+ {categoriesList} +
+
+
+ ) +} diff --git a/src/components/MediumBlogsDynamic/style.module.css b/src/components/MediumBlogsDynamic/style.module.css new file mode 100644 index 0000000..4f26dd6 --- /dev/null +++ b/src/components/MediumBlogsDynamic/style.module.css @@ -0,0 +1,47 @@ +.postContainer { + margin: 0 0 2.5rem 0; + padding-bottom: 1rem; + border-bottom: 1px solid var(--secondary); +} + +.title { + color: var(--primary); + margin: 0; +} + +.pubDate { + font-size: .85rem; + font-style: italic; + margin-bottom: .25rem; +} + +.post { + width: 100%; + display: flex; + column-gap: 1rem; +} + + +.content { + font-size: .85rem; +} + +.categoryLabel { + font-size: .85rem; + font-weight: bold; + margin-bottom: 0; +} + +.search { + max-width: 20rem; + height: 1rem; +} + +.header { + margin: 3rem 0; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + align-items: center; + margin-bottom: 1rem; +} diff --git a/src/components/SideNavigation.astro b/src/components/SideNavigation.astro index a6a4a53..60deade 100644 --- a/src/components/SideNavigation.astro +++ b/src/components/SideNavigation.astro @@ -7,7 +7,7 @@ import { getStaticPaths } from '@/pages/story/[...slug].astro' const stories = await getStaticPaths() --- -
+
Me

Adam Jelinek

@@ -23,26 +23,35 @@ const stories = await getStaticPaths() )) } + My Blogs
+ + - + h2, + h3, + h4 { + --typography-spacing-vertical: 0.25rem; + } + .active-url { + background: var(--primary-focus); + } + + + diff --git a/src/pages/blogs.astro b/src/pages/blogs.astro new file mode 100644 index 0000000..fc54e63 --- /dev/null +++ b/src/pages/blogs.astro @@ -0,0 +1,28 @@ +--- +import MediumBlogs from '@/components/MediumBlogs.astro' +import Layout from '@/layouts/Layout.astro' +--- + + +
+
+

My Blogs

+

+ Welcome to my blog page! As encouraged by one of my mentors, I've embraced the challenge of sharing my insights, + experiences, and learnings through writing. This journey has been an incredible opportunity for personal and + professional growth. Here, I'll explore a range of topics, from technology and leadership to personal + development and growth, all shared with the aim of inspiring and engaging readers. Your feedback and thoughts + are highly valued, so feel free to explore and join me on this exciting writing venture. +

+
+
+

+ Don't let your FOMO get the best of you! Follow me on Medium and never miss an entry. +

+ + +
+ + diff --git a/src/pages/blogs.mdx b/src/pages/blogs.mdx deleted file mode 100644 index 3849725..0000000 --- a/src/pages/blogs.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: ../layouts/Layout.astro ---- - -# Working on it, when I find a round-to-it. \ No newline at end of file diff --git a/src/pages/story/[...slug].astro b/src/pages/story/[...slug].astro index 3672aa1..2f7697d 100644 --- a/src/pages/story/[...slug].astro +++ b/src/pages/story/[...slug].astro @@ -1,7 +1,7 @@ --- import { getStoryPaths } from '@/utils/content/collections' import Layout from '@/layouts/Layout.astro' -import Icon from 'astro-icon' +import { slide } from 'astro:transitions' export async function getStaticPaths() { return getStoryPaths() @@ -17,7 +17,7 @@ const {

{minutesRead}

- +

Next: diff --git a/src/store/blogs.ts b/src/store/blogs.ts new file mode 100644 index 0000000..de02c92 --- /dev/null +++ b/src/store/blogs.ts @@ -0,0 +1,27 @@ + +import rss from 'rss-to-json' +//@ts-ignore +const { parse } = rss +// import { parse } from 'rss-to-json' +import dayjs from 'dayjs' +import { sort } from 'fast-sort' +const paragraph = /]*>(.*?)<\/p>/i +const imageUrl = /]+src="([^">]+)"/i + +export async function fetchBlogPosts(): Promise { + const rssJson = await parse('https://medium.com/feed/@shadetreeit') + const posts: BlogPost[] = rssJson.items.map((item: any) => { + const firstParagraph = item.content.match(paragraph)?.[1] + return { + title: item.title, + link: item.link, + pubDate: dayjs(item.published), + categories: item.category, + imageUrl: item.content.match(imageUrl)?.[1], + intro: firstParagraph.length > 300 ? firstParagraph.slice(0, 300) + '...' : firstParagraph, + content: item.content + } + }) + + return sort(posts).desc(post => post.pubDate) +} \ No newline at end of file diff --git a/src/types/index.d.ts b/src/types/index.d.ts new file mode 100644 index 0000000..39ff40d --- /dev/null +++ b/src/types/index.d.ts @@ -0,0 +1,9 @@ +type BlogPost = { + title: string + link: string + pubDate: import('dayjs').Dayjs + categories: string[] + imageUrl?: string + intro?: string + content?: string +} diff --git a/src/utils/content/collections.ts b/src/utils/content/collections.ts index 4c8e480..6233216 100644 --- a/src/utils/content/collections.ts +++ b/src/utils/content/collections.ts @@ -10,10 +10,10 @@ export async function getStoryPaths() { const title = story.data.title const nextStory = sortedStories[index + 1] - let nextUrl = '/' + let nextUrl = '/about-me' let nextPageTitle = 'The End' if (nextStory && index < sortedStories.length - 1) { - nextUrl = nextStory.slug.split('_')[1] + nextUrl = `/about-me/story/${ nextStory.slug.split('_')[1] }` nextPageTitle = nextStory.data.title } diff --git a/tsconfig.json b/tsconfig.json index 83a3e72..76ec179 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,8 @@ "@/*": [ "src/*" ] - } + }, + "jsx": "preserve", + "jsxImportSource": "solid-js" } } \ No newline at end of file