diff --git a/docs/CHANGELOG_web.md b/docs/CHANGELOG_web.md
index 335e890..6b6a5cc 100644
--- a/docs/CHANGELOG_web.md
+++ b/docs/CHANGELOG_web.md
@@ -28,6 +28,9 @@ The format loosely follows Keep a Changelog and can be adapted to the team's hab
### Changed / 变更
+- Shelf rebuilt into a content-first library UI: responsive cover grid (auto-fill 3:4 posters) with hover overlays for pages/size, color-coded format badges, in-cover progress bars, staggered entrance animations, skeleton loading, and dedicated empty/error/searching states; 继续阅读 is now a horizontal resume strip (cover + progress + library); library filter became a segmented pill bar with an icon search field in a sticky blurred top bar (brand mark, admin nav pills, user chip, icon logout); login got a brand card with icon-adorned inputs; toasts animate with icons; missing covers render a serif-initial placeholder instead of an endless pulse.
+- 书架重构为「内容优先」的现代书库界面:响应式封面网格(自适应列宽、3:4 海报),悬停显示页数/大小浮层、格式彩色徽章、封面内嵌进度条、卡片错峰入场动画、骨架屏加载与空/错/搜索无结果专属状态;「继续阅读」改为横向续读卡片条(封面+进度+所属库);库筛选变成分段 pill,搜索框带图标并移入毛玻璃吸顶顶栏(品牌标、管理导航 pill、用户胶囊、图标退出);登录页升级为主视觉卡片与带图标输入框;Toast 带动画与图标;无封面书籍以衬线首字占位,不再无限脉冲。
+
- .txt chapter splitting no longer recognizes volumes: 「第X卷/部」 lines stay plain body text and volume-only books fall back to pseudo-sections as before; chapter switching moves from the dropdown to a 目录 sidebar overlay that highlights the current chapter, scrolls it into view, and closes on click-outside or after picking a chapter.
- .txt 章节切分不再感知卷:「第X卷/部」行只作为正文文本,只有卷的书和以前一样退回伪章节切分;换章从下拉框改为「目录」侧边栏浮层——当前章高亮并自动居中可见,点击空白处或选定章节即收起。
- Whole UI restyled to a warm library palette (stone surfaces + amber accents, replacing cool zinc + emerald): warmer dark chrome, amber primary buttons/links, hover/press feedback on shelf cards (cover lift + glow), reader header with format badge and blur, pill-style CBZ page indicator, EPUB spread centered like a book page.
diff --git a/frontend/src/components/Cover.tsx b/frontend/src/components/Cover.tsx
index aa5a76b..81a5cc1 100644
--- a/frontend/src/components/Cover.tsx
+++ b/frontend/src/components/Cover.tsx
@@ -1,7 +1,8 @@
import { useEffect, useState } from "react";
import type { Book } from "../api/types";
import { fetchObjectUrl } from "../lib/authImage";
-import { btn } from "./ui";
+import { btn, formatBadge } from "./ui";
+import { IconAlert } from "./icons";
export function useAuthedImage(url: string | undefined): { src: string; failed: boolean; retry: () => void } {
const [state, setState] = useState<{ key: string; src: string; failed: boolean }>({ key: "", src: "", failed: false });
@@ -27,14 +28,29 @@ export function useAuthedImage(url: string | undefined): { src: string; failed:
export function Cover({ book, className }: { book: Book; className?: string }) {
const { src, failed, retry } = useAuthedImage(book.cover_url);
- if (failed)
+ if (!book.cover_url || failed) {
return (
-