From 67eb91ad6dccf2a14e3f8d3b285c75d251322973 Mon Sep 17 00:00:00 2001 From: mihna123 Date: Mon, 8 Jun 2026 14:19:32 +0200 Subject: feat(blogs): implement blogging functionality - Implement static blog generation from markdown files --- src/app/blog/page.tsx | 7 ------- src/app/blogs/[slug]/page.tsx | 36 ++++++++++++++++++++++++++++++++++++ src/app/blogs/page.tsx | 39 +++++++++++++++++++++++++++++++++++++++ src/app/globals.css | 29 +++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 7 deletions(-) delete mode 100644 src/app/blog/page.tsx create mode 100644 src/app/blogs/[slug]/page.tsx create mode 100644 src/app/blogs/page.tsx (limited to 'src/app') diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx deleted file mode 100644 index ff5c415..0000000 --- a/src/app/blog/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function BlogPage() { - return ( -
-

Blogs

-
- ); -} diff --git a/src/app/blogs/[slug]/page.tsx b/src/app/blogs/[slug]/page.tsx new file mode 100644 index 0000000..3372bea --- /dev/null +++ b/src/app/blogs/[slug]/page.tsx @@ -0,0 +1,36 @@ +import { getBlogFromSlug, markdownToHtml } from '@/lib/blogs/api'; + +type Params = { + params: Promise<{ slug: string }>; +}; + +export default async function Blog(props: Params) { + const params = await props.params; + const blog = getBlogFromSlug(params.slug); + const htmlContent = await markdownToHtml(blog.content); + + return ( +
+
+

{blog.title}

+

+ by{' '} + + {blog.author.name} + {' '} + ~ {blog.date.toLocaleDateString()} +

+

{blog.excerpt}

+
+
+
+ ); +} diff --git a/src/app/blogs/page.tsx b/src/app/blogs/page.tsx new file mode 100644 index 0000000..8fa3c42 --- /dev/null +++ b/src/app/blogs/page.tsx @@ -0,0 +1,39 @@ +import { type Blog, getAllBlogs } from '@/lib/blogs/api'; +import Link from 'next/link'; + +const BlogCard = ({ blog }: { blog: Blog }) => { + return ( +
+ + {blog.title} + +

+ by {blog.author.name} ~ {blog.date.toLocaleDateString()} +

+

{blog.excerpt}

+ + READ MORE > + +
+ ); +}; + +export default function BlogPage() { + const blogs = getAllBlogs(); + // newest first + blogs.sort((a, b) => b.date.getTime() - a.date.getTime()); + + return ( +
+
+

Free Invoice Generator Blogs

+ {blogs.map((b) => ( + + ))} +
+
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index eb0ee21..ff84294 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -17,3 +17,32 @@ body { color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } + +.link, +.markdown a { + @apply text-blue-900 underline hover:bg-blue-900 hover:text-white; +} + +.markdown { + @apply space-y-4 text-lg leading-relaxed; +} + +.markdown h1 { + @apply text-3xl font-bold; +} + +.markdown h2 { + @apply text-2xl font-semibold; +} + +.markdown h3 { + @apply text-xl font-semibold; +} + +.markdown ul { + @apply list-disc pl-8; +} + +.markdown ol { + @apply list-decimal pl-8; +} -- cgit v1.3.1