diff options
author | Valentin Popov <valentin@popov.link> | 2024-09-12 17:06:44 +0300 |
---|---|---|
committer | Valentin Popov <valentin@popov.link> | 2024-09-12 17:06:44 +0300 |
commit | 0b57b888caf8817ff4992c59ed40ed29bee34fd4 (patch) | |
tree | 37ea0f6c9a50f5be21e5d8e5c5c844fb498c98f4 | |
parent | 4ba339984d239180a526a5ae8ffbb558f1b5642a (diff) | |
download | popov.link-0b57b888caf8817ff4992c59ed40ed29bee34fd4.tar.xz popov.link-0b57b888caf8817ff4992c59ed40ed29bee34fd4.zip |
Add PostPagination component for blog post navigation
-rw-r--r-- | src/components/PostPagination.astro | 47 | ||||
-rw-r--r-- | src/pages/blog/[...slug].astro | 17 |
2 files changed, 61 insertions, 3 deletions
diff --git a/src/components/PostPagination.astro b/src/components/PostPagination.astro new file mode 100644 index 0000000..6ae6bef --- /dev/null +++ b/src/components/PostPagination.astro @@ -0,0 +1,47 @@ +--- +const { prevPost, nextPost } = Astro.props; +--- + +<style lang="scss"> + .pagination { + overflow: hidden; + padding: 5rem 0; + width: 100%; + } + + @media (width <=684px) { + .pagination { + padding: 2rem 0; + } + } + + .prev, + .next { + max-width: 40%; + } + + .prev { + float: left; + } + + .next { + float: right; + } +</style> + +<div class="pagination"> + { + prevPost && ( + <span class="prev"> + <a href={`/blog/${prevPost.slug}`}>< {prevPost.data.title}</a> + </span> + ) + } + { + nextPost && ( + <span class="next"> + <a href={`/blog/${nextPost.slug}`}>{nextPost.data.title} ></a> + </span> + ) + } +</div> diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index 4ecb1e1..9262a66 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -2,17 +2,24 @@ import { type CollectionEntry, getCollection } from "astro:content"; import Comments from "../../components/Comments.astro"; import Layout from "../../layouts/PageLayout.astro"; +import Pagination from "../../components/PostPagination.astro"; export async function getStaticPaths() { const posts = await getCollection("blog"); - return posts.map((post) => ({ + const total = posts.length; + + return posts.map((post, index) => ({ params: { slug: post.slug }, - props: post, + props: { + post, + prevPost: index + 1 === total ? null : posts[index + 1], + nextPost: index === 0 ? null : posts[index - 1], + }, })); } type Props = CollectionEntry<"blog">; -const post = Astro.props; +const { post, prevPost, nextPost } = Astro.props; const { Content, remarkPluginFrontmatter } = await post.render(); --- @@ -41,6 +48,10 @@ const { Content, remarkPluginFrontmatter } = await post.render(); </section> <section> + <Pagination prevPost={prevPost} nextPost={nextPost} /> + </section> + + <section> <Comments /> </section> </article> |