diff --git a/src/pages/books-preview.astro b/src/pages/books-preview.astro index 5a6ac80..55e47d4 100644 --- a/src/pages/books-preview.astro +++ b/src/pages/books-preview.astro @@ -33,6 +33,15 @@ const firstPara = (body: string | undefined): string => { /** 竖排书脊的高度有限:中文书名超过 ~11 字就必然溢出,用确定性截断代替裁切 */ const clip = (t: string, n: number) => (t.length > n ? `${t.slice(0, n)}…` : t); +/** + * 置顶书目(用户 2026-11-03 的要求:「C 方案可以默认展开置顶的书目」)。 + * 真实来源是 frontmatter 的 `pinned: true`(与文章置顶同一字段、同一排序契约)。 + * 当前还没有书被置顶,预览里用最新一本演示该效果,并在页面上明示这是演示。 + */ +const pinnedBook = books.find((b) => b.data.pinned === true) ?? books[0]; +const pinnedId = pinnedBook?.id ?? ''; +const pinnedIsDemo = !books.some((b) => b.data.pinned === true); + const items = books.map((b) => ({ id: b.id, title: b.data.title, @@ -42,11 +51,14 @@ const items = books.map((b) => ({ mood: b.data.mood ?? 'var(--ink-4)', year: b.data.pubDate.getFullYear(), href: `/archives/${b.id}/`, + pinned: b.id === pinnedId, spineTitle: clip(b.data.title, 11), spineAuthor: clip(b.data.bookAuthor ?? '', 4), short: clip(b.data.title, 3), })); const years = [...new Set(items.map((i) => i.year))].sort((a, b) => b - a); + + const withCover = items.filter((i) => i.cover).length; --- @@ -55,13 +67,21 @@ const withCover = items.filter((i) => i.cover).length;
共 {items.length} 本书,其中 {withCover} 本有封面图。三个方案用同一份数据渲染,
- 看完告诉我选哪个(回「A」「B」或「C」即可,也可以说「B 但标题字大一点」这类微调)。
+ 看完告诉我选哪个(回「A」「B」「C」或「D」即可,也可以说「B 但标题字大一点」这类微调)。
+ {pinnedIsDemo && (
+ <>
+
+ D 与 C 的「置顶默认展开」用最新一本做演示——真实使用时由该书的
+ `pinned: true` 决定(后台书评编辑页有开关)。
+ >
+ )}
+ 格子还是 B 的封面网格,但每格可以直接点开成「抽出来」的详情卡(原生 details,零 JS); + 置顶的那本默认就是展开的,落页第一眼就有内容。 +
+{year} · {items.filter((i) => i.year === year).length} 本
+{b.desc}
+ 读这篇书评 → +