feat: pinned blog post
This commit is contained in:
parent
be89d82c17
commit
573b0eef89
4 changed files with 15 additions and 5 deletions
|
|
@ -6,7 +6,8 @@ const posts = defineCollection({
|
||||||
loader: glob({ pattern: '**/*.md', base: './src/content/posts' }),
|
loader: glob({ pattern: '**/*.md', base: './src/content/posts' }),
|
||||||
schema: z.object({
|
schema: z.object({
|
||||||
title: z.string(),
|
title: z.string(),
|
||||||
date: z.coerce.date()
|
date: z.coerce.date(),
|
||||||
|
pinned: z.boolean().optional()
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
---
|
---
|
||||||
title: hello world
|
title: hello world
|
||||||
date: 2026-01-01
|
date: 2026-01-01
|
||||||
|
pinned: true
|
||||||
---
|
---
|
||||||
|
|
||||||
This is my first blog post. :right[A sidenote appears here on wide screens.]
|
This is my first blog post. :right[A sidenote appears here on wide screens.]
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,11 @@ import { getCollection } from 'astro:content';
|
||||||
import '../../styles/global.css';
|
import '../../styles/global.css';
|
||||||
|
|
||||||
const posts = await getCollection('posts');
|
const posts = await getCollection('posts');
|
||||||
const sorted = posts.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
|
const sorted = posts.sort((a, b) => {
|
||||||
|
if (a.data.pinned && !b.data.pinned) return -1;
|
||||||
|
if (!a.data.pinned && b.data.pinned) return 1;
|
||||||
|
return b.data.date.getTime() - a.data.date.getTime();
|
||||||
|
});
|
||||||
|
|
||||||
function formatDate(date: Date): string {
|
function formatDate(date: Date): string {
|
||||||
const d = String(date.getDate()).padStart(2, '0');
|
const d = String(date.getDate()).padStart(2, '0');
|
||||||
|
|
@ -22,7 +26,7 @@ function formatDate(date: Date): string {
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
<summary>blog</summary>
|
<summary>blog</summary>
|
||||||
<pre set:html={sorted.map(post => `<span class="muted">${formatDate(post.data.date)}</span> <a href="/blog/${post.id}">${post.data.title}</a>`).join('\n')} />
|
<pre set:html={sorted.map(post => `<span class="muted">${formatDate(post.data.date)}</span> <a href="/blog/${post.id}">${post.data.title}</a>${post.data.pinned ? ' [pinned]' : ''}`).join('\n')} />
|
||||||
</details>
|
</details>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,11 @@ interface TxtFile {
|
||||||
}
|
}
|
||||||
|
|
||||||
const posts = await getCollection('posts');
|
const posts = await getCollection('posts');
|
||||||
const sorted = posts.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
|
const sorted = posts.sort((a, b) => {
|
||||||
|
if (a.data.pinned && !b.data.pinned) return -1;
|
||||||
|
if (!a.data.pinned && b.data.pinned) return 1;
|
||||||
|
return b.data.date.getTime() - a.data.date.getTime();
|
||||||
|
});
|
||||||
|
|
||||||
const bookmarks = (yaml.load(bookmarksRaw) as Bookmark[])
|
const bookmarks = (yaml.load(bookmarksRaw) as Bookmark[])
|
||||||
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
||||||
|
|
@ -75,7 +79,7 @@ function extractDomain(url: string): string {
|
||||||
<details open>
|
<details open>
|
||||||
<summary>blog</summary>
|
<summary>blog</summary>
|
||||||
<pre set:html={[
|
<pre set:html={[
|
||||||
...sorted.slice(0, 10).map(post => `<span class="muted">${formatDate(post.data.date)}</span> <a href="/blog/${post.id}">${post.data.title}</a>`),
|
...sorted.slice(0, 10).map(post => `<span class="muted">${formatDate(post.data.date)}</span> <a href="/blog/${post.id}">${post.data.title}</a>${post.data.pinned ? ' [pinned]' : ''}`),
|
||||||
...(sorted.length > 10 ? [`<a href="/blog/">+${sorted.length - 10} more</a>`] : [])
|
...(sorted.length > 10 ? [`<a href="/blog/">+${sorted.length - 10} more</a>`] : [])
|
||||||
].join('\n')} />
|
].join('\n')} />
|
||||||
</details>
|
</details>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue