book-index-ui 0.6.4 → 0.7.2

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/dist/index.d.ts CHANGED
@@ -141,7 +141,7 @@ export declare interface BookDetailLayoutProps {
141
141
  onNavigate?: (id: string) => void;
142
142
  onBack?: () => void;
143
143
  backLabel?: string;
144
- renderLink?: (id: string, label?: string) => default_2.ReactNode;
144
+ renderLink?: RenderLink;
145
145
  /** 加载 detail 后的额外加工(如注入 digital_assets) */
146
146
  enrichDetail?: (entry: IndexEntry, detail: IndexDetailData) => void;
147
147
  /** 当前 tab 的源文件链接解析器 */
@@ -151,23 +151,20 @@ export declare interface BookDetailLayoutProps {
151
151
  } | null;
152
152
  /** 注入额外 tab(如 kyg 的「数字化」) */
153
153
  extraTabs?: ExtraTab[];
154
- /** 是否显示内置反馈 tab,默认 true。设为 false 时调用方可用 extraTabs 自定义。 */
155
154
  showFeedbackTab?: boolean;
156
- /** 反馈 API 端点(默认 `/api/feedback`) */
157
155
  feedbackApiUrl?: string | (() => string);
158
- /** 整个组件的外层高度(默认 100vh) */
156
+ /**
157
+ * 最小高度。旧版这里是「固定高度 + 内滚动」,现已改为文档流,
158
+ * 只用来保证短内容时页面不塌陷。
159
+ */
159
160
  height?: string;
160
- /** 桌面侧边栏宽度(默认 144 — 对应 Tailwind w-36) */
161
- sideNavWidth?: number;
162
- /** 内容区域最大宽度(默认 1024) */
163
- contentMaxWidth?: number;
164
- /** 是否在加载/未找到状态下隐藏整体导航(默认 false:仍显示返回链接) */
165
- hideNavWhenLoading?: boolean;
161
+ /** 页脚左侧附加内容(如站点的引用信息条) */
162
+ footerExtra?: default_2.ReactNode;
166
163
  className?: string;
167
164
  style?: default_2.CSSProperties;
168
165
  }
169
166
 
170
- export declare type BookDetailTabKey = 'basic' | 'collated' | 'fulltext' | 'lineage' | 'emendated' | 'feedback' | string;
167
+ export declare type BookDetailTabKey = 'basic' | 'collated' | 'fulltext' | 'lineage' | 'feedback' | string;
171
168
 
172
169
  /**
173
170
  * Book 全文 viewer:左侧章节列表 + 右侧 markdown 渲染。
@@ -371,6 +368,55 @@ export declare interface BookLineage {
371
368
  note?: string;
372
369
  }
373
370
 
371
+ export declare const BookPage: default_2.FC<BookPageProps>;
372
+
373
+ export declare interface BookPageProps {
374
+ data: BookDetailData;
375
+ transport?: IndexStorage;
376
+ onNavigate?: (id: string) => void;
377
+ renderLink?: RenderLink;
378
+ }
379
+
380
+ export declare function Breadcrumb({ items }: {
381
+ items: {
382
+ label: string;
383
+ onClick?: () => void;
384
+ href?: string;
385
+ }[];
386
+ }): JSX.Element;
387
+
388
+ export declare interface BucketedResources {
389
+ buckets: ResourceBucket[];
390
+ mirrors: MirrorGroup[];
391
+ /** 合并分册后的总数,用于「N 个资源」计数 */
392
+ total: number;
393
+ }
394
+
395
+ /**
396
+ * 把资源按类型分桶(文字全文库 / 影印资源 / 图文对照 / 馆藏),
397
+ * 并把同源镜像组(resource_groups)单独拎出来。
398
+ *
399
+ * 先合并分册系列——御定佩文韻府 23 条「第N冊」在分桶前必须先并成 1 条,
400
+ * 否则「影印資源」栏会出现 23 行一模一样的名字。
401
+ */
402
+ export declare function bucketResources(items: ResourceEntry[] | undefined, groups?: Record<string, ResourceGroupInfo>): BucketedResources;
403
+
404
+ /**
405
+ * 构造丛编「收錄書籍」表。
406
+ *
407
+ * 三级数据源,按信息量降序:
408
+ * 1. volume_book_mapping.json —— 含部类/册次/缺册/附属子目,但生产仓只有 7 份
409
+ * 2. contained_works[] —— 含标题与册次,29 部丛编有(其中 16 部带 volume_index)
410
+ * 3. books[] —— 只有 ID,需逐条 getItem 才能拿标题
411
+ *
412
+ * 优先级很重要:武英殿聚珍版有 144 条 contained_works(自带标题+册次),
413
+ * 走第 2 级就能直接渲染,不必对 books[] 发 144 次请求。
414
+ */
415
+ export declare function buildCollectionTable(coll: CollectionDetailData, catalog?: VolumeBookMapping | null, resolvedBooks?: Map<string, {
416
+ title?: string;
417
+ edition?: string;
418
+ }>): CollectionTable;
419
+
374
420
  export declare function buildId(status: IndexStatus, type: IndexType, timestamp: bigint, machineId: number, sequence: number): bigint;
375
421
 
376
422
  /**
@@ -384,12 +430,19 @@ export declare function buildId(status: IndexStatus, type: IndexType, timestamp:
384
430
  */
385
431
  export declare function buildLineageGraph(work: WorkDetailData, books: BookDetailData[], collection?: string): LineageGraph;
386
432
 
433
+ /** 构造跳到指定页的 URL(目前只有 Wikimedia Commons 支持页内导航) */
434
+ export declare function buildPageUrl(baseUrl: string, pageNum: number): string;
435
+
387
436
  /**
388
437
  * 把原始 JSON 转成 draft_id → production_id 的扁平 Map,用于 redirect 查表。
389
438
  * 容错:缺字段、版本号不匹配都按空映射处理(log 一条 warn)。
390
439
  */
391
440
  export declare function buildPromotionMap(raw: unknown): Map<string, string>;
392
441
 
442
+ export declare function buildVersionRow(v: ResolvedVersion, vg?: VersionGraph): VersionRow;
443
+
444
+ export declare function buildVersionTable(versions: ResolvedVersion[], vg: VersionGraph | undefined, opts?: VersionTableOptions): VersionTable;
445
+
393
446
  /**
394
447
  * Bundle 只读 Storage 实现
395
448
  *
@@ -538,6 +591,19 @@ declare interface CatalogDivision {
538
591
  categories: CatalogCategory[];
539
592
  }
540
593
 
594
+ /** 条目 chip(关联作品、别名、同作品其他版本…) */
595
+ export declare function Chip({ children, href, onClick, title }: {
596
+ children: default_2.ReactNode;
597
+ href?: string;
598
+ onClick?: () => void;
599
+ title?: string;
600
+ }): JSX.Element;
601
+
602
+ /** chip 牆:自动换行 + 「更多 N」 */
603
+ export declare function ChipWall({ children }: {
604
+ children: default_2.ReactNode;
605
+ }): JSX.Element;
606
+
541
607
  /**
542
608
  * 文件名清洗:保留 ASCII 字母数字 + CJK 全范围。
543
609
  *
@@ -688,6 +754,11 @@ export declare interface CollectionCatalogProps {
688
754
  /** Collection 详情 */
689
755
  export declare interface CollectionDetailData extends BaseDetailData {
690
756
  type: 'collection';
757
+ /**
758
+ * 丛编子类:book_collection(书籍汇编,60 部)/ work_collection(作品集,15 部)。
759
+ * 数据里一直有,此前没在类型里声明。
760
+ */
761
+ subtype?: 'book_collection' | 'work_collection' | string;
691
762
  work_id?: string;
692
763
  contained_in?: string[];
693
764
  history?: string[];
@@ -699,6 +770,47 @@ export declare interface CollectionDetailData extends BaseDetailData {
699
770
  }[];
700
771
  }
701
772
 
773
+ export declare const CollectionPage: default_2.FC<CollectionPageProps>;
774
+
775
+ export declare interface CollectionPageProps {
776
+ data: CollectionDetailData;
777
+ /** 丛编目录档(由 layout 预加载,生产仓只有 7 部丛编有) */
778
+ catalog?: VolumeBookMapping | null;
779
+ transport?: IndexStorage;
780
+ onNavigate?: (id: string) => void;
781
+ renderLink?: RenderLink;
782
+ /** 完整目录 tab 的入口(由 layout 注入) */
783
+ catalogAction?: default_2.ReactNode;
784
+ }
785
+
786
+ export declare interface CollectionRow {
787
+ /** 链接目标(work_id 或 book_id);无匹配时为空 */
788
+ id?: string;
789
+ title: string;
790
+ /** 部类(经史子集等),仅目录档有 */
791
+ section?: string;
792
+ /** 册号列表 */
793
+ volumes: number[];
794
+ /** 附属子目(如「附錄一卷」) */
795
+ subItems?: string[];
796
+ edition?: string;
797
+ /** 缺册统计(目录档有) */
798
+ found?: number;
799
+ expected?: number;
800
+ }
801
+
802
+ export declare interface CollectionTable {
803
+ rows: CollectionRow[];
804
+ /** 数据来源:catalog = 目录档(最全);works = contained_works;books = 仅 ID */
805
+ source: 'catalog' | 'works' | 'books';
806
+ /** 可用的部类筛选项 */
807
+ sections: string[];
808
+ /** 全帙册数(目录档有) */
809
+ totalVolumes?: number;
810
+ }
811
+
812
+ export declare function computeVersionPartition(ids: string[], vg?: VersionGraph): VersionPartition;
813
+
702
814
  export declare class ConfigError extends BookIndexError {
703
815
  constructor(message?: string);
704
816
  }
@@ -752,17 +864,81 @@ export declare interface CreateEntityParams {
752
864
  inheritData?: Record<string, unknown>;
753
865
  }
754
866
 
867
+ /** 空值占位「—」 */
868
+ export declare function Dash(): JSX.Element;
869
+
870
+ /** 表格容器:顶部墨线 */
871
+ export declare function DataTable({ children }: {
872
+ children: default_2.ReactNode;
873
+ }): JSX.Element;
874
+
755
875
  export declare const decodeId: typeof base36Decode;
756
876
 
757
877
  /** Decode an ID string and extract its components. Supports both base36 and legacy base58. */
758
878
  export declare function decodeIdString(encoded: string): IdComponents;
759
879
 
880
+ export declare interface DerivedEra {
881
+ /** 朝代名(繁体),如「宋」「清」「日本」;推不出时为空串 */
882
+ era: string;
883
+ /** 年号或纪年文本,如「乾隆」「慶元」「1773」;推不出时为空串 */
884
+ reign: string;
885
+ source: EraSource;
886
+ }
887
+
888
+ /**
889
+ * 版本类型推断(写本 / 刻本 / 活字本…)。
890
+ * lineage.category 只有 1% 有,其余从题名尾缀猜。
891
+ */
892
+ export declare function deriveEditionType(book: EraInferable): string;
893
+
894
+ /**
895
+ * 推断一个版本的朝代 / 纪年。
896
+ *
897
+ * 三级回退,越靠前越可信:
898
+ * 1. lineage.year_text —— 人工整理的版本传承信息(仅 1% 有)
899
+ * 2. publication_info.year —— 著录的出版年(仅 2% 有)
900
+ * 3. edition ∥ title 的题名前缀与特征词 —— 覆盖约 96%,但是**推断**
901
+ *
902
+ * UI 必须依 source 区分显示(推断的加 hover 提示),不要让读者误以为
903
+ * 「宋 · 慶元」是著录事实。
904
+ */
905
+ export declare function deriveEra(book: EraInferable): DerivedEra;
906
+
907
+ /**
908
+ * 推断可排序的公元年份。
909
+ *
910
+ * 优先 lineage.year(人工著录),其次文本里的 4 位公元年,
911
+ * 最后用年号表折算「乾隆四十三年」→ 1736 + 43 - 1 = 1778。
912
+ */
913
+ export declare function deriveYear(book: EraInferable): number | undefined;
914
+
760
915
  /** 描述信息 */
761
916
  export declare interface DescriptionInfo {
762
917
  text: string;
763
918
  sources?: string[];
764
919
  }
765
920
 
921
+ /**
922
+ * 全局样式。用 class 前缀 bim-d- 避免与消费者站点冲突。
923
+ *
924
+ * 响应式全部在这里用 media query 表达:JS 侧不读 window 宽度,
925
+ * 于是 Next.js 服务端渲染出的 HTML 与客户端首帧完全一致。
926
+ */
927
+ export declare const DETAIL_CSS = "\n.bim-d-page {\n background: var(--bim-page-bg, #fbf9f3);\n color: var(--bim-ink, #2a231c);\n font-family: var(--bim-font-body, system-ui, sans-serif);\n min-height: 100%;\n padding-bottom: 64px;\n}\n.bim-d-main {\n max-width: 1000px;\n margin: 0 auto;\n padding: 24px clamp(16px, 4vw, 28px) 0;\n}\n.bim-d-ui { font-family: var(--bim-font-ui, system-ui, sans-serif); }\n\n.bim-d-page a { color: var(--bim-accent, #9c3a2c); text-decoration: none; }\n.bim-d-page a:hover {\n color: var(--bim-accent-deep, #6f2a20);\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 3px;\n}\n.bim-d-page ::selection { background: var(--bim-selection-bg, #ecdcbc); }\n\n/* \u8868\u683C\u884C */\n.bim-d-row { display: grid; align-items: center; padding: 9px 4px;\n border-bottom: 1px solid var(--bim-rule, #eae2d0); font-size: 14px; }\n.bim-d-row:hover { background: var(--bim-row-hover-bg, #f5f1e5); }\n\n/* intro / \u6210\u5BF9\u533A\u5757\uFF1A\u5BBD\u5C4F\u4E24\u680F\uFF0C\u7A84\u5C4F\u5355\u680F */\n.bim-d-intro { display: grid; grid-template-columns: minmax(0, 1fr) 244px; gap: 30px;\n padding: 20px 0 26px; border-bottom: 1px solid var(--bim-rule, #e4dbc9);\n margin-bottom: 40px; align-items: start; }\n.bim-d-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 34px;\n align-items: start; margin-bottom: 48px; }\n.bim-d-pair-wide { grid-template-columns: 1fr 1.2fr; }\n\n@media (max-width: 719px) {\n .bim-d-intro { grid-template-columns: 1fr; gap: 20px; margin-bottom: 32px; }\n .bim-d-pair, .bim-d-pair-wide { grid-template-columns: 1fr; gap: 40px; }\n /* \u8868\u683C\uFF1Ameta \u5217\u6298\u5230\u7B2C\u4E8C\u884C\uFF0C\u8868\u5934\u9690\u85CF */\n .bim-d-thead { display: none !important; }\n .bim-d-row { grid-template-columns: 22px 1fr !important; gap: 5px 10px !important;\n align-items: baseline; padding: 10px 2px; }\n .bim-d-row-meta { grid-column: 2; display: flex !important; flex-wrap: wrap;\n gap: 4px 14px; font-size: 12px; }\n .bim-d-h1 { font-size: 32px !important; }\n}\n";
928
+
929
+ export declare function DetailFooter({ left, right }: {
930
+ left?: default_2.ReactNode;
931
+ right?: default_2.ReactNode;
932
+ }): JSX.Element;
933
+
934
+ /** 页头:大标题 + 副题 + 右上小字 + (可选)第二行 */
935
+ export declare function DetailHeader({ title, subtitle, aside, secondLine }: {
936
+ title: default_2.ReactNode;
937
+ subtitle?: default_2.ReactNode;
938
+ aside?: default_2.ReactNode;
939
+ secondLine?: default_2.ReactNode;
940
+ }): JSX.Element;
941
+
766
942
  /** IndexDetailData (结构化) → IndexEditorData (扁平化) */
767
943
  export declare function detailToEditor(data: IndexDetailData): IndexEditorData;
768
944
 
@@ -799,6 +975,12 @@ export declare function EmendatedBySection({ items, onNavigate, renderLink }: {
799
975
  renderLink?: (id: string, label?: string) => default_2.ReactNode;
800
976
  }): JSX.Element;
801
977
 
978
+ /** 空状态说明(如「暫無版本著錄」) */
979
+ export declare function EmptyNote({ children, action }: {
980
+ children: default_2.ReactNode;
981
+ action?: default_2.ReactNode;
982
+ }): JSX.Element;
983
+
802
984
  export declare const encodeId: typeof base36Encode;
803
985
 
804
986
  export declare const EntityDetail: default_2.FC<EntityDetailProps>;
@@ -834,6 +1016,12 @@ export declare interface EntityDetailProps {
834
1016
  onNavigate?: (id: string) => void;
835
1017
  renderLink?: (id: string, label?: string) => default_2.ReactNode;
836
1018
  headerExtra?: default_2.ReactNode;
1019
+ /**
1020
+ * 隐藏自带的标题块。
1021
+ * 详情页外壳(BookDetailLayout)已经在 DetailHeader 里渲染了
1022
+ * 姓名 / 朝代 / 生卒 / 类型,这里再渲一遍就是同一个名字出现两次。
1023
+ */
1024
+ hideHeader?: boolean;
837
1025
  }
838
1026
 
839
1027
  /** 实体选项(搜索结果、最近使用等) */
@@ -846,6 +1034,15 @@ export declare interface EntityOption {
846
1034
  dynasty?: string;
847
1035
  }
848
1036
 
1037
+ export declare const EntityPage: default_2.FC<EntityPageProps>;
1038
+
1039
+ export declare interface EntityPageProps {
1040
+ data: EntityDetailData;
1041
+ transport?: IndexStorage;
1042
+ onNavigate?: (id: string) => void;
1043
+ renderLink?: RenderLink;
1044
+ }
1045
+
849
1046
  export declare const EntityPickerDialog: default_2.FC<EntityPickerDialogProps>;
850
1047
 
851
1048
  declare interface EntityPickerDialogProps {
@@ -886,6 +1083,34 @@ export declare interface EntityWorkRef {
886
1083
  role?: string;
887
1084
  }
888
1085
 
1086
+ /**
1087
+ * 推断函数只读这几个字段,故用结构类型而非完整 BookDetailData——
1088
+ * 这样 ResolvedVersion(version 表的轻量投影)也能直接传进来。
1089
+ */
1090
+ export declare interface EraInferable {
1091
+ title?: string;
1092
+ edition?: string;
1093
+ lineage?: BookDetailData['lineage'];
1094
+ publication_info?: BookDetailData['publication_info'];
1095
+ }
1096
+
1097
+ export declare function eraRank(era: string): number;
1098
+
1099
+ /** 推断出的朝代及其可信来源 */
1100
+ export declare type EraSource = 'lineage' | 'publication' | 'edition' | 'none';
1101
+
1102
+ /**
1103
+ * 可展开行(书目收录 / 考证):+/- 方块 + 主行 + 展开内容。
1104
+ * 展开内容缩进对齐主行文字,带浅色左线。
1105
+ */
1106
+ export declare function ExpandRow({ open, onToggle, main, action, children }: {
1107
+ open: boolean;
1108
+ onToggle: () => void;
1109
+ main: default_2.ReactNode;
1110
+ action?: default_2.ReactNode;
1111
+ children?: default_2.ReactNode;
1112
+ }): JSX.Element;
1113
+
889
1114
  /** Entity.external_ids —— 外部数据库引用 */
890
1115
  export declare interface ExternalIds {
891
1116
  cbdb_id?: number;
@@ -893,6 +1118,12 @@ export declare interface ExternalIds {
893
1118
  cbdb_source?: string;
894
1119
  }
895
1120
 
1121
+ /** 外部链接(资源、机构) */
1122
+ export declare function ExtLink({ href, children }: {
1123
+ href: string;
1124
+ children: default_2.ReactNode;
1125
+ }): JSX.Element;
1126
+
896
1127
  /**
897
1128
  * 从 URL 的域名中提取简短标识符
898
1129
  */
@@ -924,6 +1155,39 @@ export declare interface ExtraTabContext {
924
1155
  onNavigate?: (id: string) => void;
925
1156
  }
926
1157
 
1158
+ export declare interface Fact {
1159
+ key: string;
1160
+ label: string;
1161
+ value: string;
1162
+ /** 点击跳转(如「收入」跳父丛编、「著錄」滚到书目区) */
1163
+ href?: string;
1164
+ /** 内部条目 ID(渲染成 BidLink) */
1165
+ linkId?: string;
1166
+ /** 锚点(页内滚动) */
1167
+ anchor?: string;
1168
+ /** hover 提示(如「據版本題名推斷」) */
1169
+ title?: string;
1170
+ }
1171
+
1172
+ export declare interface FactItem {
1173
+ label: string;
1174
+ value: default_2.ReactNode;
1175
+ /** hover 提示(如「據版本題名推斷」) */
1176
+ title?: string;
1177
+ }
1178
+
1179
+ /** facts 列表:左标签右值,带朱色左线 */
1180
+ export declare function FactList({ items, horizontal }: {
1181
+ items: FactItem[];
1182
+ /**
1183
+ * 横排模式:没有简介正文时用(Book 的 description 只有 2.5% 有)。
1184
+ * 此时标签与值改为上下堆叠——横排还左右对齐的话,标签和值之间会被
1185
+ * 拉开一大段空白,读者要横扫半个屏幕才能把「冊次」和「第 321–343 冊」
1186
+ * 对上号。
1187
+ */
1188
+ horizontal?: boolean;
1189
+ }): JSX.Element | null;
1190
+
927
1191
  export declare const FeedbackButton: default_2.FC<FeedbackButtonProps>;
928
1192
 
929
1193
  export declare interface FeedbackButtonProps {
@@ -1018,12 +1282,31 @@ declare interface FileSystem_2 {
1018
1282
  }
1019
1283
  export { FileSystem_2 as FileSystem }
1020
1284
 
1285
+ /** 筛选 chip(朝代、部类、分组)。选中态为朱红实心。 */
1286
+ export declare function FilterChip({ label, active, onClick, dashed }: {
1287
+ label: string;
1288
+ active?: boolean;
1289
+ onClick?: () => void;
1290
+ dashed?: boolean;
1291
+ }): JSX.Element;
1292
+
1293
+ /**
1294
+ * 把 `additional_titles` / `attached_texts` 这类
1295
+ * `(string | { book_title })[]` 摊平成字符串数组。
1296
+ */
1297
+ export declare function flattenTitles(items?: (string | {
1298
+ book_title: string;
1299
+ })[]): string[];
1300
+
1021
1301
  /**
1022
1302
  * 简单模板替换
1023
1303
  * formatTemplate('共 {n} 册', { n: 100 }) → '共 100 册'
1024
1304
  */
1025
1305
  export declare function formatTemplate(template: string, values: Record<string, string | number>): string;
1026
1306
 
1307
+ /** 格式化册号范围:连续用「321–343」,零散用逗号,过多用「a–b (N 冊)」 */
1308
+ export declare function formatVolumeRange(volumes: number[], unitVolume?: string): string;
1309
+
1027
1310
  export declare const FormInput: default_2.FC<FormInputProps>;
1028
1311
 
1029
1312
  declare interface FormInputProps {
@@ -1042,6 +1325,14 @@ declare interface FormTextAreaProps {
1042
1325
  placeholder?: string;
1043
1326
  }
1044
1327
 
1328
+ /** 从 URL 提取域名并映射为显示名称 */
1329
+ export declare function getDisplayNameFromUrl(url: string): string | undefined;
1330
+
1331
+ /** Extract the start page number from metadata (page_range or file_page_range) */
1332
+ export declare function getStartPage(metadata?: Record<string, unknown>): number | undefined;
1333
+
1334
+ export declare function getTypeGroupKey(types: ResourceTypeAtom[]): string;
1335
+
1045
1336
  /**
1046
1337
  * GitHub 只读 Storage 实现
1047
1338
  *
@@ -1135,6 +1426,12 @@ export declare interface GithubStorageConfig {
1135
1426
  timeout?: number;
1136
1427
  }
1137
1428
 
1429
+ /** 方形字形徽章(版·源·目·考·續·叢·收·作) */
1430
+ export declare function GlyphBadge({ char, tone }: {
1431
+ char: string;
1432
+ tone?: 'accent' | 'ink';
1433
+ }): JSX.Element;
1434
+
1138
1435
  /** 统一搜索结果(按类型分组) */
1139
1436
  export declare interface GroupedSearchResult {
1140
1437
  works: IndexEntry[];
@@ -1148,6 +1445,15 @@ export declare interface GroupedSearchResult {
1148
1445
  totalEntities?: number;
1149
1446
  }
1150
1447
 
1448
+ /**
1449
+ * 把 related_works 按 relation 分成 5 桶。
1450
+ *
1451
+ * 现有 IndexDetail 只识别 4 种 relation,剩下 8 种(contains_text_of 4231 条、
1452
+ * collected_in 3376 条、studies 304 条…)全落进「相關作品」兜底桶,
1453
+ * 语义全丢。这里覆盖生产仓里出现过的全部 12 种。
1454
+ */
1455
+ export declare function groupRelatedWorks(items: RelatedWorkRef[]): RelatedGroup[];
1456
+
1151
1457
  export declare const HomePage: default_2.FC<HomePageProps>;
1152
1458
 
1153
1459
  export declare interface HomePageProps {
@@ -1289,6 +1595,16 @@ export declare interface IndexedByEntry {
1289
1595
  author_info?: string;
1290
1596
  /** 收录时的版本信息,如"內府藏本" */
1291
1597
  edition?: string;
1598
+ /**
1599
+ * 在该书目中的门类,如"六藝略/春秋"。
1600
+ * 抽样 2480 部作品中 21.6% 有此字段,此前一直没在类型里声明,
1601
+ * 于是详情页读不到、也就从没展示过。
1602
+ */
1603
+ section?: string;
1604
+ /** section 的判定依据(整理时记录的推理过程,一般不展示) */
1605
+ section_basis?: string;
1606
+ /** 出处页码,如"KR2a0007_WYG_030-12b"(抽样 8.6% 有) */
1607
+ page?: string;
1292
1608
  /** 提要/摘要 */
1293
1609
  summary?: string;
1294
1610
  /** 编者评论 */
@@ -1584,6 +1900,12 @@ export declare interface IndexViewProps {
1584
1900
  style?: default_2.CSSProperties;
1585
1901
  }
1586
1902
 
1903
+ /** intro 区:左正文 + 右 facts */
1904
+ export declare function IntroGrid({ children, facts }: {
1905
+ children?: default_2.ReactNode;
1906
+ facts?: default_2.ReactNode;
1907
+ }): JSX.Element;
1908
+
1587
1909
  /** 卷数 */
1588
1910
  export declare interface JuanCount {
1589
1911
  number?: number;
@@ -1695,6 +2017,12 @@ export declare type LineageSiblingRelation = '兄弟本' | '同源' | '互校' |
1695
2017
  /** 版本现存状态 */
1696
2018
  export declare type LineageStatus = 'extant' | 'fragment' | 'lost';
1697
2019
 
2020
+ /** 链接渲染上下文。消费者可据此调整样式,如表格里不显示类型图标。 */
2021
+ export declare interface LinkContext {
2022
+ /** 位于成列的表格/列表中——整列同类型时图标只是噪音 */
2023
+ dense?: boolean;
2024
+ }
2025
+
1698
2026
  /** 加载选项 */
1699
2027
  export declare interface LoadOptions {
1700
2028
  page?: number;
@@ -1845,6 +2173,8 @@ export declare interface LocaleMessages {
1845
2173
  containedWorks: string;
1846
2174
  adaptations: string;
1847
2175
  derivativeWorks: string;
2176
+ /** 本作品所研究/注解的对象(relation: studies / preceded_by) */
2177
+ studies: string;
1848
2178
  };
1849
2179
  relation: {
1850
2180
  belongsToWork: string;
@@ -1908,6 +2238,13 @@ export declare interface LocaleMessages {
1908
2238
  collectionCatalog: string;
1909
2239
  collatedEdition: string;
1910
2240
  catalogSuffix: string;
2241
+ fullText: string;
2242
+ lineage: string;
2243
+ feedback: string;
2244
+ dataSource: string;
2245
+ backToIndex: string;
2246
+ submitVersion: string;
2247
+ dataLicense: string;
1911
2248
  };
1912
2249
  metadata: Record<string, string>;
1913
2250
  editor: {
@@ -2099,10 +2436,31 @@ declare interface Measure {
2099
2436
  note?: string;
2100
2437
  }
2101
2438
 
2439
+ /** 计量文本:measure_info 优先(70% 有),回退 juan_count */
2440
+ export declare function measureText(detail: Partial<IndexDetailData>, juanUnit?: string): string;
2441
+
2442
+ /**
2443
+ * 将同名模式的分册资源自动合并为一条带 volumes 的资源。
2444
+ *
2445
+ * 匹配「XXX·第N冊」与「XXX (N)」「XXX·N」两种命名;≥2 册才合并,
2446
+ * 免得把「史記 (1)」这种孤例也变成一个空壳分册组。
2447
+ *
2448
+ * 御定佩文韻府就是典型:23 条「摛藻堂四庫全書薈要·第321冊」…「第343冊」
2449
+ * 合成一条「摛藻堂四庫全書薈要」+ 23 个册号。
2450
+ */
2451
+ export declare function mergeVolumeResources(items: ResourceEntry[]): ResourceEntry[];
2452
+
2102
2453
  export declare class MigrationError extends BookIndexError {
2103
2454
  constructor(message?: string);
2104
2455
  }
2105
2456
 
2457
+ export declare interface MirrorGroup {
2458
+ key: string;
2459
+ label: string;
2460
+ description?: string;
2461
+ items: ResourceEntry[];
2462
+ }
2463
+
2106
2464
  /**
2107
2465
  * 模式指示器
2108
2466
  * 显示和切换本地模式/同步模式、draft/official 切换
@@ -2119,17 +2477,48 @@ declare interface ModeIndicatorProps {
2119
2477
  onSelectFolder?: () => void;
2120
2478
  }
2121
2479
 
2480
+ /** 整行宽的虚线「展开其余 N 条」按钮 */
2481
+ export declare function MoreButton({ label, onClick, inline }: {
2482
+ label: string;
2483
+ onClick: () => void;
2484
+ /** inline = chip 牆里的「更多 N 種」,非整行 */
2485
+ inline?: boolean;
2486
+ }): JSX.Element;
2487
+
2122
2488
  /**
2123
2489
  * 将任意格式的 volume_book_mapping.json 归一化为统一的 VolumeBookMapping。
2124
2490
  */
2125
2491
  export declare function normalizeCatalog(raw: unknown): VolumeBookMapping;
2126
2492
 
2493
+ export declare function normalizeEra(era: string): string;
2494
+
2495
+ /**
2496
+ * 把原始 role 歸到粗類。
2497
+ * 空值歸「撰」——802 條 null + 121 條空串,絕大多數是錄入時省略的作者本人著作。
2498
+ */
2499
+ export declare function normalizeRole(role?: string | null): RoleClass;
2500
+
2501
+ /** volume_index 有 int / number[] / string 三种形态(生产仓实测),统一成 number[] */
2502
+ export declare function normalizeVolumeIndex(vi: unknown): number[];
2503
+
2504
+ /** 归一化 volumes:补齐 URL */
2505
+ export declare function normalizeVolumes(item: ResourceEntry): ResourceVolume[] | null;
2506
+
2507
+ export declare function numberToChinese(n: number): string;
2508
+
2509
+ export declare const PAGE_MAX_WIDTH = 1000;
2510
+
2127
2511
  /** 页数 */
2128
2512
  export declare interface PageCount {
2129
2513
  number?: number;
2130
2514
  description?: string;
2131
2515
  }
2132
2516
 
2517
+ export declare function PageFrame({ children, style }: {
2518
+ children: default_2.ReactNode;
2519
+ style?: default_2.CSSProperties;
2520
+ }): JSX.Element;
2521
+
2133
2522
  /** 分页结果 */
2134
2523
  export declare interface PageResult<T> {
2135
2524
  entries: T[];
@@ -2138,6 +2527,9 @@ export declare interface PageResult<T> {
2138
2527
  pageSize: number;
2139
2528
  }
2140
2529
 
2530
+ /** 解析「四十三」「廿四」「元」这类中文序数 */
2531
+ export declare function parseChineseNumber(s: string): number | undefined;
2532
+
2141
2533
  export declare function parseId(id: bigint): IdComponents;
2142
2534
 
2143
2535
  /** 解析 JSON 格式的来源数组 */
@@ -2168,6 +2560,12 @@ export declare interface PublicationInfo {
2168
2560
  details?: string;
2169
2561
  }
2170
2562
 
2563
+ /** 展开区里的引文块(提要 / 按语 / 附按) */
2564
+ export declare function Quote({ label, children }: {
2565
+ label?: string;
2566
+ children: default_2.ReactNode;
2567
+ }): JSX.Element;
2568
+
2171
2569
  /** 推荐数据 */
2172
2570
  export declare interface RecommendedData {
2173
2571
  groups: RecommendedGroup[];
@@ -2221,6 +2619,19 @@ export declare interface RelatedEntity {
2221
2619
  type: IndexType;
2222
2620
  }
2223
2621
 
2622
+ export declare interface RelatedGroup {
2623
+ key: string;
2624
+ /** i18n key,UI 侧翻译 */
2625
+ labelKey: 'belongsToWork' | 'containedWorks' | 'derivativeWorks' | 'studies' | 'relatedWorks';
2626
+ items: RelatedWorkRef[];
2627
+ }
2628
+
2629
+ export declare interface RelatedWorkRef {
2630
+ id: string;
2631
+ title: string;
2632
+ relation?: string;
2633
+ }
2634
+
2224
2635
  /** 关联关系数据 */
2225
2636
  export declare interface RelationData {
2226
2637
  parentWork?: RelatedEntity;
@@ -2254,6 +2665,8 @@ declare interface RelationPanelProps {
2254
2665
  onSaveRelations?: () => void;
2255
2666
  }
2256
2667
 
2668
+ export declare type RenderLink = (id: string, label?: string, ctx?: LinkContext) => default_2.ReactNode;
2669
+
2257
2670
  /**
2258
2671
  * 指向开源数据源文件的 GitHub icon 链接。
2259
2672
  * 库内不感知具体仓库,由调用方传入 href。
@@ -2271,6 +2684,24 @@ export declare interface RepoSourceLinkProps {
2271
2684
  style?: default_2.CSSProperties;
2272
2685
  }
2273
2686
 
2687
+ /** 已解析的版本条目(BookDetailData 的子集 + 派生字段) */
2688
+ export declare interface ResolvedVersion {
2689
+ id: string;
2690
+ title?: string;
2691
+ edition?: string;
2692
+ type?: string;
2693
+ resources?: ResourceEntry[];
2694
+ resource_groups?: Record<string, ResourceGroupInfo>;
2695
+ publication_info?: BookDetailData['publication_info'];
2696
+ current_location?: BookDetailData['current_location'];
2697
+ lineage?: BookDetailData['lineage'];
2698
+ }
2699
+
2700
+ export declare interface ResourceBucket {
2701
+ key: 'text' | 'image' | 'textImage' | 'physical';
2702
+ items: ResourceEntry[];
2703
+ }
2704
+
2274
2705
  /** 带资源信息的丛编目录 */
2275
2706
  export declare interface ResourceCatalog {
2276
2707
  resource_id: string;
@@ -2319,18 +2750,46 @@ export declare interface ResourceEntry {
2319
2750
  group_role?: 'origin' | 'mirror';
2320
2751
  }
2321
2752
 
2753
+ /** 资源分组:标题 + 右上标签 + 若干行 */
2754
+ export declare function ResourceGroup({ title, tag, children }: {
2755
+ title: string;
2756
+ tag?: string;
2757
+ children: default_2.ReactNode;
2758
+ }): JSX.Element;
2759
+
2322
2760
  /** Book/Work 上的资源组元数据:每个 group key 对应一组同源镜像的展示信息 */
2323
2761
  declare interface ResourceGroupInfo {
2324
2762
  label?: string;
2325
2763
  description?: string;
2326
2764
  }
2327
2765
 
2766
+ /** 资源的最终跳转地址(有页码范围时直达起始页) */
2767
+ export declare function resourceHref(item: ResourceEntry): string | undefined;
2768
+
2328
2769
  /** 资源导入状态 */
2329
2770
  export declare type ResourceImportStatus = 'todo' | 'in_progress' | 'done';
2330
2771
 
2331
2772
  /** 资源导入类型 */
2332
2773
  export declare type ResourceImportType = 'catalog' | 'collection';
2333
2774
 
2775
+ /**
2776
+ * 资源行(含分册展开)。
2777
+ *
2778
+ * 三张页面原先各写了一份:作品页 ResourceLine、版本页 BookResourceLine、
2779
+ * 丛编页 CollectionResourceLine —— 名称解析、note 拼接、分册展开按钮、
2780
+ * 缺册划线的样式全都是复制过去的,其中版本页那份连 VolumeLinks 都内联了
2781
+ * 一遍。合成一个,差异用 props 表达。
2782
+ */
2783
+ export declare function ResourceLine({ item, siblings, showVolumes, fallbackNote, }: {
2784
+ item: ResourceEntry;
2785
+ /** 同组资源,用于给重名条目加区分后缀(史記在 CText 上三条同名) */
2786
+ siblings?: ResourceEntry[];
2787
+ /** 关掉分册展开:册号已在别处逐个列出时(版本页的「收入叢編」) */
2788
+ showVolumes?: boolean;
2789
+ /** note 为空时的兜底(丛编页用 details 补) */
2790
+ fallbackNote?: string;
2791
+ }): JSX.Element;
2792
+
2334
2793
  /**
2335
2794
  * 只读资源列表
2336
2795
  * 用于 kaiyuanguji-web 等场景的资源展示
@@ -2349,6 +2808,12 @@ declare interface ResourceListProps {
2349
2808
  renderLink?: (id: string, label?: string) => default_2.ReactNode;
2350
2809
  }
2351
2810
 
2811
+ /**
2812
+ * 资源的一行说明文字(设计稿里名称下方的小字)。
2813
+ * 例:「原卷掃描 · 23 / 23 冊」「精校版 · 圖文對照」「文淵閣本 · v224」
2814
+ */
2815
+ export declare function resourceNote(item: ResourceEntry): string;
2816
+
2352
2817
  /** 资源导入进度数据 */
2353
2818
  export declare interface ResourceProgress {
2354
2819
  resources: ResourceProgressItem[];
@@ -2376,6 +2841,15 @@ export declare interface ResourceProgressItem {
2376
2841
  notes?: string;
2377
2842
  }
2378
2843
 
2844
+ /** 资源行:名称 + note + 外链箭头 */
2845
+ export declare function ResourceRow({ name, note, href, extra }: {
2846
+ name: default_2.ReactNode;
2847
+ note?: string;
2848
+ href?: string;
2849
+ /** 行尾附加内容(如分册展开按钮) */
2850
+ extra?: default_2.ReactNode;
2851
+ }): JSX.Element;
2852
+
2379
2853
  /** 资源类型(旧版兼容:可单值或组合)。新数据应用 `types: ResourceTypeAtom[]` */
2380
2854
  export declare type ResourceType = ResourceTypeAtom | 'text+image';
2381
2855
 
@@ -2396,6 +2870,34 @@ export declare interface ResourceVolume {
2396
2870
  [key: string]: unknown;
2397
2871
  }
2398
2872
 
2873
+ export declare const ROLE_CLASS_ORDER: RoleClass[];
2874
+
2875
+ /**
2876
+ * 職任歸一。
2877
+ *
2878
+ * 生產倉全量 62,068 條人物—作品關聯裡出現了 **307 種不同寫法**:
2879
+ * 撰 51,247(82.6%)· 作 2,440 · 編 2,008 · 注 1,003 · 修 927 · 纂修 876 …
2880
+ * 長尾則是「等奉敕撰」「舊題撰」「集解」「校正並音釋」這類,
2881
+ * 還混著繁簡兩寫(輯/辑、註/注、刪/删、傳/传、贊/赞)與私用區壞字。
2882
+ *
2883
+ * 不歸一的話篩選 chips 會炸出上百個按鈕,且「撰」與「等奉敕撰」分屬兩組。
2884
+ * 這裡只歸「篩選用的粗類」,原始寫法仍原樣顯示在「職任」列裡——
2885
+ * 「等奉敕撰」與「撰」的區別對版本學是有意義的,不能真的抹掉。
2886
+ */
2887
+ export declare type RoleClass = '撰' | '編' | '注' | '校' | '譯' | '繪' | '其他';
2888
+
2889
+ export declare interface RoleFacet {
2890
+ cls: RoleClass | '全部';
2891
+ label: string;
2892
+ count: number;
2893
+ }
2894
+
2895
+ /** 統計各粗類條數,供篩選 chips 用;空類不出現 */
2896
+ export declare function roleFacets(roles: (string | null | undefined)[]): RoleFacet[];
2897
+
2898
+ /** 行号:统一补零到两位 */
2899
+ export declare function rowNo(i: number): string;
2900
+
2399
2901
  export declare const SearchInput: default_2.FC<SearchInputProps>;
2400
2902
 
2401
2903
  export declare interface SearchInputProps {
@@ -2411,6 +2913,16 @@ export declare interface SearchInputProps {
2411
2913
 
2412
2914
  export declare const Section: default_2.FC<SectionProps>;
2413
2915
 
2916
+ /** 区块头:徽章 + 标题 + 计数 | 右侧动作 */
2917
+ export declare function SectionHead({ glyph, tone, title, count, actions, id }: {
2918
+ glyph: string;
2919
+ tone?: 'accent' | 'ink';
2920
+ title: string;
2921
+ count?: default_2.ReactNode;
2922
+ actions?: default_2.ReactNode;
2923
+ id?: string;
2924
+ }): JSX.Element;
2925
+
2414
2926
  declare interface SectionProps {
2415
2927
  title: string;
2416
2928
  /** 保存按钮回调 */
@@ -2482,9 +2994,73 @@ export declare interface SyncConfig {
2482
2994
 
2483
2995
  declare type TabKey = 'recommend' | 'catalog' | 'collection' | 'site' | 'feedback';
2484
2996
 
2997
+ /** 表头。窄屏由 CSS 隐藏(meta 折到第二行后表头就没意义了)。 */
2998
+ export declare function TableHead({ spec }: {
2999
+ spec: TableSpec;
3000
+ }): JSX.Element;
3001
+
3002
+ /** 表格行:行号 + 主内容 + meta 组合列。宽度取自与表头同一份 spec。 */
3003
+ export declare function TableRow({ no, main, meta, spec }: {
3004
+ no: default_2.ReactNode;
3005
+ main: default_2.ReactNode;
3006
+ meta: default_2.ReactNode;
3007
+ spec: TableSpec;
3008
+ }): JSX.Element;
3009
+
3010
+ /**
3011
+ * 表格列规格。
3012
+ *
3013
+ * 表头与每一行必须用同一份宽度,否则列会错位。原先三张页面各自把
3014
+ * leadWidth / metaWidth / metaColumns 手抄进 TableHead 和 TableRow 两处
3015
+ * (作品页 22/424、丛编页 26/300、人物页 26/300),改一处忘一处就错位。
3016
+ * 现在一处声明、两处消费。
3017
+ */
3018
+ export declare interface TableSpec {
3019
+ /** 行号列宽 */
3020
+ leadWidth: number;
3021
+ /** meta 区总宽 */
3022
+ metaWidth: number;
3023
+ /** meta 区各子列:表头文案 + 宽度 */
3024
+ columns: {
3025
+ label: string;
3026
+ width: string;
3027
+ }[];
3028
+ /** 主列表头文案 */
3029
+ mainLabel: string;
3030
+ }
3031
+
3032
+ /**
3033
+ * 标签 + chip 的一行(别名 / 附载篇目 / 附录)。
3034
+ * 作品页的 TagRows 与版本页的 AliasRow 原是同一段样式的两份拷贝。
3035
+ */
3036
+ export declare function TagRow({ label, items }: {
3037
+ label: string;
3038
+ items: string[];
3039
+ }): JSX.Element | null;
3040
+
3041
+ /** 若干 TagRow 竖排 */
3042
+ export declare function TagRows({ rows }: {
3043
+ rows: {
3044
+ label: string;
3045
+ items: string[];
3046
+ }[];
3047
+ }): JSX.Element | null;
3048
+
3049
+ /** 文字按钮(排序切换等),带下划线 */
3050
+ export declare function TextButton({ label, onClick }: {
3051
+ label: string;
3052
+ onClick?: () => void;
3053
+ }): JSX.Element;
3054
+
2485
3055
  /** 整理本文本质量等级 */
2486
3056
  declare type TextQualityGrade = 'published' | 'fine' | 'rough' | 'ocr';
2487
3057
 
3058
+ /** 顶条:品牌/面包屑 | 右侧动作 */
3059
+ export declare function TopStrip({ breadcrumb, actions }: {
3060
+ breadcrumb: default_2.ReactNode;
3061
+ actions?: default_2.ReactNode;
3062
+ }): JSX.Element;
3063
+
2488
3064
  export declare function useBidUrl(): BidUrlBuilder;
2489
3065
 
2490
3066
  /**
@@ -2661,6 +3237,59 @@ export declare interface VersionLineageViewProps {
2661
3237
  style?: default_2.CSSProperties;
2662
3238
  }
2663
3239
 
3240
+ /**
3241
+ * 版本分组:核心集直接展开,其余按 group 折叠。
3242
+ * (从 IndexDetail.computeVersionPartition 迁入,逻辑不变)
3243
+ */
3244
+ export declare interface VersionPartition {
3245
+ useGrouping: boolean;
3246
+ coreIds: string[];
3247
+ groupedIds: {
3248
+ id: string;
3249
+ label: string;
3250
+ description?: string;
3251
+ ids: string[];
3252
+ }[];
3253
+ }
3254
+
3255
+ export declare interface VersionRow {
3256
+ id: string;
3257
+ /** 显示名:edition 优先(96.4% 有),回退 title */
3258
+ name: string;
3259
+ era: DerivedEra;
3260
+ year?: number;
3261
+ /** 影印图源(types 含 image 的资源) */
3262
+ images: ResourceEntry[];
3263
+ /** 收藏机构(types 含 physical 的资源 + current_location) */
3264
+ holders: ResourceEntry[];
3265
+ /** current_location.name —— 没有 physical 资源时的回退 */
3266
+ locationName?: string;
3267
+ /** 是否重点版本(在 version_graph 核心集内) */
3268
+ important: boolean;
3269
+ /** 所属分组 id(version_graph.node_groups) */
3270
+ group?: string;
3271
+ hasImage: boolean;
3272
+ }
3273
+
3274
+ export declare interface VersionTable {
3275
+ rows: VersionRow[];
3276
+ /** 全部行(未筛选),用于计数 */
3277
+ allRows: VersionRow[];
3278
+ /** 可用的朝代筛选项(按历史顺序) */
3279
+ eras: string[];
3280
+ /** 是否有任何一行的年代是推断出来的(UI 据此显示说明) */
3281
+ hasInferredEra: boolean;
3282
+ }
3283
+
3284
+ export declare interface VersionTableOptions {
3285
+ /** 朝代筛选,空串或 undefined = 全部 */
3286
+ era?: string;
3287
+ /** 仅看有影印 */
3288
+ scanOnly?: boolean;
3289
+ /** 排序:default = 录入序(人工排的重要程度);year = 年代先后 */
3290
+ sort?: 'default' | 'year';
3291
+ }
3292
+
2664
3293
  /** 丛编目录中的书目条目(统一格式,归一化后) */
2665
3294
  export declare interface VolumeBookEntry {
2666
3295
  title: string;
@@ -2701,6 +3330,13 @@ export declare interface VolumeBookStats {
2701
3330
  total_found_volumes?: number;
2702
3331
  }
2703
3332
 
3333
+ /** 册次方块(版本页「收入叢編」的 321…343) */
3334
+ export declare function VolumeChips({ volumes, unit, max }: {
3335
+ volumes: number[];
3336
+ unit?: string;
3337
+ max?: number;
3338
+ }): JSX.Element | null;
3339
+
2704
3340
  /** 册级详细信息(来源 URL、状态等) */
2705
3341
  export declare interface VolumeDetail {
2706
3342
  volume: number;
@@ -2709,12 +3345,26 @@ export declare interface VolumeDetail {
2709
3345
  file?: string;
2710
3346
  }
2711
3347
 
3348
+ /** 分册链接网格:缺册划线,无链接的册号显示为灰字 */
3349
+ export declare function VolumeLinks({ item }: {
3350
+ item: ResourceEntry;
3351
+ }): JSX.Element;
3352
+
2712
3353
  /** 丛编分部 */
2713
3354
  export declare interface VolumeSection {
2714
3355
  name: string;
2715
3356
  volume_range: [number, number];
2716
3357
  }
2717
3358
 
3359
+ /** 分册统计(按册号去重——同一册可在多个 group 中出现,如跨 Work 共册) */
3360
+ export declare interface VolumeStats {
3361
+ found: number;
3362
+ missing: number;
3363
+ expected: number;
3364
+ }
3365
+
3366
+ export declare function volumeStats(item: ResourceEntry): VolumeStats | null;
3367
+
2718
3368
  export declare const WorkCatalog: default_2.FC<WorkCatalogProps>;
2719
3369
 
2720
3370
  export declare interface WorkCatalogProps {
@@ -2746,4 +3396,15 @@ export declare interface WorkDetailData extends BaseDetailData {
2746
3396
  version_graph?: VersionGraph;
2747
3397
  }
2748
3398
 
3399
+ export declare const WorkPage: default_2.FC<WorkPageProps>;
3400
+
3401
+ export declare interface WorkPageProps {
3402
+ data: WorkDetailData;
3403
+ transport?: IndexStorage;
3404
+ onNavigate?: (id: string) => void;
3405
+ renderLink?: RenderLink;
3406
+ /** 版本传承入口(由 layout 注入,渲染在版本区块头右侧) */
3407
+ lineageAction?: default_2.ReactNode;
3408
+ }
3409
+
2749
3410
  export { }