@file-viewer/core 2.1.13 → 2.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/headless.js CHANGED
@@ -4,7 +4,7 @@
4
4
  // lifecycle operations, and renderer registry utilities without importing any
5
5
  // framework wrapper. It is the safest entrypoint for React/Vue/Web packages.
6
6
  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_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets.js';
7
- export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
7
+ export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
8
8
  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';
9
9
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats.js';
10
10
  export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
@@ -195,7 +195,7 @@ const ZH_CN_MESSAGES = {
195
195
  'psd.layers.hidden': '隐藏',
196
196
  'drawing.error.viewerLoadFailed': 'diagrams.net viewer 加载失败',
197
197
  'drawing.error.excalidrawEmpty': 'Excalidraw 文件中没有可预览图元',
198
- 'drawing.error.excalidrawTimeout': 'Excalidraw 官方导出超时,自动切换 rough.js 兼容渲染',
198
+ 'drawing.error.excalidrawTimeout': 'Excalidraw SVG 导出超时,自动切换 rough.js 兼容渲染',
199
199
  'drawing.error.drawioParseFailed': 'Draw.io XML 解析失败:{message}',
200
200
  'drawing.error.drawioNoModel': '当前 Draw.io 文件没有可直接渲染的 mxGraphModel。',
201
201
  'drawing.error.drawioNoElements': '当前 Draw.io 文件没有可预览图元。',
@@ -203,7 +203,7 @@ const ZH_CN_MESSAGES = {
203
203
  'drawing.error.drawioTimeout': 'diagrams.net 官方 Viewer 加载超时,自动切换本地 SVG 预览',
204
204
  'drawing.error.svgParseFailed': 'SVG 解析失败',
205
205
  'drawing.error.plantumlRenderFailed': 'PlantUML SVG 渲染失败:{status}',
206
- 'drawing.title.excalidraw': 'Excalidraw 官方 SVG 预览',
206
+ 'drawing.title.excalidraw': 'Excalidraw SVG 预览',
207
207
  'drawing.title.mermaid': 'Mermaid SVG 预览',
208
208
  'drawing.title.plantuml': 'PlantUML SVG 预览',
209
209
  'drawing.title.drawio': 'Draw.io 离线 SVG 预览',
@@ -567,7 +567,7 @@ const EN_US_MESSAGES = {
567
567
  'psd.layers.hidden': 'hidden',
568
568
  'drawing.error.viewerLoadFailed': 'Failed to load the diagrams.net viewer',
569
569
  'drawing.error.excalidrawEmpty': 'This Excalidraw file has no previewable elements',
570
- 'drawing.error.excalidrawTimeout': 'Official Excalidraw export timed out. Falling back to the rough.js renderer.',
570
+ 'drawing.error.excalidrawTimeout': 'Excalidraw SVG export timed out. Falling back to the rough.js renderer.',
571
571
  'drawing.error.drawioParseFailed': 'Failed to parse Draw.io XML: {message}',
572
572
  'drawing.error.drawioNoModel': 'This Draw.io file has no directly renderable mxGraphModel.',
573
573
  'drawing.error.drawioNoElements': 'This Draw.io file has no previewable elements.',
@@ -575,7 +575,7 @@ const EN_US_MESSAGES = {
575
575
  'drawing.error.drawioTimeout': 'Official diagrams.net Viewer timed out. Falling back to the local SVG preview.',
576
576
  'drawing.error.svgParseFailed': 'Failed to parse SVG',
577
577
  'drawing.error.plantumlRenderFailed': 'Failed to render PlantUML SVG: {status}',
578
- 'drawing.title.excalidraw': 'Official Excalidraw SVG preview',
578
+ 'drawing.title.excalidraw': 'Excalidraw SVG preview',
579
579
  'drawing.title.mermaid': 'Mermaid SVG preview',
580
580
  'drawing.title.plantuml': 'PlantUML SVG preview',
581
581
  'drawing.title.drawio': 'Draw.io offline SVG preview',
package/dist/index.d.ts CHANGED
@@ -8,7 +8,9 @@ export { createFileViewerDocumentFeatureActions, createFileViewerDocumentFeature
8
8
  export type { CreateFileViewerDocumentChangeSnapshotInput, FileViewerDocumentFeatureActionOptions, DispatchFileViewerLocationChangeInput, DispatchFileViewerSearchChangeInput, FileViewerDocumentChangeSnapshot, FileViewerDocumentFeatureActions, FileViewerDocumentFeatureControllerActionHandlers, FileViewerDocumentFeatureSearchController, CreateFileViewerDocumentFeatureActionsInput, CreateFileViewerDocumentFeatureControllerActionHandlersInput, ResolveFileViewerLocationChangeAnchorInput, } from './features/document/events';
9
9
  export { applyFileViewerZoomState, clearFileViewerZoomControllerProvider, createFileViewerZoomChangeEmitter, createFileViewerZoomChangeState, cloneFileViewerZoomState, createFileViewerZoomController, createFileViewerZoomControllerActionHandlers, destroyFileViewerZoomController, observeFileViewerZoomController, refreshFileViewerZoomControllerProvider, runFileViewerZoomControllerAction, syncFileViewerZoomControllerState, } from './features/document/zoom';
10
10
  export type { FileViewerZoomController, FileViewerZoomControllerActionHandlers, MutableFileViewerZoomState, } from './features/document/zoom';
11
- export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, findFileViewerSearchProvider, findFileViewerZoomProvider, getCurrentFileViewerDocumentAnchor, getFileViewerScrollableRange, isFileViewerScrollableElement, registerFileViewerSearchProvider, registerFileViewerZoomProvider, resolveFileViewerScrollContainer, scrollToFileViewerDocumentAnchor, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './features/document/dom';
11
+ export { cloneFileViewerViewState, createFileViewerViewStateChange, createFileViewerViewStateChangeEmitter, createFileViewerViewStateController, createFileViewerViewStateControllerActionHandlers, registerFileViewerGenericViewStateProvider, } from './features/document/viewState';
12
+ export type { CreateFileViewerViewStateControllerOptions, FileViewerGenericViewStateProviderRegistration, FileViewerViewStateController, FileViewerViewStateControllerActionHandlers, RegisterFileViewerGenericViewStateProviderOptions, } from './features/document/viewState';
13
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, findFileViewerSearchProvider, findFileViewerViewStateProvider, findFileViewerZoomProvider, getCurrentFileViewerDocumentAnchor, getFileViewerScrollableRange, isFileViewerScrollableElement, registerFileViewerSearchProvider, registerFileViewerViewStateProvider, registerFileViewerZoomProvider, resolveFileViewerScrollContainer, scrollToFileViewerDocumentAnchor, unregisterFileViewerSearchProvider, unregisterFileViewerViewStateProvider, unregisterFileViewerZoomProvider, } from './features/document/dom';
12
14
  export { buildFileViewerRenderedHtmlDocument, buildExportHtmlDocument, collectDocumentStyles, prepareFileViewerRenderedContentForSnapshot, replaceFileViewerCanvasWithImages, resolveFileViewerPrintStyle, triggerFileViewerBlobDownload, triggerFileViewerUrlDownload, waitForFileViewerImages, waitForFileViewerNextPaint, waitForFileViewerPrintWindowReady, } from './output/export';
13
15
  export { applyPrintPageSize, buildPrintPageStyle, formatCssPixels, getElementPrintPageSize, } from './output/printLayout';
14
16
  export type { ApplyPrintPageSizeOptions, BuildPrintPageStyleOptions, PrintPageSize, } from './output/printLayout';
@@ -44,7 +46,7 @@ export declare const renderFileViewerWordDoc: (buffer: ArrayBuffer, target: HTML
44
46
  export declare const renderFileViewerWordDocx: (buffer: ArrayBuffer, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance>;
45
47
  export declare const renderFileViewerSpreadsheet: (buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext) => Promise<FileViewerRenderedInstance>;
46
48
  export declare const parseEdaFile: (buffer: ArrayBuffer, type?: string) => Promise<never>;
47
- export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities';
49
+ export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities';
48
50
  export { FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationContextEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarState, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations';
49
51
  export type { BuildFileViewerOperationContextFromLifecycleStateInput, CreateFileViewerLifecycleActionsInput, DispatchFileViewerLifecycleEventInput, DispatchFileViewerOperationContextEventInput, DispatchFileViewerOperationAvailabilityChangeInput, DispatchFileViewerZoomChangeInput, FileViewerActiveUnloadState, FileViewerLifecycleActions, FileViewerLifecycleComponentEmit, FileViewerToolbarActions, FileViewerToolbarControllerActionHandlers, FileViewerToolbarZoomSyncSnapshot, FileViewerZoomButtonAction, FileViewerToolbarState, CreateFileViewerPublicApiInput, CreateFileViewerToolbarActionsInput, CreateFileViewerToolbarControllerActionHandlersInput, BuildFileViewerLifecycleContextFromNormalizedSourceInput, ResolveFileViewerBeforeOperationErrorMessageInput, ResolveFileViewerToolbarStateInput, RunFileViewerActiveUnloadCompleteInput, RunFileViewerActiveUnloadStartInput, RunFileViewerToolbarAvailabilitySyncInput, RunFileViewerToolbarZoomSyncInput, } from './lifecycle/operations';
50
52
  export { FALLBACK_FILE_VIEWER_LOADING_THEME, FILE_VIEWER_LOADING_THEME_MAP, applyFileViewerLoadingState, cloneFileViewerLoadingState, createFileViewerLoadingController, createFileViewerLoadingControllerActionHandlers, createFileViewerLoadingState, createFileViewerLoadingStyleVars, runFileViewerLoadingControllerAction, runFileViewerLoadingExtensionSync, resolveFileViewerLoadingTheme, syncFileViewerLoadingControllerState, } from './viewer/loading';
@@ -75,10 +77,10 @@ export type { FileViewerSerializableCadOptions, FileViewerSerializableOptions, F
75
77
  export type { InstallFileViewerRendererPluginsOptions, } from './registry/registry';
76
78
  export type { CreateFileViewerRendererDispatcherOptions, FileViewerRendererDispatcher, FileViewerRendererHandlerEntry, } from './rendering/dispatcher';
77
79
  export type { CreateFileViewerRenderTargetOptions, CreateFileRenderHandlerRegistryOptions, CreateFileRenderHandlerLoaderOptions, DisposeFileViewerRendererSessionOptions, FileRenderHandlerRegistryResult, FileRenderHandlerRendererSession, RenderFileViewerHandlerInput, } from './rendering/handler';
78
- export type { FileViewerSearchProviderHost, ResolveFileViewerScrollContainerOptions, FileViewerZoomProviderHost, } from './features/document/dom';
80
+ export type { FileViewerSearchProviderHost, ResolveFileViewerScrollContainerOptions, FileViewerViewStateProviderHost, FileViewerZoomProviderHost, } from './features/document/dom';
79
81
  export type { CreateFileViewerDomSearchControllerOptions, FileViewerInternalSearchMatch, } from './features/document/search';
80
82
  export type { CreateFileViewerZoomControllerOptions, FileViewerZoomOperation, } from './features/document/zoom';
81
83
  export type { CreateViewerOptions } from './viewer/createViewer';
82
84
  export type { BuildExportHtmlDocumentOptions, BuildFileViewerRenderedHtmlDocumentOptions, } from './output/export';
83
85
  export type { CreateFileViewerWorkerControllerOptions, FileViewerWorkerContext, FileViewerWorkerController, FileViewerWorkerErrorHook, FileViewerWorkerEventHandler, FileViewerWorkerFactory, FileViewerWorkerMessageHook, WorkerProvider, WorkerRef, } from './platform/worker';
84
- export type { FileViewerAiOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, 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, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerTypstOptions, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
86
+ export type { FileViewerAiOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, 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, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarOptions, FileViewerToolbarPosition, 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
@@ -4,7 +4,8 @@ export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_
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';
5
5
  export { createFileViewerDocumentFeatureActions, createFileViewerDocumentFeatureControllerActionHandlers, createFileViewerDocumentChangeSnapshot, createFileViewerSearchChangeState, dispatchFileViewerLocationChange, dispatchFileViewerSearchChange, resolveFileViewerLocationChangeAnchor, } from './features/document/events.js';
6
6
  export { applyFileViewerZoomState, clearFileViewerZoomControllerProvider, createFileViewerZoomChangeEmitter, createFileViewerZoomChangeState, cloneFileViewerZoomState, createFileViewerZoomController, createFileViewerZoomControllerActionHandlers, destroyFileViewerZoomController, observeFileViewerZoomController, refreshFileViewerZoomControllerProvider, runFileViewerZoomControllerAction, syncFileViewerZoomControllerState, } from './features/document/zoom.js';
7
- export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, findFileViewerSearchProvider, findFileViewerZoomProvider, getCurrentFileViewerDocumentAnchor, getFileViewerScrollableRange, isFileViewerScrollableElement, registerFileViewerSearchProvider, registerFileViewerZoomProvider, resolveFileViewerScrollContainer, scrollToFileViewerDocumentAnchor, unregisterFileViewerSearchProvider, unregisterFileViewerZoomProvider, } from './features/document/dom/index.js';
7
+ export { cloneFileViewerViewState, createFileViewerViewStateChange, createFileViewerViewStateChangeEmitter, createFileViewerViewStateController, createFileViewerViewStateControllerActionHandlers, registerFileViewerGenericViewStateProvider, } from './features/document/viewState.js';
8
+ export { DEFAULT_FILE_VIEWER_ANCHOR_EXCLUDE_SELECTOR, DEFAULT_FILE_VIEWER_ANCHOR_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_CANDIDATE_SELECTOR, DEFAULT_FILE_VIEWER_SCROLL_CONTAINER_SELECTOR, DEFAULT_FILE_VIEWER_SCROLLABLE_OVERFLOW_VALUES, collectFileViewerDocumentAnchors, findFileViewerAnchorForElement, findFileViewerSearchProvider, findFileViewerViewStateProvider, findFileViewerZoomProvider, getCurrentFileViewerDocumentAnchor, getFileViewerScrollableRange, isFileViewerScrollableElement, registerFileViewerSearchProvider, registerFileViewerViewStateProvider, registerFileViewerZoomProvider, resolveFileViewerScrollContainer, scrollToFileViewerDocumentAnchor, unregisterFileViewerSearchProvider, unregisterFileViewerViewStateProvider, unregisterFileViewerZoomProvider, } from './features/document/dom/index.js';
8
9
  export { buildFileViewerRenderedHtmlDocument, buildExportHtmlDocument, collectDocumentStyles, prepareFileViewerRenderedContentForSnapshot, replaceFileViewerCanvasWithImages, resolveFileViewerPrintStyle, triggerFileViewerBlobDownload, triggerFileViewerUrlDownload, waitForFileViewerImages, waitForFileViewerNextPaint, waitForFileViewerPrintWindowReady, } from './output/export.js';
9
10
  export { applyPrintPageSize, buildPrintPageStyle, formatCssPixels, getElementPrintPageSize, } from './output/printLayout.js';
10
11
  export { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_TITLE, FILE_VIEWER_OPERATION_ACTION_ERROR_PREFIXES, createFileViewerOperationActionHandlers, createFileViewerOriginalSourceState, createFileViewerOriginalSourceStateFromNormalizedSource, createFileViewerPublicOperationActionHandlers, executeFileViewerDownloadOperation, executeFileViewerExportHtmlOperation, executeFileViewerPrintOperation, hasFileViewerOriginalSource, resolveFileViewerDisplayFilename, resolveFileViewerOperationActionErrorMessage, resolveFileViewerOperationFilename, resolveFileViewerOriginalFilename, } from './viewer/operations.js';
@@ -160,7 +161,7 @@ export const parseEdaFile = async (buffer, type) => {
160
161
  void type;
161
162
  throw new Error('EDA parsing has moved out of @file-viewer/core. Import parseEdaFile from @file-viewer/renderer-eda instead.');
162
163
  };
163
- export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
164
+ export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
164
165
  export { FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationContextEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarState, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
165
166
  export { FALLBACK_FILE_VIEWER_LOADING_THEME, FILE_VIEWER_LOADING_THEME_MAP, applyFileViewerLoadingState, cloneFileViewerLoadingState, createFileViewerLoadingController, createFileViewerLoadingControllerActionHandlers, createFileViewerLoadingState, createFileViewerLoadingStyleVars, runFileViewerLoadingControllerAction, runFileViewerLoadingExtensionSync, resolveFileViewerLoadingTheme, syncFileViewerLoadingControllerState, } from './viewer/loading.js';
166
167
  export { createFileViewerLifecycleFacade, } from './lifecycle/facade.js';
@@ -1,6 +1,7 @@
1
- import type { FileRenderExportAdapter, FileViewerOperationAvailability, RendererDefinition, RendererSession } from '../contracts/types';
1
+ import type { FileRenderExportAdapter, FileViewerOperationAvailability, FileViewerZoomState, RendererDefinition, RendererSession } from '../contracts/types';
2
2
  export declare const DEFAULT_OPERATION_AVAILABILITY: FileViewerOperationAvailability;
3
3
  export declare const getRendererAvailability: (renderer: RendererDefinition | undefined, session?: RendererSession | null) => FileViewerOperationAvailability;
4
+ export declare const applyFileViewerZoomAvailability: (availability: FileViewerOperationAvailability, zoomState: FileViewerZoomState) => FileViewerOperationAvailability;
4
5
  export declare const createUnsupportedAvailability: (extension: string) => FileViewerOperationAvailability;
5
6
  /**
6
7
  * 这些格式只有专属适配器准备好后才展示打印。
@@ -31,6 +31,16 @@ export const getRendererAvailability = (renderer, session) => {
31
31
  ...(_h = session === null || session === void 0 ? void 0 : session.getAvailability) === null || _h === void 0 ? void 0 : _h.call(session),
32
32
  };
33
33
  };
34
+ export const applyFileViewerZoomAvailability = (availability, zoomState) => {
35
+ const zoom = availability.zoom && (zoomState.canZoomIn || zoomState.canZoomOut || zoomState.canReset);
36
+ return {
37
+ ...availability,
38
+ zoom,
39
+ zoomIn: zoom && zoomState.canZoomIn,
40
+ zoomOut: zoom && zoomState.canZoomOut,
41
+ zoomReset: zoom && zoomState.canReset,
42
+ };
43
+ };
34
44
  export const createUnsupportedAvailability = (extension) => ({
35
45
  ...DEFAULT_OPERATION_AVAILABILITY,
36
46
  download: normalizeFileExtension(extension).length > 0,
@@ -60,15 +60,8 @@ const resolveImageUrl = async (buffer, type) => {
60
60
  }
61
61
  return readBlobDataUrl(new Blob([buffer], { type: getImageBlobType(normalizedType) }));
62
62
  };
63
- const clampZoom = (value) => {
64
- return Math.min(5, Math.max(0.1, Number(value.toFixed(2))));
65
- };
66
- const applyImageZoom = (image, viewportHeight, zoom) => {
67
- if (viewportHeight > 0) {
68
- image.style.height = `${Math.max(1, Math.round(viewportHeight * zoom))}px`;
69
- return;
70
- }
71
- image.style.height = `${zoom * 100}%`;
63
+ const roundImageScale = (value) => {
64
+ return Number(value.toFixed(3));
72
65
  };
73
66
  const createLightbox = (src) => {
74
67
  const lightbox = document.createElement('div');
@@ -108,7 +101,9 @@ const createLightbox = (src) => {
108
101
  };
109
102
  export default async function renderImage(buffer, target, type) {
110
103
  const src = await resolveImageUrl(buffer, type);
111
- let zoom = 1;
104
+ let userZoom = 1;
105
+ let fitScale = 1;
106
+ let currentScale = 1;
112
107
  let viewportHeight = 0;
113
108
  const zoomEmitter = createZoomChangeEmitter();
114
109
  const root = document.createElement('div');
@@ -125,32 +120,67 @@ export default async function renderImage(buffer, target, type) {
125
120
  const openLightbox = () => lightbox.open();
126
121
  image.addEventListener('click', openLightbox);
127
122
  document.body.append(lightbox.element);
123
+ const getMinScale = () => Math.min(0.1, fitScale || 0.1);
124
+ const clampScale = (value) => {
125
+ const minScale = getMinScale();
126
+ return Math.min(5, Math.max(minScale, roundImageScale(value)));
127
+ };
128
+ const computeFitScale = () => {
129
+ const naturalWidth = image.naturalWidth || 0;
130
+ const naturalHeight = image.naturalHeight || 0;
131
+ if (!naturalWidth || !naturalHeight) {
132
+ return 1;
133
+ }
134
+ const availableWidth = Math.max((root.clientWidth || 0) - 48, 1);
135
+ const availableHeight = Math.max((root.clientHeight || viewportHeight || 0) - 48, 1);
136
+ return Math.min(1, availableWidth / naturalWidth, availableHeight / naturalHeight);
137
+ };
138
+ const applyImageZoom = () => {
139
+ fitScale = computeFitScale();
140
+ currentScale = clampScale(fitScale * userZoom);
141
+ if (image.naturalWidth && image.naturalHeight) {
142
+ image.style.width = `${Math.max(1, Math.round(image.naturalWidth * currentScale))}px`;
143
+ image.style.height = `${Math.max(1, Math.round(image.naturalHeight * currentScale))}px`;
144
+ return;
145
+ }
146
+ image.style.width = 'auto';
147
+ image.style.height = viewportHeight > 0
148
+ ? `${Math.max(1, Math.round(viewportHeight * userZoom))}px`
149
+ : `${userZoom * 100}%`;
150
+ };
128
151
  const updateViewportSize = () => {
129
152
  viewportHeight = root.clientHeight || 0;
130
- applyImageZoom(image, viewportHeight, zoom);
153
+ applyImageZoom();
131
154
  zoomEmitter.emit();
132
155
  };
133
156
  const resizeObserver = new ResizeObserver(updateViewportSize);
134
157
  resizeObserver.observe(root);
158
+ image.addEventListener('load', updateViewportSize);
135
159
  const getZoomState = () => ({
136
- scale: zoom,
137
- label: `${Math.round(zoom * 100)}%`,
138
- canZoomIn: zoom < 5,
139
- canZoomOut: zoom > 0.1,
140
- canReset: zoom !== 1,
141
- minScale: 0.1,
160
+ scale: currentScale,
161
+ label: `${Math.round(currentScale * 100)}%`,
162
+ canZoomIn: currentScale < 5,
163
+ canZoomOut: currentScale > getMinScale(),
164
+ canReset: Math.abs(userZoom - 1) > 0.001,
165
+ minScale: getMinScale(),
142
166
  maxScale: 5,
143
167
  });
144
168
  const setZoom = (scale) => {
145
- zoom = clampZoom(scale);
146
- applyImageZoom(image, viewportHeight, zoom);
169
+ const nextScale = clampScale(scale);
170
+ userZoom = nextScale / Math.max(fitScale, 0.001);
171
+ applyImageZoom();
147
172
  zoomEmitter.emit();
148
173
  return getZoomState();
149
174
  };
150
175
  registerFileViewerZoomProvider(root, {
151
- zoomIn: () => setZoom(zoom + 0.15),
152
- zoomOut: () => setZoom(zoom - 0.15),
153
- resetZoom: () => setZoom(1),
176
+ zoomIn: () => setZoom(currentScale + 0.15),
177
+ zoomOut: () => setZoom(currentScale - 0.15),
178
+ resetZoom: () => {
179
+ userZoom = 1;
180
+ applyImageZoom();
181
+ zoomEmitter.emit();
182
+ return getZoomState();
183
+ },
154
184
  setZoom,
155
185
  getState: getZoomState,
156
186
  subscribe: zoomEmitter.subscribe,
@@ -162,6 +192,7 @@ export default async function renderImage(buffer, target, type) {
162
192
  unmount() {
163
193
  unregisterFileViewerZoomProvider(root);
164
194
  resizeObserver.disconnect();
195
+ image.removeEventListener('load', updateViewportSize);
165
196
  image.removeEventListener('click', openLightbox);
166
197
  lightbox.destroy();
167
198
  target.replaceChildren();
@@ -20,6 +20,7 @@ export interface RenderFileViewerHandlerInput<Rendered = unknown, Target extends
20
20
  }
21
21
  export interface CreateFileRenderHandlerLoaderOptions<Rendered = unknown, Target extends HTMLElement = HTMLElement> {
22
22
  handler: FileRenderHandler<Rendered, Target>;
23
+ rendererId?: string;
23
24
  getTarget?: (context: RendererLoadContext) => Target;
24
25
  createContext?: (context: RendererLoadContext) => FileRenderContext;
25
26
  destroy?: (rendered: Rendered, context: RendererLoadContext) => void | Promise<void>;
@@ -82,8 +83,10 @@ export interface RunFileViewerRenderSurfaceMountInput<Session extends RendererSe
82
83
  waitForPaint?: () => Promise<unknown> | unknown;
83
84
  disposeSession?: (session?: Session | null) => void;
84
85
  onStartZoomObserver?: () => void;
86
+ onStartViewStateObserver?: () => void;
85
87
  onRefreshDocumentIndex?: () => Promise<unknown> | unknown;
86
88
  onRefreshZoomProvider?: () => void;
89
+ onRefreshViewStateProvider?: () => void;
87
90
  }
88
91
  export interface RunFileViewerRenderSurfaceClearInput<Session extends RendererSession = RendererSession, UnloadContext = FileViewerLifecycleContext | null> {
89
92
  reason?: FileViewerLifecycleContext['reason'];
@@ -97,6 +100,8 @@ export interface RunFileViewerRenderSurfaceClearInput<Session extends RendererSe
97
100
  onClearDocumentState?: () => void;
98
101
  onStopZoomObserver?: () => void;
99
102
  onClearZoomProvider?: () => void;
103
+ onStopViewStateObserver?: () => void;
104
+ onClearViewStateProvider?: () => void;
100
105
  }
101
106
  export interface FileViewerRenderSurfaceClearState<Session extends RendererSession = RendererSession, UnloadContext = FileViewerLifecycleContext | null> {
102
107
  reason: FileViewerLifecycleContext['reason'];
@@ -125,8 +130,12 @@ export interface CreateFileViewerRenderSurfaceActionHandlersInput<Session extend
125
130
  onStartZoomObserver?: () => void;
126
131
  onStopZoomObserver?: () => void;
127
132
  onClearZoomProvider?: () => void;
133
+ onStartViewStateObserver?: () => void;
134
+ onStopViewStateObserver?: () => void;
135
+ onClearViewStateProvider?: () => void;
128
136
  onRefreshDocumentIndex?: () => Promise<unknown> | unknown;
129
137
  onRefreshZoomProvider?: () => void;
138
+ onRefreshViewStateProvider?: () => void;
130
139
  }
131
140
  export declare const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = "file-render";
132
141
  export declare const clearFileViewerRenderSurface: (container?: HTMLElement | null) => void;
@@ -156,10 +165,10 @@ export declare const reportFileViewerRenderSessionDisposeError: ({ error, onLogE
156
165
  export declare const disposeFileViewerRendererSession: (session?: RendererSession | null, options?: DisposeFileViewerRendererSessionOptions) => void;
157
166
  export declare const disposeActiveFileViewerRendererSession: <Session extends RendererSession, Target extends MutableFileViewerRenderSurfaceState<Session>>(target: Target, options?: DisposeFileViewerRendererSessionOptions) => Session | null;
158
167
  export declare const resetFileViewerRenderSurface: <Session extends RendererSession>({ surfaceState, readinessState, container, disposeOptions, }: ResetFileViewerRenderSurfaceInput<Session>) => Session | null;
159
- export declare const runFileViewerRenderSurfaceClear: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ reason, surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, }: RunFileViewerRenderSurfaceClearInput<Session, UnloadContext>) => FileViewerRenderSurfaceClearState<Session, UnloadContext>;
160
- export declare const runFileViewerRenderSurfaceMount: <Session extends RendererSession>({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint, disposeSession, onStartZoomObserver, onRefreshDocumentIndex, onRefreshZoomProvider, }: RunFileViewerRenderSurfaceMountInput<Session>) => Promise<Session | undefined>;
161
- 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, onRefreshDocumentIndex, onRefreshZoomProvider, }: CreateFileViewerRenderSurfaceActionHandlersInput<Session, UnloadContext>) => FileViewerRenderSurfaceActionHandlers<Session, UnloadContext>;
168
+ export declare const runFileViewerRenderSurfaceClear: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ reason, surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, onStopViewStateObserver, onClearViewStateProvider, }: RunFileViewerRenderSurfaceClearInput<Session, UnloadContext>) => FileViewerRenderSurfaceClearState<Session, UnloadContext>;
169
+ export declare const runFileViewerRenderSurfaceMount: <Session extends RendererSession>({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint, disposeSession, onStartZoomObserver, onStartViewStateObserver, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: RunFileViewerRenderSurfaceMountInput<Session>) => Promise<Session | undefined>;
170
+ 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, onStartViewStateObserver, onStopViewStateObserver, onClearViewStateProvider, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: CreateFileViewerRenderSurfaceActionHandlersInput<Session, UnloadContext>) => FileViewerRenderSurfaceActionHandlers<Session, UnloadContext>;
162
171
  export declare const buildFileRenderContextFromLoadContext: ({ source, options, registerExportAdapter, renderContext, }: RendererLoadContext) => FileRenderContext;
163
172
  export declare const renderFileViewerHandler: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ dispatcher, buffer, target, type, context, throwOnMissingHandler, }: RenderFileViewerHandlerInput<Rendered, Target>) => Promise<Rendered | undefined>;
164
- export declare const createFileRenderHandlerLoader: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ handler, getTarget, createContext, destroy, }: CreateFileRenderHandlerLoaderOptions<Rendered, Target>) => RendererLoader;
173
+ export declare const createFileRenderHandlerLoader: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ handler, rendererId, getTarget, createContext, destroy, }: CreateFileRenderHandlerLoaderOptions<Rendered, Target>) => RendererLoader;
165
174
  export declare const createFileRenderHandlerRegistry: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ definitions, handlers, getTarget, createContext, destroy, }: CreateFileRenderHandlerRegistryOptions<Rendered, Target>) => FileRenderHandlerRegistryResult<Rendered, Target>;
@@ -9,6 +9,8 @@ import { createFileViewerRendererDispatcher } from './dispatcher.js';
9
9
  import { createRendererRegistry } from '../registry/registry.js';
10
10
  import { getExtension, normalizeFileExtension } from '../source/index.js';
11
11
  import { applyFileViewerRenderReadinessState, } from '../source/loading.js';
12
+ import { findFileViewerViewStateProvider } from '../features/document/dom/index.js';
13
+ import { registerFileViewerGenericViewStateProvider } from '../features/document/viewState.js';
12
14
  export const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = '预览内容卸载失败';
13
15
  export const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = 'file-render';
14
16
  const isPromiseLike = (value) => {
@@ -156,7 +158,7 @@ export const resetFileViewerRenderSurface = ({ surfaceState, readinessState, con
156
158
  clearFileViewerRenderSurface(container);
157
159
  return session;
158
160
  };
159
- export const runFileViewerRenderSurfaceClear = ({ reason = 'replace', surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, }) => {
161
+ export const runFileViewerRenderSurfaceClear = ({ reason = 'replace', surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, onStopViewStateObserver, onClearViewStateProvider, }) => {
160
162
  const unloadContext = onUnloadStart === null || onUnloadStart === void 0 ? void 0 : onUnloadStart(reason);
161
163
  let session;
162
164
  try {
@@ -172,6 +174,8 @@ export const runFileViewerRenderSurfaceClear = ({ reason = 'replace', surfaceSta
172
174
  onClearDocumentState === null || onClearDocumentState === void 0 ? void 0 : onClearDocumentState();
173
175
  onStopZoomObserver === null || onStopZoomObserver === void 0 ? void 0 : onStopZoomObserver();
174
176
  onClearZoomProvider === null || onClearZoomProvider === void 0 ? void 0 : onClearZoomProvider();
177
+ onStopViewStateObserver === null || onStopViewStateObserver === void 0 ? void 0 : onStopViewStateObserver();
178
+ onClearViewStateProvider === null || onClearViewStateProvider === void 0 ? void 0 : onClearViewStateProvider();
175
179
  }
176
180
  onUnloadComplete === null || onUnloadComplete === void 0 ? void 0 : onUnloadComplete(unloadContext, reason);
177
181
  return {
@@ -180,7 +184,7 @@ export const runFileViewerRenderSurfaceClear = ({ reason = 'replace', surfaceSta
180
184
  session,
181
185
  };
182
186
  };
183
- export const runFileViewerRenderSurfaceMount = async ({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint = waitForFileViewerNextPaint, disposeSession = disposeFileViewerRendererSession, onStartZoomObserver, onRefreshDocumentIndex, onRefreshZoomProvider, }) => {
187
+ export const runFileViewerRenderSurfaceMount = async ({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint = waitForFileViewerNextPaint, disposeSession = disposeFileViewerRendererSession, onStartZoomObserver, onStartViewStateObserver, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }) => {
184
188
  if (!getContainer()) {
185
189
  await (waitForContainer === null || waitForContainer === void 0 ? void 0 : waitForContainer());
186
190
  }
@@ -191,6 +195,7 @@ export const runFileViewerRenderSurfaceMount = async ({ buffer, file, version, s
191
195
  clearRenderedContent('replace');
192
196
  const target = createFileViewerRenderTarget(container);
193
197
  onStartZoomObserver === null || onStartZoomObserver === void 0 ? void 0 : onStartZoomObserver();
198
+ onStartViewStateObserver === null || onStartViewStateObserver === void 0 ? void 0 : onStartViewStateObserver();
194
199
  await (waitForContainer === null || waitForContainer === void 0 ? void 0 : waitForContainer());
195
200
  await waitForPaint();
196
201
  if (!isCurrent(version)) {
@@ -227,6 +232,7 @@ export const runFileViewerRenderSurfaceMount = async ({ buffer, file, version, s
227
232
  }
228
233
  void (onRefreshDocumentIndex === null || onRefreshDocumentIndex === void 0 ? void 0 : onRefreshDocumentIndex());
229
234
  onRefreshZoomProvider === null || onRefreshZoomProvider === void 0 ? void 0 : onRefreshZoomProvider();
235
+ onRefreshViewStateProvider === null || onRefreshViewStateProvider === void 0 ? void 0 : onRefreshViewStateProvider();
230
236
  return session;
231
237
  }
232
238
  catch (error) {
@@ -234,7 +240,7 @@ export const runFileViewerRenderSurfaceMount = async ({ buffer, file, version, s
234
240
  throw error;
235
241
  }
236
242
  };
237
- export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surfaceState, readinessState, isCurrent, render, waitForContainer, waitForPaint, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStartZoomObserver, onStopZoomObserver, onClearZoomProvider, onRefreshDocumentIndex, onRefreshZoomProvider, }) => {
243
+ export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surfaceState, readinessState, isCurrent, render, waitForContainer, waitForPaint, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStartZoomObserver, onStopZoomObserver, onClearZoomProvider, onStartViewStateObserver, onStopViewStateObserver, onClearViewStateProvider, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }) => {
238
244
  const handleDisposeError = (error) => {
239
245
  if (disposeOptions === null || disposeOptions === void 0 ? void 0 : disposeOptions.onError) {
240
246
  disposeOptions.onError(error);
@@ -265,6 +271,8 @@ export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surf
265
271
  onClearDocumentState,
266
272
  onStopZoomObserver,
267
273
  onClearZoomProvider,
274
+ onStopViewStateObserver,
275
+ onClearViewStateProvider,
268
276
  });
269
277
  };
270
278
  const mountRenderedContent = async (buffer, file, version, sourceUrl, streamUrl) => {
@@ -284,8 +292,10 @@ export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surf
284
292
  waitForPaint,
285
293
  disposeSession: destroyRenderSession,
286
294
  onStartZoomObserver,
295
+ onStartViewStateObserver,
287
296
  onRefreshDocumentIndex,
288
297
  onRefreshZoomProvider,
298
+ onRefreshViewStateProvider,
289
299
  });
290
300
  };
291
301
  return {
@@ -314,19 +324,42 @@ export const renderFileViewerHandler = async ({ dispatcher, buffer, target, type
314
324
  }
315
325
  return handler(buffer, target, normalizedType, context);
316
326
  };
317
- export const createFileRenderHandlerLoader = ({ handler, getTarget = context => context.surface.container, createContext = buildFileRenderContextFromLoadContext, destroy, }) => {
327
+ export const createFileRenderHandlerLoader = ({ handler, rendererId, getTarget = context => context.surface.container, createContext = buildFileRenderContextFromLoadContext, destroy, }) => {
318
328
  return async (context) => {
319
329
  const { source } = context;
320
330
  if (!source.buffer) {
321
331
  throw new Error('FileRenderHandler renderer requires an ArrayBuffer source.');
322
332
  }
323
333
  const target = getTarget(context);
324
- const rendered = await handler(source.buffer, target, source.extension, createContext(context));
334
+ const renderContext = createContext(context);
335
+ const rendered = await handler(source.buffer, target, source.extension, renderContext);
336
+ const existingProvider = findFileViewerViewStateProvider(target);
337
+ const genericViewStateProvider = existingProvider
338
+ ? null
339
+ : registerFileViewerGenericViewStateProvider({
340
+ host: target,
341
+ renderer: rendererId || source.extension,
342
+ });
343
+ const viewStateProvider = existingProvider || (genericViewStateProvider === null || genericViewStateProvider === void 0 ? void 0 : genericViewStateProvider.provider) || null;
344
+ if (context.options.initialViewState && (viewStateProvider === null || viewStateProvider === void 0 ? void 0 : viewStateProvider.applyState)) {
345
+ await viewStateProvider.applyState(context.options.initialViewState, {
346
+ action: 'restore',
347
+ source: 'initial',
348
+ });
349
+ }
325
350
  return createFileRenderHandlerRendererSession(rendered, () => {
326
- if (destroy) {
327
- return destroy(rendered, context);
351
+ const destroyRendered = () => {
352
+ if (destroy) {
353
+ return destroy(rendered, context);
354
+ }
355
+ return disposeFileViewerRendered(rendered);
356
+ };
357
+ try {
358
+ genericViewStateProvider === null || genericViewStateProvider === void 0 ? void 0 : genericViewStateProvider.destroy();
359
+ }
360
+ finally {
361
+ return destroyRendered();
328
362
  }
329
- return disposeFileViewerRendered(rendered);
330
363
  });
331
364
  };
332
365
  };
@@ -345,6 +378,7 @@ export const createFileRenderHandlerRegistry = ({ definitions = DEFAULT_RENDERER
345
378
  ...definition,
346
379
  load: createFileRenderHandlerLoader({
347
380
  handler,
381
+ rendererId: definition.id,
348
382
  getTarget,
349
383
  createContext,
350
384
  destroy,
@@ -432,6 +432,7 @@ export interface RunFileViewerPreviewComponentUnmountInput {
432
432
  onCancelPreview?: (reason: FileViewerLifecycleContext['reason']) => void;
433
433
  onResetLoading?: () => void;
434
434
  onStopZoomObserver?: () => void;
435
+ onStopViewStateObserver?: () => void;
435
436
  }
436
437
  export interface FileViewerPreviewComponentUnmountState {
437
438
  reason: FileViewerLifecycleContext['reason'];
@@ -501,7 +502,7 @@ export declare const applyFileViewerPreviewRequestResetState: <Target extends Mu
501
502
  export declare const commitFileViewerPreviewRequestStartState: ({ reason, requestController, previewTarget, onClearRenderedContent, onClearError, }: CommitFileViewerPreviewRequestStartStateInput) => number;
502
503
  export declare const cancelFileViewerPreviewRequest: ({ reason, requestController, previewTarget, onClearRenderedContent, onClearError, }: CancelFileViewerPreviewRequestInput) => number;
503
504
  export declare const runFileViewerPreviewSourceChange: ({ onRefreshPreview, }?: RunFileViewerPreviewSourceChangeInput) => unknown;
504
- export declare const runFileViewerPreviewComponentUnmount: ({ reason, onCancelPreview, onResetLoading, onStopZoomObserver, }?: RunFileViewerPreviewComponentUnmountInput) => FileViewerPreviewComponentUnmountState;
505
+ export declare const runFileViewerPreviewComponentUnmount: ({ reason, onCancelPreview, onResetLoading, onStopZoomObserver, onStopViewStateObserver, }?: RunFileViewerPreviewComponentUnmountInput) => FileViewerPreviewComponentUnmountState;
505
506
  export declare const applyFileViewerEmptyPreviewState: <Target extends MutableFileViewerPreviewState>(target: Target, state?: FileViewerEmptyPreviewState) => Target;
506
507
  export declare const commitFileViewerEmptyPreviewResetState: ({ previewTarget, state, reason, onClearRenderedContent, onResetLoading, }: CommitFileViewerEmptyPreviewResetStateInput) => MutableFileViewerPreviewState;
507
508
  export declare const runFileViewerPreviewRequest: <LocalResult = unknown, RemoteResult = unknown>({ file, url, reason, requestController, previewTarget, onPreviewLocalFile, onPreviewRemoteFile, onClearRenderedContent, onClearError, onResetLoading, }: RunFileViewerPreviewRequestInput<LocalResult, RemoteResult>) => Promise<FileViewerPreviewRequestRunState<LocalResult, RemoteResult>>;
@@ -182,10 +182,11 @@ export const cancelFileViewerPreviewRequest = ({ reason = 'component-unmount', r
182
182
  export const runFileViewerPreviewSourceChange = ({ onRefreshPreview, } = {}) => {
183
183
  return onRefreshPreview === null || onRefreshPreview === void 0 ? void 0 : onRefreshPreview();
184
184
  };
185
- export const runFileViewerPreviewComponentUnmount = ({ reason = 'component-unmount', onCancelPreview, onResetLoading, onStopZoomObserver, } = {}) => {
185
+ export const runFileViewerPreviewComponentUnmount = ({ reason = 'component-unmount', onCancelPreview, onResetLoading, onStopZoomObserver, onStopViewStateObserver, } = {}) => {
186
186
  onCancelPreview === null || onCancelPreview === void 0 ? void 0 : onCancelPreview(reason);
187
187
  onResetLoading === null || onResetLoading === void 0 ? void 0 : onResetLoading();
188
188
  onStopZoomObserver === null || onStopZoomObserver === void 0 ? void 0 : onStopZoomObserver();
189
+ onStopViewStateObserver === null || onStopViewStateObserver === void 0 ? void 0 : onStopViewStateObserver();
189
190
  return {
190
191
  reason,
191
192
  };