aboutsummaryrefslogtreecommitdiff
path: root/src/app/blogs/page.tsx
diff options
context:
space:
mode:
authormihna123 <mihailonvojinovic@gmail.com>2026-06-08 14:19:32 +0200
committermihna123 <mihailonvojinovic@gmail.com>2026-06-08 14:19:32 +0200
commit67eb91ad6dccf2a14e3f8d3b285c75d251322973 (patch)
tree648fc2de5568ef8f541e6c7033e3c1a0a953a92e /src/app/blogs/page.tsx
parent3f513363524c7cfd9d7fb573454090d2ba01bda9 (diff)
downloadinvoice-67eb91ad6dccf2a14e3f8d3b285c75d251322973.tar.gz
invoice-67eb91ad6dccf2a14e3f8d3b285c75d251322973.zip
feat(blogs): implement blogging functionality
- Implement static blog generation from markdown files
Diffstat (limited to 'src/app/blogs/page.tsx')
-rw-r--r--src/app/blogs/page.tsx39
1 files changed, 39 insertions, 0 deletions
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 (
+ <div className="space-y-2">
+ <Link
+ href={`/blogs/${blog.slug}`}
+ className="link text-3xl font-semibold"
+ >
+ {blog.title}
+ </Link>
+ <p>
+ by {blog.author.name} ~ {blog.date.toLocaleDateString()}
+ </p>
+ <p className="text-lg">{blog.excerpt}</p>
+ <Link href={`/blogs/${blog.slug}`} className="link">
+ READ MORE &gt;
+ </Link>
+ </div>
+ );
+};
+
+export default function BlogPage() {
+ const blogs = getAllBlogs();
+ // newest first
+ blogs.sort((a, b) => b.date.getTime() - a.date.getTime());
+
+ return (
+ <section className="mt-10 flex justify-center">
+ <div className="w-5xl space-y-4">
+ <h1 className="text-4xl font-bold">Free Invoice Generator Blogs</h1>
+ {blogs.map((b) => (
+ <BlogCard key={b.slug} blog={b} />
+ ))}
+ </div>
+ </section>
+ );
+}