From 71d1df3bd7d452d3ef09a3123509d29f5ef4f333 Mon Sep 17 00:00:00 2001 From: enscribe Date: Sat, 22 Mar 2025 16:25:52 -0700 Subject: [PATCH] chore: miscellaneous cleanup - Update README documentation - Update favicon configuration - Enhance site metadata in Head.astro and consts.ts - Refactor RSS feed generation logic in rss.xml.ts - Adjust avatar schema to accept both URL and local paths in content.config.ts --- README.md | 44 +- astro.config.ts | 2 - package-lock.json | 576 +----------------- package.json | 2 +- public/android-chrome-192x192.png | Bin 2680 -> 0 bytes public/android-chrome-512x512.png | Bin 5064 -> 0 bytes public/apple-touch-icon.png | Bin 720 -> 1278 bytes public/browserconfig.xml | 9 - public/favicon-16x16.png | Bin 489 -> 0 bytes public/favicon-32x32.png | Bin 522 -> 0 bytes public/favicon-96x96.png | Bin 0 -> 511 bytes public/favicon.ico | Bin 15086 -> 15086 bytes public/favicon.svg | 3 + public/mstile-150x150.png | Bin 987 -> 0 bytes public/safari-pinned-tab.svg | 17 - public/site.webmanifest | 20 +- public/web-app-manifest-192x192.png | Bin 0 -> 1597 bytes public/web-app-manifest-512x512.png | Bin 0 -> 8168 bytes src/components/Head.astro | 18 +- src/consts.ts | 2 +- src/content.config.ts | 2 +- .../blog/the-state-of-static-blogs/index.mdx | 33 +- src/pages/about.astro | 2 +- src/pages/index.astro | 2 +- src/pages/rss.xml.ts | 22 +- 25 files changed, 85 insertions(+), 669 deletions(-) delete mode 100644 public/android-chrome-192x192.png delete mode 100644 public/android-chrome-512x512.png delete mode 100644 public/browserconfig.xml delete mode 100644 public/favicon-16x16.png delete mode 100644 public/favicon-32x32.png create mode 100644 public/favicon-96x96.png create mode 100644 public/favicon.svg delete mode 100644 public/mstile-150x150.png delete mode 100644 public/safari-pinned-tab.svg create mode 100644 public/web-app-manifest-192x192.png create mode 100644 public/web-app-manifest-512x512.png diff --git a/README.md b/README.md index ec8f73b..357f271 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ -astro-erudite is an opinionated, no-frills static blogging template built with [Astro](https://astro.build/), [Tailwind](https://tailwindcss.com/), and [shadcn/ui](https://ui.shadcn.com/). Extraordinarily loosely based off the [Astro Micro](https://astro-micro.vercel.app/) theme by [trevortylerlee](https://github.com/trevortylerlee). +astro-erudite is an opinionated, unstyled static blogging template built with [Astro](https://astro.build/), [Tailwind](https://tailwindcss.com/), and [shadcn/ui](https://ui.shadcn.com/). Extraordinarily loosely based off the [Astro Micro](https://astro-micro.vercel.app/) theme by [trevortylerlee](https://github.com/trevortylerlee). > [!NOTE] > To learn more about why this template exists, read [The State of Static Blogs in 2024](https://astro-erudite.vercel.app/blog/the-state-of-static-blogs), where I share my take on what constitutes a great blogging template and my goals while developing this one. @@ -27,7 +27,7 @@ Below are some fantastic examples of websites based on this template. If you wis | [decentparadox.me](https://decentparadox.me) | [@decentparadox](https://github.com/decentparadox) | A heavily customized personal portfolio with a sci-fi theme! | [→](https://github.com/decentparadox/decentparadox.me) | | [flocto.github.io](https://flocto.github.io/) | [@flocto](https://github.com/flocto) | A slightly modified personal blog | [→](https://github.com/flocto/flocto.github.io) | | [dumbprism.me](https://www.dumbprism.me/) | [@dumbprism](https://github.com/dumbprism) | A customized portfolio inspired by enscribe's bento grid style adding my gist of UI | [→](https://github.com/dumbprism/dumbprism-portfolio) | -| [hyuki.dev](https://hyuki.dev/) | [@snow0406](https://github.com/snow0406) | A minimalist blog with a blue color scheme, focusing on simplicity ! | [→](https://github.com/Snow0406/hyuki.dev) | +| [hyuki.dev](https://hyuki.dev/) | [@snow0406](https://github.com/snow0406) | A minimalist blog with a blue color scheme, focusing on simplicity! | [→](https://github.com/Snow0406/hyuki.dev) | ## Features @@ -98,7 +98,7 @@ Edit the `src/consts.ts` file to update your site's metadata, navigation links, export const SITE: Site = { TITLE: 'astro-erudite', DESCRIPTION: - 'astro-erudite is a opinionated, no-frills blogging template—built with Astro, Tailwind, and shadcn/ui.', + 'astro-erudite is a opinionated, unstyled blogging template—built with Astro, Tailwind, and shadcn/ui.', EMAIL: 'jason@enscribe.dev', NUM_POSTS_ON_HOMEPAGE: 2, SITEURL: 'https://astro-erudite.vercel.app', @@ -149,6 +149,20 @@ Colors are defined in `src/styles/global.css` in [OKLCH format](https://develope } ``` +### Favicons + +Favicons are generated using [RealFaviconGenerator](https://realfavicongenerator.net/). To adjust the favicons, replace the files in the `public/` directory (such as `favicon.ico`, `favicon.svg`, `apple-touch-icon.png`, etc.) with your own. After updating the favicon files, you'll also need to adjust the references in `src/components/Head.astro` to match your new favicon filenames and paths: + +```html + + + + + + + +``` + ## Adding Content ### Blog Posts @@ -198,18 +212,18 @@ mail: 'jason@enscribe.dev' The author schema is defined as follows: -| Field | Type (Zod) | Requirements | Required | -| ---------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -------- | -| `name` | `string` | n/a | Yes | -| `pronouns` | `string` | n/a | Optional | -| `avatar` | `string.url()` | Must be a valid URL. Preferably use [Gravatar](https://en.gravatar.com/site/implement/images/) with the `?size=256` size parameter. | Yes | -| `bio` | `string` | n/a | Optional | -| `mail` | `string.email()` | Must be a valid email address. | Optional | -| `website` | `string.url()` | Must be a valid URL. | Optional | -| `twitter` | `string.url()` | Must be a valid URL. | Optional | -| `github` | `string.url()` | Must be a valid URL. | Optional | -| `linkedin` | `string.url()` | Must be a valid URL. | Optional | -| `discord` | `string.url()` | Must be a valid URL. | Optional | +| Field | Type (Zod) | Requirements | Required | +| ---------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| `name` | `string` | n/a | Yes | +| `pronouns` | `string` | n/a | Optional | +| `avatar` | `string.url()` or `string.startsWith('/')` | Should be either a valid URL or a path starting with `/`. Preferably use [Gravatar](https://en.gravatar.com/site/implement/images/) with the `?size=256` size parameter. | Yes | +| `bio` | `string` | n/a | Optional | +| `mail` | `string.email()` | Must be a valid email address. | Optional | +| `website` | `string.url()` | Must be a valid URL. | Optional | +| `twitter` | `string.url()` | Must be a valid URL. | Optional | +| `github` | `string.url()` | Must be a valid URL. | Optional | +| `linkedin` | `string.url()` | Must be a valid URL. | Optional | +| `discord` | `string.url()` | Must be a valid URL. | Optional | > [!TIP] > You can add as many social media links as you want, as long as you adjust the schema! Make sure you also support the new field in the `src/components/SocialIcons.astro` component. diff --git a/astro.config.ts b/astro.config.ts index 95964f8..06a3c63 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -10,7 +10,6 @@ import { rehypeHeadingIds } from '@astrojs/markdown-remark' import rehypeExternalLinks from 'rehype-external-links' import rehypeKatex from 'rehype-katex' import rehypePrettyCode from 'rehype-pretty-code' -// import sectionize from '@hbsnow/rehype-sectionize' import remarkEmoji from 'remark-emoji' import remarkMath from 'remark-math' import remarkSectionize from 'remark-sectionize' @@ -92,7 +91,6 @@ export default defineConfig({ ], rehypeHeadingIds, rehypeKatex, - // sectionize, [ rehypePrettyCode, { diff --git a/package-lock.json b/package-lock.json index 29fce4c..c78005f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "astro-erudite", - "version": "1.3.0", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "astro-erudite", - "version": "1.3.0", + "version": "1.3.1", "hasInstallScript": true, "dependencies": { "@astrojs/check": "^0.9.4", @@ -17,7 +17,6 @@ "@astrojs/sitemap": "^3.3.0", "@expressive-code/plugin-collapsible-sections": "^0.40.2", "@expressive-code/plugin-line-numbers": "^0.40.2", - "@hbsnow/rehype-sectionize": "^1.0.7", "@iconify-json/lucide": "^1.2.26", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-dropdown-menu": "^2.1.6", @@ -26,7 +25,6 @@ "@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@rehype-pretty/transformers": "^0.13.2", - "@shikijs/transformers": "^1.29.2", "@tailwindcss/vite": "^4.0.7", "@types/react": "19.0.0", "@types/react-dom": "19.0.0", @@ -1149,19 +1147,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" }, - "node_modules/@hbsnow/rehype-sectionize": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@hbsnow/rehype-sectionize/-/rehype-sectionize-1.0.7.tgz", - "integrity": "sha512-twbVxCFf4YwgTm6FIdGtHfJ14vvIHedk2fqZTpE3X6+vszEeZlMTy7tOyI9KaP/6S2DN2Jnk7zZGtZANTD+vEg==", - "dependencies": { - "hast-util-heading": "^2.0.1", - "hast-util-heading-rank": "^2.1.1", - "rehype": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@iconify-json/lucide": { "version": "1.2.26", "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.26.tgz", @@ -2580,15 +2565,6 @@ "@shikijs/types": "1.29.2" } }, - "node_modules/@shikijs/transformers": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.29.2.tgz", - "integrity": "sha512-NHQuA+gM7zGuxGWP9/Ub4vpbwrYCrho9nQCLcCPfOe3Yc7LOYwmSuhElI688oiqIXk9dlZwDiyAG9vPBTuPJMA==", - "dependencies": { - "@shikijs/core": "1.29.2", - "@shikijs/types": "1.29.2" - } - }, "node_modules/@shikijs/types": { "version": "1.29.2", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", @@ -2945,11 +2921,6 @@ "undici-types": "~6.20.0" } }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" - }, "node_modules/@types/react": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.0.tgz", @@ -5388,83 +5359,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-heading": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-heading/-/hast-util-heading-2.0.1.tgz", - "integrity": "sha512-nwRggTanShzHRYMUX46lm6pbJ2c1+TUQCETahENb6yR6c8ro8MkE0hRJm8G0IqAZl35ONgJiW8RC8+D3484vYg==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-is-element": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-heading-rank": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz", - "integrity": "sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-heading-rank/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/hast-util-heading-rank/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/hast-util-heading/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/hast-util-heading/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/hast-util-is-element": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", - "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/hast-util-is-element/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -5820,28 +5714,6 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "optional": true }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -8474,21 +8346,6 @@ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" }, - "node_modules/rehype": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-12.0.1.tgz", - "integrity": "sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==", - "dependencies": { - "@types/hast": "^2.0.0", - "rehype-parse": "^8.0.0", - "rehype-stringify": "^9.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-expressive-code": { "version": "0.40.2", "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.40.2.tgz", @@ -8544,156 +8401,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-parse": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz", - "integrity": "sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^6.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/rehype-parse/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/rehype-parse/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/rehype-pretty-code": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.14.1.tgz", @@ -8769,285 +8476,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/rehype/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - }, - "node_modules/rehype/node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/rehype/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/rehype/node_modules/rehype-stringify": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz", - "integrity": "sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-to-html": "^8.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-emoji": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.1.tgz", diff --git a/package.json b/package.json index dd3f7dc..360e38f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "astro-erudite", "type": "module", - "version": "1.3.0", + "version": "1.3.1", "private": true, "scripts": { "dev": "astro dev", diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png deleted file mode 100644 index 67a130b0f3e6e9efa32d3a155f5c94e006b06968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 zcmaJ@XH?V49{m#nAw)nrOAP{{1q>uazyP5MfkYx51f+!|t`JIuC}p#PbkS8rKm-(p z6$R;wi_(!Qp(zg(rAQG(s!Hc&&)E;}owM(Kn7Q-2bMEc_#@PTM9h&#&860;5B)`P}AZ!9puCk=zvCQNLo_Hd`MY_%Azl_9WX zX7Zt?uC}(!h&L8tfcnxo)sRc6wTFbHVx-MBAs8l=(X|++lWhE80%c@3FP6gp3VP( z6D~_t*{L0rgb26w7@L41V5qRFy*21k+^j`1em_>Qbja}`yd5`nXrS8|xS zdKk#bDa@CX(N-uYWjR#VouXqm%x5UO$TARHMZQcJM7-?2hbo6XbrlWeH#=xd`B-8G z8Q{AucYPye_`<1KbgW5@(mqZ=cTH?gHeGHcTJlh>PkHk9i{f`s+#?=8OdE{B2hB+q zD)37e33TjY-hRA72N7-!#QeOo!SwLS`R zQYn0~zdh;++Z5xM+|cINepuo_SoGL&3~7jK{#oM~#6dqOWhuNjRZOnO2UN}xN;5@2 z0ecm6g!Sl$dH498r$OsYv2Ww7@rYCOK{YtU&g1*X_A~?>co{d(&zR*Juw0s${RrHBv|KNku$Bzk_UQIo3l6h zv_oF2JFUp?3jA*5yEgJA(PsI+fZ;2DO^>i%_3s--V0KYQDByWMGPCrMBlewFr+!MI zKjbx16#s(n8^$?oEHCv?0+Dah@JY(X?}yXJiYD0N%GFa#uI7z#i9S)S-#|#gP5;(JSk;M_!qNWI)z1H`sGQQqCU}j2q0h~OXKm|tC zX?H!n;uZAoR$Oyec`z>^S!3UiHKA`0N~uvAj5{@;ZA7(4&>WbIGiOYz6dZE|jiBFR z+vi;RK>q7u-qGK%{EMAi*afRjg82WqUv1qo7{MO8_A)!i?mT?*bP@hACsPS2?6K2r zVj&TFC$Yc)7O5yMDIwuk{cR+ANbJvP5k}e6!u;o?BI(RbiN@@mEQ;Hn=5qdTVdntuegX%Jjn5mw~ zF=U$3_-xGyn5eI2t3_H=Q}_PpO9Nzkp=X8vz1^7?CRf-ML)IYu0ULbx&3EsW=9hnS z#V4I+`6nIIRfpOx#dh3=lE{k?gxP3{{ZApSDA~M5)5l!~piJnS?f=N3e~hPiX0fW+ zjd=4ld%W;8)ZhFH*RF_=h4Q9WxM4WFVsp(*L?L%G7E6wFuO(HRc z=6UvA>~rrJUk3#~;&tHT!9L^TVLY!SX|ygyPgBjmBSYi`wNp7uYWOakq4b>En{Qkf zJS}6^MW~zoO$Ty*+~Zg?Yom)BJ%;3>paqHhqUY(44J)WheDy}gevGIW^Cq#q#e8oZ z2%R}6Mn;^SF*Vi9R^K1E^=96aS_<^Io5MD_oMGrp@aue?>t76Qn+ZGOofDJmXlpjz zpS(PC?*=#zK~Y^gjzu$D+rOL0UL>?_ge}*-e$nAI(98OxznI z_FoEe&$&1#6OdJmmCZ1{2ANqcHngf9g@0oMdf>=MQn; zOnPM3{LQ0sp-S8y&u^D{P~*u>tqzo44c8ijqC8@uv8O&y{r@Mgizs#jdnR?1TEl9| zh|}R2^>rSKT-CO@yIcJdIux>~OYu0jNBYY7j-Vw9I)W3XpCKA+SI zKEkXcz^ek&4STjYQ%=lrDx&+IO6}f9{X_`+EMoXYc*2XYcduwcht#=NG3VHZp4! z)&hVG#rBX301kV_frJ}%`d01%}Pfc^xqicO(o z01;$>2_FEHYykPN+(u_pYytPqX}DP)mr8=kbIuk(K2k(U152jQaE_A4>Q+K3aL_&KuIQ%RfHAjiNcqs@XmpRA-P4 zI5TUN-OPGkVSw&skA;EYhL(McGuo})Rentk!ND0<7W(PbEL{ZK6ML5XA1%-8U8g$^ zpBhGd{J67m+zWX;{VY!Gp#Gv$X55zB>EKhj${9A_9it;#sxdsIyR!F^R5}G1%%sC+ zGNFP`Y8g*s2lEzuFS$N8ECHWe&+gN;Q!ZT0 zy|Or&3rY)AV)_MHU`LEdr}me=x_2_)eL!qIF{;=1?V9jG#2^RQG9~X&TBU-~S*3nv?i%Hi_lMdq151fy!w8?dEZ95?KvW8c92d6?Jt z-BzbBPp;`5O~i*$^3auoy#j@L;P@rgAA5GXWKbVz-bp0Qjkc_ET9@Ic@fo!)ZwAb+ zS(z6IqUu56dDd>z2WucEr!DHwyvkd}1a|RuX#^g=5*SvT8b`8;^g-78O8u{l9~!4LqtN!g4NlIw1YHACX8mX6=%L z&-o7*k!Ee_&rJJx5H)MWJAC}x$}2g84X7EKwmMY3*GL? zIN0ydx@xKz1g3#pk4u>cXzR2_>HMn-WkDq!gPWC5l4z7^12GB>Ok(%Dna7Xtz-A5E zaiT0H62)-vVAFmJ(~BC<~dOAnru8E2aKnc^~_S5>r?}XLD()Yp*^5C zlJ}ImW`ONZKvTM^mlGAmzgFzJ5z*)mVEUxZyPvH9KI*qc4!Ss4mPlVp!tQ4Gk|0KVTmd_rCfnyJFDlpOd>?FRQwK$FkFxl4`!a&wZ(Sp<;s0`BO4uHTJy zf`=(9oAW(|U3J8@jHOqEd~;qy0QTJlO1C5YMHt73gv73_#XYPdhjJ>XH1$eR*z^@~ znzHTMecGehBSdrIc%Byz)f>m9YIKN71?HmkxPId5c2+=zM@9jzgY-aC`g37{_CR^v zN?~5*4v57mY_A)%PWiPxpmxx@uAm?r&_Qu=aVx6<=IM%@>ej^_UKdP|Z4o``my4_k z!L`oCrJ9-MVeaNgct`7NT7yXftByEXvkTlSZ+-|Gp2%m7^1Hc&UDK`o0BAi z^<@{V-D=R}HDim2os~W;qQjlqL$ch`5_D_dPw4ZJ}-?<}etFkxG zHeT&Jjkay)I(Jde^o1~UJ}xd2t73h!1~}~JtPa{cl1Ru*6lX_|g^JHuXW1zRM?_Cw z!Og~oBU|*32ZbNR9I`JwlVo@NQ?R>2kjp>bfRKMHxlc0xFo4v^FdifJmPJcs*{sA9 z6<%dr9c~16i@j*4)0P=uoX?3>1NQPe0G&>Go_5@ot&Hd!p-AHrMr>zIX6BmcsO%yS zy*CG8LP8Mc6ftA-HA}vEFyoGEd}Z`W9Rzb+|IzrYhIvRE7uxOae>7l?kHo*;Y(xB4 z+%|AK1pkjCYh8&rFTr9Iq|#SKge_xkcI({t74;mg zkg+{TiZqU7oDe#_|XwQh!VHJ@>0@0cZVwOnJ` zF;X9n_Y8C2h2j;AFb`L9%*9b)tY-=z@^2|Ekf*#~;w{#ppZp>sMG=bev}6yX$18Lh zIg7mk=6|ARx8WEygyV+q=ihZ9EM9W~4-Pa$?>lXNOq_kyf*o;*d(WGD=3-_sk7^HP zQ(o6hHUL|(Q;vL1kj`mMfLcF7U+xf5f}Iw_jXBC6;d;kFg5a<=FDo+;7{={$DNE^J z{a%v%F76b<);;pNUC`E=rG%ah+5rs5Fws=GdlZz=p9ZZiK1#u}J@0%XUascHM>gCB zxEMJp0iUAT2k)o=m|>p#+h`9eRp0}Y05M0f)1gFXZyvnYktS*lXWU?$dGo4KBhNT^ zG%8sBvu5`5n{5y}KQw-B9Fe$ro5zy`M#BpidSk9Xc7a>6=&r7=nb$MgVAk4wq%*g; ziR{35gimeq^DfgSHIc5~GN0XiX*oNQ&S@gQM5Ku5S4nlPpt&^g``U;EOujlz%}$;F z8dDe$TsvTCoL1mbOzD7Qz51e}J4LQ$b}lntjaff4phD3otw5pf;8SS6Gd%a{#CStM zM!#LUR@6AM{DBxJoa_4RMjW{N{<&|E?^=q>M+N0D=ggwigX^?Pw5bj(A$Pc6vy}Rd z<)ET#2J|nHtoRyse4eI=o3bh4w=qgDw*lfkGvb%d{qT~{k{ZX-8JctSd&9J@BdX;v3?q5?6 zXx`rMdH2QP&XW&Zk|!`;8q%r1{ZH35HnlW?RsP7-V8FkM_RVwEvzPePs#sevd+~PS zT6YXy63hzyX_2NY255IkP47sXd`(SnT?&ywu=Ts@h>^eft&D6j)bY$Q*5hAO{JoC^ z{L|4}c+!^dd!lzGD?N<HX3(`G|Opf#RA~9&8LY*DQ163`{+zC=P778<`7O6yDFJnZ z7bGkarJ*A;F{N*lAYWrTBD)jPF!{B%nWk#l1w{1F6bCr`?q0%c-^LOm)|jS5X&W-6 zK>l;F`)|VQGeZ(ZZJxBu8GktoQ5S1lYWv@xrigdm&b!gMs)Q>dypgzrbLbz3 zPGLWV)WWTfhMznU?q}kA&JP1HARFw~CGXSSW#~#aHZd|VF*Nv&Og15tcfE=}|Gxr) zLrtwg7f(8$Y VHk^CFC0*I3rDQ!a-)`K4x)@s;b&L!EVQJyvIi?JoPWNVYo5`2!5{zr z)xGBz|0B9k+@a*re-@6j6SSCG*3Al*bShrZ#jtSovyiq6GAooEUaYd5s%XN#ibG&m zmR~Bz*+!z2{XNt;x#7i+NEW+K;@U0$bWZv$Q~lz3>)tKDh6}d^s~@N^I?Z45cI{gh zj=i!Q+5LnRXe0Tt@BDBYV4-7sC^OY z>GRH7qm*{w45fO0CLb00fmxNLPa`?4lh(C zWIch@6xAmYP7N2l4Xh>sDNXMa8(SC_PERONX=PX#JZ(ZUC!>@8!51D}j84mS6psrr zwZt`DoG8N7;uq=ErwWWOmc`1NEF5z;wa9pL2vl*pxd(9w{5mS6&bZV=@pv_h-2VD+ zpYP2-_dn~Zei(=C{Y77y7Di9syG4AVzU;oOW;9@bbLYBi<(9pEvi%8#lGUz`dpTrH z+BAxRVQ*Zb*uk){`ItZ|FxeHi>9GJq`+~%xGr&kXccE2*sfAC*eey(RMLLl;!l7S7td!{H8xLI>Nd` z=-{bS=gyf%>|k+hX=ptdm)JJ(_h&x~f9vfQJi$Ii`%@y;|H{tKWGE@RaNz=@qq8$R z3ooy%fQdtETM zO?F;3=0zCLI&1wh@#BZTtlItQQ^4$y?`jE47A#!I+|<^_$04;V;H%wVTjr#UJG-=g zl~sNI_9rXl%jqvKu4X>|96K*FBjZH_M6q7T-dXc}^KZ=S>D@O|Zf{oY_5fFX`#+zz z>zy}2a%k4PHI=oq6E~&heEIzM(i6Xac4WzYv*hH?et7ymy>e$|Q0=t)H{zyGpIu%h z`{DdY6wB_JmV9+~NQ!-jWHd^k>~8zVc;czp{To&e)SwZt`|BqgyV)hf9t6-Y4{ z85o)98d&NY8iyE|TbUYJ85?LD7+4t?Ec45XLeY?$pOTqYiCe>U;Y-he8p5kWB1(c1 z%M}WW^3yVNQWZ)n3sMy_3rdn17%JvG{=~yk7^b0d%K!8k&!<5Q%*xz)$=t%q!rqfb zn1vNw8cYtSFe`5kQ8<0$%84Uqj>sHgKi%N5z)O$emAGKZCnwXXKr0wLUHx3vIVCg! E02AsQ - - - - - #121212 - - - diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png deleted file mode 100644 index a08c2275ebda122bda0994295641ee7b1b1e75f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L90|U1(2s1Lwnj--eWH0gbb!C6S$;)mc|LaO(3Q(xh)5S4F<9zExMWI6hJgnyX zS04N#F!v#YtO-;5o4r+RD%*s@1OG1XyDidm!0hDao0TVXmPjRvFdSA&NMCg6$ARfn zud8NcNLXGk;_;|^^312FPcATzZ$t5O&uEWDItRH}Q&0HTReV_HazLhAE52OC7#SFu=o(n+8XAWfm|K||Ss5E@ z8yHv_7%*5SzC+QFo1c=IR*73fVaiQVNQYO2M3e+2mMat#<)>xlq$-qD7Nja<7L+72 zFjUNW{E3I7Fib<^l>g~7o=<}qn3cKplDUPIg}o<>FbgZVG?*MtVOHK8qHy}gl@mwK k9FaM~e!9V9ftMb`D{;Y+Pfn&&fmSehy85}Sb4q9e02Ga!Qvd(} diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png deleted file mode 100644 index 27a5bd740400cfcddcc782220c05225889a9e0ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SSr1Gg{;GcwGYBLNg-FY)wsWq-lR%Wfk7>q=q@P-vE?i(`n#@noCN^Ba{8xXk=^ zFoA)4PHEpm9m`{iJU5P9$S^u`xS_f6JCE^8HiJXLmx|lcd3vVoaG2y+W_KIn8{F2x9hYx(1UX|#uO#FdoUuz<>B-@{MR>dMO z6=9yX78Yia^kuC)xjZQ;=`D=*5_bG&m3SxeozS_~?&!4W1_Q%#E=BL(*93t+U{Eb_ zjVMV;EJ?LWE=mPb3`Pb9)IHDC=AokIOTu(jOWuJ z24-b$y<~1-Wnu5hBFw@HE)6D!Q<#-EhbWxBaplC3Ge=~Ou%B-5Sm33{@Jd{; QRG<|Mp00i_>zopr0L9^^KmY&$ diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..c85434abaa8bde92f58dace457f263ce8939bb0a GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_9pO;uum9_jayh-ysJ9=9%VC z8(aRT-ZSyIV|ip#$f*_I_T;u}Raz=+e7tMj*H7%q1|kg`|BGrjJYCN)V?UFKgK)#| zTK)hAABJ`1j9d+z2fpe#Fd8uKxW}r&pvG|Bom(P#&hf&U2kG}0#W8MhgNW{CU_HR{ zph|oJ!wiO)_e>%T!VRxu8<-N93ifhWEMoXEbNi}(u??b(KaOf38-`ok--h4YSI#fq zcRlL)UGXIiyN~?)vyaJ3;j#qlk|$o}TpEo&$s!XbY2Vdcz+%)J=-{=kWO;+o2@^L) z&7GI#VpDjO>Cd$zlNt?<@uxTytTkrc;?ZWw#c^=!IgtxWlFu|0Sgu>6E20_EI+nR)&2AE|AfE>rYe>PD*stDL1Ba2JGEQDVGz!+CKyYYV$-*O YnbXXsu#@Y50V9^d)78&qol`;+0PI4=V*mgE literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index fdcc528b352bb70a4e211a4d16095b7f9871eeb8..277ebfb098a9b3a4ca6ad8adf4e057afe2c758b0 100644 GIT binary patch literal 15086 zcmeHOL23gr44lwHuX(~=3O(l3Yx|TQ`-|k%xAZalhSG-=wsNRo36j?VN7XK45X#E3 zEstjH#W=tYcQ_m%dcfx+@C;xW{+{>1m)Q2AOa1#j@F5OQ;v-G)CQ|HP8OL#=5Cd|6 z93Th!a==@2Gudl7&lIN@3*+~YiLn#^7@WOPwv2ymZmjFOR}oL*Ne--!1Kz%n$zJ1C zrZ~M=7{7;1jGg$$;Ovc3!=H8Q+cTIm=8PQ3&jD{e&SbCgC{vtXER5enCdN+uV{rCH z*)smMxv?(){>L0KN94e5IpFOJOZMGVirg)_QZM!E)t`qs0j=8WXUTr;eAIubU$4I0 z(;7rxMR-r^wp{00(iPvMP&TX>x#Rd@=mQ4+yf@0bvtb+vq?+m|x!Z={PY7cT4G8fB7T)yXG`ONz$zb&6~P9c9W zJD*jo;he&nLyJxKrxst!r&oLJCt6!`YO!gYExwkIw$Gxi7+Y)_e~Yi>)2qGq6RmYl UFS3fLsBQX@^IH)uT3@u5U;oHx$^ZZW literal 15086 zcmeI3zfK%65XJ|Bpg<8=2D5xmu5KlmqB6)`-O3e$9ibuF8Wg?Ie zqM%Me!{5tq2#Z$6dxv-LyxwCheR%B~d&Zw<$6oIuG9fQyd0EIa*?TSWRz$MwzT6Qx zrmjP-zi&;6d_v$2GBlA*p!IiY>3>%I+wFFH2IIhdz;z*lgSw zH>vo*H)2ex_=;`c!71?a)$HmsSUYx41KmrS{e$Tmx`gpRbV`Fd9C!X1U#hWF?HU+A zk@3bQt2bWE2U_g|ZGV1j`}4b<9|r9dstNarQO18YN`qRBG5-gQZ2`=KHom`T`}-r? zm)hRke87BQq&^U|*cF5)dYbsQC@?Q{5p;Q{=7Y#n^PtWP!lC2IK6(y;JHPrKF$N~l^U>8m%Gl=ijqcsl^kYv9?p24Ef9hlSp6V#` zKi40v{P-S?$;laWr76bRqdMHNHNE~m_x(@P<5!<(a{ul6qm>`uqhrH~yGPLS9ETw} zX1MmrP<;aa-s8k4qiyqkH22BqIfWieWZ>bPg8wyhlP6AAor9|HZ&lwF(D=Lx)&rsK zFTi_uY)>iEPTOAtjSbsiClFQn%G-smhnUwr0?N1cF&Btg \ No newline at end of file diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png deleted file mode 100644 index ba604ae4180e97136dbcf3e5d9e0d78cdaf14ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Z~4i=!ur5%QPK#C>Z(btiIVPik{pF~z5Um@8e z$d`ekN{xY`p@o6r7f`6-1p`B=0RzLU1O^7H84L{K1#@-<+5jb(lDyqr82-2SpV<%O zv6p!Iy0X9E_J1FixLN{pScpR{d1^=~=z=GUAX2ep55s{JUjWdoXu9UNGCD~py0EW4NZuH_5`|kwRy)3ND82Jlh9ye2>q+;p9JTdF*5A9{Kj0%5qJ`J&$ky*z$L- z?IXnx&+zF78GXs}Ua^hz`abc>^BZH&$8ET6Tz%l4?mo_M)qm#f{baIj`eyMr-_FQw zc-~z2nh4XXrYDG3oiLuK_ha|IgGtX-lV#%1#}x>LKR#She3^f3*_+KVXK!D>$?f;B z!gSyHdj;k9WK;?#9B~w4_r%4BdN=QJQh)8d^YaSIyYI^N7XC4;KG=EZkx#)^?+r(v z{ZPB%wZ{^FKy@~6xubeRH|C8!L(ExVNLB8U7XP{4IlQ>9@Q>8>*%tqp^KpeSJox86 zwmshc@ms|V+eaeX`k|px-hJLq_SpQJ+WyJaM%4%N&c9)--p9F(kFar_%-B-`9?^GC z<=q%`zn*<#Bmh*UTH+c}l9E`GYL#4+3Zxi}42(>44J>sHjYAB~txS!qjE%Gn46Fedff|6tghKf0l zKk;xBhG}S=@;`mX^Jx$Rvog0{GPkg@u=ivUW?==F29v`n%*vZX6i(l`a^lFDBQi(W ePd9ih@X}*=B`#R<$;oso$g7^NelF{r5}E)FUT5wA diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg deleted file mode 100644 index 5a70780..0000000 --- a/public/safari-pinned-tab.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - diff --git a/public/site.webmanifest b/public/site.webmanifest index aa79006..dce2fc2 100644 --- a/public/site.webmanifest +++ b/public/site.webmanifest @@ -1,19 +1,21 @@ { - "name": "erudite", - "short_name": "erudite", + "name": "astro-erudite", + "short_name": "astro-erudite", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "/web-app-manifest-192x192.png", "sizes": "192x192", - "type": "image/png" + "type": "image/png", + "purpose": "maskable" }, { - "src": "/android-chrome-512x512.png", + "src": "/web-app-manifest-512x512.png", "sizes": "512x512", - "type": "image/png" + "type": "image/png", + "purpose": "maskable" } ], - "theme_color": "#121212", - "background_color": "#121212", + "theme_color": "#ffffff", + "background_color": "#000000", "display": "standalone" -} +} \ No newline at end of file diff --git a/public/web-app-manifest-192x192.png b/public/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..24d7711e06990ddb26583c87f4b63a4c67aa5caa GIT binary patch literal 1597 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;U}N!gaSW-5dwct!Z;Gdg%f&;| zJPEymGnyG^Gz+dVT(IY5=GHXR)pd;zj_FioEUN0Baz5atlcDQH zAN>6J^V^Rf84Foi-hKc5_VMGzn>^PttY5!=`}FD4y)x{w+#dY>`}f#(?9k9N`-%_~ON7x9 zDM?1AlsikN2`C(xqEIU|4J7)Q})SPXP_tW9ffw8_%CVzu*4P z{K+gG7df{HC^(!J+V>df!yPQUy`wn<7Nm0CF9ZfmOw-+^x-1+QHnqIp0raHa!FQL$ zm{>9*50%FN!)AIyc_ud_(-xhF)_RH#4c;4eZ)s&D8_HT zU;pPm0Va>K_`kLe1xrtu3o1A;Ok-f&a*2bnDUn0KLAzH#L86T=0?#11T0+J37RR0U z-)|p3?tVM{@6UO+7xO{<>)9IU~K!4^1wWF^6+wZP!%>gTe~DWM4fjQcta literal 0 HcmV?d00001 diff --git a/public/web-app-manifest-512x512.png b/public/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..245f820f1f74247a9c23dd92fe0d9213d9f2da7f GIT binary patch literal 8168 zcmeHMZBP_v67HD{FbhG3MbQIchw$k)3K1^1!tfyoQlK#jCL*kt5_}WNmFhp1@E8xQJUe5^rxVj%#b@%5g zvwz;5dV71i`|Y>;d3t}pEi={A-On8WJkz!$KMp|RR}yGfT&(K9+W-_TX~_vssB>@k zuYdEs%N>V|aZ#*}PB^4=ckKyLx@~>`H(?c-TY_{aDyUvqf8@265B&r7{3(6Np+5M{ zWAdjjoS!OjnvM5*O(v6bZba)y<$)k6Iw!=UAPSBDC|fB!F*90%Fz;YFVRNZF&3mLy zACoco%!9>KSV8CELK)s@oc$Y0vm6IAuENS2-XKZyUyb(X1T8EJnuo-Fb0R?$em7RO zLDbGbx45!}XLx8YEQ+raZJ=R9T$%Q59OT4y)MtpcQGCI?jS(!YT|Sf*CYnVWV#JkN zyO@EcZ%%~!h~^Sze{q$}mZD9NQj+}tUCCsHcfWV?z1am)36>j7&?n5PY-vO`fKXKW&BtS3uiB>@#nip zQdRXkYbz|fk*m*u4|n}CjpwpCC~ETt<4Y7*w5<0LPPLVTz58ndeW7u1yjI2^SQRc~ z#<22DY$Vx^8aTXY^l6ITE2H@}&BjZl>Ydl@8;I6@H$n(*YsFc8X?(!MA@t6~Z;FVxePz=EqRoW7YZIY-=bBpR}iVdGOmO?tVcTI*uQs=pq-2 zEA}TCL0#pY)g<)^MHzhi#`X}ApI(?s!&yOHZ}7Fb28YzfQa%h{QyHfBxPuvB~(;%Ek9D z2tiiTn7VJx-vrLg;2Q%TpHF#u`6GC9lics;Ht3QlOyVulOMhnJRbXOOV0v<#d8o5E zt6-$tv+GkI$1WiSWl~9#>c7-1|0874ZTsPTQ*XReBf=!Zqhwy$y&IPu4M)D=Gu`k9zbGf?m;9|?&(|FywDP6PTdcTF@CyMu#M7sjnEaxh(= z2u3AQC=o^2fAT`QP$^JbHy;MPHtw`uc+jDq#jUnGa(sR0V!J1D+lLVvCj3~AO5Bc) zH+i##=Xi*HrSDc=D4e@Igrr)Rj}rN$?Ry19@m@M~&nt|Dz`d3Q79IzgB3DL##R{z6Nwc z80$JSohymRH4|}y5{$Ic=UTi|m;=!0o;nhbMOD7Je$@hKh{Kp@{MQAskeg^65l*y$ zhh?9}&8#E}E$wA~1Sy0us`x#}lcegI!BRm9Mp_-#pmikR(1AhsEGl%T$F(XhdjUac zFeWn_a}zn}s<<9L(%Upggo{3Sk(H#B-^?05UJ;^!=vlIE(5Cxi`ayPG%KOry{Skn$$>9<-#_ho9_b~E%L0H0)YdENwXnoHY5$w z{&ni8nZ4bX)slPhNcY!5{b~)fIP9}cd0P8{+pRkq5yQVT@I2x)mTN#*=l3hM3j$1p zwm6S$99)Zd8&Rw$j!gS|RtZA9;R8f`HxB+nlzIVC>y<^h3F03Rcz!+7Dt`C1#Uu8emKJXs61Ox1-k77PD*cY5T&jmR;>x>dR-8rs}V+S-&czy z0;LY|@WPMgC8Cikah%*KFd&MK#+vY~TZkdiCXsYnSX-If2Uf;pB(mn9!||1$Jl Pz)#xd%;e@o)$9KRc`ZA9 literal 0 HcmV?d00001 diff --git a/src/components/Head.astro b/src/components/Head.astro index 9afab73..f40d1fc 100644 --- a/src/components/Head.astro +++ b/src/components/Head.astro @@ -19,6 +19,10 @@ const { title, description, image = '/static/twitter-card.png' } = Astro.props + + + + @@ -26,14 +30,17 @@ const { title, description, image = '/static/twitter-card.png' } = Astro.props {title} + + + + - - + - - - + + + @@ -81,7 +88,6 @@ const { title, description, image = '/static/twitter-card.png' } = Astro.props setDarkMode(document) document.addEventListener('astro:before-swap', (ev) => { - // Pass the incoming document to set the theme on it setDarkMode(ev.newDocument) }) diff --git a/src/consts.ts b/src/consts.ts index 54cbc6d..84cadc0 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -15,7 +15,7 @@ export type Link = { export const SITE: Site = { TITLE: 'astro-erudite', DESCRIPTION: - 'astro-erudite is a opinionated, no-frills blogging template—built with Astro, Tailwind, and shadcn/ui.', + 'astro-erudite is a opinionated, unstyled blogging template—built with Astro, Tailwind, and shadcn/ui.', EMAIL: 'jason@enscribe.dev', NUM_POSTS_ON_HOMEPAGE: 2, POSTS_PER_PAGE: 3, diff --git a/src/content.config.ts b/src/content.config.ts index 20e3fa7..28709e1 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -30,7 +30,7 @@ const authors = defineCollection({ schema: z.object({ name: z.string(), pronouns: z.string().optional(), - avatar: z.string().url(), + avatar: z.string().url().or(z.string().startsWith('/')), bio: z.string().optional(), mail: z.string().email().optional(), website: z.string().url().optional(), diff --git a/src/content/blog/the-state-of-static-blogs/index.mdx b/src/content/blog/the-state-of-static-blogs/index.mdx index 16f4cb7..cd48e5d 100644 --- a/src/content/blog/the-state-of-static-blogs/index.mdx +++ b/src/content/blog/the-state-of-static-blogs/index.mdx @@ -121,6 +121,8 @@ This is a non-exhaustive list of features I believe are essential for a friction $ pnpm install @astrojs/mdx @astrojs/react @astrojs/sitemap astro-icon ``` +- Expressive Code unfortunately does not support inline syntax highlighting like this: `console.log('Hello world!'){:js}`. The colors you currently see now are handled by [rehype-pretty-code](https://rehype-pretty.pages.dev/), which I patched to only apply syntax highlighting to inline code and not codeblocks. To read more about this process, see the next blog post: [v1.3.0: "Patches in Production"](/blog/rehype-patch). + - The `cn(){:js}` function is a utility function which combines [clsx](https://www.npmjs.com/package/clsx) and [tailwind-merge](https://www.npmjs.com/package/tailwind-merge), two packages which allow painless conditional class addition and concatenation: ```tsx title="src⠀›⠀lib⠀›⠀utils.ts" caption="A utility function for class name concatenation" showLineNumbers @@ -169,9 +171,9 @@ Within the blog itself (as in the layout, appearance, and navigation) are featur - Images are awesome and, by default, your blog post should have an image associated with it as part of the post's [Open Graph](https://ogp.me/) metadata. Since you can do whatever you want with the image, all of my dummy posts will have a placeholder image placed within their folder in `src/content/blog/`. Whenever you load into a blog post, splat in the middle will be the image associated with that post in its frontmatter. - Theme selectors should be self-explanatory. I've added one on the top right of the header, which is also `sticky` and not `absolute` such that it doesn't ignore the document flow (and thus you won't have to add `mt-20` to the top of every single page). -- The table of contents of a post shouldn't be reduced to a `
{:html}` at the start of a blog post on desktop. You'd need to go to the top of the page to navigate through items. I've added a sticky `{:html}` component which always hangs out around the unused left side margin of a blog post. I also attached a very tiny client-side script using [`IntersectionObserver{:js}`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver) to highlight all of the headings you're viewing within the TOC as you scroll through the page—it also will handle nested headings in that the parent heading of a visible child will still be highlighted even if off-screen (see the dummy [2024 Post](/blog/2024-post) for an example of this). I'll still use a collapsible `
{:html}` element for the table of contents on mobile though since obviously a table of contents on the side is unfeasible for small screens. -- Every page, except the homepage, will have a `{:html}` component which shows you your current location in the site hierarchy. I don't see these often in blog templates even though they are so amazing for both discoverability (SEO and crawling) and user experience (the user always knows how "deep" they are in the site). -- You can specify multiple post authors via frontmatter. If this post author's id is found within the `Authors` collection, then it will render particular info from that author's frontmatter file, `[author-name].md` (e.g. avatar, link to profile). For example, the previous post (2024 Post) has two authors: "enscribe" and "jktrn", where "enscribe" is the only author with a custom avatar since "jktrn" is unregistered. +- The table of contents of a post shouldn't be reduced to a `
{:html}` at the start of a blog post on desktop. You'd need to go to the top of the page to navigate through items. I've added a sticky `{:html}` component which always hangs out around the unused left side margin of a blog post. I also attached a very tiny client-side script using [`IntersectionObserver{:js}`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver) to highlight all of the headings you're viewing within the TOC as you scroll through the page—it also will handle nested headings in that the parent heading of a visible child will still be highlighted even if off-screen (see the dummy [2024 Post](/blog/2024-post) for an example of this). I'll still use a collapsible `
{:html}` element for the table of contents on mobile though since obviously a table of contents on the side is unfeasible for small screens. +- Every page, except the homepage, will have a `{:html}` component which shows you your current location in the site hierarchy. I don't see these often in blog templates even though they are so amazing for both discoverability (SEO and crawling) and user experience (the user always knows how "deep" they are in the site). +- You can specify multiple post authors via frontmatter. If this post author's ID is found within the `Authors` collection, then it will render particular info from that author's frontmatter file, `[author-name].md` (e.g. avatar, link to profile). For example, the previous post (2024 Post) has two authors: "enscribe" and "jktrn", where "enscribe" is the only author with a custom avatar since "jktrn" is unregistered. - Each author will have their own page, which lists all of their posts. If you're the only author throughout the entire blog then you can simply disregard all aspects regarding both inserting authors and the `Authors` collection. - Each tag will also have their own page, which lists all of the posts under that tag! - $\LaTeX$ is fully supported with [KaTeX](https://katex.org/): @@ -225,23 +227,20 @@ Within the blog itself (as in the layout, appearance, and navigation) are featur ## Foregoing some slop -- Goodbye, [ESLint](https://eslint.org/)! There have been so many occasions where I've had to deal with blogging templates with in-built pre-commit hooks which enforce contrived and arbitrary linting rules that, frankly, I couldn't be bothered with. Obviously, linting is awesome for ensuring consistency and best practice, but that's with shared and large codebases. You're dealing with, at most, your mediocre MDX blog posts and some interior fetching. It's just not worth the hypertension. - -- You really don't need analytics via [Umami](https://umami.is) or [Plausible](https://plausible.io). Let's be realistic: for many personal blogs, unless you're an anime profile picture Twitter microcelebrity and/or the daughter of Taylor Swift you don't need to know how many of your avid fans click Big Button A versus how many click Big Button B. -- You really don't need a comments section via [Giscus](https://giscus.app). This opens up a can of worms involving the ability to spam comments and the necessity to moderate them. If you want organic discussion about your blog posts to happen, then share on social media and let people discuss there. - - Speaking of sharing on social media, let's get rid of the share buttons. Please inform me of a single time you have used a share button on a blog post. -- You really don't need a CMS unless you have thousands of posts and/or are willing to navigate through a clunky management interface. Markdown and folders is really all you need, which you can organize to your preference via folder or file naming conventions. -- If you have literally anything involving an `.env` file in a blogging site, please think about what you are doing very carefully. -- Please do not override the browser's Ctrl + K functionality to open up a command palette. There should not be a single reason why a user would use a small context menu to browse your blog over the `/blog` route. Most of the time, command palettes on sites do nothing more than regurgitate shortcuts that are already on the same page you're hiding with the palette's modal. +- Goodbye, [ESLint](https://eslint.org/)! There have been so many occasions where I've had to deal with blogging templates with in-built pre-commit hooks which enforce contrived and arbitrary linting rules that, frankly, I couldn't be bothered with. Obviously, linting is awesome for ensuring consistency and best practice, but that's for shared and large codebases. You're dealing with, at most, your MDX blog posts and some interior fetching. It's just not worth the headache. +- You probably don't need analytics via [Umami](https://umami.is) or [Plausible](https://plausible.io). Let's be realistic: for many personal blogs, unless you're an anime profile picture Twitter microcelebrity, you don't need to know how many of your readers click Big Button A versus how many click Big Button B. +- You likely don't need a comments section via [Giscus](https://giscus.app). This opens up a can of worms involving the ability to spam comments and the necessity to moderate them. If you want organic discussion about your blog posts to happen, then share on social media and let people discuss there. + - Speaking of sharing on social media, let's get rid of the share buttons. When was the last time you actually used a share button on a blog post rather than just copying the URL? +- You probably don't need a CMS unless you have thousands of posts and/or are willing to navigate through a clunky management interface. Markdown and folders is really all you need, which you can organize to your preference via folder or file naming conventions. +- If you have literally anything involving an `.env` file in a blogging site, maybe think about what you are doing for a moment. +- Please consider not overriding the browser's Ctrl + K functionality to open up a command palette. There should not be a single reason why a user would use a small context menu to browse your blog over the `/blog` route. Most of the time, command palettes on sites do nothing more than regurgitate shortcuts that are already on the same page you're hiding with the palette's modal. ## Something important -Before we wrap up, I want to emphasize that everything that I've shared here is based on my own personal opinions and experiences. While I believe these practices and choices lead to a better blogging experience, you're absolutely free to disagree. - -The web development community, especially in spaces like Twitter and various online forums, is constantly engaged in heated debates about what constitutes "best practices." You'll find a wide spectrum of viewpoints: +Obviously a disclaimer: everything that I've shared here are my own personal gripes and, while I'd like for you to agree with me on a lot of these points for the better of the community, you can go ahead and disagree. The web development community, especially in spaces like Twitter and various online forums, is constantly engaged in heated debates about what constitutes "best practices." You'll find a wide spectrum of viewpoints: 1. Fundamentalists who adhere strictly to established patterns and completely disregard change, -2. Accelerationists who gobble up whatever Vercel cooks as if it's the second coming of Christ, -3. and everyone in between this spectrum who just wants to ship. +2. Accelerationists who eat up whatever Vercel cooks as if it's the second coming of Christ, +3. and everyone in between this spectrum. -I'm just another guy who loves to blog, and I wanted to share what particular technology stack worked the best for me in this particular use case. A stack for one project can be completely unusable for another. If you vehemently hate any of the design choices I've made then simply get rid of them. MIT license! Happy blogging. +I wanted to share what particular technology stack worked the best for me in this particular use case. A stack for one project can be completely unusable for another. If you vehemently hate any of the design choices I've made then simply get rid of them. MIT license! Happy blogging. diff --git a/src/pages/about.astro b/src/pages/about.astro index 6600f27..35e2316 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -18,7 +18,7 @@ const projects = await getCollection('projects')

- astro-erudite is an opinionated, no-frills static blogging template + astro-erudite is an opinionated, unstyled static blogging template that prioritizes simplicity and performance, built with

- astro-erudite is an opinionated, no-frills static blogging template + astro-erudite is an opinionated, unstyled static blogging template built with !post.data.draft, - ) + const posts = await getCollection('blog', ({ data }) => !data.draft) + posts.sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf()) - // Sort posts by date - const items = [...blog].sort( - (a, b) => - new Date(b.data.date).valueOf() - new Date(a.data.date).valueOf(), - ) - - // Return RSS feed return rss({ title: SITE.TITLE, description: SITE.DESCRIPTION, site: context.site ?? SITE.SITEURL, - items: items.map((item) => ({ - title: item.data.title, - description: item.data.description, - pubDate: item.data.date, - link: `/${item.collection}/${item.id}/`, + items: posts.map((post) => ({ + title: post.data.title, + description: post.data.description, + pubDate: post.data.date, + link: `/blog/${post.id}/`, })), }) } catch (error) {