diff --git a/src/components/PostList.tsx b/src/components/PostList.tsx new file mode 100644 index 0000000..be8e7ab --- /dev/null +++ b/src/components/PostList.tsx @@ -0,0 +1,24 @@ +import type { Post } from '@/payload-types' +import { PostPreview } from './PostPreview' + +interface PostListProps { + posts: Post[] + numbers?: number[] + startNumber?: number +} + +function numberFor(index: number, posts: Post[], numbers?: number[], startNumber?: number): number { + if (numbers && numbers[index] !== undefined) return numbers[index] + if (startNumber !== undefined) return startNumber - index + return posts.length - index +} + +export function PostList({ posts, numbers, startNumber }: PostListProps) { + return ( + + ) +} diff --git a/src/components/PostPreview.tsx b/src/components/PostPreview.tsx new file mode 100644 index 0000000..1e83378 --- /dev/null +++ b/src/components/PostPreview.tsx @@ -0,0 +1,72 @@ +import Link from 'next/link' +import type { Post, Tag } from '@/payload-types' + +interface PostPreviewProps { + post: Post + number: number + className?: string +} + +function formatDate(dateStr: string): string { + const date = new Date(dateStr) + const y = date.getFullYear() + const m = String(date.getMonth() + 1).padStart(2, '0') + const d = String(date.getDate()).padStart(2, '0') + return `${y}.${m}.${d}` +} + +export function PostPreview({ post, number, className }: PostPreviewProps) { + const { title, slug, publishDate, excerpt, tags } = post + const paddedNumber = String(number).padStart(3, '0') + const formattedDate = publishDate ? formatDate(publishDate) : '' + + // Only show tags when depth=1 returns Tag objects (not bare IDs) + const resolvedTags: Tag[] = Array.isArray(tags) + ? tags.filter((t): t is Tag => typeof t === 'object' && t !== null) + : [] + const topTags = resolvedTags.slice(0, 3) + + return ( +
  • + +
    + + {paddedNumber} + + {formattedDate} +
    + +
    +
    + {formattedDate} +
    +

    + {title} +

    + {excerpt && ( +

    {excerpt}

    + )} + {topTags.length > 0 && ( +
    + {topTags.map((tag, i) => ( + + {i > 0 && ·} + {tag.name} + + ))} +
    + )} +
    + +
    + + → + +
    + +
  • + ) +}