PostFeedRow

3 variants. Open one in isolation: use the link on each card.

NOTE
Representative problems beat toy examples
When teaching or designing APIs, anchor on problems your reader actually hits—not abstract shapes they forget by Tuesday.
NOTE Secret — not listed in public feeds
Draft — visible only with dev:secrets
When teaching or designing APIs, anchor on problems your reader actually hits—not abstract shapes they forget by Tuesday.

src/ui/2_organisms/PostFeedRow.astro
---
import Badge from '../0_atoms/Badge.astro'
import BodyText from '../0_atoms/BodyText.astro'
import Date from '../0_atoms/Date.astro'
import PostTypeLabel from '../1_molecules/PostTypeLabel.astro'
import { type FeedPost, normalizeFeedPostPublishedAt } from '../../lib/feed-types'
interface Props {
post: FeedPost
}
const { post: postProp } = Astro.props
const post = normalizeFeedPostPublishedAt(postProp)
---
<div class="relative cursor-pointer border-b border-border mb-6 pb-6">
<div class="text-xs mb-1">
<PostTypeLabel postType={post.postType} secret={post.secret === true} />
</div>
<a
href={post.url}
class="font-serif font-medium text-lg leading-snug text-ink no-underline stretched-link"
>
{post.title}
</a>
{
post.description && (
<BodyText variant="muted" label={post.description} class="text-sm mt-1 line-clamp-3" />
)
}
<div class="mt-2 flex flex-wrap items-center gap-2">
<Date date={post.publishedAt} />
{
post.tags.map(tag => (
<Badge href={`/tags/${tag}`} class="relative z-10" label={`#${tag}`} />
))
}
</div>
</div>