Better post navigation
This commit is contained in:
parent
cbb148d0af
commit
729d3ae611
2 changed files with 24 additions and 13 deletions
|
|
@ -4,7 +4,7 @@ import { ShareLinks } from '@/components/post/ShareLinks'
|
||||||
import { TableOfContents } from '@/components/post/TableOfContents'
|
import { TableOfContents } from '@/components/post/TableOfContents'
|
||||||
import { getAllPostSlugs, getNextAndPreviousPosts, getPostBySlug } from '@/lib/posts'
|
import { getAllPostSlugs, getNextAndPreviousPosts, getPostBySlug } from '@/lib/posts'
|
||||||
import { slugify } from '@/utils/slug'
|
import { slugify } from '@/utils/slug'
|
||||||
import { Pencil, SendHorizonal } from 'lucide-react'
|
import { ArrowLeft, ArrowRight, Pencil, SendHorizonal } from 'lucide-react'
|
||||||
import type { Metadata } from 'next'
|
import type { Metadata } from 'next'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
|
@ -126,26 +126,39 @@ export default async function Post({ params }: { params: Promise<{ slug: string
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-8 flex justify-between">
|
<div className="mt-12 grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4 border-t border-border pt-8">
|
||||||
{previous ? (
|
{previous ? (
|
||||||
<Link
|
<Link
|
||||||
href={`/posts/${previous.slug}`}
|
href={`/posts/${previous.slug}`}
|
||||||
className="text-accent hover:underline font-sm mb-2 block"
|
className="group flex flex-col gap-1 rounded-lg p-4 transition-colors hover:bg-muted/50 active:bg-muted/70"
|
||||||
>
|
>
|
||||||
← {previous.title}
|
<span className="flex items-center gap-1 text-xs text-muted-foreground uppercase tracking-wide">
|
||||||
|
<ArrowLeft className="w-3 h-3 shrink-0 transition-transform group-hover:-translate-x-1" />
|
||||||
|
Previous
|
||||||
|
</span>
|
||||||
|
<span className="text-accent font-medium group-hover:underline line-clamp-2">
|
||||||
|
{previous.title}
|
||||||
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<div />
|
<div className="hidden sm:block" />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{next ? (
|
{next ? (
|
||||||
<Link
|
<Link
|
||||||
href={`/posts/${next.slug}`}
|
href={`/posts/${next.slug}`}
|
||||||
className="text-accent hover:underline font-sm mb-2 block"
|
className="group flex flex-col gap-1 rounded-lg p-4 transition-colors hover:bg-muted/50 active:bg-muted/70 sm:text-right"
|
||||||
>
|
>
|
||||||
{next.title} →
|
<span className="flex items-center gap-1 text-xs text-muted-foreground uppercase tracking-wide sm:justify-end">
|
||||||
|
Next
|
||||||
|
<ArrowRight className="w-3 h-3 shrink-0 transition-transform group-hover:translate-x-1" />
|
||||||
|
</span>
|
||||||
|
<span className="text-accent font-medium group-hover:underline line-clamp-2">
|
||||||
|
{next.title}
|
||||||
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<div />
|
<div className="hidden sm:block" />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
||||||
|
|
@ -56,8 +56,8 @@ export function getNextAndPreviousPosts(slug: string): {
|
||||||
} {
|
} {
|
||||||
const posts = getAllPostsMeta()
|
const posts = getAllPostsMeta()
|
||||||
const index = posts.findIndex((post) => post.slug === slug)
|
const index = posts.findIndex((post) => post.slug === slug)
|
||||||
const next = index < posts.length - 1 ? posts[index + 1] : null
|
const previous = index < posts.length - 1 ? posts[index + 1] : null
|
||||||
const previous = index > 0 ? posts[index - 1] : null
|
const next = index > 0 ? posts[index - 1] : null
|
||||||
return { next, previous }
|
return { next, previous }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,9 +99,7 @@ export async function getPostBySlug(slug: string, postDirectory: string = postsD
|
||||||
img: ({ src, alt }: { src: string; alt: string }) => <ImageWrapper src={src} alt={alt} />,
|
img: ({ src, alt }: { src: string; alt: string }) => <ImageWrapper src={src} alt={alt} />,
|
||||||
a: ({ href, children }: { href: string; children: ReactNode }) =>
|
a: ({ href, children }: { href: string; children: ReactNode }) =>
|
||||||
href?.startsWith('http') ? (
|
href?.startsWith('http') ? (
|
||||||
<ExternalLink href={href}>
|
<ExternalLink href={href}>{children}</ExternalLink>
|
||||||
{children}
|
|
||||||
</ExternalLink>
|
|
||||||
) : (
|
) : (
|
||||||
<Link href={href}>{children}</Link>
|
<Link href={href}>{children}</Link>
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue