@file-viewer/core 2.1.26 → 2.1.28

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.
@@ -186,6 +186,28 @@ export interface FileViewerPresentationOptions {
186
186
  workerType?: WorkerType;
187
187
  }
188
188
  export type FileRenderExportMode = 'export' | 'print';
189
+ export type FileViewerRenderPurpose = 'preview' | 'thumbnail';
190
+ export type FileViewerThumbnailFormat = 'webp' | 'jpeg' | 'png';
191
+ export type FileViewerThumbnailFit = 'contain' | 'cover';
192
+ export interface FileViewerThumbnailCaptureOptions {
193
+ width: number;
194
+ height: number;
195
+ format: FileViewerThumbnailFormat;
196
+ quality: number;
197
+ fit: FileViewerThumbnailFit;
198
+ background: string;
199
+ signal?: AbortSignal;
200
+ }
201
+ export interface FileRenderThumbnailAdapter {
202
+ /** Prepare lazy content immediately before capture. */
203
+ beforeCapture?: (options: FileViewerThumbnailCaptureOptions) => void | Promise<void>;
204
+ /** Identifies a capture result that comes from packaged metadata rather than rendered content. */
205
+ captureSource?: 'embedded' | 'rendered';
206
+ /** A renderer-native fast path. Returning null delegates to the DOM fallback. */
207
+ capture?: (options: FileViewerThumbnailCaptureOptions) => Blob | null | Promise<Blob | null>;
208
+ /** The first page/slide/sheet/cover element used by the DOM fallback. */
209
+ getTarget?: (options: FileViewerThumbnailCaptureOptions) => Element | null | Promise<Element | null>;
210
+ }
189
211
  export interface FileRenderExportOptions {
190
212
  mode: FileRenderExportMode;
191
213
  title: string;
@@ -202,9 +224,12 @@ export interface FileRenderContext {
202
224
  filename?: string;
203
225
  url?: string;
204
226
  streamUrl?: string;
227
+ signal?: AbortSignal;
205
228
  options?: FileViewerOptions;
206
229
  surface?: RenderSurface;
207
230
  registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
231
+ registerThumbnailAdapter?: (adapter: FileRenderThumbnailAdapter | null) => void;
232
+ renderPurpose?: FileViewerRenderPurpose;
208
233
  onProgressiveRender?: () => void;
209
234
  renderNestedBuffer?: (buffer: ArrayBuffer, type: string, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance | undefined>;
210
235
  }
@@ -846,6 +871,7 @@ export interface RendererLoadContext {
846
871
  options: FileViewerOptions;
847
872
  signal?: AbortSignal;
848
873
  registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
874
+ registerThumbnailAdapter?: (adapter: FileRenderThumbnailAdapter | null) => void;
849
875
  renderContext?: FileRenderContext;
850
876
  }
851
877
  export interface RendererSession {
@@ -897,9 +923,15 @@ export interface FileViewerRendererPreset<Handler = FileRenderHandler> {
897
923
  }
898
924
  export type FileViewerRendererPluginInput<Handler = FileRenderHandler> = FileViewerRendererPlugin<Handler> | FileViewerRendererPreset<Handler> | readonly FileViewerRendererPluginInput<Handler>[];
899
925
  export type FileViewerRendererPresetInput<Handler = FileRenderHandler> = FileViewerRendererPresetName | FileViewerRendererPluginInput<Handler> | readonly FileViewerRendererPresetInput<Handler>[];
926
+ export interface FileViewerLoadOptions {
927
+ signal?: AbortSignal;
928
+ }
900
929
  export interface FileViewerInstance {
901
930
  readonly container: HTMLElement;
902
- load(source: FileViewerSource): Promise<RendererSession | null>;
931
+ /** Installs configured renderer plugins without loading a document. */
932
+ prepare?(): Promise<void>;
933
+ load(source: FileViewerSource, options?: FileViewerLoadOptions): Promise<RendererSession | null>;
934
+ unload?(reason?: FileViewerLifecycleContext['reason']): Promise<void>;
903
935
  destroy(reason?: FileViewerLifecycleContext['reason']): Promise<void>;
904
936
  updateOptions(options: Partial<FileViewerOptions>): void;
905
937
  getCapabilities(extension?: string): FileViewerOperationAvailability;
@@ -907,6 +939,8 @@ export interface FileViewerInstance {
907
939
  getSource(): NormalizedFileViewerSource | null;
908
940
  registerExportAdapter(adapter: FileRenderExportAdapter | null): void;
909
941
  getExportAdapter(): FileRenderExportAdapter | null;
942
+ registerThumbnailAdapter?(adapter: FileRenderThumbnailAdapter | null): void;
943
+ getThumbnailAdapter?(): FileRenderThumbnailAdapter | null;
910
944
  download(options?: FileViewerDownloadOptions): Promise<void>;
911
945
  exportHtml(options?: FileViewerExportHtmlOptions): Promise<string>;
912
946
  print(options?: FileViewerPrintOptions): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { FileRenderContext, FileViewerRenderedInstance } from './contracts/types';
2
- export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PDF_CMAP_PATH, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, DEFAULT_FILE_VIEWER_PDF_WASM_PATH, DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPdfAssetUrls, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets';
2
+ export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PDF_CMAP_PATH, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, DEFAULT_FILE_VIEWER_PDF_WASM_PATH, DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPdfAssetUrls, resolveFileViewerRendererAssets, resolveFileViewerRuntimeAssetBaseUrl, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets';
3
3
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats';
4
4
  export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model';
5
5
  export { DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS, DEFAULT_FILE_VIEWER_SEARCH_MATCH_CLASS, DEFAULT_FILE_VIEWER_SEARCH_MAX_MATCHES, applyFileViewerSearchState, cloneFileViewerSearchState, createFileViewerDomSearchController, createFileViewerDomSearchControllerActionHandlers, destroyFileViewerDomSearchController, observeFileViewerDomSearchController, runFileViewerDomSearchControllerAction, syncFileViewerDomSearchControllerState, } from './features/document/search';
@@ -88,4 +88,4 @@ export type { CreateFileViewerZoomControllerOptions, FileViewerZoomOperation, }
88
88
  export type { CreateViewerOptions } from './viewer/createViewer';
89
89
  export type { BuildExportHtmlDocumentOptions, BuildFileViewerRenderedHtmlDocumentOptions, } from './output/export';
90
90
  export type { CreateFileViewerWorkerControllerOptions, FileViewerWorkerContext, FileViewerWorkerController, FileViewerWorkerErrorHook, FileViewerWorkerEventHandler, FileViewerWorkerFactory, FileViewerWorkerMessageHook, WorkerProvider, WorkerRef, } from './platform/worker';
91
- export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerTextOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
91
+ export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLoadOptions, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRenderPurpose, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerThumbnailCaptureOptions, FileViewerThumbnailFit, FileViewerThumbnailFormat, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerTextOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PDF_CMAP_PATH, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, DEFAULT_FILE_VIEWER_PDF_WASM_PATH, DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPdfAssetUrls, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets.js';
1
+ export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PDF_CMAP_PATH, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, DEFAULT_FILE_VIEWER_PDF_WASM_PATH, DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPdfAssetUrls, resolveFileViewerRendererAssets, resolveFileViewerRuntimeAssetBaseUrl, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets.js';
2
2
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats.js';
3
3
  export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model.js';
4
4
  export { DEFAULT_FILE_VIEWER_SEARCH_ACTIVE_CLASS, DEFAULT_FILE_VIEWER_SEARCH_MATCH_CLASS, DEFAULT_FILE_VIEWER_SEARCH_MAX_MATCHES, applyFileViewerSearchState, cloneFileViewerSearchState, createFileViewerDomSearchController, createFileViewerDomSearchControllerActionHandlers, destroyFileViewerDomSearchController, observeFileViewerDomSearchController, runFileViewerDomSearchControllerAction, syncFileViewerDomSearchControllerState, } from './features/document/search.js';
@@ -29,6 +29,14 @@ export interface ResolveFileViewerAssetUrlOptions {
29
29
  documentBaseUrl?: string;
30
30
  trimTrailingSlash?: boolean;
31
31
  }
32
+ /**
33
+ * Resolves the stable public base for runtime assets without reading
34
+ * bundler-specific environment metadata or webpack public-path variables.
35
+ * Explicit HTML `<base>` configuration stays authoritative; for SPA fallback
36
+ * routes, emitted Vite/Webpack/UMI entry scripts reveal the deployment root
37
+ * more reliably than the route-derived page URL.
38
+ */
39
+ export declare const resolveFileViewerRuntimeAssetBaseUrl: (documentRef: Document) => string;
32
40
  export interface ResolvedFileViewerCadAssetUrls {
33
41
  wasmPath: string;
34
42
  workerUrl: string;
@@ -25,6 +25,61 @@ export const DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_PACKAGE_PATH = '@myriaddrea
25
25
  export const DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH = '@myriaddreamin/typst-ts-renderer/pkg/typst_ts_renderer_bg.wasm';
26
26
  export const DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL = 'wasm/data/sql-wasm.wasm';
27
27
  export const DEFAULT_FILE_VIEWER_DATA_SQL_WASM_PACKAGE_PATH = 'sql.js/dist/sql-wasm.wasm';
28
+ const resolveFileViewerScriptAssetBaseCandidate = (script, documentBaseUrl, index) => {
29
+ try {
30
+ const rawScriptUrl = script.src || script.getAttribute('src') || '';
31
+ if (!rawScriptUrl) {
32
+ return null;
33
+ }
34
+ const scriptUrl = new URL(rawScriptUrl, documentBaseUrl);
35
+ const assetDirectory = scriptUrl.pathname.match(/^(.*\/)(?:assets|static|js)\/.+\.(?:m?js)$/i);
36
+ const entryScript = scriptUrl.pathname.match(/^(.*\/)(?:app|index|main|runtime|umi)(?:[.-][^/]*)?\.(?:m?js)$/i);
37
+ const basePath = (assetDirectory === null || assetDirectory === void 0 ? void 0 : assetDirectory[1]) || (entryScript === null || entryScript === void 0 ? void 0 : entryScript[1]);
38
+ if (!basePath) {
39
+ return null;
40
+ }
41
+ const url = new URL(basePath, scriptUrl).href;
42
+ const documentUrl = new URL(documentBaseUrl);
43
+ const candidateUrl = new URL(url);
44
+ const scriptName = scriptUrl.pathname.slice(scriptUrl.pathname.lastIndexOf('/') + 1);
45
+ let score = index / 10000;
46
+ if (candidateUrl.origin === documentUrl.origin) {
47
+ score += 8;
48
+ }
49
+ if (documentUrl.pathname.startsWith(candidateUrl.pathname)) {
50
+ score += 4;
51
+ }
52
+ if (script.type === 'module') {
53
+ score += 2;
54
+ }
55
+ if (/^(?:app|index|main|runtime|umi)(?:[.-]|$)/i.test(scriptName)) {
56
+ score += 2;
57
+ }
58
+ return { url, score };
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ };
64
+ /**
65
+ * Resolves the stable public base for runtime assets without reading
66
+ * bundler-specific environment metadata or webpack public-path variables.
67
+ * Explicit HTML `<base>` configuration stays authoritative; for SPA fallback
68
+ * routes, emitted Vite/Webpack/UMI entry scripts reveal the deployment root
69
+ * more reliably than the route-derived page URL.
70
+ */
71
+ export const resolveFileViewerRuntimeAssetBaseUrl = (documentRef) => {
72
+ var _a;
73
+ const documentBaseUrl = documentRef.baseURI || documentRef.URL || 'file:///';
74
+ if (documentRef.querySelector('base[href]')) {
75
+ return documentBaseUrl;
76
+ }
77
+ const candidates = Array.from(documentRef.querySelectorAll('script[src]'))
78
+ .map((script, index) => resolveFileViewerScriptAssetBaseCandidate(script, documentBaseUrl, index))
79
+ .filter((candidate) => Boolean(candidate))
80
+ .sort((left, right) => right.score - left.score);
81
+ return ((_a = candidates[0]) === null || _a === void 0 ? void 0 : _a.url) || documentBaseUrl;
82
+ };
28
83
  export const DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS = [
29
84
  {
30
85
  rendererId: 'drawing',
@@ -315,4 +315,4 @@ export declare const DEFAULT_RENDERER_DEFINITIONS: readonly [{
315
315
  readonly search: true;
316
316
  };
317
317
  }];
318
- export declare const DEFAULT_SUPPORTED_EXTENSIONS: readonly ("markdown" | "xyz" | "wasm" | "pdf" | "typst" | "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" | "glb" | "gltf" | "obj" | "stl" | "ply" | "fbx" | "dae" | "3ds" | "3mf" | "amf" | "usd" | "usda" | "usdc" | "usdz" | "kmz" | "step" | "stp" | "iges" | "igs" | "ifc" | "3dm" | "brep" | "pcd" | "wrl" | "vrml" | "vtk" | "vtp" | "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" | "patch" | "bundle" | "bdl" | "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" | "docx" | "docm" | "dotx" | "dotm" | "doc" | "dot" | "pptx" | "pptm" | "potx" | "potm" | "ppsx" | "ppsm" | "rtf" | "odt" | "odp" | "xlsx" | "xltx" | "xlsm" | "xlsb" | "xls" | "xlt" | "xltm" | "csv" | "ods" | "fods" | "numbers" | "ofd" | "typ" | "eml" | "msg" | "mbox" | "olb" | "dra" | "gds" | "oas" | "oasis" | "dxf" | "dwg" | "dwf" | "dwfx" | "xps" | "geojson" | "kml" | "gpx" | "shp" | "excalidraw" | "drawio" | "dio" | "mermaid" | "mmd" | "plantuml" | "puml" | "xmind" | "epub" | "umd" | "md" | "mp4" | "webm" | "m3u8" | "mp3" | "mpeg" | "wav" | "ogg" | "oga" | "opus" | "m4a" | "aac" | "flac" | "weba" | "midi" | "mid" | "ttf" | "otf" | "woff" | "woff2" | "psd" | "ai" | "eps" | "sqlite" | "parquet" | "avro" | "webarchive")[];
318
+ export declare const DEFAULT_SUPPORTED_EXTENSIONS: readonly ("markdown" | "webp" | "jpeg" | "png" | "xyz" | "wasm" | "pdf" | "typst" | "html" | "svg" | "rb" | "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" | "glb" | "gltf" | "obj" | "stl" | "ply" | "fbx" | "dae" | "3ds" | "3mf" | "amf" | "usd" | "usda" | "usdc" | "usdz" | "kmz" | "step" | "stp" | "iges" | "igs" | "ifc" | "3dm" | "brep" | "pcd" | "wrl" | "vrml" | "vtk" | "vtp" | "txt" | "json" | "js" | "mjs" | "cjs" | "css" | "java" | "py" | "htm" | "jsx" | "ts" | "tsx" | "xml" | "log" | "vue" | "yaml" | "yml" | "ini" | "sh" | "bash" | "sql" | "go" | "rs" | "php" | "c" | "cpp" | "cc" | "h" | "hpp" | "cs" | "diff" | "patch" | "bundle" | "bdl" | "jsonc" | "json5" | "ipynb" | "toml" | "proto" | "hcl" | "tex" | "gv" | "http" | "react" | "swift" | "kt" | "gif" | "jpg" | "bmp" | "tiff" | "tif" | "avif" | "ico" | "heic" | "heif" | "jxl" | "docx" | "docm" | "dotx" | "dotm" | "doc" | "dot" | "pptx" | "pptm" | "potx" | "potm" | "ppsx" | "ppsm" | "rtf" | "odt" | "odp" | "xlsx" | "xltx" | "xlsm" | "xlsb" | "xls" | "xlt" | "xltm" | "csv" | "ods" | "fods" | "numbers" | "ofd" | "typ" | "eml" | "msg" | "mbox" | "olb" | "dra" | "gds" | "oas" | "oasis" | "dxf" | "dwg" | "dwf" | "dwfx" | "xps" | "geojson" | "kml" | "gpx" | "shp" | "excalidraw" | "drawio" | "dio" | "mermaid" | "mmd" | "plantuml" | "puml" | "xmind" | "epub" | "umd" | "md" | "mp4" | "webm" | "m3u8" | "mp3" | "mpeg" | "wav" | "ogg" | "oga" | "opus" | "m4a" | "aac" | "flac" | "weba" | "midi" | "mid" | "ttf" | "otf" | "woff" | "woff2" | "psd" | "ai" | "eps" | "sqlite" | "parquet" | "avro" | "webarchive")[];
@@ -102,10 +102,13 @@ const createLightbox = (documentRef, src, t) => {
102
102
  };
103
103
  };
104
104
  export default async function renderImage(buffer, target, type, context) {
105
- var _a;
105
+ var _a, _b;
106
106
  const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
107
107
  const documentRef = target.ownerDocument || document;
108
108
  const src = await resolveImageUrl(buffer, type);
109
+ (_a = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _a === void 0 ? void 0 : _a.call(context, {
110
+ capture: () => new Blob([buffer], { type: getImageBlobType(type) }),
111
+ });
109
112
  let userZoom = 1;
110
113
  let fitScale = 1;
111
114
  let currentScale = 1;
@@ -236,11 +239,13 @@ export default async function renderImage(buffer, target, type, context) {
236
239
  subscribe: zoomEmitter.subscribe,
237
240
  });
238
241
  target.replaceChildren(createStyle(documentRef), root);
239
- (((_a = context === null || context === void 0 ? void 0 : context.surface) === null || _a === void 0 ? void 0 : _a.shadowRoot) || target).append(lightbox.element);
242
+ (((_b = context === null || context === void 0 ? void 0 : context.surface) === null || _b === void 0 ? void 0 : _b.shadowRoot) || target).append(lightbox.element);
240
243
  updateViewportSize();
241
244
  return {
242
245
  $el: target,
243
246
  unmount() {
247
+ var _a;
248
+ (_a = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _a === void 0 ? void 0 : _a.call(context, null);
244
249
  unregisterFileViewerZoomProvider(root);
245
250
  resizeObserver.disconnect();
246
251
  image.removeEventListener('load', updateViewportSize);
@@ -1,6 +1,6 @@
1
1
  import type { FileViewerRendererDispatcher } from './dispatcher';
2
2
  import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from '../source/loading';
3
- import type { FileRenderExportAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from '../contracts/types';
3
+ import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from '../contracts/types';
4
4
  export declare const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = "\u9884\u89C8\u5185\u5BB9\u5378\u8F7D\u5931\u8D25";
5
5
  export interface ResolveFileViewerRenderSessionDisposeErrorMessageInput {
6
6
  message?: string;
@@ -34,6 +34,7 @@ export interface DisposeFileViewerRendererSessionOptions {
34
34
  export interface FileViewerRenderSurfaceState<Session extends RendererSession = RendererSession> {
35
35
  session: Session | null;
36
36
  exportAdapter: FileRenderExportAdapter | null;
37
+ thumbnailAdapter: FileRenderThumbnailAdapter | null;
37
38
  }
38
39
  export type MutableFileViewerRenderSurfaceState<Session extends RendererSession = RendererSession> = FileViewerRenderSurfaceState<Session>;
39
40
  export interface CreateFileViewerRenderReadinessTargetInput {
@@ -43,6 +44,7 @@ export interface CreateFileViewerRenderReadinessTargetInput {
43
44
  export interface CreateFileViewerRenderSurfaceStateTargetInput<Session extends RendererSession = RendererSession> {
44
45
  session: FileViewerMutableAccessor<Session | null>;
45
46
  exportAdapter: FileViewerMutableAccessor<FileRenderExportAdapter | null>;
47
+ thumbnailAdapter?: FileViewerMutableAccessor<FileRenderThumbnailAdapter | null>;
46
48
  }
47
49
  export interface CreateFileViewerRenderTargetOptions {
48
50
  className?: string;
@@ -171,7 +173,7 @@ export declare const appendFileViewerStyle: (target: HTMLElement | ShadowRoot, c
171
173
  export declare const removeFileViewerRenderTarget: (container: HTMLElement, target: HTMLElement) => boolean;
172
174
  export declare const createFileViewerRenderSurfaceState: <Session extends RendererSession = RendererSession>() => FileViewerRenderSurfaceState<Session>;
173
175
  export declare const createFileViewerRenderReadinessTarget: ({ renderedReady, progressiveReady, }: CreateFileViewerRenderReadinessTargetInput) => MutableFileViewerRenderReadinessState;
174
- export declare const createFileViewerRenderSurfaceStateTarget: <Session extends RendererSession = RendererSession>({ session, exportAdapter, }: CreateFileViewerRenderSurfaceStateTargetInput<Session>) => MutableFileViewerRenderSurfaceState<Session>;
176
+ export declare const createFileViewerRenderSurfaceStateTarget: <Session extends RendererSession = RendererSession>({ session, exportAdapter, thumbnailAdapter, }: CreateFileViewerRenderSurfaceStateTargetInput<Session>) => MutableFileViewerRenderSurfaceState<Session>;
175
177
  export declare const applyFileViewerRenderSurfaceState: <Session extends RendererSession, Target extends MutableFileViewerRenderSurfaceState<Session>>(target: Target, state: Partial<FileViewerRenderSurfaceState<Session>>) => Target;
176
178
  export declare const createFileRenderHandlerRendererSession: <Rendered = unknown>(rendered: Rendered, destroy?: () => void | Promise<void>) => FileRenderHandlerRendererSession<Rendered>;
177
179
  export interface CreateFileRenderHandlerRegistryOptions<Rendered = unknown, Target extends HTMLElement = HTMLElement> extends Omit<CreateFileRenderHandlerLoaderOptions<Rendered, Target>, 'handler'> {
@@ -196,7 +198,7 @@ export declare const resetFileViewerRenderSurface: <Session extends RendererSess
196
198
  export declare const runFileViewerRenderSurfaceClear: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ reason, surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, onStopFitObserver, onStopViewStateObserver, onClearViewStateProvider, }: RunFileViewerRenderSurfaceClearInput<Session, UnloadContext>) => FileViewerRenderSurfaceClearState<Session, UnloadContext>;
197
199
  export declare const runFileViewerRenderSurfaceMount: <Session extends RendererSession>({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint, disposeSession, onStartZoomObserver, onStartFitObserver, onStartViewStateObserver, onApplyInitialFit, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: RunFileViewerRenderSurfaceMountInput<Session>) => Promise<Session | undefined>;
198
200
  export declare const createFileViewerRenderSurfaceActionHandlers: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ getContainer, surfaceState, readinessState, isCurrent, render, waitForContainer, waitForPaint, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStartZoomObserver, onStopZoomObserver, onClearZoomProvider, onStartFitObserver, onStopFitObserver, onStartViewStateObserver, onStopViewStateObserver, onClearViewStateProvider, onApplyInitialFit, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: CreateFileViewerRenderSurfaceActionHandlersInput<Session, UnloadContext>) => FileViewerRenderSurfaceActionHandlers<Session, UnloadContext>;
199
- export declare const buildFileRenderContextFromLoadContext: ({ source, surface, options, registerExportAdapter, renderContext, }: RendererLoadContext) => FileRenderContext;
201
+ export declare const buildFileRenderContextFromLoadContext: ({ source, surface, options, signal, registerExportAdapter, registerThumbnailAdapter, renderContext, }: RendererLoadContext) => FileRenderContext;
200
202
  export declare const renderFileViewerHandler: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ dispatcher, buffer, target, type, context, throwOnMissingHandler, }: RenderFileViewerHandlerInput<Rendered, Target>) => Promise<Rendered | undefined>;
201
203
  export declare const createFileRenderHandlerLoader: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ handler, rendererId, getTarget, createContext, destroy, }: CreateFileRenderHandlerLoaderOptions<Rendered, Target>) => RendererLoader;
202
204
  export declare const createFileRenderHandlerRegistry: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ definitions, handlers, getTarget, createContext, destroy, }: CreateFileRenderHandlerRegistryOptions<Rendered, Target>) => FileRenderHandlerRegistryResult<Rendered, Target>;
@@ -157,6 +157,7 @@ export const removeFileViewerRenderTarget = (container, target) => {
157
157
  export const createFileViewerRenderSurfaceState = () => ({
158
158
  session: null,
159
159
  exportAdapter: null,
160
+ thumbnailAdapter: null,
160
161
  });
161
162
  export const createFileViewerRenderReadinessTarget = ({ renderedReady, progressiveReady, }) => {
162
163
  return {
@@ -174,7 +175,8 @@ export const createFileViewerRenderReadinessTarget = ({ renderedReady, progressi
174
175
  },
175
176
  };
176
177
  };
177
- export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapter, }) => {
178
+ export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapter, thumbnailAdapter, }) => {
179
+ let localThumbnailAdapter = null;
178
180
  return {
179
181
  get session() {
180
182
  return session.get();
@@ -188,16 +190,27 @@ export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapte
188
190
  set exportAdapter(value) {
189
191
  exportAdapter.set(value);
190
192
  },
193
+ get thumbnailAdapter() {
194
+ var _a;
195
+ return (_a = thumbnailAdapter === null || thumbnailAdapter === void 0 ? void 0 : thumbnailAdapter.get()) !== null && _a !== void 0 ? _a : localThumbnailAdapter;
196
+ },
197
+ set thumbnailAdapter(value) {
198
+ localThumbnailAdapter = value;
199
+ thumbnailAdapter === null || thumbnailAdapter === void 0 ? void 0 : thumbnailAdapter.set(value);
200
+ },
191
201
  };
192
202
  };
193
203
  export const applyFileViewerRenderSurfaceState = (target, state) => {
194
- var _a, _b;
204
+ var _a, _b, _c;
195
205
  if ('session' in state) {
196
206
  target.session = (_a = state.session) !== null && _a !== void 0 ? _a : null;
197
207
  }
198
208
  if ('exportAdapter' in state) {
199
209
  target.exportAdapter = (_b = state.exportAdapter) !== null && _b !== void 0 ? _b : null;
200
210
  }
211
+ if ('thumbnailAdapter' in state) {
212
+ target.thumbnailAdapter = (_c = state.thumbnailAdapter) !== null && _c !== void 0 ? _c : null;
213
+ }
201
214
  return target;
202
215
  };
203
216
  export const createFileRenderHandlerRendererSession = (rendered, destroy) => ({
@@ -265,7 +278,7 @@ export const disposeActiveFileViewerRendererSession = (target, options = {}) =>
265
278
  };
266
279
  export const resetFileViewerRenderSurface = ({ surfaceState, readinessState, container, disposeOptions, }) => {
267
280
  const session = disposeActiveFileViewerRendererSession(surfaceState, disposeOptions);
268
- applyFileViewerRenderSurfaceState(surfaceState, { exportAdapter: null });
281
+ applyFileViewerRenderSurfaceState(surfaceState, { exportAdapter: null, thumbnailAdapter: null });
269
282
  applyFileViewerRenderReadinessState(readinessState, {
270
283
  renderedReady: false,
271
284
  progressiveReady: false,
@@ -430,13 +443,15 @@ export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surf
430
443
  mountRenderedContent,
431
444
  };
432
445
  };
433
- export const buildFileRenderContextFromLoadContext = ({ source, surface, options, registerExportAdapter, renderContext, }) => ({
446
+ export const buildFileRenderContextFromLoadContext = ({ source, surface, options, signal, registerExportAdapter, registerThumbnailAdapter, renderContext, }) => ({
434
447
  filename: source.filename,
435
448
  url: source.url,
436
449
  streamUrl: source.url,
450
+ signal,
437
451
  options,
438
452
  surface,
439
453
  registerExportAdapter,
454
+ registerThumbnailAdapter,
440
455
  ...renderContext,
441
456
  });
442
457
  export const renderFileViewerHandler = async ({ dispatcher, buffer, target, type = '', context, throwOnMissingHandler = false, }) => {
@@ -1,8 +1,9 @@
1
- import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, RendererRegistry } from '../contracts/types';
1
+ import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from '../contracts/types';
2
2
  export interface CreateViewerOptions {
3
3
  registry?: RendererRegistry;
4
4
  options?: FileViewerOptions;
5
5
  signal?: AbortSignal;
6
6
  onEvent?: FileViewerEventHandler;
7
+ renderPurpose?: FileViewerRenderPurpose;
7
8
  }
8
9
  export declare const createViewer: (container: HTMLElement, createOptions?: CreateViewerOptions) => FileViewerInstance;
@@ -56,6 +56,27 @@ const resolveAutoRenderersEnabled = (options) => {
56
56
  }
57
57
  return (options.rendererMode || 'extend') !== 'replace';
58
58
  };
59
+ const createFileViewerLoadSignal = (controller, signals) => {
60
+ if (!controller) {
61
+ return signals.find(signal => signal);
62
+ }
63
+ const removeListeners = [];
64
+ const cleanup = () => removeListeners.splice(0).forEach(remove => remove());
65
+ controller.signal.addEventListener('abort', cleanup, { once: true });
66
+ for (const signal of signals) {
67
+ if (!signal) {
68
+ continue;
69
+ }
70
+ if (signal.aborted) {
71
+ controller.abort(signal.reason);
72
+ break;
73
+ }
74
+ const onAbort = () => controller.abort(signal.reason);
75
+ signal.addEventListener('abort', onAbort, { once: true });
76
+ removeListeners.push(() => signal.removeEventListener('abort', onAbort));
77
+ }
78
+ return controller.signal;
79
+ };
59
80
  const renderMissingRendererState = (container, type, options) => {
60
81
  const documentRef = container.ownerDocument;
61
82
  const state = createFileViewerUnsupportedState(type, undefined, options);
@@ -427,6 +448,7 @@ export const createViewer = (container, createOptions = {}) => {
427
448
  applyFileViewerRenderSurfaceState(renderSurfaceState, {
428
449
  session: null,
429
450
  exportAdapter: null,
451
+ thumbnailAdapter: null,
430
452
  });
431
453
  removeWatermarkOverlay();
432
454
  await documentActions.clearDocumentState();
@@ -440,8 +462,16 @@ export const createViewer = (container, createOptions = {}) => {
440
462
  };
441
463
  const instance = {
442
464
  container,
443
- async load(source) {
465
+ async prepare() {
466
+ await ensureRendererPluginsInstalled();
467
+ },
468
+ async load(source, loadOptions = {}) {
444
469
  const version = requestScope.requestController.createVersion();
470
+ const requestAbortController = requestScope.requestController.createAbortController();
471
+ const loadSignal = createFileViewerLoadSignal(requestAbortController, [
472
+ createOptions.signal,
473
+ loadOptions.signal,
474
+ ]);
445
475
  await destroyCurrent('replace');
446
476
  await ensureRendererPluginsInstalled();
447
477
  if (!requestScope.isCurrentRequest(version)) {
@@ -470,12 +500,20 @@ export const createViewer = (container, createOptions = {}) => {
470
500
  source: normalized,
471
501
  surface,
472
502
  options,
473
- signal: createOptions.signal,
503
+ signal: loadSignal,
474
504
  registerExportAdapter: adapter => {
475
505
  if (requestScope.isCurrentRequest(version)) {
476
506
  applyFileViewerRenderSurfaceState(renderSurfaceState, { exportAdapter: adapter });
477
507
  }
478
508
  },
509
+ registerThumbnailAdapter: adapter => {
510
+ if (requestScope.isCurrentRequest(version)) {
511
+ applyFileViewerRenderSurfaceState(renderSurfaceState, { thumbnailAdapter: adapter });
512
+ }
513
+ },
514
+ renderContext: {
515
+ renderPurpose: createOptions.renderPurpose || 'preview',
516
+ },
479
517
  });
480
518
  }
481
519
  catch (error) {
@@ -504,6 +542,10 @@ export const createViewer = (container, createOptions = {}) => {
504
542
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
505
543
  return session;
506
544
  },
545
+ async unload(reason = 'replace') {
546
+ requestScope.requestController.createVersion();
547
+ await destroyCurrent(reason);
548
+ },
507
549
  async destroy(reason = 'component-unmount') {
508
550
  requestScope.requestController.createVersion();
509
551
  await destroyCurrent(reason);
@@ -540,6 +582,12 @@ export const createViewer = (container, createOptions = {}) => {
540
582
  getExportAdapter() {
541
583
  return renderSurfaceState.exportAdapter;
542
584
  },
585
+ registerThumbnailAdapter(adapter) {
586
+ applyFileViewerRenderSurfaceState(renderSurfaceState, { thumbnailAdapter: adapter });
587
+ },
588
+ getThumbnailAdapter() {
589
+ return renderSurfaceState.thumbnailAdapter;
590
+ },
543
591
  async download(downloadOptions = {}) {
544
592
  const source = createFileViewerOriginalSourceStateFromNormalizedSource(currentSource);
545
593
  await executeFileViewerDownloadOperation({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.26",
3
+ "version": "2.1.28",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for Flyfish File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",