Guides list with a left-aligned header over full-width rows. Each row pairs cover art with a date, category tag, linked title, longer excerpt and author line.
import { Heading } from "@/components/editorial/heading"
import {
Post,
PostAuthor,
PostCategory,
PostContent,
PostDate,
PostExcerpt,
PostGroup,
PostMedia,
PostMeta,
PostTitle,
} from "@/components/editorial/post"
import {
Section,
SectionContent,
SectionDescription,
SectionHeader,
SectionTitleGroup,
} from "@/components/editorial/section"
// The copy: change text here, not in the markup.
const COPY = {
title: "Guides",
body: "Longer reads for support leads, from first hire to a team of fifty.",
} as const
const POSTS = [
{
image: "https://01orbital.dev/art/kit/layered-currents-180965.png",
category: "Hiring",
title: "Hiring your first support lead",
description:
"The first lead sets the tone for every hire after them. We asked twelve founders what they looked for and what they wish they had looked for instead.",
datetime: "2026-08-20",
date: "Aug 20, 2026",
author: "Peggy Whitson",
href: "#",
},
{
image: "https://01orbital.dev/art/kit/newman-blue.png",
category: "Operations",
title: "One queue, then the specialists",
description:
"Every conversation starts in one shared queue. Specialist teams pull from it by rule, so nothing waits in a side inbox that nobody watches.",
datetime: "2026-08-06",
date: "Aug 6, 2026",
author: "Tim Peake",
href: "#",
},
{
image: "https://01orbital.dev/art/kit/fluid-forms-831492.png",
category: "Product",
title: "Automations that stay out of the way",
description:
"An automation should save a person a step, never answer for them. We rebuilt ours around that rule and replies got warmer.",
datetime: "2026-07-23",
date: "Jul 23, 2026",
author: "Jim Lovell",
href: "#",
},
] as const
export default function Blog03() {
return (
<Section>
{/* The header shares the list's column, so both start on one edge. */}
<SectionContent width="lg" size="lg">
<SectionHeader>
<SectionTitleGroup>
<Heading>{COPY.title}</Heading>
</SectionTitleGroup>
<SectionDescription>{COPY.body}</SectionDescription>
</SectionHeader>
<PostGroup cols={1}>
{POSTS.map((post) => (
<Post key={post.title} variant="row">
<PostMedia>
<img src={post.image} alt="" loading="lazy" />
</PostMedia>
<PostContent className="max-w-md self-center">
<PostMeta>
<PostDate dateTime={post.datetime}>{post.date}</PostDate>
<PostCategory>{post.category}</PostCategory>
</PostMeta>
<PostTitle>
<a href={post.href}>{post.title}</a>
</PostTitle>
<PostExcerpt>{post.description}</PostExcerpt>
<PostMeta className="mt-3 text-foreground">
<PostAuthor>{post.author}</PostAuthor>
</PostMeta>
</PostContent>
</Post>
))}
</PostGroup>
</SectionContent>
</Section>
)
}
pnpm dlx shadcn add @01orbital/blog-03npx shadcn add @01orbital/blog-03yarn shadcn add @01orbital/blog-03bunx --bun shadcn add @01orbital/blog-03Free under the MIT license. Add the @01orbital registry to components.json once (install guide), then run the command.
It lands at components/blocks/blog/blog-03/index.tsx, as source you own and edit.
import Blog03 from "@/components/blocks/blog/blog-03"
export default function Example() {
return <Blog03 />
}Registry pieces it installs with it:
Compare
Every Blog block side by side: whether it follows the theme or stays dark, the stock parts it is built on, and whether it is free. Open one for its preview, props and install.
Blog with Featured Post
Two-column blog layout with one large featured post beside a divided list of three dated posts. Text only, no images, with a long excerpt on the featured story.