diff --git a/website/public/css/feed.css b/website/public/css/feed.css index d7acd93..fc665ec 100644 --- a/website/public/css/feed.css +++ b/website/public/css/feed.css @@ -6,3 +6,11 @@ .h-feed .h-entry { margin-block-start: var(--spacing-block-xs); } + +.h-feed .full-feed-link { + text-align: end; +} + +.h-feed :is(a.full-feed-link, .full-feed-link a)::after { + content: ' >' +} diff --git a/website/src/components/BlogFeed.astro b/website/src/components/BlogFeed.astro index 525d7ba..3d6352d 100644 --- a/website/src/components/BlogFeed.astro +++ b/website/src/components/BlogFeed.astro @@ -1,15 +1,21 @@ --- import type { CollectionEntry } from 'astro:content'; import { getCollection } from 'astro:content'; +import FormattedDate from './FormattedDate.astro'; export interface Props { headingLevel?: 1 | 2 | 3 | 4 | 5 | 6, hideAuthor?: boolean, + maxEntries?: number, }; -const { headingLevel = 2, hideAuthor = false } = Astro.props; +const { headingLevel = 2, hideAuthor = false, maxEntries } = Astro.props; -const posts = (await getCollection('blog')).filter((post) => !post.data.hidden); +const allPosts = (await getCollection('blog')).filter((post) => !post.data.hidden); + +const posts = maxEntries === undefined + ? allPosts + : allPosts.sort(sortByPubDateDescending).slice(0, maxEntries); const distinctYears: number[] = posts .map(post => post.data.pubDate.getFullYear()) @@ -58,9 +64,16 @@ const canonicalBlogUrl = new URL('blog', Astro.site) )) } + + { (maxEntries !== undefined && maxEntries < allPosts.length) + ? + : <> + } diff --git a/website/src/components/LinksFeed.astro b/website/src/components/LinksFeed.astro index 4ca8dbd..fbbf9f4 100644 --- a/website/src/components/LinksFeed.astro +++ b/website/src/components/LinksFeed.astro @@ -1,27 +1,34 @@ --- import FormattedDate from '../components/FormattedDate.astro'; -import LINKS from '../data/links.ts'; +import allLinks from '../data/links.ts'; + +type Link = (typeof allLinks)[number]; export interface Props { headingLevel?: 1 | 2 | 3 | 4 | 5 | 6, hideAuthor?: boolean, + maxEntries?: number, }; -const { headingLevel = 2, hideAuthor = false } = Astro.props; +const { headingLevel = 2, hideAuthor = false, maxEntries } = Astro.props; const headingElem = `h${headingLevel}`; const subHeadingElem = `h${headingLevel + 1}` -const distinctYears: string[] = LINKS +const links: Link[] = maxEntries === undefined + ? allLinks + : allLinks.sort(sortByDateAddedDescending).slice(0, maxEntries); + +const distinctYears: string[] = links .map(link => link.isoDateAdded.slice(0,4)) .reduce((acc, curr) => acc.includes(curr) ? acc : [...acc, curr], []) .sort((a, b) => Number.parseInt(b) - Number.parseInt(a)); function matchesYear(year: string) { - return (link: (typeof LINKS)[number]) => link.isoDateAdded.slice(0,4) === year; + return (link: (typeof links)[number]) => link.isoDateAdded.slice(0,4) === year; } -function sortByDateAddedDescending(link1: (typeof LINKS)[number], link2: (typeof LINKS)[number]) { +function sortByDateAddedDescending(link1: (typeof links)[number], link2: (typeof links)[number]) { const year1 = Number.parseInt(link1.isoDateAdded.slice(0, 4)); const year2 = Number.parseInt(link2.isoDateAdded.slice(0, 4)); const month1 = Number.parseInt(link1.isoDateAdded.slice(5, 7)); @@ -65,7 +72,7 @@ const canonicalLinksUrl = new URL('links', Astro.site) `} /> )) } + + { (maxEntries !== undefined && maxEntries < allLinks.length) + ? + : <> + } diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index 835b4d3..cbd7037 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -8,6 +8,6 @@ import Page from '../layouts/Page.astro'; - - + +