@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,16 @@
1
+ import type { FileViewerStateDescriptor, FileViewerStateTheme } from './types';
2
+ export type FileViewerErrorMessageFormatter = (prefix: string, error: unknown) => string;
3
+ export declare const FILE_VIEWER_PREVIEW_MESSAGES: Readonly<{
4
+ downloading: "正在下载文件资源...";
5
+ streamingPdf: "正在建立 PDF 流式预览...";
6
+ reading: "正在解析文件内容...";
7
+ }>;
8
+ export declare const DEFAULT_FILE_VIEWER_STATE_THEME: FileViewerStateTheme;
9
+ export declare const DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION = "\u652F\u6301 Office\u3001PDF\u3001OFD\u3001Typst\u3001\u538B\u7F29\u5305\u3001\u90AE\u4EF6\u3001OLB/DRA\u3001CAD\u3001\u5730\u7406\u6570\u636E\u30013D \u6A21\u578B\u3001Excalidraw\u3001draw.io\u3001EPUB\u3001UMD\u3001Markdown\u3001\u4EE3\u7801/\u6587\u672C\u3001\u56FE\u7247\u3001\u97F3\u89C6\u9891\u3001\u5B57\u4F53\u548C\u6570\u636E\u8D44\u4EA7\u7684\u5728\u7EBF\u9884\u89C8";
10
+ export declare const createFileViewerPreviewLoadingState: (extension?: string, message?: "正在解析文件内容...", theme?: FileViewerStateTheme) => FileViewerStateDescriptor;
11
+ export declare const createFileViewerReadyState: (extension?: string, theme?: FileViewerStateTheme) => FileViewerStateDescriptor;
12
+ export declare const createFileViewerEmptyState: (extension?: string, theme?: FileViewerStateTheme) => FileViewerStateDescriptor;
13
+ export declare const createFileViewerUnsupportedState: (extension?: string, theme?: FileViewerStateTheme) => FileViewerStateDescriptor;
14
+ export declare const normalizeFileViewerErrorMessage: (error: unknown) => string;
15
+ export declare const formatFileViewerErrorMessage: FileViewerErrorMessageFormatter;
16
+ export declare const createFileViewerErrorState: (extension?: string, error?: unknown, theme?: FileViewerStateTheme) => FileViewerStateDescriptor;
package/dist/state.js ADDED
@@ -0,0 +1,81 @@
1
+ import { normalizeFileExtension } from './source.js';
2
+ export const FILE_VIEWER_PREVIEW_MESSAGES = Object.freeze({
3
+ downloading: '正在下载文件资源...',
4
+ streamingPdf: '正在建立 PDF 流式预览...',
5
+ reading: '正在解析文件内容...',
6
+ });
7
+ export const DEFAULT_FILE_VIEWER_STATE_THEME = Object.freeze({
8
+ accent: '#5f6f82',
9
+ soft: 'rgba(95, 111, 130, 0.12)',
10
+ badge: 'DOC',
11
+ label: '文件内容',
12
+ hint: '正在整理内容结构并生成预览。',
13
+ });
14
+ export const DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION = '支持 Office、PDF、OFD、Typst、压缩包、邮件、OLB/DRA、CAD、地理数据、3D 模型、Excalidraw、draw.io、EPUB、UMD、Markdown、代码/文本、图片、音视频、字体和数据资产的在线预览';
15
+ const extensionLabel = (extension) => {
16
+ const normalized = normalizeFileExtension(extension);
17
+ return normalized ? `.${normalized}` : '当前';
18
+ };
19
+ const createFileViewerStateDescriptor = ({ state, extension = '', title, message, description, theme = DEFAULT_FILE_VIEWER_STATE_THEME, recoverable, }) => ({
20
+ state,
21
+ extension: normalizeFileExtension(extension),
22
+ title,
23
+ message,
24
+ description,
25
+ theme,
26
+ recoverable,
27
+ });
28
+ export const createFileViewerPreviewLoadingState = (extension = '', message = FILE_VIEWER_PREVIEW_MESSAGES.reading, theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
29
+ state: 'loading',
30
+ extension,
31
+ title: theme.label,
32
+ message,
33
+ description: theme.hint,
34
+ theme,
35
+ recoverable: false,
36
+ });
37
+ export const createFileViewerReadyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
38
+ state: 'ready',
39
+ extension,
40
+ title: '预览完成',
41
+ message: '文件内容已完成渲染。',
42
+ theme,
43
+ recoverable: false,
44
+ });
45
+ export const createFileViewerEmptyState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
46
+ state: 'empty',
47
+ extension,
48
+ title: '暂无文件',
49
+ message: '请选择文件或提供可访问的文件地址后开始预览。',
50
+ theme,
51
+ recoverable: true,
52
+ });
53
+ export const createFileViewerUnsupportedState = (extension = '', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => {
54
+ const label = extensionLabel(extension);
55
+ return createFileViewerStateDescriptor({
56
+ state: 'unsupported',
57
+ extension,
58
+ title: '暂不支持在线预览',
59
+ message: `不支持${label}格式的在线预览,请下载后预览或转换为支持的格式。`,
60
+ description: DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION,
61
+ theme,
62
+ recoverable: true,
63
+ });
64
+ };
65
+ export const normalizeFileViewerErrorMessage = (error) => {
66
+ if (error instanceof Error) {
67
+ return error.message;
68
+ }
69
+ return String(error);
70
+ };
71
+ export const formatFileViewerErrorMessage = (prefix, error) => {
72
+ return `${prefix}:${normalizeFileViewerErrorMessage(error)}`;
73
+ };
74
+ export const createFileViewerErrorState = (extension = '', error = '未知错误', theme = DEFAULT_FILE_VIEWER_STATE_THEME) => createFileViewerStateDescriptor({
75
+ state: 'error',
76
+ extension,
77
+ title: '预览失败',
78
+ message: normalizeFileViewerErrorMessage(error),
79
+ theme,
80
+ recoverable: true,
81
+ });
@@ -0,0 +1,446 @@
1
+ export type FileViewerSourceKind = 'file' | 'url' | 'buffer' | 'empty';
2
+ export type FileViewerThemeMode = 'light' | 'dark' | 'system';
3
+ export type FileViewerFileRef = File | Blob | ArrayBuffer;
4
+ export type FileViewerToolbarPosition = 'auto' | 'top' | 'bottom-right';
5
+ export type FileViewerLifecyclePhase = 'load-start' | 'load-complete' | 'unload-start' | 'unload-complete';
6
+ export type FileViewerOperationType = 'download' | 'print' | 'export-html' | 'zoom-in' | 'zoom-out' | 'zoom-reset';
7
+ export type FileViewerRenderStateKind = 'idle' | 'loading' | 'ready' | 'empty' | 'unsupported' | 'error';
8
+ export type FileViewerRendererCategory = 'office' | 'document' | 'archive' | 'email' | 'eda' | 'cad' | 'model' | 'geo' | 'drawing' | 'ebook' | 'image' | 'markdown' | 'code' | 'media' | 'asset' | 'fallback';
9
+ export interface FileViewerWatermarkOptions {
10
+ enabled?: boolean;
11
+ text?: string;
12
+ image?: string;
13
+ opacity?: number;
14
+ rotate?: number;
15
+ gapX?: number;
16
+ gapY?: number;
17
+ width?: number;
18
+ height?: number;
19
+ fontSize?: number;
20
+ color?: string;
21
+ fontFamily?: string;
22
+ }
23
+ export interface FileViewerToolbarOptions {
24
+ download?: boolean;
25
+ print?: boolean;
26
+ exportHtml?: boolean;
27
+ zoom?: boolean;
28
+ position?: FileViewerToolbarPosition;
29
+ beforeOperation?: FileViewerBeforeOperation;
30
+ beforeDownload?: FileViewerBeforeOperation;
31
+ beforePrint?: FileViewerBeforeOperation;
32
+ beforeExportHtml?: FileViewerBeforeOperation;
33
+ }
34
+ export interface FileViewerArchiveOptions {
35
+ workerUrl?: string;
36
+ wasmUrl?: string;
37
+ workerTimeoutMs?: number;
38
+ cache?: boolean;
39
+ maxArchiveSize?: number;
40
+ maxEntryPreviewSize?: number;
41
+ }
42
+ export interface FileViewerPdfOptions {
43
+ toolbar?: boolean;
44
+ navigation?: boolean;
45
+ defaultNavigationVisible?: boolean;
46
+ rotation?: number;
47
+ streaming?: boolean | 'same-origin';
48
+ rangeChunkSize?: number;
49
+ withCredentials?: boolean;
50
+ workerUrl?: string;
51
+ }
52
+ export interface FileViewerDocxOptions {
53
+ worker?: boolean;
54
+ workerUrl?: string;
55
+ progressive?: boolean;
56
+ visualPagination?: boolean;
57
+ workerTimeout?: number;
58
+ }
59
+ export interface FileViewerSpreadsheetOptions {
60
+ worker?: boolean;
61
+ workerUrl?: string;
62
+ }
63
+ export type FileRenderExportMode = 'export' | 'print';
64
+ export interface FileRenderExportOptions {
65
+ mode: FileRenderExportMode;
66
+ title: string;
67
+ }
68
+ export interface FileRenderExportAdapter {
69
+ print?: boolean;
70
+ exportHtml?: boolean;
71
+ includeDocumentStyles?: boolean;
72
+ beforeSnapshot?: () => Promise<void> | void;
73
+ printStyle?: string | ((options: FileRenderExportOptions) => Promise<string> | string);
74
+ toHtml?: (options: FileRenderExportOptions) => Promise<string> | string;
75
+ }
76
+ export interface FileRenderContext {
77
+ filename?: string;
78
+ url?: string;
79
+ streamUrl?: string;
80
+ options?: FileViewerOptions;
81
+ registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
82
+ onProgressiveRender?: () => void;
83
+ renderNestedBuffer?: (buffer: ArrayBuffer, type: string, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance | undefined>;
84
+ }
85
+ export type FileRenderHandler<Rendered = unknown, Target extends HTMLElement = HTMLElement> = (buffer: ArrayBuffer, target: Target, type?: string, context?: FileRenderContext) => Promise<Rendered>;
86
+ export interface FileRenderHandlerComposite<Rendered = unknown, Target extends HTMLElement = HTMLElement> {
87
+ accepts: Array<string>;
88
+ handler: FileRenderHandler<Rendered, Target>;
89
+ }
90
+ /**
91
+ * Framework-neutral instance returned by a renderer after it mounts content.
92
+ *
93
+ * Vue, React legacy, Web Components or imperative renderers may expose different
94
+ * teardown names, but wrappers can share this single contract when bridging old
95
+ * renderer handlers into the core registry.
96
+ */
97
+ export type FileViewerRenderedInstance = {
98
+ $el?: Node;
99
+ unmount: () => void | Promise<void>;
100
+ } | {
101
+ $el?: Node;
102
+ $destroy: () => void | Promise<void>;
103
+ } | {
104
+ $el?: Node;
105
+ destroy: () => void | Promise<void>;
106
+ };
107
+ export interface FileViewerTypstOptions {
108
+ compilerWasmUrl?: string;
109
+ rendererWasmUrl?: string;
110
+ }
111
+ export interface FileViewerDataOptions {
112
+ sqlWasmUrl?: string;
113
+ }
114
+ export type FileViewerCadRenderer = 'auto' | 'webgl' | 'canvas2d';
115
+ export type FileViewerCadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';
116
+ export interface FileViewerCadOptions {
117
+ wasmPath?: string;
118
+ workerUrl?: string | URL;
119
+ dwfWasmUrl?: string;
120
+ dxfEncoding?: string;
121
+ useWorker?: boolean;
122
+ workerTimeoutMs?: number;
123
+ renderer?: FileViewerCadRenderer;
124
+ preferDwgWasm?: boolean;
125
+ includePaperSpace?: boolean;
126
+ maxInsertDepth?: number;
127
+ keepRaw?: boolean;
128
+ preloadDwg?: boolean;
129
+ dwfPreferWebgl?: boolean;
130
+ dwfPreferWasm?: boolean;
131
+ dwfBackground?: string;
132
+ dwfMaxDevicePixelRatio?: number;
133
+ dwfMaxCanvasPixels?: number;
134
+ dwfMaxGpuCacheBytes?: number;
135
+ dwfMaxCachedScenes?: number;
136
+ dwfLineWeightMode?: FileViewerCadDwfLineWeightMode;
137
+ dwfMinStrokeCssPx?: number;
138
+ dwfMaxOverviewStrokeCssPx?: number;
139
+ dwfMinTextCssPx?: number;
140
+ dwfMinFilledAreaCssPx?: number;
141
+ canvasOptions?: Record<string, unknown>;
142
+ }
143
+ export interface FileViewerSearchOptions {
144
+ enabled?: boolean;
145
+ caseSensitive?: boolean;
146
+ wholeWord?: boolean;
147
+ maxMatches?: number;
148
+ debounce?: number;
149
+ className?: string;
150
+ activeClassName?: string;
151
+ }
152
+ export interface FileViewerAiOptions {
153
+ enabled?: boolean;
154
+ collectText?: boolean;
155
+ maxTextLength?: number;
156
+ chunkSize?: number;
157
+ chunkOverlap?: number;
158
+ }
159
+ export interface FileViewerOptions {
160
+ theme?: FileViewerThemeMode;
161
+ watermark?: boolean | FileViewerWatermarkOptions;
162
+ toolbar?: boolean | FileViewerToolbarOptions;
163
+ search?: boolean | FileViewerSearchOptions;
164
+ ai?: boolean | FileViewerAiOptions;
165
+ archive?: FileViewerArchiveOptions;
166
+ pdf?: FileViewerPdfOptions;
167
+ docx?: FileViewerDocxOptions;
168
+ spreadsheet?: FileViewerSpreadsheetOptions;
169
+ typst?: FileViewerTypstOptions;
170
+ data?: FileViewerDataOptions;
171
+ cad?: FileViewerCadOptions;
172
+ hooks?: FileViewerLifecycleHooks;
173
+ beforeOperation?: FileViewerBeforeOperation;
174
+ }
175
+ export interface FileViewerLifecycleContext {
176
+ phase: FileViewerLifecyclePhase;
177
+ type: string;
178
+ filename: string;
179
+ source: FileViewerSourceKind;
180
+ url?: string;
181
+ file?: File;
182
+ size?: number;
183
+ version: number;
184
+ timestamp: number;
185
+ duration?: number;
186
+ reason?: 'replace' | 'reset' | 'component-unmount';
187
+ }
188
+ export interface FileViewerLifecycleHooks {
189
+ onLoadStart?: (context: FileViewerLifecycleContext) => void | Promise<void>;
190
+ onLoadComplete?: (context: FileViewerLifecycleContext) => void | Promise<void>;
191
+ onUnloadStart?: (context: FileViewerLifecycleContext) => void | Promise<void>;
192
+ onUnloadComplete?: (context: FileViewerLifecycleContext) => void | Promise<void>;
193
+ }
194
+ export interface FileViewerOperationContext extends Omit<FileViewerLifecycleContext, 'phase'> {
195
+ operation: FileViewerOperationType;
196
+ label: string;
197
+ }
198
+ export type FileViewerBeforeOperation = (context: FileViewerOperationContext) => boolean | void | Promise<boolean | void>;
199
+ export interface FileViewerOperationAvailability {
200
+ download: boolean;
201
+ print: boolean;
202
+ exportHtml: boolean;
203
+ zoom: boolean;
204
+ zoomIn: boolean;
205
+ zoomOut: boolean;
206
+ zoomReset: boolean;
207
+ }
208
+ export interface FileViewerStateTheme {
209
+ accent: string;
210
+ badge: string;
211
+ hint: string;
212
+ label: string;
213
+ soft: string;
214
+ }
215
+ export interface FileViewerStateDescriptor {
216
+ state: FileViewerRenderStateKind;
217
+ extension: string;
218
+ title: string;
219
+ message: string;
220
+ description?: string;
221
+ theme: FileViewerStateTheme;
222
+ recoverable: boolean;
223
+ }
224
+ export interface FileViewerZoomState {
225
+ scale: number;
226
+ label: string;
227
+ canZoomIn: boolean;
228
+ canZoomOut: boolean;
229
+ canReset: boolean;
230
+ minScale?: number;
231
+ maxScale?: number;
232
+ }
233
+ export interface FileViewerZoomProvider {
234
+ zoomIn: () => FileViewerZoomState | Promise<FileViewerZoomState>;
235
+ zoomOut: () => FileViewerZoomState | Promise<FileViewerZoomState>;
236
+ resetZoom: () => FileViewerZoomState | Promise<FileViewerZoomState>;
237
+ setZoom?: (scale: number) => FileViewerZoomState | Promise<FileViewerZoomState>;
238
+ getState: () => FileViewerZoomState;
239
+ subscribe?: (listener: () => void) => () => void;
240
+ }
241
+ export interface FileViewerSearchMatch {
242
+ id: string;
243
+ index: number;
244
+ text: string;
245
+ anchor: FileViewerDocumentAnchor | null;
246
+ line?: number;
247
+ page?: number;
248
+ }
249
+ export interface FileViewerSearchState {
250
+ query: string;
251
+ total: number;
252
+ currentIndex: number;
253
+ current: FileViewerSearchMatch | null;
254
+ matches: FileViewerSearchMatch[];
255
+ }
256
+ export interface FileViewerSearchProvider {
257
+ search: (query: string, options?: FileViewerSearchOptions) => FileViewerSearchState | Promise<FileViewerSearchState>;
258
+ next?: () => FileViewerSearchState | Promise<FileViewerSearchState>;
259
+ previous?: () => FileViewerSearchState | Promise<FileViewerSearchState>;
260
+ clear?: () => FileViewerSearchState | Promise<FileViewerSearchState>;
261
+ getState?: () => FileViewerSearchState;
262
+ }
263
+ export interface FileViewerDocumentAnchor {
264
+ id: string;
265
+ index: number;
266
+ line: number;
267
+ type: 'page' | 'line' | 'block';
268
+ label: string;
269
+ text: string;
270
+ page?: number;
271
+ top: number;
272
+ left: number;
273
+ width: number;
274
+ height: number;
275
+ }
276
+ export interface FileViewerDocumentChunk {
277
+ id: string;
278
+ text: string;
279
+ anchor: FileViewerDocumentAnchor;
280
+ startLine: number;
281
+ endLine: number;
282
+ }
283
+ export interface FileViewerComponentProps {
284
+ file?: FileViewerFileRef;
285
+ url?: string;
286
+ options?: FileViewerOptions;
287
+ }
288
+ export interface FileViewerComponentEventMap {
289
+ 'load-start': FileViewerLifecycleContext;
290
+ 'load-complete': FileViewerLifecycleContext;
291
+ 'unload-start': FileViewerLifecycleContext;
292
+ 'unload-complete': FileViewerLifecycleContext;
293
+ 'operation-before': FileViewerOperationContext;
294
+ 'operation-cancel': FileViewerOperationContext;
295
+ 'operation-availability-change': FileViewerOperationAvailability;
296
+ 'search-change': FileViewerSearchState;
297
+ 'location-change': FileViewerDocumentAnchor | null;
298
+ 'zoom-change': FileViewerZoomState;
299
+ }
300
+ export type FileViewerEventType = keyof FileViewerComponentEventMap;
301
+ export type FileViewerEvent = {
302
+ [EventType in FileViewerEventType]: {
303
+ type: EventType;
304
+ payload: FileViewerComponentEventMap[EventType];
305
+ };
306
+ }[FileViewerEventType];
307
+ export type FileViewerEventHandler = (event: FileViewerEvent) => void;
308
+ export interface FileViewerComponentEmits {
309
+ (event: 'load-start', context: FileViewerComponentEventMap['load-start']): void;
310
+ (event: 'load-complete', context: FileViewerComponentEventMap['load-complete']): void;
311
+ (event: 'unload-start', context: FileViewerComponentEventMap['unload-start']): void;
312
+ (event: 'unload-complete', context: FileViewerComponentEventMap['unload-complete']): void;
313
+ (event: 'operation-before', context: FileViewerComponentEventMap['operation-before']): void;
314
+ (event: 'operation-cancel', context: FileViewerComponentEventMap['operation-cancel']): void;
315
+ (event: 'operation-availability-change', availability: FileViewerComponentEventMap['operation-availability-change']): void;
316
+ (event: 'search-change', state: FileViewerComponentEventMap['search-change']): void;
317
+ (event: 'location-change', anchor: FileViewerComponentEventMap['location-change']): void;
318
+ (event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
319
+ }
320
+ export interface FileViewerPublicApi {
321
+ downloadOriginalFile(): Promise<void>;
322
+ printRenderedHtml(): Promise<void>;
323
+ exportRenderedHtml(): Promise<void>;
324
+ zoomIn(): Promise<FileViewerZoomState>;
325
+ zoomOut(): Promise<FileViewerZoomState>;
326
+ resetZoom(): Promise<FileViewerZoomState>;
327
+ getZoomState(): FileViewerZoomState;
328
+ getOperationAvailability(): FileViewerOperationAvailability;
329
+ getScrollContainer(): HTMLElement | null;
330
+ searchDocument(query: string): Promise<FileViewerSearchState>;
331
+ clearDocumentSearch(): Promise<FileViewerSearchState>;
332
+ nextSearchResult(): Promise<FileViewerSearchState>;
333
+ previousSearchResult(): Promise<FileViewerSearchState>;
334
+ getSearchState(): FileViewerSearchState;
335
+ collectDocumentAnchors(): Promise<FileViewerDocumentAnchor[]>;
336
+ scrollToAnchor(anchor: FileViewerDocumentAnchor | string): Promise<boolean>;
337
+ scrollToLine(line: number): Promise<boolean>;
338
+ getDocumentTextChunks(): FileViewerDocumentChunk[];
339
+ }
340
+ export interface FileViewerDownloadOptions {
341
+ filename?: string;
342
+ }
343
+ export interface FileViewerExportHtmlOptions {
344
+ download?: boolean;
345
+ filename?: string;
346
+ title?: string;
347
+ watermarkInlineStyle?: string;
348
+ }
349
+ export interface FileViewerPrintOptions {
350
+ autoPrint?: boolean;
351
+ openWindow?: () => Window | null;
352
+ printWindow?: Window | null;
353
+ title?: string;
354
+ watermarkInlineStyle?: string;
355
+ }
356
+ export interface FileViewerSource {
357
+ url?: string;
358
+ file?: File | Blob;
359
+ buffer?: ArrayBuffer;
360
+ filename?: string;
361
+ type?: string;
362
+ size?: number;
363
+ }
364
+ export interface NormalizedFileViewerSource {
365
+ kind: FileViewerSourceKind;
366
+ filename: string;
367
+ extension: string;
368
+ url?: string;
369
+ file?: File | Blob;
370
+ buffer?: ArrayBuffer;
371
+ size?: number;
372
+ }
373
+ export interface RenderSurface {
374
+ container: HTMLElement;
375
+ shadowRoot?: ShadowRoot;
376
+ }
377
+ export interface RendererCapability {
378
+ download?: boolean;
379
+ print?: boolean | 'adapter';
380
+ exportHtml?: boolean | 'adapter';
381
+ zoom?: boolean | 'provider';
382
+ search?: boolean | 'provider';
383
+ }
384
+ export interface RendererDefinition {
385
+ id: string;
386
+ label: string;
387
+ category: FileViewerRendererCategory;
388
+ extensions: readonly string[];
389
+ async?: boolean;
390
+ capabilities?: RendererCapability;
391
+ load?: RendererLoader;
392
+ }
393
+ export type RendererPlugin = RendererDefinition;
394
+ export type ViewerLifecycleContext = FileViewerLifecycleContext;
395
+ export type ViewerOperationContext = FileViewerOperationContext;
396
+ export type ViewerCapabilityState = FileViewerOperationAvailability;
397
+ export interface RendererLoadContext {
398
+ source: NormalizedFileViewerSource;
399
+ surface: RenderSurface;
400
+ options: FileViewerOptions;
401
+ signal?: AbortSignal;
402
+ registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
403
+ renderContext?: FileRenderContext;
404
+ }
405
+ export interface RendererSession {
406
+ destroy?: () => void | Promise<void>;
407
+ getAvailability?: () => Partial<FileViewerOperationAvailability>;
408
+ }
409
+ export type RendererLoader = (context: RendererLoadContext) => RendererSession | Promise<RendererSession>;
410
+ export interface RendererRegistry {
411
+ register(definition: RendererDefinition): void;
412
+ unregister(id: string): boolean;
413
+ getById(id: string): RendererDefinition | undefined;
414
+ getByExtension(extension: string): RendererDefinition | undefined;
415
+ hasExtension(extension: string): boolean;
416
+ list(): RendererDefinition[];
417
+ listExtensions(): string[];
418
+ }
419
+ export interface FileViewerInstance {
420
+ readonly container: HTMLElement;
421
+ load(source: FileViewerSource): Promise<RendererSession | null>;
422
+ destroy(reason?: FileViewerLifecycleContext['reason']): Promise<void>;
423
+ updateOptions(options: Partial<FileViewerOptions>): void;
424
+ getCapabilities(extension?: string): FileViewerOperationAvailability;
425
+ getRenderer(extension?: string): RendererDefinition | undefined;
426
+ getSource(): NormalizedFileViewerSource | null;
427
+ registerExportAdapter(adapter: FileRenderExportAdapter | null): void;
428
+ getExportAdapter(): FileRenderExportAdapter | null;
429
+ download(options?: FileViewerDownloadOptions): Promise<void>;
430
+ exportHtml(options?: FileViewerExportHtmlOptions): Promise<string>;
431
+ print(options?: FileViewerPrintOptions): Promise<void>;
432
+ zoomIn(): Promise<FileViewerZoomState>;
433
+ zoomOut(): Promise<FileViewerZoomState>;
434
+ resetZoom(): Promise<FileViewerZoomState>;
435
+ getZoomState(): FileViewerZoomState;
436
+ search(query: string): Promise<FileViewerSearchState>;
437
+ nextSearchResult(): Promise<FileViewerSearchState>;
438
+ previousSearchResult(): Promise<FileViewerSearchState>;
439
+ clearSearch(): Promise<FileViewerSearchState>;
440
+ getSearchState(): FileViewerSearchState;
441
+ collectDocumentAnchors(): Promise<FileViewerDocumentAnchor[]>;
442
+ getCurrentDocumentAnchor(): FileViewerDocumentAnchor | null;
443
+ scrollToDocumentAnchor(anchor: FileViewerDocumentAnchor | string | number | null | undefined): boolean;
444
+ scrollToLine(line: number): Promise<boolean>;
445
+ getDocumentTextChunks(options?: boolean | FileViewerAiOptions): FileViewerDocumentChunk[];
446
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, RendererRegistry } from './types';
2
+ export interface CreateViewerOptions {
3
+ registry?: RendererRegistry;
4
+ options?: FileViewerOptions;
5
+ signal?: AbortSignal;
6
+ onEvent?: FileViewerEventHandler;
7
+ }
8
+ export declare const createViewer: (container: HTMLElement, createOptions?: CreateViewerOptions) => FileViewerInstance;