@hamster-note/reader 0.2.0-beta.1
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/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/components/IntermediateDocumentViewer/IntermediateDocumentPageContent.d.ts +40 -0
- package/dist/components/IntermediateDocumentViewer/IntermediateDocumentPageContent.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/IntermediateDocumentViewer.d.ts +356 -0
- package/dist/components/IntermediateDocumentViewer/IntermediateDocumentViewer.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/index.d.ts +7 -0
- package/dist/components/IntermediateDocumentViewer/index.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/pageContentGeometry.d.ts +84 -0
- package/dist/components/IntermediateDocumentViewer/pageContentGeometry.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/rangeJumpHelpers.d.ts +131 -0
- package/dist/components/IntermediateDocumentViewer/rangeJumpHelpers.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/renderTiming.d.ts +44 -0
- package/dist/components/IntermediateDocumentViewer/renderTiming.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/selectionAdapter.d.ts +25 -0
- package/dist/components/IntermediateDocumentViewer/selectionAdapter.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/textSpanStyle.d.ts +4 -0
- package/dist/components/IntermediateDocumentViewer/textSpanStyle.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer/useLazyPageQueue.d.ts +73 -0
- package/dist/components/IntermediateDocumentViewer/useLazyPageQueue.d.ts.map +1 -0
- package/dist/components/IntermediateDocumentViewer.d.ts +2 -0
- package/dist/components/IntermediateDocumentViewer.d.ts.map +1 -0
- package/dist/components/PopoverPortal.d.ts +21 -0
- package/dist/components/PopoverPortal.d.ts.map +1 -0
- package/dist/components/Reader.d.ts +122 -0
- package/dist/components/Reader.d.ts.map +1 -0
- package/dist/components/gestureRouting.d.ts +73 -0
- package/dist/components/gestureRouting.d.ts.map +1 -0
- package/dist/components/selection/caretResolver.d.ts +33 -0
- package/dist/components/selection/caretResolver.d.ts.map +1 -0
- package/dist/components/selection/index.d.ts +2 -0
- package/dist/components/selection/index.d.ts.map +1 -0
- package/dist/components/selection/savedSelection.d.ts +71 -0
- package/dist/components/selection/savedSelection.d.ts.map +1 -0
- package/dist/components/selection/selectionComposer.d.ts +3 -0
- package/dist/components/selection/selectionComposer.d.ts.map +1 -0
- package/dist/components/selection/selectionPayloadSerializer.d.ts +21 -0
- package/dist/components/selection/selectionPayloadSerializer.d.ts.map +1 -0
- package/dist/components/selection/wordRange.d.ts +17 -0
- package/dist/components/selection/wordRange.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2933 -0
- package/dist/style.css +323 -0
- package/dist/types/selection.d.ts +42 -0
- package/dist/types/selection.d.ts.map +1 -0
- package/dist/vendor/clipper-lib.d.ts +3 -0
- package/dist/vendor/clipper-lib.d.ts.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderTiming.d.ts","sourceRoot":"","sources":["../../../src/components/IntermediateDocumentViewer/renderTiming.ts"],"names":[],"mappings":"AAGA,eAAe;AACf,MAAM,MAAM,qCAAqC,GAC7C,qBAAqB,GACrB,iBAAiB,GACjB,sBAAsB,GACtB,oBAAoB,GACpB,wBAAwB,GACxB,yBAAyB,GACzB,kBAAkB,GAClB,gBAAgB,CAAA;AAEpB,eAAe;AACf,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AAC1D,MAAM,WAAW,qCAAqC;IACpD,KAAK,EAAE,qCAAqC,CAAA;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;CAC/C;AAED,aAAa;AACb,MAAM,MAAM,wCAAwC,GAAG,CACrD,KAAK,EAAE,qCAAqC,KACzC,IAAI,CAAA;AAET,kBAAkB;AAClB,MAAM,WAAW,qCAAqC;IACpD,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB;AAED,aAAa;AACb,MAAM,WAAW,6CAA6C;IAC5D,QAAQ,CAAC,EAAE,wCAAwC,CAAA;IACnD,KAAK,CAAC,EAAE,qCAAqC,CAAA;IAC7C,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,kBAAkB;AAClB,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,sCAAsC;IACtC,KAAK,EAAE,CACL,KAAK,EAAE,qCAAqC,EAC5C,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KACrC,KACE,MAAM,IAAI,CAAA;IACf,4BAA4B;IAC5B,OAAO,EAAE,CAAC,CAAC,EACT,KAAK,EAAE,qCAAqC,EAC5C,OAAO,EACH;QACE,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KACrC,GACD,SAAS,EACb,EAAE,EAAE,MAAM,CAAC,KACR,CAAC,CAAA;IACN,uBAAuB;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,CAAA;CAC/D;AA+BD,qCAAqC;AACrC,wBAAgB,sCAAsC,CACpD,OAAO,CAAC,EAAE,6CAA6C,GACtD,gCAAgC,CAwDlC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LinkedSelectionData, LinkedSelectionRange } from '@hamster-note/selection';
|
|
2
|
+
import type { ReaderLinkedSelectionData, ReaderSelectionOverlayRectType, ReaderSelectionRange } from '../../types/selection';
|
|
3
|
+
export type RuntimeLinkedSelectionTransient = {
|
|
4
|
+
selectionOrder?: LinkedSelectionData['selectionOrder'];
|
|
5
|
+
draggingRange?: LinkedSelectionData['draggingRange'];
|
|
6
|
+
selectingText?: LinkedSelectionData['selectingText'];
|
|
7
|
+
activeRange?: LinkedSelectionData['activeRange'];
|
|
8
|
+
};
|
|
9
|
+
export type RuntimeLinkedSelectionDataInput = {
|
|
10
|
+
readonly scopeId: string;
|
|
11
|
+
readonly ranges: readonly ReaderSelectionRange[];
|
|
12
|
+
readonly selectedRangeId: string | null;
|
|
13
|
+
readonly pageNumbers: readonly number[];
|
|
14
|
+
readonly overlayRectType: ReaderSelectionOverlayRectType;
|
|
15
|
+
readonly transient: RuntimeLinkedSelectionTransient;
|
|
16
|
+
};
|
|
17
|
+
export declare function runtimePageSelectionId(scopeId: string, pageNumber: number): string;
|
|
18
|
+
export declare function mapPublicRangesToRuntime(ranges: readonly ReaderSelectionRange[], scopeId: string): LinkedSelectionRange[];
|
|
19
|
+
export declare function mapRuntimeRangesToPublic(ranges: readonly LinkedSelectionRange[], scopeId: string): ReaderSelectionRange[];
|
|
20
|
+
export declare function mapRuntimeLinkedDataToPublic(data: LinkedSelectionData, scopeId: string): ReaderLinkedSelectionData;
|
|
21
|
+
export declare function buildRuntimeLinkedSelectionData({ scopeId, ranges, selectedRangeId, pageNumbers, overlayRectType, transient }: RuntimeLinkedSelectionDataInput): LinkedSelectionData;
|
|
22
|
+
export declare function extractRuntimeLinkedTransient(data: LinkedSelectionData): RuntimeLinkedSelectionTransient;
|
|
23
|
+
export declare function areRuntimeLinkedTransientsEqual(left: RuntimeLinkedSelectionTransient, right: RuntimeLinkedSelectionTransient): boolean;
|
|
24
|
+
export declare function mapRuntimeRangeToPublic(range: LinkedSelectionRange, scopeId: string): ReaderSelectionRange | null;
|
|
25
|
+
//# sourceMappingURL=selectionAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionAdapter.d.ts","sourceRoot":"","sources":["../../../src/components/IntermediateDocumentViewer/selectionAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EACV,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EAErB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IACtD,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAA;IACpD,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAA;IACpD,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAA;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,QAAQ,CAAC,eAAe,EAAE,8BAA8B,CAAA;IACxD,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAA;CACpD,CAAA;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,oBAAoB,EAAE,EACvC,OAAO,EAAE,MAAM,GACd,oBAAoB,EAAE,CAUxB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,oBAAoB,EAAE,EACvC,OAAO,EAAE,MAAM,GACd,oBAAoB,EAAE,CAKxB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,GACd,yBAAyB,CAoB3B;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,OAAO,EACP,MAAM,EACN,eAAe,EACf,WAAW,EACX,eAAe,EACf,SAAS,EACV,EAAE,+BAA+B,GAAG,mBAAmB,CAcvD;AAqBD,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,mBAAmB,GACxB,+BAA+B,CAoBjC;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,+BAA+B,EACrC,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAOT;AA2ED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,MAAM,GACd,oBAAoB,GAAG,IAAI,CA6B7B"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
import { getTextBbox, type RenderableIntermediateText } from './pageContentGeometry';
|
|
3
|
+
export declare const buildTextSpanStyle: (text: RenderableIntermediateText, bbox: ReturnType<typeof getTextBbox>, enableTextWidthScale?: boolean) => CSSProperties;
|
|
4
|
+
//# sourceMappingURL=textSpanStyle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textSpanStyle.d.ts","sourceRoot":"","sources":["../../../src/components/IntermediateDocumentViewer/textSpanStyle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAEL,WAAW,EACX,KAAK,0BAA0B,EAChC,MAAM,uBAAuB,CAAA;AAsF9B,eAAO,MAAM,kBAAkB,GAC7B,MAAM,0BAA0B,EAChC,MAAM,UAAU,CAAC,OAAO,WAAW,CAAC,EACpC,8BAA4B,KAC3B,aAyCF,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { IntermediateContent, IntermediateDocument, IntermediateImage, IntermediateText } from '@hamster-note/types';
|
|
2
|
+
/**
|
|
3
|
+
* 懒加载页面队列的参数配置。由 `IntermediateDocumentViewer` 通过
|
|
4
|
+
* `lazyQueueConfigRef.current` 提供实时值,队列在每次调度时读取最新配置,
|
|
5
|
+
* 避免参数膨胀并保证配置变更后立即生效。
|
|
6
|
+
*/
|
|
7
|
+
export interface LazyPageQueueConfig {
|
|
8
|
+
/** 初始立即加载的页数(默认 1) */
|
|
9
|
+
initialLoadedPages: number;
|
|
10
|
+
/** 同时并发加载的页数上限(默认 3) */
|
|
11
|
+
pageLoadConcurrency: number;
|
|
12
|
+
/**
|
|
13
|
+
* 页面进入可加载窗口后、真正发起加载前的延迟(毫秒)。
|
|
14
|
+
* 当前阶段仅用于初始页面之后的可见性触发(后续任务实现),
|
|
15
|
+
* 初始页面不受此延迟限制。
|
|
16
|
+
*/
|
|
17
|
+
pageLoadEnterDelayMs: number;
|
|
18
|
+
/** 页面离开可加载窗口后、卸载其内容的延迟(毫秒),后续任务实现 */
|
|
19
|
+
pageUnloadDelayMs: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 页面内容加载结果处理回调集合。队列加载完一页后调用这些回调,
|
|
23
|
+
* 由 `IntermediateDocumentViewer` 提供具体的状态更新实现,
|
|
24
|
+
* 复用现有的 immutable updater helpers(createSet*Handler)。
|
|
25
|
+
*/
|
|
26
|
+
export interface LazyPageQueueCallbacks {
|
|
27
|
+
/** 页面加载成功后,更新底图/文本/图片/状态 */
|
|
28
|
+
onPageLoaded: (params: {
|
|
29
|
+
pageNumber: number;
|
|
30
|
+
baseImage: string | undefined;
|
|
31
|
+
texts: IntermediateText[];
|
|
32
|
+
images: IntermediateImage[];
|
|
33
|
+
}) => void;
|
|
34
|
+
/** 页面加载失败后,清空该页的状态并标记为 'error' */
|
|
35
|
+
onPageError: (pageNumber: number) => void;
|
|
36
|
+
/** 判断某页是否已加载(texts map 已有该页条目) */
|
|
37
|
+
isPageLoaded: (pageNumber: number) => boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* `useLazyPageQueue` 返回的稳定函数集合。
|
|
41
|
+
* - `enqueueInitialPages`:在 shell 就绪后入队前 `initialLoadedPages` 页。
|
|
42
|
+
* - `enqueuePage`:入队单个页码(例如由可见性观察器触发)。
|
|
43
|
+
* - `cancelAll`:清空队列并忽略在途结果。
|
|
44
|
+
*/
|
|
45
|
+
export interface LazyPageQueueApi {
|
|
46
|
+
enqueueInitialPages: (pageNumbers: number[]) => void;
|
|
47
|
+
enqueuePage: (pageNumber: number) => void;
|
|
48
|
+
cancelAll: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* intermediate-document 默认模式的懒加载页面队列 hook。
|
|
52
|
+
*
|
|
53
|
+
* 设计要点:
|
|
54
|
+
* - 队列项是 **页码**(number),不是已加载的 `IntermediatePage` 对象。
|
|
55
|
+
* - 在开始一个队列项前,重新检查:document 仍是当前活动文档、页码仍在当前 pageNumbers 中、未已加载/在途。
|
|
56
|
+
* - 通过 `loadingPagesRef`(Set<number>)强制并发上限 `pageLoadConcurrency`。
|
|
57
|
+
* - 对 queued/in-flight/loaded 页码去重。
|
|
58
|
+
* - `cancelAll` 清空队列;在途 async 结果通过 generation token 被忽略。
|
|
59
|
+
*
|
|
60
|
+
* 加载流程:`getPageByPageNumber` → `getBaseImageFromPage` + `getPageContentEntries`
|
|
61
|
+
* → 用 `isIntermediateText`/`isIntermediateImage` 过滤 → 调用 callbacks 更新状态。
|
|
62
|
+
*/
|
|
63
|
+
export declare function useLazyPageQueue(configRef: React.MutableRefObject<LazyPageQueueConfig>, runtimeDocument: IntermediateDocument | null, options: {
|
|
64
|
+
activeDocumentRef: React.MutableRefObject<IntermediateDocument | null>;
|
|
65
|
+
isMountedRef: React.MutableRefObject<boolean>;
|
|
66
|
+
loadingPagesRef: React.MutableRefObject<Set<number>>;
|
|
67
|
+
getBaseImageFromPage: (page: unknown) => Promise<string | undefined>;
|
|
68
|
+
getPageContentEntries: (page: unknown) => Promise<IntermediateContent[]>;
|
|
69
|
+
isIntermediateText: (content: IntermediateContent) => content is IntermediateText;
|
|
70
|
+
isIntermediateImage: (content: IntermediateContent) => content is IntermediateImage;
|
|
71
|
+
callbacks: LazyPageQueueCallbacks;
|
|
72
|
+
}): LazyPageQueueApi;
|
|
73
|
+
//# sourceMappingURL=useLazyPageQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLazyPageQueue.d.ts","sourceRoot":"","sources":["../../../src/components/IntermediateDocumentViewer/useLazyPageQueue.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAE5B;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,sBAAsB;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,wBAAwB;IACxB,mBAAmB,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qCAAqC;IACrC,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,KAAK,EAAE,gBAAgB,EAAE,CAAA;QACzB,MAAM,EAAE,iBAAiB,EAAE,CAAA;KAC5B,KAAK,IAAI,CAAA;IACV,kCAAkC;IAClC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,kCAAkC;IAClC,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAA;CAC9C;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACpD,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,EACtD,eAAe,EAAE,oBAAoB,GAAG,IAAI,EAC5C,OAAO,EAAE;IACP,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IACtE,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACpD,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACpE,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACxE,kBAAkB,EAAE,CAClB,OAAO,EAAE,mBAAmB,KACzB,OAAO,IAAI,gBAAgB,CAAA;IAChC,mBAAmB,EAAE,CACnB,OAAO,EAAE,mBAAmB,KACzB,OAAO,IAAI,iBAAiB,CAAA;IACjC,SAAS,EAAE,sBAAsB,CAAA;CAClC,GACA,gBAAgB,CAkSlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntermediateDocumentViewer.d.ts","sourceRoot":"","sources":["../../src/components/IntermediateDocumentViewer.tsx"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* PopoverPortal —— 将 popover 内容通过 React Portal 渲染到 document.body,
|
|
4
|
+
* 使其脱离 VirtualPaper 的 CSS transform(scale / translate)影响。
|
|
5
|
+
*
|
|
6
|
+
* 核心思路:
|
|
7
|
+
* 1. 在 .hsn-selection-popover 内部渲染一个 0x0 的隐藏 anchor div
|
|
8
|
+
* 2. 通过 rAF 循环持续读取 anchor 的 getBoundingClientRect()(视口坐标)
|
|
9
|
+
* 3. 将实际内容以 position:fixed 渲染到 body,位置与 anchor 对齐
|
|
10
|
+
* 4. transform: translate(-50%,-100%) 与 .hsn-selection-popover 原有定位逻辑一致
|
|
11
|
+
*
|
|
12
|
+
* 这样 popover 的屏幕尺寸不会随 zoom 缩放,始终保持原始大小。
|
|
13
|
+
*
|
|
14
|
+
* @param visible 控制 portal 内容是否显示(用于 VirtualPaper transform debounce)
|
|
15
|
+
* @param children 实际 popover 内容(按钮、颜色选择器等)
|
|
16
|
+
*/
|
|
17
|
+
export declare function PopoverPortal({ children, visible }: {
|
|
18
|
+
children: React.ReactNode;
|
|
19
|
+
visible: boolean;
|
|
20
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=PopoverPortal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverPortal.d.ts","sourceRoot":"","sources":["../../src/components/PopoverPortal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAG1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAO,EACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAqGA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { IntermediateDocument, IntermediateDocumentSerialized, IntermediateText } from '@hamster-note/types';
|
|
2
|
+
import type { ReaderInteractionMode, ReaderPageRange, ReaderSelectedTextSegment, ReaderTextSelectionDetail } from './IntermediateDocumentViewer';
|
|
3
|
+
import type { IntermediateDocumentRenderTimingCallback } from './IntermediateDocumentViewer/renderTiming';
|
|
4
|
+
import type { ReaderLinkedSelectionData, ReaderMousePosition, ReaderSelectionOverlayRectType, ReaderSelectionRange, ReaderSelectionRef } from '../types/selection';
|
|
5
|
+
export type ReaderProps = {
|
|
6
|
+
document?: IntermediateDocument | IntermediateDocumentSerialized | null;
|
|
7
|
+
className?: string;
|
|
8
|
+
emptyText?: string;
|
|
9
|
+
onFileUpload?: (file: File) => void;
|
|
10
|
+
overscanPages?: number;
|
|
11
|
+
pageRange?: ReaderPageRange;
|
|
12
|
+
ocr?: boolean | {
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
};
|
|
15
|
+
onOcrError?: (error: unknown, detail: {
|
|
16
|
+
pageNumber: number;
|
|
17
|
+
}) => void;
|
|
18
|
+
onTextSelectionChange?: (text: IntermediateText, detail: ReaderTextSelectionDetail) => void;
|
|
19
|
+
onTextSelectionEnd?: (text: IntermediateText, detail: ReaderTextSelectionDetail) => void;
|
|
20
|
+
onSelectText?: (selection: Selection, segments: ReaderSelectedTextSegment[], extractedText: string) => void;
|
|
21
|
+
/** 交互模式,透传给 IntermediateDocumentViewer */
|
|
22
|
+
interactionMode?: ReaderInteractionMode;
|
|
23
|
+
/**
|
|
24
|
+
* Controlled zoom scale. When provided, Reader never mutates zoom internally;
|
|
25
|
+
* wheel/pinch gestures only report the next clamped value through
|
|
26
|
+
* `onScaleChange`, and the caller must pass a new `scale` back to update the
|
|
27
|
+
* view. Invalid/non-positive values are ignored in favor of the safe default
|
|
28
|
+
* scale of `1`, clamped to the active bounds.
|
|
29
|
+
*/
|
|
30
|
+
scale?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Initial zoom scale for uncontrolled mode. This value is read once on mount,
|
|
33
|
+
* defaults to `1`, and is clamped to `minScale`/`maxScale`; later
|
|
34
|
+
* `defaultScale` changes do not reset user zoom.
|
|
35
|
+
*/
|
|
36
|
+
defaultScale?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Called after a wheel or pinch gesture requests a real scale change. The
|
|
39
|
+
* first argument is the clamped next scale; `detail.source` identifies the
|
|
40
|
+
* gesture and `detail.focalPoint`, when present, is the viewport point that
|
|
41
|
+
* should remain visually anchored.
|
|
42
|
+
*/
|
|
43
|
+
onScaleChange?: (scale: number, detail: {
|
|
44
|
+
source: 'wheel' | 'pinch';
|
|
45
|
+
focalPoint?: {
|
|
46
|
+
x: number;
|
|
47
|
+
y: number;
|
|
48
|
+
};
|
|
49
|
+
}) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Minimum allowed zoom scale. Defaults to `0.25`; invalid or non-positive
|
|
52
|
+
* values fall back to that default. If `minScale` exceeds `maxScale`, the
|
|
53
|
+
* effective maximum is raised to the minimum so the range remains safe.
|
|
54
|
+
*/
|
|
55
|
+
minScale?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Maximum allowed zoom scale. Defaults to `4`; invalid or non-positive values
|
|
58
|
+
* fall back to that default before the range is normalized.
|
|
59
|
+
*/
|
|
60
|
+
maxScale?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Maximum number of concurrently loaded pages before lazy eviction. The
|
|
63
|
+
* default is `max(5, overscanPages * 2 + 5)`. Only `Infinity` disables
|
|
64
|
+
* eviction entirely; `0`, negative, `NaN`, or other invalid values fall back
|
|
65
|
+
* to the default cap. Finite values are floored by the pages that must remain
|
|
66
|
+
* protected (visible pages, overscan, in-flight work, selections, active
|
|
67
|
+
* drags, and saved-selection anchors), so the runtime may keep more pages than
|
|
68
|
+
*/
|
|
69
|
+
maxLoadedPages?: number;
|
|
70
|
+
/** 受控的已高亮 range 列表 */
|
|
71
|
+
ranges?: ReaderSelectionRange[];
|
|
72
|
+
/** 非受控模式下 ranges 的初始值 */
|
|
73
|
+
defaultRanges?: ReaderSelectionRange[];
|
|
74
|
+
/** 受控的当前选中 range ID */
|
|
75
|
+
selectedRangeId?: string | null;
|
|
76
|
+
/** 非受控模式下 selectedRangeId 的初始值 */
|
|
77
|
+
defaultSelectedRangeId?: string | null;
|
|
78
|
+
/** 用户确认高亮时触发 */
|
|
79
|
+
onSelect?: (range: ReaderSelectionRange) => void;
|
|
80
|
+
onLinkedDataChange?: (next: ReaderLinkedSelectionData) => void;
|
|
81
|
+
onLinkedSelect?: (range: ReaderSelectionRange) => void;
|
|
82
|
+
onLinkedUpdateRange?: (range: ReaderSelectionRange) => void;
|
|
83
|
+
onLinkedSelectRange?: (id: string | null) => void;
|
|
84
|
+
/** 用户点击或取消选中某个已高亮 range 时触发 */
|
|
85
|
+
onSelectRange?: (id: string | null) => void;
|
|
86
|
+
/** 用户拖动已高亮 range 的首尾手柄调整范围时触发 */
|
|
87
|
+
onUpdateRange?: (range: ReaderSelectionRange) => void;
|
|
88
|
+
/** 用户开始选择时触发(容器内 mousedown) */
|
|
89
|
+
onSelectionStart?: (mousePos: ReaderMousePosition, selection: Selection) => void;
|
|
90
|
+
/** 用户结束选择时触发(容器内 mouseup);注意 touch 选择可能不触发 */
|
|
91
|
+
onSelectionEnd?: (mousePos: ReaderMousePosition, selection: Selection) => void;
|
|
92
|
+
/** 执行高亮操作时额外触发(在 onSelect 之后) */
|
|
93
|
+
onHighlight?: (range: ReaderSelectionRange) => void;
|
|
94
|
+
/** 已确认高亮的 Overlay 颜色 */
|
|
95
|
+
highlightColor?: string;
|
|
96
|
+
/** 正在选择中的临时 Overlay 颜色 */
|
|
97
|
+
selectionColor?: string;
|
|
98
|
+
/** 被选中的高亮上方弹出的 Popover 内容 */
|
|
99
|
+
selectionPopover?: React.ReactNode;
|
|
100
|
+
/** 被高亮的片段上方弹出的 Popover 内容,未提供时 fallback 到 selectionPopover */
|
|
101
|
+
highlightPopover?: React.ReactNode;
|
|
102
|
+
/** 是否在选区结束时自动触发高亮,默认为 false */
|
|
103
|
+
autoHighlight?: boolean;
|
|
104
|
+
/** Reader 自有命令式 ref,暴露 highlight()/clear()/scrollToRange(id) */
|
|
105
|
+
selectionRef?: React.Ref<ReaderSelectionRef>;
|
|
106
|
+
/** 选区 Overlay 矩形坐标类型;默认 'percent' */
|
|
107
|
+
overlayRectType?: ReaderSelectionOverlayRectType;
|
|
108
|
+
/** 初始立即加载的页数,转发给 viewer,默认 1 */
|
|
109
|
+
initialLoadedPages?: number;
|
|
110
|
+
/** 并发加载页数上限,转发给 viewer,默认 3 */
|
|
111
|
+
pageLoadConcurrency?: number;
|
|
112
|
+
/** 进入可加载窗口后发起加载前的延迟(毫秒),转发给 viewer,默认 500 */
|
|
113
|
+
pageLoadEnterDelayMs?: number;
|
|
114
|
+
/** 离开可加载窗口后卸载内容的延迟(毫秒),转发给 viewer,默认 5000 */
|
|
115
|
+
pageUnloadDelayMs?: number;
|
|
116
|
+
/** intermediate-document 渲染阶段计时回调,转发给 IntermediateDocumentViewer */
|
|
117
|
+
onIntermediateDocumentRenderTiming?: IntermediateDocumentRenderTimingCallback;
|
|
118
|
+
};
|
|
119
|
+
export declare const SUPPORTED_UPLOAD_ACCEPT = ".pdf,application/pdf,.txt,text/plain,.docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.md,.markdown,text/markdown,text/x-markdown";
|
|
120
|
+
export declare const SUPPORTED_UPLOAD_COPY = "PDF, TXT, DOCX, and Markdown";
|
|
121
|
+
export declare function Reader({ document, className, emptyText, onFileUpload, overscanPages, pageRange, ocr, onOcrError, onTextSelectionChange, onTextSelectionEnd, onSelectText, scale, defaultScale, onScaleChange, minScale, maxScale, maxLoadedPages, interactionMode, ranges, defaultRanges, selectedRangeId, defaultSelectedRangeId, onSelect, onLinkedDataChange, onLinkedSelect, onLinkedUpdateRange, onLinkedSelectRange, onSelectRange, onUpdateRange, onSelectionStart, onSelectionEnd, onHighlight, highlightColor, selectionColor, selectionPopover, highlightPopover, autoHighlight, selectionRef, overlayRectType, initialLoadedPages, pageLoadConcurrency, pageLoadEnterDelayMs, pageUnloadDelayMs, onIntermediateDocumentRenderTiming }: ReaderProps): import("react/jsx-runtime").JSX.Element;
|
|
122
|
+
//# sourceMappingURL=Reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reader.d.ts","sourceRoot":"","sources":["../../src/components/Reader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 手势路由 — 纯逻辑决策层。
|
|
3
|
+
*
|
|
4
|
+
* 根据 `interactionMode`(default / stylus)和 `pointerType`(mouse / touch / pen)
|
|
5
|
+
* 决定某个输入事件应该被路由到哪种行为:
|
|
6
|
+
* - 文本选择(selection)
|
|
7
|
+
* - 长按等待(long-press timer)
|
|
8
|
+
* - 空白点击(blank click)
|
|
9
|
+
*
|
|
10
|
+
* 视口平移/缩放已由 VirtualPaper 处理,本文件不再负责 pan/pinch/wheel 路由。
|
|
11
|
+
* 本文件不维护任何状态,也不操作 DOM;所有决策仅依赖调用方传入的瞬时上下文。
|
|
12
|
+
*/
|
|
13
|
+
import type { ReaderInteractionMode } from './IntermediateDocumentViewer';
|
|
14
|
+
/** 调用方已识别的指针类型。 */
|
|
15
|
+
export type ReaderPointerType = 'mouse' | 'touch' | 'pen' | 'unknown';
|
|
16
|
+
/**
|
|
17
|
+
* 将 PointerEvent.pointerType 归一化为 ReaderPointerType。
|
|
18
|
+
*
|
|
19
|
+
* @param pointerType - PointerEvent.pointerType 值
|
|
20
|
+
* @returns 归一化后的 ReaderPointerType
|
|
21
|
+
*/
|
|
22
|
+
export declare function toReaderPointerType(pointerType: string | undefined): ReaderPointerType;
|
|
23
|
+
/**
|
|
24
|
+
* pointerdown 时是否应该立即启动文本选择(非长按路径)。
|
|
25
|
+
*
|
|
26
|
+
* - default 模式:鼠标和手写笔在文本上立即选择;触摸走长按路径。
|
|
27
|
+
* - stylus 模式:只有手写笔在文本上立即选择。
|
|
28
|
+
*
|
|
29
|
+
* @param args.interactionMode - 当前交互模式
|
|
30
|
+
* @param args.pointerType - 当前指针类型
|
|
31
|
+
* @param args.isOnText - 落点是否在可选文本上
|
|
32
|
+
* @returns 是否允许立即开始选择
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldStartSelectionOnPointerDown(args: {
|
|
35
|
+
interactionMode: ReaderInteractionMode;
|
|
36
|
+
pointerType: ReaderPointerType;
|
|
37
|
+
isOnText: boolean;
|
|
38
|
+
}): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* pointerdown 时是否应该启用手长按定时器。
|
|
41
|
+
*
|
|
42
|
+
* 仅在 default 模式且为单指触摸时启用。
|
|
43
|
+
*
|
|
44
|
+
* @param args.interactionMode - 当前交互模式
|
|
45
|
+
* @param args.pointerType - 当前指针类型
|
|
46
|
+
* @returns 是否启用手长按
|
|
47
|
+
*/
|
|
48
|
+
export declare function shouldArmLongPress(args: {
|
|
49
|
+
interactionMode: ReaderInteractionMode;
|
|
50
|
+
pointerType: ReaderPointerType;
|
|
51
|
+
}): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* pointerdown 时是否应该将事件视为“空白点击”(清除选择但不触发 pan)。
|
|
54
|
+
*
|
|
55
|
+
* 所有模式下,鼠标/触摸/手写笔点击空白区域都属于空白点击。
|
|
56
|
+
*
|
|
57
|
+
* @param args.isOnText - 落点是否在可选文本上
|
|
58
|
+
* @returns 是否视为空白点击
|
|
59
|
+
*/
|
|
60
|
+
export declare function isBlankClick(args: {
|
|
61
|
+
isOnText: boolean;
|
|
62
|
+
}): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* 在 stylus 模式下,是否应该阻止鼠标和触摸的文本选择能力。
|
|
65
|
+
*
|
|
66
|
+
* 这是一个聚合判断,方便上层在 onStart 中快速拦截。
|
|
67
|
+
*
|
|
68
|
+
* @param interactionMode - 当前交互模式
|
|
69
|
+
* @param pointerType - 当前指针类型
|
|
70
|
+
* @returns 是否应该强制阻止选择
|
|
71
|
+
*/
|
|
72
|
+
export declare function shouldForceBlockSelection(interactionMode: ReaderInteractionMode, pointerType: ReaderPointerType): boolean;
|
|
73
|
+
//# sourceMappingURL=gestureRouting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestureRouting.d.ts","sourceRoot":"","sources":["../../src/components/gestureRouting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEzE,mBAAmB;AACnB,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAA;AAErE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,iBAAiB,CASnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,eAAe,EAAE,qBAAqB,CAAA;IACtC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,QAAQ,EAAE,OAAO,CAAA;CAClB,GAAG,OAAO,CAUV;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,eAAe,EAAE,qBAAqB,CAAA;IACtC,WAAW,EAAE,iBAAiB,CAAA;CAC/B,GAAG,OAAO,CAEV;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,qBAAqB,EACtC,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAGT"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IntermediateText } from '@hamster-note/types';
|
|
2
|
+
export type TextElementEntry = {
|
|
3
|
+
text: IntermediateText;
|
|
4
|
+
pageNumber: number;
|
|
5
|
+
};
|
|
6
|
+
export type CaretPositionFromPoint = (x: number, y: number) => {
|
|
7
|
+
offsetNode: Node;
|
|
8
|
+
offset: number;
|
|
9
|
+
} | null;
|
|
10
|
+
export type CaretRangeFromPoint = (x: number, y: number) => Range | null;
|
|
11
|
+
export type ResolveCaretOptions = {
|
|
12
|
+
viewerRoot: HTMLElement;
|
|
13
|
+
pageRefs: Map<number, HTMLDivElement>;
|
|
14
|
+
textElements: Map<string, TextElementEntry>;
|
|
15
|
+
caretPositionFromPoint?: CaretPositionFromPoint;
|
|
16
|
+
caretRangeFromPoint?: CaretRangeFromPoint;
|
|
17
|
+
document?: Document;
|
|
18
|
+
snapToNearestLine?: boolean;
|
|
19
|
+
allowHtmlParserRange?: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare const isSelectionBackgroundTarget: (node: Node | null) => boolean;
|
|
22
|
+
export declare const getPageElementByPageNumber: (pageNumber: number, viewerRoot: HTMLElement, pageRefs: Map<number, HTMLDivElement>) => HTMLElement | null;
|
|
23
|
+
export declare const getPageElementForPoint: (clientX: number, clientY: number, viewerRoot: HTMLElement | null, pageRefs: Map<number, HTMLDivElement>, ownerDocument?: Document) => {
|
|
24
|
+
pageElement: HTMLElement;
|
|
25
|
+
pageNumber: number;
|
|
26
|
+
} | null;
|
|
27
|
+
export declare const getNearestTextElementForPoint: (clientX: number, clientY: number, pageNumber: number, viewerRoot: HTMLElement | null, textElements: Map<string, TextElementEntry>) => HTMLElement | null;
|
|
28
|
+
export declare const isHtmlParserSelectionTarget: (node: Node | null, viewerRoot: HTMLElement) => boolean;
|
|
29
|
+
export declare const resolveCaret: (clientX: number, clientY: number, options: ResolveCaretOptions) => {
|
|
30
|
+
range: Range;
|
|
31
|
+
pageNumber: number;
|
|
32
|
+
} | null;
|
|
33
|
+
//# sourceMappingURL=caretResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caretResolver.d.ts","sourceRoot":"","sources":["../../../src/components/selection/caretResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,KACN;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAA;AAEhD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,CAAA;AAExE,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,WAAW,CAAA;IACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACrC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAC3C,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;IAC/C,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAInB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AA4BD,eAAO,MAAM,2BAA2B,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,OAG/D,CAAA;AAiDD,eAAO,MAAM,0BAA0B,GACrC,YAAY,MAAM,EAClB,YAAY,WAAW,EACvB,UAAU,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,KACpC,WAAW,GAAG,IAWhB,CAAA;AAiHD,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,SAAS,MAAM,EACf,YAAY,WAAW,GAAG,IAAI,EAC9B,UAAU,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACrC,gBAAe,QAA8B,KAC5C;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAUrD,CAAA;AAYD,eAAO,MAAM,6BAA6B,GACxC,SAAS,MAAM,EACf,SAAS,MAAM,EACf,YAAY,MAAM,EAClB,YAAY,WAAW,GAAG,IAAI,EAC9B,cAAc,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAC1C,WAAW,GAAG,IAkChB,CAAA;AA8BD,eAAO,MAAM,2BAA2B,GACtC,MAAM,IAAI,GAAG,IAAI,EACjB,YAAY,WAAW,KACtB,OAMF,CAAA;AAqQD,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,SAAS,MAAM,EACf,SAAS,mBAAmB,KAC3B;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAiFzC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/selection/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { IntermediateText } from '@hamster-note/types';
|
|
2
|
+
import type { ReaderSavedSelection, ReaderSavedSelectionRestoreResult, ReaderSelectionOverlayRect } from '../IntermediateDocumentViewer';
|
|
3
|
+
import type { ReaderSelectedTextSegment } from './selectionPayloadSerializer';
|
|
4
|
+
export type NormalizedRect = {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
export type TextElementInfo = {
|
|
11
|
+
element: HTMLElement;
|
|
12
|
+
text: IntermediateText;
|
|
13
|
+
pageNumber: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 生成轻量、稳定的文本哈希。使用本地 FNV-1a 32 位实现,避免引入依赖。
|
|
17
|
+
*/
|
|
18
|
+
export declare const textHash: (text: string) => string;
|
|
19
|
+
/**
|
|
20
|
+
* 将页面坐标系矩形归一化到 0-1,保存时用于跨缩放比例恢复视觉覆盖层。
|
|
21
|
+
*/
|
|
22
|
+
export declare const normalizePageRects: (rects: ReaderSelectionOverlayRect[], pageSize: {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}) => NormalizedRect[];
|
|
26
|
+
/**
|
|
27
|
+
* 将 0-1 归一化矩形还原为页面坐标系矩形,供视觉回退渲染复用。
|
|
28
|
+
*/
|
|
29
|
+
export declare const denormalizePageRects: (rects: NormalizedRect[], pageSize: {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
}, pageNumber?: number) => ReaderSelectionOverlayRect[];
|
|
33
|
+
/**
|
|
34
|
+
* 从当前 Selection payload 构造可持久化的选择模型,仅使用调用方传入的数据。
|
|
35
|
+
*/
|
|
36
|
+
export declare const buildSavedSelection: (options: {
|
|
37
|
+
id: string;
|
|
38
|
+
document?: string;
|
|
39
|
+
selection: Selection;
|
|
40
|
+
segments: ReaderSelectedTextSegment[];
|
|
41
|
+
rects: ReaderSelectionOverlayRect[];
|
|
42
|
+
pageSizes: Map<number, {
|
|
43
|
+
width: number;
|
|
44
|
+
height: number;
|
|
45
|
+
}>;
|
|
46
|
+
}) => ReaderSavedSelection;
|
|
47
|
+
/**
|
|
48
|
+
* 用编辑后的实时 Selection payload 重建已保存选择。
|
|
49
|
+
* 调用方仍持有源数据;这里返回全新对象,避免修改 savedSelections prop。
|
|
50
|
+
* 注意:此处需要主动透传 comments 等业务字段,否则编辑手柄拖动后会丢失。
|
|
51
|
+
*/
|
|
52
|
+
export declare const rebuildSavedSelectionFromEdit: (options: {
|
|
53
|
+
previousSelection: ReaderSavedSelection;
|
|
54
|
+
selection: Selection;
|
|
55
|
+
segments: ReaderSelectedTextSegment[];
|
|
56
|
+
rects: ReaderSelectionOverlayRect[];
|
|
57
|
+
pageSizes: Map<number, {
|
|
58
|
+
width: number;
|
|
59
|
+
height: number;
|
|
60
|
+
}>;
|
|
61
|
+
}) => ReaderSavedSelection;
|
|
62
|
+
/**
|
|
63
|
+
* 按 exact → context → selected-text → visual 的顺序恢复已保存选择。
|
|
64
|
+
*
|
|
65
|
+
* 坐标原点处理:
|
|
66
|
+
* 从 selection.visual 构建 pageSize 查找表,传给 resolveRangeRects,
|
|
67
|
+
* 使 fallback bbox 能从 0-1 归一化反转为页面像素坐标(origin: 'page-relative'),
|
|
68
|
+
* 与 DOM Range 矩形(origin: 'viewport')区分,避免 viewer 边界二次转换。
|
|
69
|
+
*/
|
|
70
|
+
export declare const resolveSavedSelection: (selection: ReaderSavedSelection, textElements: TextElementInfo[]) => ReaderSavedSelectionRestoreResult;
|
|
71
|
+
//# sourceMappingURL=savedSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savedSelection.d.ts","sourceRoot":"","sources":["../../../src/components/selection/savedSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,KAAK,EACV,oBAAoB,EAEpB,iCAAiC,EAEjC,0BAA0B,EAC3B,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AAE7E,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AA+cD;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAOvC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,0BAA0B,EAAE,EACnC,UAAU;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KAC1C,cAAc,EAehB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,cAAc,EAAE,EACvB,UAAU;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,mBAAc,KACb,0BAA0B,EAU5B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,yBAAyB,EAAE,CAAA;IACrC,KAAK,EAAE,0BAA0B,EAAE,CAAA;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1D,KAAG,oBAgCH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,SAAS;IACrD,iBAAiB,EAAE,oBAAoB,CAAA;IACvC,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,yBAAyB,EAAE,CAAA;IACrC,KAAK,EAAE,0BAA0B,EAAE,CAAA;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1D,KAAG,oBAeH,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,oBAAoB,EAC/B,cAAc,eAAe,EAAE,KAC9B,iCAwFF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionComposer.d.ts","sourceRoot":"","sources":["../../../src/components/selection/selectionComposer.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAC7B,WAAW,IAAI,EACf,aAAa,MAAM,EACnB,SAAS,IAAI,EACb,WAAW,MAAM,KAChB,KAkCF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,IAO/C,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IntermediateText } from '@hamster-note/types';
|
|
2
|
+
export type ReaderSelectedTextSegment = IntermediateText & {
|
|
3
|
+
selectedText: string;
|
|
4
|
+
startCharIndex: number;
|
|
5
|
+
endCharIndex: number;
|
|
6
|
+
pageNumber?: number;
|
|
7
|
+
};
|
|
8
|
+
export type ReaderSelectionPayload = {
|
|
9
|
+
selection: Selection;
|
|
10
|
+
segments: ReaderSelectedTextSegment[];
|
|
11
|
+
extractedText: string;
|
|
12
|
+
};
|
|
13
|
+
export type TextElementRecord = {
|
|
14
|
+
text: IntermediateText;
|
|
15
|
+
pageNumber: number;
|
|
16
|
+
};
|
|
17
|
+
export declare const textElementRecords: WeakMap<HTMLElement, TextElementRecord>;
|
|
18
|
+
export declare const getClosestTextElement: (node: Node | null) => HTMLElement | null;
|
|
19
|
+
export declare const buildSelectionPayload: (selection: Selection, records?: WeakMap<HTMLElement, TextElementRecord>) => ReaderSelectionPayload | null;
|
|
20
|
+
export declare const buildSelectionPayloadFromTexts: (selection: Selection, texts: IntermediateText[], records?: WeakMap<HTMLElement, TextElementRecord>) => ReaderSelectionPayload | null;
|
|
21
|
+
//# sourceMappingURL=selectionPayloadSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionPayloadSerializer.d.ts","sourceRoot":"","sources":["../../../src/components/selection/selectionPayloadSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAI3D,MAAM,MAAM,yBAAyB,GAAG,gBAAgB,GAAG;IACzD,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,yBAAyB,EAAE,CAAA;IACrC,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,kBAAkB,yCAAgD,CAAA;AAE/E,eAAO,MAAM,qBAAqB,GAChC,MAAM,IAAI,GAAG,IAAI,KAChB,WAAW,GAAG,IAMhB,CAAA;AAyHD,eAAO,MAAM,qBAAqB,GAChC,WAAW,SAAS,EACpB,UAAS,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAsB,KACpE,sBAAsB,GAAG,IAwD3B,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,WAAW,SAAS,EACpB,OAAO,gBAAgB,EAAE,EACzB,UAAS,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAsB,KACpE,sBAAsB,GAAG,IAsE3B,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 从插入点(collapsed Range)扩展出单词级别的 Range。
|
|
3
|
+
* 用于长按选择单词的场景。
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 从一个 collapsed Range(插入点)扩展出该位置所在的单词 Range。
|
|
7
|
+
*
|
|
8
|
+
* @param caretRange - 必须是 collapsed 的 Range(startContainer 为 Text 节点)
|
|
9
|
+
* @returns 选中单词的新 Range,或无法扩展时返回 null
|
|
10
|
+
*
|
|
11
|
+
* 安全约束:
|
|
12
|
+
* - 不修改输入 range
|
|
13
|
+
* - 输入非 collapsed 时返回 null
|
|
14
|
+
* - 输入不在文本节点内时返回 null
|
|
15
|
+
*/
|
|
16
|
+
export declare const createWordRangeFromCaret: (caretRange: Range) => Range | null;
|
|
17
|
+
//# sourceMappingURL=wordRange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wordRange.d.ts","sourceRoot":"","sources":["../../../src/components/selection/wordRange.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4IH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GAAI,YAAY,KAAK,KAAG,KAAK,GAAG,IAmBpE,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { MousePosition as ReaderMousePosition, OverlayRectType as ReaderSelectionOverlayRectType } from '@hamster-note/selection';
|
|
2
|
+
export type { ReaderLinkedSelectionData, ReaderLinkedSelectionRange, ReaderSelectionEndpoint, ReaderSelectionRange, ReaderSelectionRect, ReaderSelectionRef } from './types/selection';
|
|
3
|
+
export { buildSavedSelection, buildSelectionPayload, denormalizePageRects, IntermediateDocumentViewer, type IntermediateDocumentViewerProps, normalizePageRects, resolveSavedSelection, type ReaderInteractionMode, type ReaderPageRange, type ReaderSavedSelection, type ReaderSavedSelectionAnchor, type ReaderSavedSelectionComment, type ReaderSavedSelectionEditDetail, type ReaderSavedSelectionRestoreResult, type ReaderSavedSelectionRestoreStatus, type ReaderSavedSelectionSegment, type ReaderSavedSelectionVisualPage, type ReaderSelectedTextSegment, type ReaderSelectionOverlayRect, type ReaderSelectionPayload, type ReaderTextSelectionDetail, textHash, type NormalizedRect, type TextElementInfo, createIntermediateDocumentRenderTiming, type CreateIntermediateDocumentRenderTimingOptions, type IntermediateDocumentRenderTiming, type IntermediateDocumentRenderTimingCallback, type IntermediateDocumentRenderTimingClock, type IntermediateDocumentRenderTimingEntry, type IntermediateDocumentRenderTimingStage } from './components/IntermediateDocumentViewer';
|
|
4
|
+
export { Reader, type ReaderProps } from './components/Reader';
|
|
5
|
+
export type ReaderInteractiveProps = Pick<import('./components/Reader').ReaderProps, 'ocr' | 'onSelectText' | 'onTextSelectionChange' | 'onTextSelectionEnd' | 'interactionMode' | 'ranges' | 'selectedRangeId' | 'onSelect' | 'onLinkedDataChange' | 'onLinkedSelect' | 'onLinkedUpdateRange' | 'onLinkedSelectRange' | 'onSelectRange' | 'onUpdateRange' | 'onSelectionStart' | 'onSelectionEnd' | 'onHighlight' | 'highlightColor' | 'selectionColor' | 'selectionPopover' | 'selectionRef' | 'overlayRectType'>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,IAAI,mBAAmB,EACpC,eAAe,IAAI,8BAA8B,EAClD,MAAM,yBAAyB,CAAA;AAEhC,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,+BAA+B,EACpC,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,sCAAsC,EACtC,KAAK,6CAA6C,EAClD,KAAK,gCAAgC,EACrC,KAAK,wCAAwC,EAC7C,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC3C,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,OAAO,qBAAqB,EAAE,WAAW,EACvC,KAAK,GACL,cAAc,GACd,uBAAuB,GACvB,oBAAoB,GACpB,iBAAiB,GACjB,QAAQ,GACR,iBAAiB,GACjB,UAAU,GACV,oBAAoB,GACpB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,cAAc,GACd,iBAAiB,CACpB,CAAA"}
|