@file-viewer/core 2.1.13 → 2.1.14

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';
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
  };
@@ -7,8 +7,9 @@
7
7
  import { createEmptyFileViewerSearchState, } from '../features/document/model.js';
8
8
  import { createFileViewerDocumentFeatureControllerActionHandlers, } from '../features/document/events.js';
9
9
  import { createFileViewerZoomController } from '../features/document/zoom.js';
10
+ import { createFileViewerViewStateController } from '../features/document/viewState.js';
10
11
  import { DEFAULT_FILE_VIEWER_DOWNLOAD_FILENAME, DEFAULT_FILE_VIEWER_EXPORT_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_TITLE, createFileViewerOriginalSourceStateFromNormalizedSource, executeFileViewerDownloadOperation, executeFileViewerExportHtmlOperation, executeFileViewerPrintOperation, resolveFileViewerDisplayFilename, resolveFileViewerOperationFilename, } from './operations.js';
11
- import { getRendererAvailability, createUnsupportedAvailability } from '../registry/capabilities.js';
12
+ import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from '../registry/capabilities.js';
12
13
  import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from '../lifecycle/operations.js';
13
14
  import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, } from '../registry/registry.js';
14
15
  import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, } from '../rendering/handler.js';
@@ -149,6 +150,7 @@ export const createViewer = (container, createOptions = {}) => {
149
150
  ...definition,
150
151
  load: createFileRenderHandlerLoader({
151
152
  handler: registration.handler,
153
+ rendererId: definition.id,
152
154
  getTarget: context => context.surface.container,
153
155
  }),
154
156
  });
@@ -195,10 +197,11 @@ export const createViewer = (container, createOptions = {}) => {
195
197
  const getCapabilitiesForExtension = (extension) => {
196
198
  const targetExtension = extension || (currentSource === null || currentSource === void 0 ? void 0 : currentSource.extension) || '';
197
199
  const renderer = registry.getByExtension(targetExtension);
200
+ const zoomState = zoomController.getState();
198
201
  if (!renderer) {
199
- return createUnsupportedAvailability(targetExtension);
202
+ return applyFileViewerZoomAvailability(createUnsupportedAvailability(targetExtension), zoomState);
200
203
  }
201
- return getRendererAvailability(renderer, renderSurfaceState.session);
204
+ return applyFileViewerZoomAvailability(getRendererAvailability(renderer, renderSurfaceState.session), zoomState);
202
205
  };
203
206
  const emitOperationAvailabilityChange = () => {
204
207
  var _a;
@@ -214,9 +217,21 @@ export const createViewer = (container, createOptions = {}) => {
214
217
  payload: state,
215
218
  });
216
219
  };
220
+ const emitZoomAndOperationAvailabilityChange = (state = zoomController.getState()) => {
221
+ emitZoomChange(state);
222
+ emitOperationAvailabilityChange();
223
+ };
217
224
  const zoomController = createFileViewerZoomController({
218
225
  root: () => container,
219
226
  beforeZoom: runBeforeViewerOperation,
227
+ onChange: state => emitZoomAndOperationAvailabilityChange(state),
228
+ });
229
+ const viewStateController = createFileViewerViewStateController({
230
+ root: () => container,
231
+ onChange: change => {
232
+ var _a;
233
+ (_a = createOptions.onEvent) === null || _a === void 0 ? void 0 : _a.call(createOptions, { type: 'view-state-change', payload: change });
234
+ },
220
235
  });
221
236
  const documentActions = createFileViewerDocumentFeatureControllerActionHandlers({
222
237
  root: () => container,
@@ -233,6 +248,7 @@ export const createViewer = (container, createOptions = {}) => {
233
248
  },
234
249
  });
235
250
  zoomController.observe();
251
+ viewStateController.observe();
236
252
  const destroyCurrent = async (reason = 'replace') => {
237
253
  var _a, _b;
238
254
  if (!currentSource) {
@@ -250,8 +266,8 @@ export const createViewer = (container, createOptions = {}) => {
250
266
  });
251
267
  await documentActions.clearDocumentState();
252
268
  zoomController.clearProvider();
253
- emitOperationAvailabilityChange();
254
- emitZoomChange();
269
+ viewStateController.clearProvider();
270
+ emitZoomAndOperationAvailabilityChange();
255
271
  await emitLifecycle(options, createOptions.onEvent, 'unload-complete', source, version, startedAt, reason);
256
272
  };
257
273
  return {
@@ -268,8 +284,7 @@ export const createViewer = (container, createOptions = {}) => {
268
284
  if (!(renderer === null || renderer === void 0 ? void 0 : renderer.load)) {
269
285
  renderMissingRendererState(container, normalized.extension, options);
270
286
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session: null });
271
- emitOperationAvailabilityChange();
272
- emitZoomChange();
287
+ emitZoomAndOperationAvailabilityChange();
273
288
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
274
289
  return null;
275
290
  }
@@ -284,9 +299,9 @@ export const createViewer = (container, createOptions = {}) => {
284
299
  });
285
300
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session });
286
301
  zoomController.refreshProvider();
302
+ viewStateController.refreshProvider();
287
303
  await documentActions.refreshDocumentIndex({ notify: false });
288
- emitOperationAvailabilityChange();
289
- emitZoomChange();
304
+ emitZoomAndOperationAvailabilityChange();
290
305
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
291
306
  return session;
292
307
  },
@@ -294,6 +309,7 @@ export const createViewer = (container, createOptions = {}) => {
294
309
  await destroyCurrent(reason);
295
310
  documentActions.destroyDocumentFeatures();
296
311
  zoomController.destroy();
312
+ viewStateController.destroy();
297
313
  },
298
314
  updateOptions(nextOptions) {
299
315
  options = {
@@ -362,22 +378,28 @@ export const createViewer = (container, createOptions = {}) => {
362
378
  },
363
379
  async zoomIn() {
364
380
  const state = await zoomController.zoomIn();
365
- emitZoomChange(state);
381
+ emitZoomAndOperationAvailabilityChange(state);
366
382
  return state;
367
383
  },
368
384
  async zoomOut() {
369
385
  const state = await zoomController.zoomOut();
370
- emitZoomChange(state);
386
+ emitZoomAndOperationAvailabilityChange(state);
371
387
  return state;
372
388
  },
373
389
  async resetZoom() {
374
390
  const state = await zoomController.resetZoom();
375
- emitZoomChange(state);
391
+ emitZoomAndOperationAvailabilityChange(state);
376
392
  return state;
377
393
  },
378
394
  getZoomState() {
379
395
  return zoomController.getState();
380
396
  },
397
+ getViewState() {
398
+ return viewStateController.getState();
399
+ },
400
+ applyViewState(state, applyOptions) {
401
+ return viewStateController.applyState(state, applyOptions);
402
+ },
381
403
  search(query) {
382
404
  return documentActions.searchDocument(query);
383
405
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.13",
3
+ "version": "2.1.14",
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",