Compare commits

..

3 Commits

Author SHA1 Message Date
jfmonty2 67779ecd40 fix draft notice in dark mode 2026-04-05 06:41:37 -04:00
jfmonty2 eda7d3aa00 extract post-listing logic 2026-04-05 06:40:18 -04:00
jfmonty2 e0af57e5b1 add draft notice to post list and fix draft-hiding logic 2026-04-05 06:32:27 -04:00
5 changed files with 38 additions and 13 deletions
+1
View File
@@ -1,6 +1,7 @@
---
title: Example after post
date: 2026-02-28
draft: true
---
## After
+10
View File
@@ -0,0 +1,10 @@
import { getCollection } from 'astro:content';
export async function listPosts() {
// all posts in dev, exlucde draft posts in prod
let entries = await getCollection('posts', ({ data }) => import.meta.env.DEV || !data.draft);
// sort by date descending
entries.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
return entries;
}
+5 -6
View File
@@ -1,18 +1,17 @@
---
import { getCollection } from 'astro:content';
import { listPosts } from '@lib/content.ts';
import BaseLayout from '@layouts/BaseLayout.astro';
import Post from '@components/Post.astro';
export async function getStaticPaths() {
const entries = await getCollection('posts');
// unlike `/index` and `/posts`, we want to sort ascending by date here
entries.sort((a, b) => a.data.date.getTime() - b.data.date.getTime());
const entries = await listPosts();
// for each route, the page gets passed the entry itself, plus the previous and next slugs
// (if any), so that it can render links to them
return entries.map((entry, idx) => {
const prevSlug = entries[idx - 1]?.id || null;
const nextSlug = entries[idx + 1]?.id || null;
// entries are sorted in by date descending, so prev has a higher index and next has lower
const prevSlug = entries[idx + 1]?.id || null;
const nextSlug = entries[idx - 1]?.id || null;
return {
params: { slug: entry.id },
props: { entry, prevSlug, nextSlug },
+2 -3
View File
@@ -1,10 +1,9 @@
---
import { getCollection } from 'astro:content';
import { listPosts } from '@lib/content.ts';
import BaseLayout from '@layouts/BaseLayout.astro';
import Post from '@components/Post.astro';
const entries = await getCollection('posts');
entries.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
const entries = await listPosts();
// there will always be at leaste one entry
const entry = entries[0]!;
const prevSlug = entries[1] ? entries[1]?.id : null;
+20 -4
View File
@@ -1,12 +1,12 @@
---
import '@styles/prose.css';
import { getCollection, render } from 'astro:content';
import { render } from 'astro:content';
import { listPosts } from '@lib/content.ts';
import BaseLayout from '@layouts/BaseLayout.astro';
// return all posts
let entries = await getCollection('posts', ({ data }) => !data.draft || import.meta.env.PROD );
entries.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
// return all posts in dev, only non-draft in prod
const entries = await listPosts();
const posts = await Promise.all(entries.map(async entry => {
const { remarkPluginFrontmatter } = await render(entry);
return { ...entry, remarkPluginFrontmatter };
@@ -24,6 +24,7 @@ const posts = await Promise.all(entries.map(async entry => {
<a href={`/${p.id}`} data-astro-prefetch>
{p.data.title}
</a>
{p.data.draft && <span class="draft-notice">Draft</span>}
</h2>
<p>
{p.remarkPluginFrontmatter.description}
@@ -55,6 +56,21 @@ const posts = await Promise.all(entries.map(async entry => {
margin-left: 0;
}
h2 {
display: flex;
gap: 01rem;
align-items: center;
}
.draft-notice {
font-size: 0.5em;
font-family: 'Figtree Variable', sans-serif;
color: var(--nav-link-color);
background-color: var(--accent-color);
padding: 0.05em 0.5em;
border-radius: 20% / 50%;
}
hr {
border: none;
height: 1px;