feat: add BlogPage and BlogContent components with blog data integration

This commit is contained in:
Poyraz Avsever
2026-03-10 11:40:17 +03:00
parent 529ad01e51
commit e2b9f24d50
4 changed files with 316 additions and 2 deletions
+5
View File
@@ -0,0 +1,5 @@
import { BlogContent } from "@/components/blog-content";
export default function BlogPage() {
return <BlogContent />;
}
+2 -2
View File
@@ -48,8 +48,8 @@ export default function RootLayout({
}>) { }>) {
return ( return (
<html lang="en"> <html lang="en">
<body className="h-dvh overflow-hidden bg-background text-foreground antialiased"> <body className="min-h-dvh bg-background text-foreground antialiased">
<div className="mx-auto flex h-dvh w-full max-w-4xl flex-col overflow-hidden px-4 py-8 sm:px-6 sm:py-10"> <div className="mx-auto flex w-full max-w-4xl flex-col overflow-hidden px-4 py-8 sm:px-6 sm:py-10">
<SiteNavbar /> <SiteNavbar />
<AnnouncementBar <AnnouncementBar
variant="branded" variant="branded"
+116
View File
@@ -0,0 +1,116 @@
import { Badge, Card, Typography } from "poyraz-ui/atoms";
import {
ArticleCard,
NewsCard,
Pagination,
PaginationContent,
PaginationItem,
PaginationLink,
PaginationNext,
PaginationPrevious,
} from "poyraz-ui/molecules";
import {
BLOG_ARTICLES,
BLOG_CATEGORIES,
BLOG_NEWS,
RECENT_COMMENTS,
} from "@/data/blog";
export function BlogContent() {
return (
<section className="flex h-full flex-col gap-3 overflow-hidden">
<div className="grid gap-3 md:grid-cols-[1.35fr_1fr]">
<div className="space-y-2">
{BLOG_NEWS.map((post) => (
<NewsCard
key={post.id}
image={post.image}
category={post.category}
title={post.title}
date={post.date}
href={post.href}
className="rounded-sm border-border"
/>
))}
</div>
<div className="grid gap-3 md:grid-rows-[auto_1fr]">
<Card className="rounded-sm border-border p-4">
<Typography variant="large">Categories</Typography>
<div className="mt-3 flex flex-wrap gap-2">
{BLOG_CATEGORIES.map((category, index) => (
<Badge
key={category}
variant={index === 0 ? "default" : "outline"}
className="rounded-sm"
>
{category}
</Badge>
))}
</div>
</Card>
<Card className="rounded-sm border-border p-4">
<Typography variant="large">Recent comments</Typography>
<div className="mt-3 space-y-2">
{RECENT_COMMENTS.map((comment) => (
<Card key={comment.id} className="rounded-sm border-border p-3">
<Typography variant="small" className="font-semibold text-foreground">
{comment.author}
</Typography>
<Typography variant="small" className="mt-1 text-muted-foreground">
{comment.text}
</Typography>
<Typography variant="small" className="mt-2 text-red-600">
{comment.date}
</Typography>
</Card>
))}
</div>
</Card>
</div>
</div>
<div className="space-y-3">
<div className="grid gap-3 md:grid-cols-3">
{BLOG_ARTICLES.map((post) => (
<ArticleCard
key={post.id}
image={post.image}
category={post.category}
title={post.title}
excerpt={post.excerpt}
date={post.date}
readTime={post.readTime}
href={post.href}
className="rounded-sm border-border"
author={{ name: "Poyraz Avsever", avatar: "/logo/logo.jpeg" }}
/>
))}
</div>
<Pagination className="mx-0 mt-4 justify-end">
<PaginationContent className="justify-start">
<PaginationItem>
<PaginationPrevious href="/blog" />
</PaginationItem>
<PaginationItem>
<PaginationLink href="/blog" isActive>
1
</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink href="/blog?page=2">2</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationLink href="/blog?page=3">3</PaginationLink>
</PaginationItem>
<PaginationItem>
<PaginationNext href="/blog?page=2" />
</PaginationItem>
</PaginationContent>
</Pagination>
</div>
</section>
);
}
+193
View File
@@ -0,0 +1,193 @@
export const BLOG_NEWS = [
{
id: "next-16-notes",
title: "Next.js 16 Released with Major Performance Improvements",
category: "Technology",
image: "/news/performance.svg",
date: "Mar 6, 2026",
href: "/blog",
},
{
id: "ui-system-basics",
title: "Minimalism in Modern UI: Less Is Truly More",
category: "Design",
image: "/news/design.svg",
date: "Mar 5, 2026",
href: "/blog",
},
{
id: "next-16-notes-2",
title: "Next.js 16 Released with Major Performance Improvements",
category: "Technology",
image: "/news/performance.svg",
date: "Mar 6, 2026",
href: "/blog",
},
{
id: "ui-system-basics-2",
title: "Minimalism in Modern UI: Less Is Truly More",
category: "Design",
image: "/news/design.svg",
date: "Mar 5, 2026",
href: "/blog",
},
] as const;
export const BLOG_ARTICLES = [
{
id: "article-design-systems-1",
title: "Building Minimal Design Systems",
excerpt:
"A deep dive into creating clean, composable components with Tailwind CSS and Radix primitives.",
category: "React",
image: "/news/design.svg",
date: "Mar 2026",
readTime: "4 min",
href: "/blog",
},
{
id: "article-design-systems-2",
title: "Practical UI Consistency for Startup Teams",
excerpt:
"How to keep visual quality stable while features ship fast across multiple screens.",
category: "Design",
image: "/news/performance.svg",
date: "Mar 2026",
readTime: "5 min",
href: "/blog",
},
{
id: "article-design-systems-3",
title: "React Patterns That Age Well in Production",
excerpt:
"Component composition, state boundaries, and patterns that remain maintainable over time.",
category: "React",
image: "/news/performance.svg",
date: "Mar 2026",
readTime: "6 min",
href: "/blog",
},
{
id: "article-design-systems-4",
title: "Mobile-First Decisions for Web Developers",
excerpt:
"A short guide to adapting web habits when product constraints are mobile-first.",
category: "Mobile",
image: "/images/hero1.png",
date: "Feb 2026",
readTime: "4 min",
href: "/blog",
},
{
id: "article-design-systems-5",
title: "Design Tokens Without Enterprise Complexity",
excerpt:
"A lightweight token strategy for colors, spacing, and type that still scales.",
category: "Design",
image: "/news/design.svg",
date: "Feb 2026",
readTime: "5 min",
href: "/blog",
},
{
id: "article-design-systems-6",
title: "Improving Developer Experience in UI Projects",
excerpt:
"Naming, structure, and defaults that reduce friction for both current and future contributors.",
category: "Development",
image: "/news/performance.svg",
date: "Feb 2026",
readTime: "5 min",
href: "/blog",
},
{
id: "article-design-systems-7",
title: "Fast Feedback Loops for Better Frontend Quality",
excerpt:
"Practical review loops that catch UX and implementation issues before release.",
category: "Career",
image: "/images/hero2.png",
date: "Jan 2026",
readTime: "4 min",
href: "/blog",
},
{
id: "article-design-systems-8",
title: "Scaling Component Libraries Responsibly",
excerpt:
"When to abstract, when to duplicate, and how to avoid premature complexity.",
category: "React",
image: "/news/design.svg",
date: "Jan 2026",
readTime: "6 min",
href: "/blog",
},
{
id: "article-design-systems-9",
title: "Clean Navigation UX for Portfolio Sites",
excerpt:
"Simple navigation patterns that improve flow, clarity, and perceived polish.",
category: "Design",
image: "/news/performance.svg",
date: "Jan 2026",
readTime: "3 min",
href: "/blog",
},
{
id: "article-design-systems-10",
title: "What I Learned from Shipping Weekly",
excerpt:
"A personal workflow for shipping consistently without losing architectural direction.",
category: "Productivity",
image: "/images/hero1.png",
date: "Dec 2025",
readTime: "4 min",
href: "/blog",
},
{
id: "article-design-systems-11",
title: "Reducing UI Noise with Fewer Decisions",
excerpt:
"How constraints can improve speed, coherence, and confidence across a project.",
category: "Design",
image: "/news/design.svg",
date: "Dec 2025",
readTime: "4 min",
href: "/blog",
},
{
id: "article-design-systems-12",
title: "Portfolio Engineering Beyond Visuals",
excerpt:
"Performance, accessibility, and maintainability decisions that matter in real portfolios.",
category: "Development",
image: "/news/performance.svg",
date: "Dec 2025",
readTime: "6 min",
href: "/blog",
},
] as const;
export const BLOG_CATEGORIES = [
"All",
"Development",
"Design",
"Mobile",
"Career",
"Productivity",
] as const;
export const RECENT_COMMENTS = [
{
id: "comment-1",
author: "Ahmet Y.",
text: "The performance checklist was super practical. Thanks for sharing.",
date: "2 days ago",
},
{
id: "comment-2",
author: "Merve K.",
text: "I liked how you simplified the design system approach.",
date: "4 days ago",
},
] as const;