@file-viewer/core 2.0.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.
Files changed (166) hide show
  1. package/LICENSE +160 -0
  2. package/README.en.md +78 -0
  3. package/README.md +83 -0
  4. package/dist/assets.d.ts +62 -0
  5. package/dist/assets.js +260 -0
  6. package/dist/browser.d.ts +1 -0
  7. package/dist/browser.js +1 -0
  8. package/dist/capabilities.d.ts +24 -0
  9. package/dist/capabilities.js +95 -0
  10. package/dist/document.d.ts +9 -0
  11. package/dist/document.js +86 -0
  12. package/dist/documentDom/anchors.d.ts +7 -0
  13. package/dist/documentDom/anchors.js +196 -0
  14. package/dist/documentDom/index.d.ts +5 -0
  15. package/dist/documentDom/index.js +3 -0
  16. package/dist/documentDom/providers.d.ts +13 -0
  17. package/dist/documentDom/providers.js +52 -0
  18. package/dist/documentDom/scroll.d.ts +12 -0
  19. package/dist/documentDom/scroll.js +42 -0
  20. package/dist/documentDom.d.ts +5 -0
  21. package/dist/documentDom.js +3 -0
  22. package/dist/documentEvents.d.ts +73 -0
  23. package/dist/documentEvents.js +150 -0
  24. package/dist/documentSearch.d.ts +50 -0
  25. package/dist/documentSearch.js +459 -0
  26. package/dist/documentZoom.d.ts +47 -0
  27. package/dist/documentZoom.js +184 -0
  28. package/dist/export.d.ts +26 -0
  29. package/dist/export.js +466 -0
  30. package/dist/formats.d.ts +305 -0
  31. package/dist/formats.js +207 -0
  32. package/dist/headless.d.ts +25 -0
  33. package/dist/headless.js +14 -0
  34. package/dist/index.d.ts +78 -0
  35. package/dist/index.js +118 -0
  36. package/dist/lifecycleFacade.d.ts +46 -0
  37. package/dist/lifecycleFacade.js +68 -0
  38. package/dist/loading.d.ts +59 -0
  39. package/dist/loading.js +489 -0
  40. package/dist/operations.d.ts +287 -0
  41. package/dist/operations.js +485 -0
  42. package/dist/options.d.ts +16 -0
  43. package/dist/options.js +92 -0
  44. package/dist/presentation.d.ts +14 -0
  45. package/dist/presentation.js +16 -0
  46. package/dist/printLayout.d.ts +19 -0
  47. package/dist/printLayout.js +83 -0
  48. package/dist/registry.d.ts +2 -0
  49. package/dist/registry.js +63 -0
  50. package/dist/rendererDispatcher.d.ts +21 -0
  51. package/dist/rendererDispatcher.js +42 -0
  52. package/dist/rendererHandler.d.ts +165 -0
  53. package/dist/rendererHandler.js +354 -0
  54. package/dist/renderers/archive.d.ts +2 -0
  55. package/dist/renderers/archive.js +547 -0
  56. package/dist/renderers/archiveCache.d.ts +10 -0
  57. package/dist/renderers/archiveCache.js +96 -0
  58. package/dist/renderers/archiveFallback.d.ts +7 -0
  59. package/dist/renderers/archiveFallback.js +166 -0
  60. package/dist/renderers/archiveShared.d.ts +23 -0
  61. package/dist/renderers/archiveShared.js +71 -0
  62. package/dist/renderers/audio.d.ts +8 -0
  63. package/dist/renderers/audio.js +219 -0
  64. package/dist/renderers/cad.d.ts +2 -0
  65. package/dist/renderers/cad.js +445 -0
  66. package/dist/renderers/code.d.ts +11 -0
  67. package/dist/renderers/code.js +233 -0
  68. package/dist/renderers/data.d.ts +7 -0
  69. package/dist/renderers/data.js +370 -0
  70. package/dist/renderers/drawing.d.ts +10 -0
  71. package/dist/renderers/drawing.js +537 -0
  72. package/dist/renderers/eda.d.ts +2 -0
  73. package/dist/renderers/eda.js +434 -0
  74. package/dist/renderers/edaParser.d.ts +77 -0
  75. package/dist/renderers/edaParser.js +569 -0
  76. package/dist/renderers/email.d.ts +2 -0
  77. package/dist/renderers/email.js +463 -0
  78. package/dist/renderers/epub.d.ts +2 -0
  79. package/dist/renderers/epub.js +330 -0
  80. package/dist/renderers/geo.d.ts +2 -0
  81. package/dist/renderers/geo.js +284 -0
  82. package/dist/renderers/image.d.ts +2 -0
  83. package/dist/renderers/image.js +179 -0
  84. package/dist/renderers/index.d.ts +21 -0
  85. package/dist/renderers/index.js +207 -0
  86. package/dist/renderers/markdown.d.ts +2 -0
  87. package/dist/renderers/markdown.js +83 -0
  88. package/dist/renderers/model.d.ts +2 -0
  89. package/dist/renderers/model.js +566 -0
  90. package/dist/renderers/ofd.d.ts +2 -0
  91. package/dist/renderers/ofd.js +255 -0
  92. package/dist/renderers/openDocument.d.ts +2 -0
  93. package/dist/renderers/openDocument.js +122 -0
  94. package/dist/renderers/pdf.d.ts +3 -0
  95. package/dist/renderers/pdf.js +846 -0
  96. package/dist/renderers/pdfStyles.d.ts +1 -0
  97. package/dist/renderers/pdfStyles.js +1 -0
  98. package/dist/renderers/pptx.d.ts +2 -0
  99. package/dist/renderers/pptx.js +202 -0
  100. package/dist/renderers/spreadsheet/state.d.ts +80 -0
  101. package/dist/renderers/spreadsheet/state.js +96 -0
  102. package/dist/renderers/spreadsheet/view.d.ts +25 -0
  103. package/dist/renderers/spreadsheet/view.js +833 -0
  104. package/dist/renderers/spreadsheet/worker/index.d.ts +2 -0
  105. package/dist/renderers/spreadsheet/worker/index.js +1 -0
  106. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +73 -0
  107. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +623 -0
  108. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +2 -0
  109. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +73 -0
  110. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +1 -0
  111. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +1 -0
  112. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +18 -0
  113. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +106 -0
  114. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +1 -0
  115. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +11 -0
  116. package/dist/renderers/spreadsheet/worker/type.d.ts +57 -0
  117. package/dist/renderers/spreadsheet/worker/type.js +1 -0
  118. package/dist/renderers/spreadsheet.d.ts +3 -0
  119. package/dist/renderers/spreadsheet.js +929 -0
  120. package/dist/renderers/typst.d.ts +8 -0
  121. package/dist/renderers/typst.js +415 -0
  122. package/dist/renderers/umd/parser.d.ts +30 -0
  123. package/dist/renderers/umd/parser.js +408 -0
  124. package/dist/renderers/umd.d.ts +2 -0
  125. package/dist/renderers/umd.js +297 -0
  126. package/dist/renderers/video.d.ts +8 -0
  127. package/dist/renderers/video.js +108 -0
  128. package/dist/renderers/wordDoc.d.ts +5 -0
  129. package/dist/renderers/wordDoc.js +284 -0
  130. package/dist/renderers/wordDocx.d.ts +5 -0
  131. package/dist/renderers/wordDocx.js +501 -0
  132. package/dist/renderers/wordDocx.worker.d.ts +1 -0
  133. package/dist/renderers/wordDocx.worker.js +96 -0
  134. package/dist/source.d.ts +18 -0
  135. package/dist/source.js +152 -0
  136. package/dist/sourceLoading.d.ts +566 -0
  137. package/dist/sourceLoading.js +918 -0
  138. package/dist/state.d.ts +16 -0
  139. package/dist/state.js +81 -0
  140. package/dist/types.d.ts +446 -0
  141. package/dist/types.js +1 -0
  142. package/dist/viewer.d.ts +8 -0
  143. package/dist/viewer.js +285 -0
  144. package/dist/viewerOperations.d.ts +88 -0
  145. package/dist/viewerOperations.js +242 -0
  146. package/dist/watermark.d.ts +15 -0
  147. package/dist/watermark.js +81 -0
  148. package/dist/worker.d.ts +34 -0
  149. package/dist/worker.js +101 -0
  150. package/package.json +109 -0
  151. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +183 -0
  152. package/vendor/ofd/dltech/jbig2/ccitt.js +1070 -0
  153. package/vendor/ofd/dltech/jbig2/compatibility.js +12 -0
  154. package/vendor/ofd/dltech/jbig2/core_utils.js +180 -0
  155. package/vendor/ofd/dltech/jbig2/is_node.js +27 -0
  156. package/vendor/ofd/dltech/jbig2/jbig2.js +2589 -0
  157. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +81 -0
  158. package/vendor/ofd/dltech/jbig2/primitives.js +387 -0
  159. package/vendor/ofd/dltech/jbig2/stream.js +1348 -0
  160. package/vendor/ofd/dltech/jbig2/util.js +972 -0
  161. package/vendor/ofd/dltech/ofd/ofd.d.ts +11 -0
  162. package/vendor/ofd/dltech/ofd/ofd.js +100 -0
  163. package/vendor/ofd/dltech/ofd/ofd_parser.js +395 -0
  164. package/vendor/ofd/dltech/ofd/ofd_render.js +473 -0
  165. package/vendor/ofd/dltech/ofd/ofd_util.js +350 -0
  166. package/vendor/ofd/dltech/ofd/pipeline.js +26 -0
@@ -0,0 +1,24 @@
1
+ import type { FileRenderExportAdapter, FileViewerOperationAvailability, RendererDefinition, RendererSession } from './types';
2
+ export declare const DEFAULT_OPERATION_AVAILABILITY: FileViewerOperationAvailability;
3
+ export declare const getRendererAvailability: (renderer: RendererDefinition | undefined, session?: RendererSession | null) => FileViewerOperationAvailability;
4
+ export declare const createUnsupportedAvailability: (extension: string) => FileViewerOperationAvailability;
5
+ /**
6
+ * 这些格式只有专属适配器准备好后才展示打印。
7
+ *
8
+ * 它们的在线预览常依赖分页引擎、虚拟渲染或 Worker 生命周期,直接克隆
9
+ * DOM 很容易只得到当前页或当前视口。
10
+ */
11
+ export declare const ADAPTER_PRINT_REQUIRED_EXTENSIONS: readonly ["docx", "docm", "dotx", "dotm", "doc", "dot", "pdf", "typ", "typst"];
12
+ /**
13
+ * 这些格式的预览结果是完整 DOM / SVG / Canvas 截图,解除滚动容器裁切后
14
+ * 可以稳定进入浏览器打印流程。
15
+ */
16
+ export declare const DOM_PRINTABLE_EXTENSIONS: readonly ["pptx", "pptm", "potx", "potm", "ppsx", "ppsm", "ofd", "dxf", "dwg", "dwf", "dwfx", "xps", "excalidraw", "drawio", "dio", "umd", "md", "markdown", "olb", "dra", "txt", "json", "js", "mjs", "cjs", "css", "java", "py", "html", "htm", "jsx", "ts", "tsx", "xml", "log", "vue", "yaml", "yml", "ini", "sh", "bash", "sql", "go", "rs", "php", "c", "cpp", "cc", "h", "hpp", "cs", "diff", "jsonc", "json5", "ipynb", "toml", "proto", "hcl", "tex", "gv", "http", "react", "rb", "swift", "kt", "gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg", "webp", "avif", "ico", "heic", "heif", "jxl"];
17
+ /**
18
+ * 这些格式默认不展示打印按钮,避免导出半截内容。
19
+ */
20
+ export declare const NON_PRINTABLE_EXTENSIONS: readonly ["xlsx", "xltx", "xlsm", "xlsb", "xls", "xlt", "xltm", "csv", "ods", "fods", "numbers", "zip", "zipx", "7z", "rar", "tar", "gz", "gzip", "tgz", "bz2", "bzip2", "tbz", "tbz2", "xz", "txz", "lzma", "zst", "tzst", "cab", "ar", "cpio", "iso", "xar", "lha", "lzh", "jar", "war", "ear", "apk", "cbz", "cbr", "eml", "msg", "epub", "mp4", "mp3", "mpeg", "wav", "ogg", "oga", "opus", "m4a", "aac", "flac", "weba", "glb", "gltf", "obj", "stl", "ply", "fbx", "dae", "3ds", "3mf", "amf", "usd", "usda", "usdc", "usdz", "kmz", "step", "stp", "iges", "igs", "ifc", "3dm", "pcd", "wrl", "vrml", "xyz", "vtk", "vtp"];
21
+ export declare const needsDedicatedPrintAdapter: (extension: string) => boolean;
22
+ export declare const isDomPrintableExtension: (extension: string) => boolean;
23
+ export declare const isKnownNonPrintableExtension: (extension: string) => boolean;
24
+ export declare const resolvePrintAvailability: (extension: string, adapter: FileRenderExportAdapter | null, renderedReady: boolean) => boolean;
@@ -0,0 +1,95 @@
1
+ import { ARCHIVE_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS } from './formats.js';
2
+ import { normalizeFileExtension } from './source.js';
3
+ export const DEFAULT_OPERATION_AVAILABILITY = Object.freeze({
4
+ download: false,
5
+ print: false,
6
+ exportHtml: false,
7
+ zoom: false,
8
+ zoomIn: false,
9
+ zoomOut: false,
10
+ zoomReset: false,
11
+ });
12
+ const resolveBooleanCapability = (value) => {
13
+ return value === true || value === 'adapter' || value === 'provider';
14
+ };
15
+ export const getRendererAvailability = (renderer, session) => {
16
+ var _a, _b, _c, _d, _e, _f, _g, _h;
17
+ if (!renderer) {
18
+ return { ...DEFAULT_OPERATION_AVAILABILITY };
19
+ }
20
+ const base = {
21
+ download: ((_a = renderer.capabilities) === null || _a === void 0 ? void 0 : _a.download) !== false,
22
+ print: resolveBooleanCapability((_b = renderer.capabilities) === null || _b === void 0 ? void 0 : _b.print),
23
+ exportHtml: resolveBooleanCapability((_c = renderer.capabilities) === null || _c === void 0 ? void 0 : _c.exportHtml),
24
+ zoom: resolveBooleanCapability((_d = renderer.capabilities) === null || _d === void 0 ? void 0 : _d.zoom),
25
+ zoomIn: resolveBooleanCapability((_e = renderer.capabilities) === null || _e === void 0 ? void 0 : _e.zoom),
26
+ zoomOut: resolveBooleanCapability((_f = renderer.capabilities) === null || _f === void 0 ? void 0 : _f.zoom),
27
+ zoomReset: resolveBooleanCapability((_g = renderer.capabilities) === null || _g === void 0 ? void 0 : _g.zoom),
28
+ };
29
+ return {
30
+ ...base,
31
+ ...(_h = session === null || session === void 0 ? void 0 : session.getAvailability) === null || _h === void 0 ? void 0 : _h.call(session),
32
+ };
33
+ };
34
+ export const createUnsupportedAvailability = (extension) => ({
35
+ ...DEFAULT_OPERATION_AVAILABILITY,
36
+ download: normalizeFileExtension(extension).length > 0,
37
+ });
38
+ /**
39
+ * 这些格式只有专属适配器准备好后才展示打印。
40
+ *
41
+ * 它们的在线预览常依赖分页引擎、虚拟渲染或 Worker 生命周期,直接克隆
42
+ * DOM 很容易只得到当前页或当前视口。
43
+ */
44
+ export const ADAPTER_PRINT_REQUIRED_EXTENSIONS = [
45
+ 'docx', 'docm', 'dotx', 'dotm', 'doc', 'dot', 'pdf', 'typ', 'typst',
46
+ ];
47
+ /**
48
+ * 这些格式的预览结果是完整 DOM / SVG / Canvas 截图,解除滚动容器裁切后
49
+ * 可以稳定进入浏览器打印流程。
50
+ */
51
+ export const DOM_PRINTABLE_EXTENSIONS = [
52
+ 'pptx', 'pptm', 'potx', 'potm', 'ppsx', 'ppsm', 'ofd', 'dxf', 'dwg', 'dwf', 'dwfx', 'xps',
53
+ 'excalidraw', 'drawio', 'dio', 'umd', 'md', 'markdown', 'olb', 'dra',
54
+ ...TEXT_EXTENSIONS,
55
+ ...IMAGE_EXTENSIONS,
56
+ ];
57
+ /**
58
+ * 这些格式默认不展示打印按钮,避免导出半截内容。
59
+ */
60
+ export const NON_PRINTABLE_EXTENSIONS = [
61
+ 'xlsx', 'xltx', 'xlsm', 'xlsb', 'xls', 'xlt', 'xltm', 'csv', 'ods', 'fods', 'numbers',
62
+ ...ARCHIVE_EXTENSIONS,
63
+ 'eml', 'msg', 'epub', 'mp4',
64
+ 'mp3', 'mpeg', 'wav', 'ogg', 'oga', 'opus', 'm4a', 'aac', 'flac', 'weba',
65
+ ...MODEL_EXTENSIONS,
66
+ ];
67
+ const hasExtension = (items, extension) => {
68
+ return items.includes(normalizeFileExtension(extension));
69
+ };
70
+ export const needsDedicatedPrintAdapter = (extension) => {
71
+ return hasExtension(ADAPTER_PRINT_REQUIRED_EXTENSIONS, extension);
72
+ };
73
+ export const isDomPrintableExtension = (extension) => {
74
+ return hasExtension(DOM_PRINTABLE_EXTENSIONS, extension);
75
+ };
76
+ export const isKnownNonPrintableExtension = (extension) => {
77
+ return hasExtension(NON_PRINTABLE_EXTENSIONS, extension);
78
+ };
79
+ export const resolvePrintAvailability = (extension, adapter, renderedReady) => {
80
+ if (!renderedReady) {
81
+ return false;
82
+ }
83
+ if (adapter) {
84
+ if (adapter.print === false) {
85
+ return false;
86
+ }
87
+ if (adapter.toHtml) {
88
+ return true;
89
+ }
90
+ }
91
+ if (needsDedicatedPrintAdapter(extension) || isKnownNonPrintableExtension(extension)) {
92
+ return false;
93
+ }
94
+ return isDomPrintableExtension(extension);
95
+ };
@@ -0,0 +1,9 @@
1
+ import type { FileViewerAiOptions, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerSearchOptions, FileViewerSearchState, FileViewerZoomState } from './types';
2
+ export declare const DEFAULT_FILE_VIEWER_ZOOM_SCALE = 1;
3
+ export declare const DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE = 1200;
4
+ export declare const DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP = 160;
5
+ export declare const createFileViewerZoomState: (patch?: Partial<FileViewerZoomState>) => FileViewerZoomState;
6
+ export declare const normalizeFileViewerSearchOptions: (options?: boolean | FileViewerSearchOptions) => FileViewerSearchOptions;
7
+ export declare const createEmptyFileViewerSearchState: (query?: string) => FileViewerSearchState;
8
+ export declare const normalizeFileViewerAiOptions: (options?: boolean | FileViewerAiOptions) => FileViewerAiOptions;
9
+ export declare const buildFileViewerDocumentTextChunks: (anchors: FileViewerDocumentAnchor[], options?: boolean | FileViewerAiOptions) => FileViewerDocumentChunk[];
@@ -0,0 +1,86 @@
1
+ export const DEFAULT_FILE_VIEWER_ZOOM_SCALE = 1;
2
+ export const DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE = 1200;
3
+ export const DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP = 160;
4
+ export const createFileViewerZoomState = (patch = {}) => {
5
+ var _a, _b, _c;
6
+ const scale = Number.isFinite(patch.scale) && patch.scale ? Number(patch.scale) : DEFAULT_FILE_VIEWER_ZOOM_SCALE;
7
+ return {
8
+ scale,
9
+ label: patch.label || `${Math.round(scale * 100)}%`,
10
+ canZoomIn: (_a = patch.canZoomIn) !== null && _a !== void 0 ? _a : false,
11
+ canZoomOut: (_b = patch.canZoomOut) !== null && _b !== void 0 ? _b : false,
12
+ canReset: (_c = patch.canReset) !== null && _c !== void 0 ? _c : false,
13
+ minScale: patch.minScale,
14
+ maxScale: patch.maxScale,
15
+ };
16
+ };
17
+ export const normalizeFileViewerSearchOptions = (options) => {
18
+ if (options === false) {
19
+ return { enabled: false };
20
+ }
21
+ if (options === true || options === undefined) {
22
+ return {};
23
+ }
24
+ return options;
25
+ };
26
+ export const createEmptyFileViewerSearchState = (query = '') => ({
27
+ query,
28
+ total: 0,
29
+ currentIndex: -1,
30
+ current: null,
31
+ matches: [],
32
+ });
33
+ export const normalizeFileViewerAiOptions = (options) => {
34
+ if (options === false) {
35
+ return { enabled: false, collectText: false };
36
+ }
37
+ if (options === true || options === undefined) {
38
+ return {};
39
+ }
40
+ return options;
41
+ };
42
+ export const buildFileViewerDocumentTextChunks = (anchors, options) => {
43
+ var _a;
44
+ const normalized = normalizeFileViewerAiOptions(options);
45
+ if (normalized.enabled === false || normalized.collectText === false) {
46
+ return [];
47
+ }
48
+ const chunkSize = Math.max(200, normalized.chunkSize || DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE);
49
+ const overlap = Math.max(0, Math.min(chunkSize - 1, (_a = normalized.chunkOverlap) !== null && _a !== void 0 ? _a : DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP));
50
+ const maxTextLength = Math.max(0, normalized.maxTextLength || 0);
51
+ const chunks = [];
52
+ anchors.forEach(anchor => {
53
+ const source = maxTextLength ? anchor.text.slice(0, maxTextLength) : anchor.text;
54
+ if (!source) {
55
+ return;
56
+ }
57
+ if (source.length <= chunkSize) {
58
+ chunks.push({
59
+ id: `${anchor.id}-chunk-1`,
60
+ text: source,
61
+ anchor,
62
+ startLine: anchor.line,
63
+ endLine: anchor.line,
64
+ });
65
+ return;
66
+ }
67
+ let offset = 0;
68
+ let chunkIndex = 1;
69
+ while (offset < source.length) {
70
+ const text = source.slice(offset, offset + chunkSize);
71
+ chunks.push({
72
+ id: `${anchor.id}-chunk-${chunkIndex}`,
73
+ text,
74
+ anchor,
75
+ startLine: anchor.line,
76
+ endLine: anchor.line,
77
+ });
78
+ if (offset + chunkSize >= source.length) {
79
+ break;
80
+ }
81
+ offset += chunkSize - overlap;
82
+ chunkIndex += 1;
83
+ }
84
+ });
85
+ return chunks;
86
+ };
@@ -0,0 +1,7 @@
1
+ import type { FileViewerDocumentAnchor } from '../types';
2
+ export declare const DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR: string;
3
+ export declare const DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR: string;
4
+ export declare const collectFileViewerDocumentAnchors: (root: HTMLElement | null) => FileViewerDocumentAnchor[];
5
+ export declare const findFileViewerAnchorForElement: (element: Element | null, anchors: FileViewerDocumentAnchor[], root?: HTMLElement | null) => FileViewerDocumentAnchor | null;
6
+ export declare const getCurrentFileViewerDocumentAnchor: (root: HTMLElement | null, anchors: FileViewerDocumentAnchor[]) => FileViewerDocumentAnchor | null;
7
+ export declare const scrollToFileViewerDocumentAnchor: (root: HTMLElement | null, anchor: FileViewerDocumentAnchor | string | number | null | undefined) => boolean;
@@ -0,0 +1,196 @@
1
+ export const DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR = [
2
+ '[data-viewer-anchor-id]',
3
+ '.pdfViewer .page',
4
+ '.docx-wrapper section',
5
+ '.docx p',
6
+ '.docx li',
7
+ '.docx table',
8
+ '.markdown-body h1',
9
+ '.markdown-body h2',
10
+ '.markdown-body h3',
11
+ '.markdown-body h4',
12
+ '.markdown-body h5',
13
+ '.markdown-body h6',
14
+ '.markdown-body p',
15
+ '.markdown-body li',
16
+ '.markdown-body pre',
17
+ '.markdown-body table',
18
+ 'article h1',
19
+ 'article h2',
20
+ 'article h3',
21
+ 'article h4',
22
+ 'article h5',
23
+ 'article h6',
24
+ 'article p',
25
+ 'article li',
26
+ 'article pre',
27
+ 'article table',
28
+ 'pre code',
29
+ 'p',
30
+ 'li',
31
+ 'tr',
32
+ 'h1',
33
+ 'h2',
34
+ 'h3',
35
+ 'h4',
36
+ 'h5',
37
+ 'h6',
38
+ 'pre',
39
+ 'table',
40
+ ].join(',');
41
+ export const DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR = [
42
+ '.viewer-actions',
43
+ '.viewer-watermark',
44
+ '.state-panel',
45
+ '.pdf-toolbar',
46
+ '.pdf-nav-pane',
47
+ '.flyfish-search-match',
48
+ ].join(',');
49
+ const cssEscape = (value) => {
50
+ if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {
51
+ return CSS.escape(value);
52
+ }
53
+ return value.replace(/["\\]/g, '\\$&');
54
+ };
55
+ const trimText = (value, maxLength = 160) => {
56
+ const normalized = value.replace(/\s+/g, ' ').trim();
57
+ return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}…` : normalized;
58
+ };
59
+ const isElementVisible = (element) => {
60
+ const rect = element.getBoundingClientRect();
61
+ return rect.width > 0 || rect.height > 0;
62
+ };
63
+ const shouldSkipAnchorElement = (element) => {
64
+ return !!element.closest(DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR);
65
+ };
66
+ const getPageNumber = (element) => {
67
+ const pageElement = element.closest('[data-page-number], [data-page]');
68
+ const rawPage = (pageElement === null || pageElement === void 0 ? void 0 : pageElement.dataset.pageNumber) || (pageElement === null || pageElement === void 0 ? void 0 : pageElement.dataset.page);
69
+ const page = rawPage ? Number.parseInt(rawPage, 10) : Number.NaN;
70
+ return Number.isFinite(page) ? page : undefined;
71
+ };
72
+ const getAnchorType = (element) => {
73
+ if (element.matches('.pdfViewer .page, [data-page-number], [data-page]')) {
74
+ return 'page';
75
+ }
76
+ if (element.matches('p, li, tr, pre, code')) {
77
+ return 'line';
78
+ }
79
+ return 'block';
80
+ };
81
+ const isNestedInAcceptedElement = (element, acceptedElements) => {
82
+ let parent = element.parentElement;
83
+ while (parent) {
84
+ if (acceptedElements.has(parent)) {
85
+ return true;
86
+ }
87
+ parent = parent.parentElement;
88
+ }
89
+ return false;
90
+ };
91
+ export const collectFileViewerDocumentAnchors = (root) => {
92
+ if (!root) {
93
+ return [];
94
+ }
95
+ const rootRect = root.getBoundingClientRect();
96
+ const acceptedElements = new Set();
97
+ const anchors = [];
98
+ const candidates = Array.from(root.querySelectorAll(DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR));
99
+ candidates.forEach(element => {
100
+ if (shouldSkipAnchorElement(element) || !isElementVisible(element)) {
101
+ return;
102
+ }
103
+ const text = trimText(element.textContent || '', 1000);
104
+ if (!text) {
105
+ return;
106
+ }
107
+ if (isNestedInAcceptedElement(element, acceptedElements) && !element.matches('p, li, tr, pre, code')) {
108
+ return;
109
+ }
110
+ acceptedElements.add(element);
111
+ const id = element.dataset.viewerAnchorId || `viewer-anchor-${anchors.length + 1}`;
112
+ element.dataset.viewerAnchorId = id;
113
+ element.dataset.viewerLine = String(anchors.length + 1);
114
+ const rect = element.getBoundingClientRect();
115
+ anchors.push({
116
+ id,
117
+ index: anchors.length,
118
+ line: anchors.length + 1,
119
+ type: getAnchorType(element),
120
+ label: trimText(text, 96),
121
+ text,
122
+ page: getPageNumber(element),
123
+ top: rect.top - rootRect.top + root.scrollTop,
124
+ left: rect.left - rootRect.left + root.scrollLeft,
125
+ width: rect.width,
126
+ height: rect.height,
127
+ });
128
+ });
129
+ return anchors;
130
+ };
131
+ export const findFileViewerAnchorForElement = (element, anchors, root) => {
132
+ if (!element) {
133
+ return null;
134
+ }
135
+ const anchorElement = element.closest('[data-viewer-anchor-id]');
136
+ if (anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.dataset.viewerAnchorId) {
137
+ const anchor = anchors.find(item => item.id === anchorElement.dataset.viewerAnchorId);
138
+ if (anchor) {
139
+ return anchor;
140
+ }
141
+ }
142
+ if (!root) {
143
+ return null;
144
+ }
145
+ const rootRect = root.getBoundingClientRect();
146
+ const rect = element.getBoundingClientRect();
147
+ const top = rect.top - rootRect.top + root.scrollTop;
148
+ let fallback = null;
149
+ for (const anchor of anchors) {
150
+ if (anchor.top <= top + 1) {
151
+ fallback = anchor;
152
+ continue;
153
+ }
154
+ break;
155
+ }
156
+ return fallback;
157
+ };
158
+ export const getCurrentFileViewerDocumentAnchor = (root, anchors) => {
159
+ if (!root || !anchors.length) {
160
+ return null;
161
+ }
162
+ const viewportMiddle = root.scrollTop + root.clientHeight * 0.42;
163
+ let current = anchors[0];
164
+ for (const anchor of anchors) {
165
+ if (anchor.top <= viewportMiddle) {
166
+ current = anchor;
167
+ continue;
168
+ }
169
+ break;
170
+ }
171
+ return current;
172
+ };
173
+ export const scrollToFileViewerDocumentAnchor = (root, anchor) => {
174
+ if (!root || anchor === null || anchor === undefined) {
175
+ return false;
176
+ }
177
+ const selector = typeof anchor === 'object'
178
+ ? `[data-viewer-anchor-id="${cssEscape(anchor.id)}"]`
179
+ : typeof anchor === 'number'
180
+ ? `[data-viewer-line="${anchor}"]`
181
+ : `[data-viewer-anchor-id="${cssEscape(anchor)}"]`;
182
+ const target = root.querySelector(selector);
183
+ if (target) {
184
+ target.scrollIntoView({ block: 'center', inline: 'nearest' });
185
+ return true;
186
+ }
187
+ if (typeof anchor === 'object') {
188
+ root.scrollTo({
189
+ top: Math.max(0, anchor.top - root.clientHeight * 0.18),
190
+ left: Math.max(0, Math.min(anchor.left, root.scrollWidth - root.clientWidth)),
191
+ behavior: 'smooth',
192
+ });
193
+ return true;
194
+ }
195
+ return false;
196
+ };
@@ -0,0 +1,5 @@
1
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, getCurrentFileViewerDocumentAnchor, scrollToFileViewerDocumentAnchor, } from './anchors';
2
+ export { findFileViewerSearchProvider, findFileViewerZoomProvider, registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './providers';
3
+ export type { FileViewerSearchProviderHost, FileViewerZoomProviderHost, } from './providers';
4
+ export { DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, getFileViewerScrollableRange, isFileViewerScrollableElement, resolveFileViewerScrollContainer, } from './scroll';
5
+ export type { ResolveFileViewerScrollContainerOptions, } from './scroll';
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, getCurrentFileViewerDocumentAnchor, scrollToFileViewerDocumentAnchor, } from './anchors.js';
2
+ export { findFileViewerSearchProvider, findFileViewerZoomProvider, registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './providers.js';
3
+ export { DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, getFileViewerScrollableRange, isFileViewerScrollableElement, resolveFileViewerScrollContainer, } from './scroll.js';
@@ -0,0 +1,13 @@
1
+ import type { FileViewerSearchProvider, FileViewerZoomProvider } from '../types';
2
+ export interface FileViewerSearchProviderHost extends HTMLElement {
3
+ __flyfishViewerSearchProvider?: FileViewerSearchProvider;
4
+ }
5
+ export interface FileViewerZoomProviderHost extends HTMLElement {
6
+ __flyfishViewerZoomProvider?: FileViewerZoomProvider;
7
+ }
8
+ export declare const registerFileViewerSearchProvider: (host: HTMLElement, provider: FileViewerSearchProvider) => void;
9
+ export declare const unregisterFileViewerSearchProvider: (host: HTMLElement | null | undefined) => void;
10
+ export declare const findFileViewerSearchProvider: (root: HTMLElement | null | undefined) => FileViewerSearchProvider | null;
11
+ export declare const registerFileViewerZoomProvider: (host: HTMLElement, provider: FileViewerZoomProvider) => void;
12
+ export declare const unregisterFileViewerZoomProvider: (host: HTMLElement | null | undefined) => void;
13
+ export declare const findFileViewerZoomProvider: (root: HTMLElement | null | undefined) => FileViewerZoomProvider | null;
@@ -0,0 +1,52 @@
1
+ const searchProviderRegistry = new WeakMap();
2
+ const zoomProviderRegistry = new WeakMap();
3
+ export const registerFileViewerSearchProvider = (host, provider) => {
4
+ searchProviderRegistry.set(host, provider);
5
+ host.__flyfishViewerSearchProvider = provider;
6
+ };
7
+ export const unregisterFileViewerSearchProvider = (host) => {
8
+ if (!host) {
9
+ return;
10
+ }
11
+ searchProviderRegistry.delete(host);
12
+ delete host.__flyfishViewerSearchProvider;
13
+ };
14
+ export const findFileViewerSearchProvider = (root) => {
15
+ if (!root) {
16
+ return null;
17
+ }
18
+ const direct = searchProviderRegistry.get(root) || root.__flyfishViewerSearchProvider;
19
+ if (direct) {
20
+ return direct;
21
+ }
22
+ const host = root.querySelector('[data-viewer-search-provider]');
23
+ return host
24
+ ? searchProviderRegistry.get(host) || host.__flyfishViewerSearchProvider || null
25
+ : null;
26
+ };
27
+ export const registerFileViewerZoomProvider = (host, provider) => {
28
+ zoomProviderRegistry.set(host, provider);
29
+ host.dataset.viewerZoomProvider = host.dataset.viewerZoomProvider || 'custom';
30
+ host.__flyfishViewerZoomProvider = provider;
31
+ };
32
+ export const unregisterFileViewerZoomProvider = (host) => {
33
+ if (!host) {
34
+ return;
35
+ }
36
+ zoomProviderRegistry.delete(host);
37
+ delete host.dataset.viewerZoomProvider;
38
+ delete host.__flyfishViewerZoomProvider;
39
+ };
40
+ export const findFileViewerZoomProvider = (root) => {
41
+ if (!root) {
42
+ return null;
43
+ }
44
+ const direct = zoomProviderRegistry.get(root) || root.__flyfishViewerZoomProvider;
45
+ if (direct) {
46
+ return direct;
47
+ }
48
+ const host = root.querySelector('[data-viewer-zoom-provider]');
49
+ return host
50
+ ? zoomProviderRegistry.get(host) || host.__flyfishViewerZoomProvider || null
51
+ : null;
52
+ };
@@ -0,0 +1,12 @@
1
+ export declare const DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR = "[data-viewer-scroll-container], .pdf-wrapper";
2
+ export declare const DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR = "div, section, article, pre";
3
+ export declare const DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES: readonly ["auto", "scroll", "overlay"];
4
+ export interface ResolveFileViewerScrollContainerOptions {
5
+ preferredSelector?: string;
6
+ candidateSelector?: string;
7
+ overflowValues?: readonly string[];
8
+ minScrollRange?: number;
9
+ }
10
+ export declare const getFileViewerScrollableRange: (element: HTMLElement) => number;
11
+ export declare const isFileViewerScrollableElement: (element: HTMLElement, options?: ResolveFileViewerScrollContainerOptions) => boolean;
12
+ export declare const resolveFileViewerScrollContainer: (root: HTMLElement | null | undefined, options?: ResolveFileViewerScrollContainerOptions) => HTMLElement | null;
@@ -0,0 +1,42 @@
1
+ export const DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR = '[data-viewer-scroll-container], .pdf-wrapper';
2
+ export const DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR = 'div, section, article, pre';
3
+ export const DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES = ['auto', 'scroll', 'overlay'];
4
+ export const getFileViewerScrollableRange = (element) => {
5
+ return Math.max(0, element.scrollHeight - element.clientHeight);
6
+ };
7
+ export const isFileViewerScrollableElement = (element, options = {}) => {
8
+ var _a, _b;
9
+ const minScrollRange = (_a = options.minScrollRange) !== null && _a !== void 0 ? _a : 2;
10
+ if (getFileViewerScrollableRange(element) <= minScrollRange) {
11
+ return false;
12
+ }
13
+ const ownerView = (_b = element.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView;
14
+ const view = (ownerView === null || ownerView === void 0 ? void 0 : ownerView.getComputedStyle)
15
+ ? ownerView
16
+ : (typeof window !== 'undefined' ? window : undefined);
17
+ if (!(view === null || view === void 0 ? void 0 : view.getComputedStyle)) {
18
+ return false;
19
+ }
20
+ const style = view.getComputedStyle(element);
21
+ const overflowY = style.overflowY || style.overflow;
22
+ const overflowValues = options.overflowValues || DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES;
23
+ return overflowValues.includes(overflowY);
24
+ };
25
+ export const resolveFileViewerScrollContainer = (root, options = {}) => {
26
+ if (!root) {
27
+ return null;
28
+ }
29
+ const preferredSelector = options.preferredSelector || DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR;
30
+ const candidateSelector = options.candidateSelector || DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR;
31
+ const preferred = root.querySelector(preferredSelector);
32
+ if (preferred && isFileViewerScrollableElement(preferred, options)) {
33
+ return preferred;
34
+ }
35
+ if (isFileViewerScrollableElement(root, options)) {
36
+ return root;
37
+ }
38
+ const scrollableChildren = Array.from(root.querySelectorAll(candidateSelector))
39
+ .filter(element => isFileViewerScrollableElement(element, options))
40
+ .sort((a, b) => getFileViewerScrollableRange(b) - getFileViewerScrollableRange(a));
41
+ return scrollableChildren[0] || preferred || root;
42
+ };
@@ -0,0 +1,5 @@
1
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, getCurrentFileViewerDocumentAnchor, scrollToFileViewerDocumentAnchor, } from './documentDom/anchors';
2
+ export { findFileViewerSearchProvider, findFileViewerZoomProvider, registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './documentDom/providers';
3
+ export type { FileViewerSearchProviderHost, FileViewerZoomProviderHost, } from './documentDom/providers';
4
+ export { DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, getFileViewerScrollableRange, isFileViewerScrollableElement, resolveFileViewerScrollContainer, } from './documentDom/scroll';
5
+ export type { ResolveFileViewerScrollContainerOptions, } from './documentDom/scroll';
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, getCurrentFileViewerDocumentAnchor, scrollToFileViewerDocumentAnchor, } from './documentDom/anchors.js';
2
+ export { findFileViewerSearchProvider, findFileViewerZoomProvider, registerFileViewerSearchProvider, registerFileViewerZoomProvider, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './documentDom/providers.js';
3
+ export { DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, getFileViewerScrollableRange, isFileViewerScrollableElement, resolveFileViewerScrollContainer, } from './documentDom/scroll.js';
@@ -0,0 +1,73 @@
1
+ import { type FileViewerDomSearchControllerStateTarget } from './documentSearch';
2
+ import type { FileViewerAiOptions, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerSearchOptions, FileViewerSearchState } from './types';
3
+ export interface ResolveFileViewerLocationChangeAnchorInput {
4
+ root: HTMLElement | null | undefined;
5
+ anchors: FileViewerDocumentAnchor[];
6
+ }
7
+ export interface CreateFileViewerDocumentChangeSnapshotInput extends ResolveFileViewerLocationChangeAnchorInput {
8
+ searchState: FileViewerSearchState;
9
+ }
10
+ export interface FileViewerDocumentChangeSnapshot {
11
+ searchState: FileViewerSearchState;
12
+ locationAnchor: FileViewerDocumentAnchor | null;
13
+ }
14
+ export interface DispatchFileViewerSearchChangeInput {
15
+ state: FileViewerSearchState;
16
+ onChange?: (state: FileViewerSearchState) => void;
17
+ }
18
+ export interface DispatchFileViewerLocationChangeInput {
19
+ anchor: FileViewerDocumentAnchor | null;
20
+ onChange?: (anchor: FileViewerDocumentAnchor | null) => void;
21
+ }
22
+ export interface FileViewerDocumentFeatureActionOptions {
23
+ notify?: boolean;
24
+ }
25
+ export interface FileViewerDocumentFeatureSearchController {
26
+ getAnchors(): FileViewerDocumentAnchor[];
27
+ getSearchState(): FileViewerSearchState;
28
+ observe(): void;
29
+ refreshAnchors(): Promise<FileViewerDocumentAnchor[]>;
30
+ search(query: string): Promise<unknown>;
31
+ clear(): Promise<unknown>;
32
+ next(): Promise<unknown>;
33
+ previous(): Promise<unknown>;
34
+ }
35
+ export interface CreateFileViewerDocumentFeatureActionsInput {
36
+ root: () => HTMLElement | null | undefined;
37
+ searchController: FileViewerDocumentFeatureSearchController;
38
+ getAiOptions?: () => boolean | FileViewerAiOptions | undefined;
39
+ onSearchChange?: (state: FileViewerSearchState) => void;
40
+ onLocationChange?: (anchor: FileViewerDocumentAnchor | null) => void;
41
+ }
42
+ export interface FileViewerDocumentFeatureActions {
43
+ refreshDocumentIndex(options?: FileViewerDocumentFeatureActionOptions): Promise<FileViewerDocumentAnchor[]>;
44
+ clearDocumentState(): Promise<FileViewerSearchState>;
45
+ getScrollContainer(): HTMLElement | null;
46
+ searchDocument(query: string): Promise<FileViewerSearchState>;
47
+ clearDocumentSearch(): Promise<FileViewerSearchState>;
48
+ nextSearchResult(): Promise<FileViewerSearchState>;
49
+ previousSearchResult(): Promise<FileViewerSearchState>;
50
+ getSearchState(): FileViewerSearchState;
51
+ collectDocumentAnchors(options?: FileViewerDocumentFeatureActionOptions): Promise<FileViewerDocumentAnchor[]>;
52
+ getCurrentDocumentAnchor(): FileViewerDocumentAnchor | null;
53
+ scrollToLoadedAnchor(anchor: FileViewerDocumentAnchor | string | number | null | undefined, options?: FileViewerDocumentFeatureActionOptions): boolean;
54
+ scrollToAnchor(anchor: FileViewerDocumentAnchor | string | number | null | undefined, options?: FileViewerDocumentFeatureActionOptions): Promise<boolean>;
55
+ scrollToLine(line: number, options?: FileViewerDocumentFeatureActionOptions): Promise<boolean>;
56
+ getDocumentTextChunks(options?: boolean | FileViewerAiOptions): FileViewerDocumentChunk[];
57
+ }
58
+ export interface CreateFileViewerDocumentFeatureControllerActionHandlersInput extends Omit<CreateFileViewerDocumentFeatureActionsInput, 'searchController'> {
59
+ searchTarget: FileViewerDomSearchControllerStateTarget;
60
+ searchOptions?: () => boolean | FileViewerSearchOptions | undefined;
61
+ waitForDomUpdate?: () => Promise<void> | void;
62
+ preferredScrollContainer?: () => HTMLElement | null | undefined;
63
+ }
64
+ export interface FileViewerDocumentFeatureControllerActionHandlers extends FileViewerDocumentFeatureActions {
65
+ destroyDocumentFeatures(): FileViewerSearchState;
66
+ }
67
+ export declare const createFileViewerSearchChangeState: (state: FileViewerSearchState) => FileViewerSearchState;
68
+ export declare const resolveFileViewerLocationChangeAnchor: ({ root, anchors, }: ResolveFileViewerLocationChangeAnchorInput) => FileViewerDocumentAnchor | null;
69
+ export declare const createFileViewerDocumentChangeSnapshot: ({ root, anchors, searchState, }: CreateFileViewerDocumentChangeSnapshotInput) => FileViewerDocumentChangeSnapshot;
70
+ export declare const createFileViewerDocumentFeatureControllerActionHandlers: ({ root, searchTarget, searchOptions, waitForDomUpdate, preferredScrollContainer, getAiOptions, onSearchChange, onLocationChange, }: CreateFileViewerDocumentFeatureControllerActionHandlersInput) => FileViewerDocumentFeatureControllerActionHandlers;
71
+ export declare const dispatchFileViewerSearchChange: ({ state, onChange, }: DispatchFileViewerSearchChangeInput) => boolean;
72
+ export declare const dispatchFileViewerLocationChange: ({ anchor, onChange, }: DispatchFileViewerLocationChangeInput) => boolean;
73
+ export declare const createFileViewerDocumentFeatureActions: ({ root, searchController, getAiOptions, onSearchChange, onLocationChange, }: CreateFileViewerDocumentFeatureActionsInput) => FileViewerDocumentFeatureActions;