book-index-ui 0.9.7 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,10 +30,11 @@ import 'book-index-ui/styles' // CSS(用到组件时引入)
30
30
  | `WorkPage` / `BookPage` / `CollectionPage` / `EntityPage` | **现行详情页**(2026-09 版式重构):作品 / 版本 / 丛编 / 人物 |
31
31
  | `primitives`(`PageFrame`、`SectionHead`、`DataTable`、`Chip` …) | 四个 Page 共用的版式原语与 `DETAIL_CSS` |
32
32
  | `deriveEra` / `deriveDating` / `buildVersionTable` … | `core/detail-model.ts` 的数据派生层(刊刻年代、角色归一、版本表) |
33
- | `BookFullText` / `WorkCatalog` | Book 全文 tab / 作品目录 |
33
+ | `BookFullText` / `WorkCatalog` | 全文阅读页(Book / Work 全文,走 `ReaderShell`)/ 作品目录 |
34
34
  | `IndexEditor` | 详情编辑器(写入需 storage 实现 saveItem) |
35
35
  | `HomePage` | 首页:推荐丛编 + 经典作品(kaiyuanguji-web 用) |
36
- | `CollatedEdition` | 整理本(collated_edition)阅读 + 全文搜索 |
36
+ | `CollatedEdition` | 整理本阅读页(走 `ReaderShell`)+ 跨卷搜索;「條目」看法保留原卡片视图 |
37
+ | `ReaderShell` / `ReaderToc` / `ImagePanel` / `ReaderMdText` | 阅读器(整理本与全文共用),见下「阅读器」 |
37
38
  | `CollectionCatalog` | 丛编目录(按册/卷分组) |
38
39
  | `EmendatedBySection` | "校勘自" 引用列表 |
39
40
  | `VersionLineageView` / `VersionLineageGraph` | 版本传承图(dagre + xyflow) |
@@ -41,6 +42,21 @@ import 'book-index-ui/styles' // CSS(用到组件时引入)
41
42
  | `LocaleProvider` / `LocaleToggle` | 繁简切换 |
42
43
  | `useT` / `useConvert` | 繁简 hook |
43
44
 
45
+ ### 阅读器(`components/Reader/`,2026-09 N5a)
46
+
47
+ 整理本与全文共用一个外壳 `ReaderShell`:
48
+
49
+ - 布局:**书影在正文左边**,目录在最左。宽屏(≥1100px)目录是可收起的侧栏(默认展开);更窄时是抽屉(默认收起,选卷后自动合上,Esc 关闭,打开时 Tab 圈在抽屉内);窄屏(≤719px)书影区不显示,只留正文。
50
+ - 工具条(吸顶)只用文字与图标:目录、书影、繁|简、A− A+、自然段(体裁判得清时才出现,W7)、专名线(书名加波浪线)。竖排预留 `allowVertical`,默认不显示。
51
+ - 正文:`--bim-font-reading`(宋体,默认接 `--bim-font-serif`,宿主覆盖后者即可)18px、行高 2.05(手机端同样),`line-break: strict` 避头尾;界面黑体。
52
+ - 无障碍:第一个可聚焦元素是「跳到正文」;目录用游走 tabindex,几百卷也只有当前卷进 Tab 序列(↑↓ Home End 移动)。
53
+ - 偏好(字号、自然段、专名线)存 `localStorage['bim-reader-prefs']`,首帧用默认值,SSR 安全。
54
+ - 宿主若有吸顶导航,设 `--bim-reader-top`(如 `60px`)。
55
+
56
+ 书影接口:`CollatedEdition` / `BookFullText` 的 `resolveImages(chapterKey)` 返回当卷的 `ReaderPageImage[]`(可异步)——每页一张图,URL 由宿主给,可带 `width/height` 与逐字框 `boxes`(暂定格式 `bim-charbox-v0`:原图像素坐标 `x/y/w/h`,可选 `char`/`textOffset`/`confidence`)。其他格式的框设 `boxFormat` 并用 `renderImageOverlay` 自己画,这是与 CV 交付格式对齐前的扩展点。没有影像时书影区默认收起(`imagePanel="auto"`),点工具条「书影」可看占位。
57
+
58
+ **`resolveImages` 要用 `useCallback`(或模块级函数)包一层**:组件按 `[resolveImages, 当前卷]` 重新取书影,每次渲染都传一个新函数会反复请求。
59
+
44
60
  ### 数据层(`book-index-ui/storage`)
45
61
 
46
62
  | 类 | 用途 |
@@ -107,6 +123,14 @@ class MyStorage implements IndexStorage {
107
123
 
108
124
  参考 `kaiyuanguji-web/nextjs/src/lib/local-api-storage.ts`(浏览器 → Next.js API 路由)和 `guji-platform/src/storage/VscodeStorage.ts`(VS Code 文件系统)。
109
125
 
126
+ ### 4. 宿主接入要点(手机 / 无障碍,2026-09-28)
127
+
128
+ - **搜索结果是真链接**:`IndexBrowser` 的结果卡片是 `<a href>`,href 由 `BidUrlProvider` 的 `buildUrl` 生成(默认 `/book-index?id=…`),站点路由不同时务必包一层 Provider。普通左键点击仍调 `onEntryClick` 走客户端路由;Ctrl / Cmd / Shift / 中键交给浏览器(新标签、复制链接)。不传 `onEntryClick` 则按 href 整页跳转。
129
+ - **反馈浮钮** `FeedbackButton`:
130
+ - 层级取 `--bim-feedback-fab-z`(默认 40),低于抽屉与弹层;也可传 `zIndex` prop。
131
+ - 挂载且未隐藏时在 `<html>` 上写 `--bim-feedback-fab-offset`(浮钮占掉的底部高度)。正文容器写 `padding-bottom: var(--bim-feedback-fab-offset, 0px)`,右下角内容就不会被盖住。
132
+ - `hidden` prop:移动端菜单 / 抽屉打开时传 `true`,浮钮与留白一起撤掉。
133
+
110
134
  ## 数据约定
111
135
 
112
136
  `book-index-ui` 读写的数据格式与 Python 端 `book-index-manager` CLI 完全一致。详见 [根 README](../README.md) 的"存储结构"和"Manager API 对照表"。
@@ -1,16 +1,11 @@
1
1
  /**
2
- * CSS 变量默认值(换肤接口)
2
+ * CSS 变量默认值(换肤接口)—— 由 src/styles/tokens.ts 生成,勿手改;
3
+ * 改完 tokens.ts 后运行 `npm run gen:tokens`。
3
4
  *
4
- * - VS Code 环境下会被 --vscode-* 覆盖
5
- * - 非 VS Code 环境使用这里的默认值
6
- * - 消费者(如 kaiyuanguji-web)在自己的 :root 里覆盖同名变量即可换肤;
7
- * 若同时引入了本文件,请确保覆盖声明在 `book-index-ui/styles` 之后加载
8
- *
9
- * 组件内部一律以 `var(--bim-x, <默认值>)` 取色。本文件中新增变量的取值
10
- * 与组件里原本写死的字面值逐一相同,因此不改变任何既有消费者的观感。
5
+ * 消费者在自己的 :root 里覆盖同名变量即可换肤;覆盖声明须在本文件之后加载。
11
6
  */
12
7
  :root {
13
- /* ================= 原有变量(取值保持不变) ================= */
8
+ /* ==== 基础(VS Code 环境下跟随 --vscode-*) ==== */
14
9
  --bim-bg: var(--vscode-editor-background, #ffffff);
15
10
  --bim-fg: var(--vscode-foreground, #333333);
16
11
  --bim-input-bg: var(--vscode-input-background, #ffffff);
@@ -30,79 +25,100 @@
30
25
  --bim-list-active-bg: var(--vscode-list-activeSelectionBackground, rgba(0, 120, 212, 0.1));
31
26
  --bim-focus-border: var(--vscode-focusBorder, #0078d4);
32
27
 
33
- /* ================= 新增:补齐组件已在用、此前只有内联回退值的变量 ================= */
34
-
35
- /* ---- 底色层次 ---- */
28
+ /* ==== 底色层次 / 文字与描边 / 链接 ==== */
36
29
  --bim-bg-subtle: #fafafa;
37
30
  --bim-widget-bg: #f8f8f8;
38
-
39
- /* ---- 文字与描边 ---- */
40
31
  --bim-muted: #888888;
41
32
  --bim-border: #e5e5e5;
42
-
43
- /* ---- 主色衍生 / 链接 ---- */
44
33
  --bim-primary-bg: #fdf4f4;
45
34
  --bim-link: #1976d2;
46
-
47
- /* ---- 标签与点缀 ---- */
48
35
  --bim-tag-bg: #f0f0f0;
49
36
  --bim-accent-bg: #1976d2;
37
+ /* 彩色底(徽章、选中态按钮)上的文字 */
38
+ --bim-on-color-fg: #ffffff;
50
39
 
51
- /* ---- 提示与警告 ---- */
40
+ /* ==== 提示与警告 ==== */
52
41
  --bim-info-fg: #0c5380;
53
42
  --bim-info-bg: #e7f3ff;
54
43
  --bim-info-border: #b3dbff;
55
44
  --bim-warn-fg: #856404;
56
45
  --bim-warn-bg: #fff3cd;
57
46
  --bim-warn-border: #ffc107;
58
-
59
- /* ================= 新增:原本写死在组件里、现已变量化 ================= */
60
-
61
- /* ---- 条目类型徽章(Book / Work / Collection / Entity) ---- */
47
+ /* 错误提示条底色 */
48
+ --bim-danger-bg: rgba(244, 67, 54, 0.08);
49
+ /* 编辑器危险区块 */
50
+ --bim-danger-soft-bg: rgba(244, 67, 54, 0.03);
51
+ --bim-danger-soft-border: rgba(244, 67, 54, 0.13);
52
+
53
+ /* ==== 遮罩与阴影 ==== */
54
+ /* 对话框遮罩 */
55
+ --bim-backdrop: rgba(0, 0, 0, 0.5);
56
+ /* 轻量遮罩底(图片占位等) */
57
+ --bim-overlay-bg: #00000010;
58
+ --bim-shadow-dialog: 0 4px 20px rgba(0, 0, 0, 0.3);
59
+ --bim-shadow-dropdown: 0 4px 12px rgba(0, 0, 0, 0.1);
60
+ --bim-shadow-tooltip: 0 2px 8px rgba(0, 0, 0, 0.08);
61
+ /* 悬浮按钮(反馈) */
62
+ --bim-shadow-fab: 0 2px 8px rgba(0, 0, 0, 0.25);
63
+ /* 展开的卡片 */
64
+ --bim-shadow-card: 0 1px 4px rgba(0, 0, 0, 0.06);
65
+ /* 谱系图节点 */
66
+ --bim-shadow-node: 0 1px 3px rgba(0, 0, 0, 0.1);
67
+ --bim-shadow-node-selected: 0 0 0 3px rgba(0, 120, 212, 0.2), 0 2px 8px rgba(0, 120, 212, 0.3);
68
+
69
+ /* ==== 条目类型 / 状态徽章 ==== */
62
70
  --bim-type-book: #c0392b;
63
71
  --bim-type-work: #8e6f3e;
64
72
  --bim-type-collection: #2471a3;
65
73
  --bim-type-entity: #5b3e8e;
66
-
67
- /* ---- 条目状态徽章 ---- */
68
74
  --bim-status-draft: #e67e22;
69
75
  --bim-status-official: #27ae60;
70
76
 
71
- /* ---- 资源类型标记 ---- */
77
+ /* ==== 资源 ==== */
72
78
  --bim-restype-text: #2196f3;
73
79
  --bim-restype-image: #ff9800;
74
80
  --bim-restype-text-image: #9c27b0;
75
81
  --bim-restype-physical: #795548;
76
-
77
82
  /* 资源缺册提示 */
78
83
  --bim-missing-fg: #e67e22;
79
-
80
84
  /* 影印件色彩模式标记(黑白 / 彩色) */
81
85
  --bim-colormode-bw-bg: #f5f5f5;
82
86
  --bim-colormode-bw-fg: #757575;
83
87
  --bim-colormode-color-bg: #fff8e1;
84
88
  --bim-colormode-color-fg: #f57f17;
85
-
86
- /* ---- 资源导入进度 ---- */
89
+ /* 资源导入进度 */
87
90
  --bim-progress-active: #f59e0b;
88
91
  --bim-progress-done: #10b981;
89
92
  --bim-progress-todo: #9ca3af;
90
-
91
- /* ---- 整理本(CollatedEdition) ---- */
93
+ /* 文字资源校对程度徽章(精校 / 粗校 / AI整理) */
94
+ --bim-check-fine-bg: #e8f5e9;
95
+ --bim-check-fine-fg: #2e7d32;
96
+ --bim-check-rough-bg: #fff3e0;
97
+ --bim-check-rough-fg: #e65100;
98
+ --bim-check-ai-bg: #e3f2fd;
99
+ --bim-check-ai-fg: #1565c0;
100
+
101
+ /* ==== 整理本(CollatedEdition) ==== */
92
102
  /* 搜索命中高亮底 */
93
103
  --bim-highlight-bg: #fff59d;
94
- /* 章节类型标记:类 / 书 / 序 / 结语 / 考证 */
104
+ /* 章节类型标记:类 / 书 / 序 / 结语 / 考证 / 注释 */
95
105
  --bim-section-lei: #8e6f3e;
96
106
  --bim-section-shu: #c0392b;
97
107
  --bim-section-xu: #1a5276;
98
108
  --bim-section-jieyu: #7d6608;
99
109
  --bim-section-kaozhen: #5d6d7e;
110
+ --bim-section-zhushi: #6c5b7b;
100
111
  /* 章节标记(△ 等) */
101
112
  --bim-section-tag-fg: #e74c3c;
102
113
  /* 与底本匹配状态提示 */
103
114
  --bim-matchstate-fg: #b78900;
115
+ /* 文本质量等级(出版 / 精校 / 粗校 / OCR) */
116
+ --bim-quality-published: #1b5e20;
117
+ --bim-quality-fine: #2e7d32;
118
+ --bim-quality-rough: #1565c0;
119
+ --bim-quality-ocr: #e65100;
104
120
 
105
- /* ---- 版本传承(VersionLineageGraph / List) ---- */
121
+ /* ==== 版本传承(VersionLineageGraph / List) / 关系方向(RelationPanel) ==== */
106
122
  /* 佚失标记 */
107
123
  --bim-lost-fg: #c62828;
108
124
  /* 关系置信度 */
@@ -110,105 +126,78 @@
110
126
  --bim-confidence-consensus: #1976d2;
111
127
  --bim-confidence-probable: #ed6c02;
112
128
  --bim-confidence-disputed: #c62828;
113
- /*
114
- * ⚠️ 历史遗留的不一致:同为 consensus(共识),
115
- * VersionLineageList 的徽章用蓝色 #1976d2,
116
- * VersionLineageGraph 的连线用灰色 #555。
117
- * 变量化时为保证零变化,各自保留原值,故 Graph 单独用下面这个变量。
118
- * 若要统一,把 --bim-lineage-edge-consensus 覆盖成
119
- * var(--bim-confidence-consensus) 即可。
120
- */
121
- --bim-lineage-edge-consensus: #555;
122
-
123
- /* ---- 关系方向(RelationPanel) ---- */
129
+ /* ⚠️ 同为 consensus,List 徽章用 --bim-confidence-consensus(蓝),Graph 连线用这个(灰)。若要统一,覆盖成 var(--bim-confidence-consensus) */
130
+ --bim-lineage-edge-consensus: #555555;
124
131
  --bim-relation-up: #2196f3;
125
132
  --bim-relation-down: #4caf50;
126
133
  --bim-relation-flat: #ff9800;
127
134
 
128
- /* ================= 编辑器视图(主要在 guji-platform 插件中可见) ================= */
129
-
130
- /*
131
- * ⚠️ 历史遗留的不一致:条目类型(Work/Collection/Book/Entity)在
132
- * 展示视图(IndexDetail)与编辑视图(IndexEditor / EntityPickerDialog)
133
- * 用的是两套完全不同的配色:
134
- * 展示:--bim-type-* work 泥金 / book 朱红 / collection 靛蓝 / entity 紫
135
- * 编辑:--bim-editor-type-* work 绿 / book 橙 / collection 蓝 / entity 紫
136
- * 变量化时为保证零变化各自保留。若要统一,把 --bim-editor-type-* 覆盖成
137
- * 对应的 var(--bim-type-*) 即可。
138
- */
135
+ /* ==== 编辑器视图(主要在 guji-platform 插件中可见) ==== */
136
+ /* ⚠️ 与展示视图的 --bim-type-* 是两套配色(历史如此)。若要统一,覆盖成对应的 var(--bim-type-*) */
139
137
  --bim-editor-type-work: #4caf50;
140
138
  --bim-editor-type-collection: #2196f3;
141
139
  --bim-editor-type-book: #ff9800;
142
140
  --bim-editor-type-entity: #9c27b0;
143
-
144
141
  /* 来源类型(SourceEditor) */
145
142
  --bim-source-url: #2196f3;
146
143
  --bim-source-bookid: #4caf50;
147
-
148
- /* 轻量遮罩底(图片占位等) */
149
- --bim-overlay-bg: #00000010;
150
-
151
- /* 模式指示器当前态底色(ModeIndicator) */
144
+ /* 模式指示器当前态(ModeIndicator) */
152
145
  --bim-mode-active-bg: #2196f3;
153
-
154
- /* 书目卡片「封面」的点缀色(IndexBrowser resultVariant="card") */
146
+ /* 书目卡片「封面」点缀(IndexBrowser resultVariant="card") */
155
147
  --bim-cover-accent: #8e6f3e;
156
148
 
157
- /* =========================================================
158
- 详情页(作品 / 版本 / 丛编)
159
- ---------------------------------------------------------
160
- 2026-09 版式重构新增。设计稿全用字面色,这里**一律由上面
161
- 已有的 --bim-* 派生**,于是消费者(kaiyuanguji-web 的宣纸
162
- 皮肤、未来的墨夜深色、VS Code 主题)只要覆盖了基础色,
163
- 详情页自动跟随,不需要再覆盖第二套。
164
-
165
- 右侧注释是设计稿里对应的字面值,仅作对照,不要写回代码。
166
- ========================================================= */
167
-
168
- /*
169
- * 取值策略:详情页是「读书」的场面,用宣纸+朱砂一套独立的暖色,
170
- * **不**继承 --bim-primary 等通用控件色——后者在 VS Code 里跟随
171
- * 主题的按钮蓝,用在正文页会变成一片蓝链接,与设计稿差得很远。
172
- *
173
- * 消费者(kaiyuanguji-web)覆盖同名变量即可换肤;VS Code 插件里
174
- * 若要跟随主题,把这几个覆盖成 var(--vscode-*) 就行。
175
- */
176
-
177
- /* ---- 底色 ---- */
178
- --bim-page-bg: #fbf9f3; /* 纸 */
179
- --bim-row-hover-bg: #f5f1e5; /* 行 hover */
180
- --bim-selection-bg: #ecdcbc; /* 选区 */
181
-
182
- /* 全文入口横幅底色(作品页的整理本、版本页的全文)。这两个是少数
183
- **不由上面派生**的值:朱砂淡化会发粉,选区色在消费者那边可能是
184
- 半透明的,再套 color-mix 会失真。 */
185
- --bim-band-bg: #f0e4cb; /* 暖沙 */
186
- --bim-band-bg-hover: #e6d5b4; /* 暖沙 · hover 加深 */
187
-
188
- /* ---- 文字层次(墨 → 正文 → 提要 → meta → 标签 → 提示) ---- */
149
+ /* ==== 详情页(作品 / 版本 / 丛编):宣纸 + 朱砂一套独立暖色,不继承 --bim-primary 等控件色 ==== */
150
+ /* 纸 */
151
+ --bim-page-bg: #fbf9f3;
152
+ --bim-row-hover-bg: #f5f1e5;
153
+ /* 选区 */
154
+ --bim-selection-bg: #ecdcbc;
155
+ /* 全文入口横幅(暖沙) */
156
+ --bim-band-bg: #f0e4cb;
157
+ --bim-band-bg-hover: #e6d5b4;
158
+ /* 文字层次:墨 → 正文 → 提要 → meta → 标签 → 提示 */
189
159
  --bim-ink: #2a231c;
190
160
  --bim-body-fg: #3b3228;
191
- --bim-quiet-fg: #5b4f40; /* 提要正文 */
161
+ --bim-quiet-fg: #5b4f40;
192
162
  --bim-meta-fg: #7b6a54;
193
- --bim-label-fg: #a3937b; /* 表头 / 计数 / facts key */
194
- --bim-hint-fg: #b3a385; /* 行号 / 空值 / 箭头 */
195
-
196
- /* ---- 强调 ---- */
197
- --bim-accent: #9c3a2c; /* 朱 */
198
- --bim-accent-deep: #6f2a20; /* 链接 hover */
199
-
200
- /* ---- 分隔线(强 → 常规 → 虚线 → 提要左线) ---- */
201
- --bim-rule-strong: #2a231c; /* header 底 / 表头 */
163
+ /* 标签 / 提示:2026-09 N3a 调深,纸底与斑马底上对比度均 ≥4.5(原 #a3937b 2.8、#b3a385 2.3) */
164
+ --bim-label-fg: #6f6457;
165
+ --bim-hint-fg: #756a5e;
166
+ /* 朱 */
167
+ --bim-accent: #9c3a2c;
168
+ /* 链接 hover */
169
+ --bim-accent-deep: #6f2a20;
170
+ /* 分隔线:强 → 常规 → 虚线 → 提要左线 */
171
+ --bim-rule-strong: #2a231c;
202
172
  --bim-rule: #e4dbc9;
203
- --bim-rule-dashed: #d6c9ae; /* 展开按钮 */
204
- --bim-rule-accent-soft: #e0d3b6; /* 提要左线 */
205
-
206
- /*
207
- * 字体:全站无衬线(2026-09-05 定)。
208
- * 消费者若要换字体,覆盖这两个变量即可;--bim-font-body 影响标题与正文,
209
- * --bim-font-ui 影响 meta / 表头 / 标签 / 数字。
210
- */
211
- --bim-font-ui: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
212
- "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", "Microsoft YaHei", sans-serif;
173
+ --bim-rule-dashed: #d6c9ae;
174
+ --bim-rule-accent-soft: #e0d3b6;
175
+ /* 辅助字(元数据、注记、「·」分隔的浅色小字)。须在 page-bg / zebra-bg 上对比度 ≥4.5(Q5 巡检) */
176
+ --bim-aux-fg: #6f6457;
177
+ /* 提要卡:抬起的面 */
178
+ --bim-card-bg: #fffdf9;
179
+ /* 表格斑马纹 / 左栏分组底(不画格线,靠这一阶底色分行) */
180
+ --bim-zebra-bg: #f6f2eb;
181
+ /* 检索框、悬停 */
182
+ --bim-tint-bg: #f3eee6;
183
+ /* 提要卡投影 */
184
+ --bim-shadow-summary: 0 10px 32px rgba(60, 50, 40, 0.07);
185
+ /* 唯一的状态色块「有影印」 */
186
+ --bim-flag-bg: rgba(158, 42, 43, 0.08);
187
+
188
+ /* ==== 阅读器(整理本 / 全文) ==== */
189
+ /* 宿主吸顶导航的高度:阅读器工具条、目录与书影侧栏在它下面吸顶(如 60px) */
190
+ --bim-reader-top: 0px;
191
+
192
+ /* ==== 反馈浮钮(2026-09-28 Q5) ==== */
193
+ /* 层级:低于页面抽屉、弹层(本包对话框为 1000) */
194
+ --bim-feedback-fab-z: 40;
195
+
196
+ /* ==== 字体(全站无衬线,2026-09-05 定) ==== */
197
+ --bim-font-ui: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", "Microsoft YaHei", sans-serif;
213
198
  --bim-font-body: var(--bim-font-ui);
199
+ /* 著录原文(提要、按语)用宋体 */
200
+ --bim-font-serif: "Songti SC", "Songti TC", STSong, "Noto Serif CJK SC", "Source Han Serif SC", SimSun, serif;
201
+ /* 阅读器正文(整理本 / 全文);默认接 font-serif,只需覆盖那一个就同时换掉 */
202
+ --bim-font-reading: var(--bim-font-serif);
214
203
  }