main
1---
2import type { CollectionEntry } from "astro:content";
3
4import { DEFAULT_LOCALE } from "@/config.ts";
5import { getPostLocaleSlug } from "@/utils/content.ts";
6import { getRelativeLocaleUrl } from "@/utils/url.ts";
7
8interface Props {
9 posts: CollectionEntry<"posts">[];
10}
11
12const { posts } = Astro.props;
13
14const postUrl = (post) => {
15 const { locale, slug } = getPostLocaleSlug(post);
16 return getRelativeLocaleUrl(slug, locale);
17};
18---
19
20<nav class="posts-list">
21 <ol>
22 {posts.map((post) => {
23 const dt = Temporal.ZonedDateTime.from(post.data.date).toPlainDateTime();
24 return (
25 <li>
26 <a href={postUrl(post)}>{post.data.title}</a>
27 <time datetime={dt.toString()}>
28 {dt
29 .toPlainDate()
30 .toLocaleString(Astro.currentLocale || DEFAULT_LOCALE)}
31 </time>
32 </li>
33 );
34 })}
35 </ol>
36</nav>
37
38<style lang="scss" is:global>
39nav.posts-list ol li {
40 display: grid;
41 align-items: first baseline;
42 grid-template-columns: 1fr auto;
43 gap: 1rem;
44
45 &::before {
46 /* remove ::before */
47 content: initial;
48 }
49
50 a {
51 color: inherit;
52 text-decoration-color: color-mix(in oklab, var(--color-base-content) 60%,
53 transparent);
54
55 &:hover {
56 text-decoration-color: var(--color-base-content);
57 }
58 }
59
60 time {
61 font-size: 0.875rem;
62 color: color-mix(in oklab, var(--color-base-content) 80%, transparent);
63 }
64}
65</style>