{title}
+ + {description && ( ++ {description} +
+ )} +diff --git a/services/www/.storybook/main.ts b/services/www/.storybook/main.ts
index 894331b..58a224c 100644
--- a/services/www/.storybook/main.ts
+++ b/services/www/.storybook/main.ts
@@ -1,5 +1,7 @@
import path from 'path';
import type { StorybookConfig } from '@storybook/react-vite';
+import { mergeConfig } from 'vite';
+import tailwindcss from '@tailwindcss/vite';
const config: StorybookConfig = {
stories: [
@@ -25,14 +27,16 @@ const config: StorybookConfig = {
},
},
async viteFinal(config) {
- config.resolve = config.resolve || {};
- config.resolve.alias = {
- ...config.resolve.alias,
- '#': path.resolve(__dirname, '../src'),
- '@ermnvldmr/stl': path.resolve(__dirname, '../../../packages/stl/src'),
- '@ermnvldmr/ui': path.resolve(__dirname, '../../../packages/ui/src'),
- };
- return config;
+ return mergeConfig(config, {
+ plugins: [tailwindcss()],
+ resolve: {
+ alias: {
+ '#': path.resolve(__dirname, '../src'),
+ '@ermnvldmr/stl': path.resolve(__dirname, '../../../packages/stl/src'),
+ '@ermnvldmr/ui': path.resolve(__dirname, '../../../packages/ui/src'),
+ },
+ },
+ });
},
};
diff --git a/services/www/content/articles/2026/test-article.mdx b/services/www/content/articles/2026/test-article.mdx
new file mode 100644
index 0000000..d588649
--- /dev/null
+++ b/services/www/content/articles/2026/test-article.mdx
@@ -0,0 +1,19 @@
+---
+title: "Hello World"
+description: "My first article using the new content system."
+createdDate: 2026-01-31
+tags: ["test", "general"]
+---
+
+# Hello World
+
+This is a test article.
+
+## Section 1
+
+Some content here.
+
+```typescript
+const hello = "world";
+console.log(hello);
+```
diff --git a/services/www/src/content.config.ts b/services/www/src/content.config.ts
new file mode 100644
index 0000000..980d5cc
--- /dev/null
+++ b/services/www/src/content.config.ts
@@ -0,0 +1,18 @@
+import { glob } from 'astro/loaders';
+import { defineCollection, z } from 'astro:content';
+
+const articles = defineCollection({
+ // Load all markdown and MDX files from the content/articles directory
+ loader: glob({ pattern: "**/*.{md,mdx}", base: "./content/articles" }),
+ schema: z.object({
+ title: z.string(),
+ description: z.string().optional(),
+ // Astro handles date strings in frontmatter, but we use coerce to be safe
+ createdDate: z.coerce.date(),
+ updatedDate: z.coerce.date().optional(),
+ tags: z.array(z.string()).optional(),
+ image: z.string().optional(),
+ }),
+});
+
+export const collections = { articles };
diff --git a/services/www/src/layouts/ArticleLayout/ArticleLayout.stories.tsx b/services/www/src/layouts/ArticleLayout/ArticleLayout.stories.tsx
new file mode 100644
index 0000000..cdd2dba
--- /dev/null
+++ b/services/www/src/layouts/ArticleLayout/ArticleLayout.stories.tsx
@@ -0,0 +1,99 @@
+import { ArticleLayout } from './ArticleLayout';
+
+import type { Meta, StoryObj } from '@storybook/react';
+
+/**
+ * Metadata for the ArticleLayout component stories.
+ */
+const meta: Meta
+ Astro 5 introduces the Content Layer API, a powerful way to fetch content from any source,
+ including local files, remote APIs, and CMSs. In this article, we'll explore how to set
+ up a robust system for articles and projects.
+
+ Let's look at some code. Our new
+ Astro's zero-JS by default approach is perfect for content-heavy sites. By moving our
+ content outside of the
+ We can also include images and videos. The layout ensures they are responsive and fit the
+ grid.
+ Conclusion: It's a great time to be a web developer. This is my first article.
+ {description}
+
+ {article.data.description}
+ Introduction
+
+ "The best way to manage content is to not manage it at all." — Someone, probably.
+
+
+ content.config.ts uses the{' '}
+ glob loader to pull in MDX files from outside the src directory:
+
+
+
+ {`// services/www/src/content.config.ts
+import { defineCollection, z } from 'astro:content';
+import { glob } from 'astro/loaders';
+
+const articles = defineCollection({
+ loader: glob({ pattern: "**/*.mdx", base: "./content/articles" }),
+ schema: z.object({
+ title: z.string(),
+ description: z.string().optional(),
+ createdDate: z.date(),
+ updatedDate: z.date().optional(),
+ tags: z.array(z.string()).optional(),
+ }),
+});
+
+export const collections = { articles };`}
+ Why Astro 5?
+ src directory, we keep our project clean and organized.
+
+
+
+ Visual Media
+ {title}
+
+ {description && (
+ Articles
+
+ {
+ articles.map((article) => (
+
+
+ {article.data.title}
+
+ {article.data.description && (
+
- For the source code and support please refer to github.comermnvldmr.com monorepo.
- Pictures of mine are available at instagram.com@deytenit.
+ Check out my thoughts and articles on various matters. +
Thank you for visiting!