6.8 KiB
6.8 KiB
全站现代化重构(shadcn/radix 设计系统 + 公共表面)设计 / Modern site-wide redesign (shadcn/radix) design — phase 1
日期 2026-09-08。分支 feat/ui-redesign。状态:已获用户批准(五节设计逐节确认)。
目标 / Goal
以 shadcn/radix 体系从零重做全部产品表面的布局与交互(不沿袭现有布局/交互,仅阅读器的翻页/翻章语义保留), 建立 light/dark 双主题设计系统;功能面与现状等价;移动端达到真正可用。 本期(phase 1)= 设计底座 + 登录/应用壳/书架/admin 两页;阅读器 chrome 迁移为 phase 2(另立 spec)。
决策记录 / Decisions
- 用户选定:方案 C(shadcn/radix),视觉基调=极简书架风(Notion/Linear/豆瓣读书),主题=双主题开关(默认 system)。
- 功能等价重做;不做功能增减。明确否决/推迟:视图密度开关(=新功能,不做)、阅读器本期不动(phase 2)、 命令面板/键盘优先导航(不适合媒体浏览)。
- 否决方案:仅换皮保结构(四项痛点都不回答)、手写 token 层不引框架(交互原语 a11y 自理成本高)。
components/icons.tsx(自研 SVG)删除,由lucide-react取代。components/ui.ts不整体删(phase-1 的/book/:id各表面仍引用):收缩为btn/btnGhost/formatBadge三个 deprecated 导出供阅读器侧继续使用,phase 2 随阅读器迁移一并删除;其余导出(input/card/pill/pillActive/btnPrimary)随公共表面重做删除;formatSize属数据格式化,迁lib/format.ts。/book/:id(pages/Reader.tsx+ 四 reader 组件 +Bookmarks面板)本期整体不重构、不套壳,维持现状。 例外边界:Cover/Toaster是跨期共享组件,phase 1 改写时保持 props 兼容(EpubReader/App 等旧调用零改动), 仅视觉入新 token。- 原生
confirm()(Shelf 删书、Users 删用户)→ radix AlertDialog。 - API/路由/数据流零改动;后端不在本期范围。
技术底座 / Foundation
- React 19.2 + Tailwind v4.3(
@tailwindcss/vite已在)+ react-router 7。新依赖(容器内安装,提交 lockfile):radix-ui(统一新包,按需 import 子模块)、class-variance-authority、clsx、tailwind-merge、lucide-react、tw-animate-css。 components.json放frontend/,alias:@/* → src/*(与 tsconfig paths 同步)。- 工具:
src/lib/utils.ts提供cn = twMerge(clsx(...))。 - Token:shadcn 标准语义变量(
--background --foreground --card --card-foreground --popover --primary --secondary --muted --accent --destructive --border --input --ring --chart-*+--radius),@theme inline映射进 Tailwind;:root= light(纸白中性灰,--primary暖墨黑,唯一彩色点缀朱橙),.dark= 对应暗色套。全站禁止裸stone-*/amber-*直用(阅读器现有类在 phase 2 清理)。 - 主题:
src/components/theme.tsxThemeProvider —"system" | "light" | "dark"持久化于localStorage("ui.theme")(默认 system);index.html内联脚本按同 key 预算 class 防 FOUC; 入口=应用壳内 DropdownMenu(lucide Sun/Moon/Monitor,当前值打勾)。
应用壳 / AppShell
- 新
src/components/app-shell.tsx包裹/与/admin/*(登录页不套壳,居中 Card 独立布局)。 - 断点约定(Tailwind 默认值):
lg(≥1024):固定w-60左侧栏——品牌字标、导航(书架;admin 另加 库管理/用户管理)、 库筛选列表(全部+各库,来自GET /libraries)、底部 主题切换 + 用户/退出。sm–lg:图标窄栏(w-14,Tooltip 标注)。<sm:顶部 Header(品牌+搜索入口)+ 底部 Tab 栏(书架 / 管理(admin 可见) / 账户); 账户页=弹出 DropdownMenu(主题、库管理入口、退出)。
- 现
TopBar.tsx删除,职责并入壳。
书架页 / Shelf
- 粘性工具条(主列顶部):搜索 Input(沿用 300ms 防抖与
q参数)、排序 DropdownMenu (新加时间/标题/阅读进度,前端排序,默认新加时间)、分组 SegmentedControl(平铺|按目录,默认平铺)。 - 「继续阅读」:等价保留(progress 前 12 条),桌面横滑大卡轨,移动端降级为单行紧凑卡横滑。
- 网格:
grid-cols-[repeat(auto-fill,minmax(...))],卡=封面 3:4 + 标题 + 格式徽章 + 进度细线; 整卡链接进阅读器;操作 DropdownMenu(打开;admin 追加 删除)叠于封面右上,hover/focus 出现。 - 删除确认 = AlertDialog,文案语义与现状一致(提示磁盘文件连带删除、进度保留)。
- 空态/错误重试/骨架屏按新语言重绘;损坏书红徽章保留。
- 数据源不变:
useQuery(["books", lib, q])+["progress"]+ 全量 books 缓存复用。
admin 页 / Admin
- 库管理:库=Card 列表(名称、
#id、root 路径、扫描按钮、上传 input);上传入口升级=dropzone (Label+Input 包装,拖拽与点击同效,仍串行uploadBook,toast 用快照计数——保留2721df8修复语义)。 - 用户管理:Table(用户名/角色/创建时间/操作)+ 顶部新建行(Input+Select 角色+提交);删除=AlertDialog。
- 权限与错误处理逻辑不变(非 admin 由 AuthContext 路由守卫拦截)。
错误处理 / Errors
- 网络错误路径不变(
apiFetch抛错→toast);radix 组件不新增失败面。 localStorage不可用(隐私模式):主题回落 system、渲染不崩(读写包 try/catch)。
测试与验收 / Verification
npm run -s check(tsc+vitest+build)绿;既有 33 用例保持绿。- 纯逻辑新增件(排序比较器、分组视图函数迁自
lib/group.ts)补 vitest。 - playwright 走查并截图:375/768/1280 三宽 × light/dark ×(登录→书架→筛选/搜索/排序→ 删除确认→admin 两页),核对布局无溢出、焦点环可见、AlertDialog 焦点收拢。
- a11y 基线:导航 landmark、图标按钮 aria-label、
aria-current、主题切换aria-pressed。
文档 / Docs
docs/CHANGELOG_web.md新增 Changed 条目(英中相邻行):全站 UI 重构为 shadcn/radix 设计系统 + 双主题 + 新应用壳;阅读器注明「交互不变,样式后续」。
Phase 2(另立 spec 的边界)
- 四阅读器 chrome(工具条/目录/书签面板/主题卡)迁入同一 token + radix 原语(Sheet/Popover);
翻页、翻屏、CBZ 章锁/连读/预读、书签 seek、进度上报逻辑与 localStorage 键原样保留;
「纸/米/夜」重映射为语义变量并与全局主题定联动规则;清理
rd-*/裸色类。
不做 / Non-goals
- 视图密度开关、虚拟化长列表(当前量级不需要)、i18n、SSR、后端 API 改动、收藏/标签等新功能。