import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Author, BlogMdxFrontmatter, getAllBlogs } from "@/lib/markdown"; import { formatDate2, stringToDate } from "@/lib/utils"; import { getMetadata } from "@/app/layout"; import Image from "next/image"; import Link from "next/link"; import { AuroraText } from "@/components/ui/aurora"; import { ShineBorder } from "@/components/ui/shine-border"; import docuConfig from "@/docu.json"; export const metadata = getMetadata({ title: "Blog", description: "Discover the latest updates, tutorials, and insights on DocuBook.", }); const { meta } = docuConfig; export default async function BlogIndexPage() { const blogs = (await getAllBlogs()).sort( (a, b) => stringToDate(b.date).getTime() - stringToDate(a.date).getTime() ); return (
# Stay Informed, Stay Ahead

Blog Posts

Explore updates, tips, and deep dives from the {meta.title}.

{blogs.map((blog) => ( ))}
); } function BlogCard({ date, title, description, slug, cover, authors, }: BlogMdxFrontmatter & { slug: string }) { return (
{title}

{title}

{description}

Published on {formatDate2(date)}

); } function AvatarGroup({ users, max = 4 }: { users: Author[]; max?: number }) { const displayUsers = users.slice(0, max); const remainingUsers = Math.max(users.length - max, 0); return (
{displayUsers.map((user, index) => ( {user.username.slice(0, 2).toUpperCase()} ))} {remainingUsers > 0 && ( +{remainingUsers} )}
); }