From 0b8b50cf128e7a78ebfbb7cd5ed07911ff78737f Mon Sep 17 00:00:00 2001 From: lew Date: Fri, 23 Jan 2026 00:07:23 +0000 Subject: [PATCH] Add blog app scaffolding with remark plugins --- apps/blog/astro.config.mjs | 19 +++++++++++++++++++ apps/blog/package.json | 18 ++++++++++++++++++ apps/blog/src/content.config.ts | 13 +++++++++++++ apps/blog/src/plugins/remark-aside.ts | 14 ++++++++++++++ apps/blog/src/styles/global.css | 20 ++++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 apps/blog/astro.config.mjs create mode 100644 apps/blog/package.json create mode 100644 apps/blog/src/content.config.ts create mode 100644 apps/blog/src/plugins/remark-aside.ts create mode 100644 apps/blog/src/styles/global.css diff --git a/apps/blog/astro.config.mjs b/apps/blog/astro.config.mjs new file mode 100644 index 0000000..767aa3d --- /dev/null +++ b/apps/blog/astro.config.mjs @@ -0,0 +1,19 @@ +import { defineConfig } from 'astro/config'; +import remarkDirective from 'remark-directive'; +import remarkGfm from 'remark-gfm'; +import remarkSlug from 'remark-slug'; +import remarkSmartypants from 'remark-smartypants'; +import remarkAside from './src/plugins/remark-aside.ts'; + +export default defineConfig({ + output: 'static', + markdown: { + remarkPlugins: [ + remarkGfm, + remarkDirective, + remarkAside, + remarkSlug, + remarkSmartypants + ] + } +}); diff --git a/apps/blog/package.json b/apps/blog/package.json new file mode 100644 index 0000000..ee2290d --- /dev/null +++ b/apps/blog/package.json @@ -0,0 +1,18 @@ +{ + "name": "@ily/blog", + "type": "module", + "scripts": { + "dev": "astro dev --port 4322", + "build": "astro build", + "preview": "astro preview" + }, + "dependencies": { + "astro": "^5.16.13" + }, + "devDependencies": { + "remark-directive": "^3.0.0", + "remark-gfm": "^4.0.0", + "remark-slug": "^7.0.1", + "remark-smartypants": "^3.0.2" + } +} diff --git a/apps/blog/src/content.config.ts b/apps/blog/src/content.config.ts new file mode 100644 index 0000000..4d660c3 --- /dev/null +++ b/apps/blog/src/content.config.ts @@ -0,0 +1,13 @@ +import { defineCollection } from 'astro:content'; +import { glob } from 'astro/loaders'; +import { z } from 'astro/zod'; + +const posts = defineCollection({ + loader: glob({ pattern: '**/*.md', base: './src/content/posts' }), + schema: z.object({ + title: z.string(), + date: z.coerce.date() + }) +}); + +export const collections = { posts }; diff --git a/apps/blog/src/plugins/remark-aside.ts b/apps/blog/src/plugins/remark-aside.ts new file mode 100644 index 0000000..f98b084 --- /dev/null +++ b/apps/blog/src/plugins/remark-aside.ts @@ -0,0 +1,14 @@ +import { visit } from 'unist-util-visit'; +import type { Root } from 'mdast'; + +export default function remarkAside() { + return (tree: Root) => { + visit(tree, 'textDirective', (node: any) => { + if (node.name !== 'aside') return; + + const data = node.data || (node.data = {}); + data.hName = 'span'; + data.hProperties = { class: 'aside' }; + }); + }; +} diff --git a/apps/blog/src/styles/global.css b/apps/blog/src/styles/global.css new file mode 100644 index 0000000..11053b2 --- /dev/null +++ b/apps/blog/src/styles/global.css @@ -0,0 +1,20 @@ +body { + max-width: 38rem; + margin: 0 auto; + padding: 1rem; +} + +.aside { + display: block; + font-size: 0.9rem; +} + +@media (min-width: 63rem) { + .aside { + display: inline; + float: right; + position: relative; + width: 10rem; + margin-right: -12rem; + } +}