@file-viewer/core 2.1.18 → 2.1.20

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.
@@ -1,4 +1,4 @@
1
- import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerThemeMode, FileViewerToolbarOptions } from '../contracts/types';
1
+ import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from '../contracts/types';
2
2
  export type FileViewerSerializableToolbarOptions = Omit<FileViewerToolbarOptions, 'beforeOperation' | 'beforeDownload' | 'beforePrint' | 'beforeExportHtml'>;
3
3
  export type FileViewerSerializableCadOptions = Omit<FileViewerCadOptions, 'workerUrl'> & {
4
4
  workerUrl?: string;
@@ -9,6 +9,8 @@ export interface FileViewerSerializableOptions extends Omit<FileViewerOptions, '
9
9
  cad?: FileViewerSerializableCadOptions;
10
10
  }
11
11
  export declare const normalizeFileViewerTheme: (theme: FileViewerThemeMode | undefined) => FileViewerThemeMode;
12
+ export declare const normalizeFileViewerUiDensity: (density: FileViewerUiDensity | undefined) => FileViewerUiDensity;
13
+ export declare const resolveFileViewerUiDensity: (options?: Pick<FileViewerOptions, "ui"> | null) => FileViewerUiDensity;
12
14
  export declare const sanitizeFileViewerOptions: (options?: FileViewerOptions | FileViewerSerializableOptions | null) => FileViewerSerializableOptions | undefined;
13
15
  export declare const serializeFileViewerOptions: (options?: FileViewerOptions | FileViewerSerializableOptions | null) => string | undefined;
14
16
  export declare const parseFileViewerOptions: (value: unknown) => FileViewerSerializableOptions | undefined;
@@ -51,6 +51,10 @@ const stripExecutionOnlyOptions = (value) => {
51
51
  export const normalizeFileViewerTheme = (theme) => {
52
52
  return theme === 'light' || theme === 'dark' || theme === 'system' ? theme : 'system';
53
53
  };
54
+ export const normalizeFileViewerUiDensity = (density) => {
55
+ return density === 'compact' ? 'compact' : 'comfortable';
56
+ };
57
+ export const resolveFileViewerUiDensity = (options) => { var _a; return normalizeFileViewerUiDensity((_a = options === null || options === void 0 ? void 0 : options.ui) === null || _a === void 0 ? void 0 : _a.density); };
54
58
  export const sanitizeFileViewerOptions = (options) => {
55
59
  if (!isRecord(options)) {
56
60
  return undefined;
@@ -60,6 +60,23 @@ export interface FileViewerToolbarOptions {
60
60
  beforePrint?: FileViewerBeforeOperation;
61
61
  beforeExportHtml?: FileViewerBeforeOperation;
62
62
  }
63
+ export interface FileViewerArchiveEntryActionContext {
64
+ path: string;
65
+ name: string;
66
+ extension: string;
67
+ size: number;
68
+ lastModified?: number;
69
+ depth: number;
70
+ previewable: boolean;
71
+ }
72
+ export type FileViewerArchiveEntryActionPolicy = boolean | ((entry: FileViewerArchiveEntryActionContext) => boolean);
73
+ export interface FileViewerArchiveEntryActionsOptions {
74
+ /**
75
+ * Controls the download button for files opened from inside an archive.
76
+ * The viewer-level original-file download remains controlled by toolbar options.
77
+ */
78
+ download?: FileViewerArchiveEntryActionPolicy;
79
+ }
63
80
  export interface FileViewerArchiveOptions {
64
81
  workerUrl?: string;
65
82
  wasmUrl?: string;
@@ -67,6 +84,7 @@ export interface FileViewerArchiveOptions {
67
84
  cache?: boolean;
68
85
  maxArchiveSize?: number;
69
86
  maxEntryPreviewSize?: number;
87
+ entryActions?: FileViewerArchiveEntryActionsOptions;
70
88
  /**
71
89
  * Optional archive password. It is used for the first encrypted archive
72
90
  * attempt; if it is wrong, the built-in password dialog or requestPassword
@@ -360,6 +378,14 @@ export interface FileViewerAiOptions {
360
378
  chunkSize?: number;
361
379
  chunkOverlap?: number;
362
380
  }
381
+ export type FileViewerUiDensity = 'comfortable' | 'compact';
382
+ export interface FileViewerUiOptions {
383
+ /**
384
+ * Controls spacing density for viewer chrome such as toolbars, headers,
385
+ * archive lists, badges, search inputs, and compact action clusters.
386
+ */
387
+ density?: FileViewerUiDensity;
388
+ }
363
389
  export interface FileViewerOptions {
364
390
  theme?: FileViewerThemeMode;
365
391
  /**
@@ -428,6 +454,7 @@ export interface FileViewerOptions {
428
454
  presets?: FileViewerRendererPresetInput;
429
455
  renderers?: FileViewerRendererPluginInput;
430
456
  watermark?: boolean | FileViewerWatermarkOptions;
457
+ ui?: FileViewerUiOptions;
431
458
  toolbar?: boolean | FileViewerToolbarOptions;
432
459
  search?: boolean | FileViewerSearchOptions;
433
460
  ai?: boolean | FileViewerAiOptions;
@@ -8,12 +8,14 @@ export interface FileViewerZoomProviderHost extends HTMLElement {
8
8
  export interface FileViewerViewStateProviderHost extends HTMLElement {
9
9
  __flyfishViewerViewStateProvider?: FileViewerViewStateProvider;
10
10
  }
11
+ type FileViewerProviderSearchRoot = HTMLElement | ShadowRoot | null | undefined;
11
12
  export declare const registerFileViewerSearchProvider: (host: HTMLElement, provider: FileViewerSearchProvider) => void;
12
13
  export declare const unregisterFileViewerSearchProvider: (host: HTMLElement | null | undefined) => void;
13
- export declare const findFileViewerSearchProvider: (root: HTMLElement | null | undefined) => FileViewerSearchProvider | null;
14
+ export declare const findFileViewerSearchProvider: (root: FileViewerProviderSearchRoot) => FileViewerSearchProvider | null;
14
15
  export declare const registerFileViewerZoomProvider: (host: HTMLElement, provider: FileViewerZoomProvider) => void;
15
16
  export declare const unregisterFileViewerZoomProvider: (host: HTMLElement | null | undefined) => void;
16
- export declare const findFileViewerZoomProvider: (root: HTMLElement | null | undefined) => FileViewerZoomProvider | null;
17
+ export declare const findFileViewerZoomProvider: (root: FileViewerProviderSearchRoot) => FileViewerZoomProvider | null;
17
18
  export declare const registerFileViewerViewStateProvider: (host: HTMLElement, provider: FileViewerViewStateProvider) => void;
18
19
  export declare const unregisterFileViewerViewStateProvider: (host: HTMLElement | null | undefined) => void;
19
- export declare const findFileViewerViewStateProvider: (root: HTMLElement | null | undefined) => FileViewerViewStateProvider | null;
20
+ export declare const findFileViewerViewStateProvider: (root: FileViewerProviderSearchRoot) => FileViewerViewStateProvider | null;
21
+ export {};
@@ -1,6 +1,25 @@
1
1
  const searchProviderRegistry = new WeakMap();
2
2
  const zoomProviderRegistry = new WeakMap();
3
3
  const viewStateProviderRegistry = new WeakMap();
4
+ const isProviderElement = (root) => {
5
+ return !!root && root.nodeType === 1;
6
+ };
7
+ const queryProviderHosts = (root, selector) => {
8
+ if (!(root === null || root === void 0 ? void 0 : root.querySelectorAll)) {
9
+ return [];
10
+ }
11
+ const hosts = Array.from(root.querySelectorAll(selector));
12
+ if (isProviderElement(root) && root.shadowRoot) {
13
+ hosts.push(...queryProviderHosts(root.shadowRoot, selector));
14
+ }
15
+ const elements = Array.from(root.querySelectorAll('*'));
16
+ for (const element of elements) {
17
+ if (element.shadowRoot) {
18
+ hosts.push(...queryProviderHosts(element.shadowRoot, selector));
19
+ }
20
+ }
21
+ return hosts;
22
+ };
4
23
  export const registerFileViewerSearchProvider = (host, provider) => {
5
24
  searchProviderRegistry.set(host, provider);
6
25
  host.__flyfishViewerSearchProvider = provider;
@@ -13,15 +32,16 @@ export const unregisterFileViewerSearchProvider = (host) => {
13
32
  delete host.__flyfishViewerSearchProvider;
14
33
  };
15
34
  export const findFileViewerSearchProvider = (root) => {
16
- var _a;
17
35
  if (!root) {
18
36
  return null;
19
37
  }
20
- const direct = searchProviderRegistry.get(root) || root.__flyfishViewerSearchProvider;
38
+ const direct = isProviderElement(root)
39
+ ? searchProviderRegistry.get(root) || root.__flyfishViewerSearchProvider
40
+ : null;
21
41
  if (direct) {
22
42
  return direct;
23
43
  }
24
- const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-search-provider]');
44
+ const host = queryProviderHosts(root, '[data-viewer-search-provider]')[0];
25
45
  return host
26
46
  ? searchProviderRegistry.get(host) || host.__flyfishViewerSearchProvider || null
27
47
  : null;
@@ -40,15 +60,16 @@ export const unregisterFileViewerZoomProvider = (host) => {
40
60
  delete host.__flyfishViewerZoomProvider;
41
61
  };
42
62
  export const findFileViewerZoomProvider = (root) => {
43
- var _a;
44
63
  if (!root) {
45
64
  return null;
46
65
  }
47
- const direct = zoomProviderRegistry.get(root) || root.__flyfishViewerZoomProvider;
66
+ const direct = isProviderElement(root)
67
+ ? zoomProviderRegistry.get(root) || root.__flyfishViewerZoomProvider
68
+ : null;
48
69
  if (direct) {
49
70
  return direct;
50
71
  }
51
- const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-zoom-provider]');
72
+ const host = queryProviderHosts(root, '[data-viewer-zoom-provider]')[0];
52
73
  return host
53
74
  ? zoomProviderRegistry.get(host) || host.__flyfishViewerZoomProvider || null
54
75
  : null;
@@ -67,16 +88,17 @@ export const unregisterFileViewerViewStateProvider = (host) => {
67
88
  delete host.__flyfishViewerViewStateProvider;
68
89
  };
69
90
  export const findFileViewerViewStateProvider = (root) => {
70
- var _a;
71
91
  if (!root) {
72
92
  return null;
73
93
  }
74
- const direct = viewStateProviderRegistry.get(root) ||
75
- root.__flyfishViewerViewStateProvider;
76
- if (direct && root.dataset.viewerViewStateProvider !== 'generic') {
94
+ const direct = isProviderElement(root)
95
+ ? viewStateProviderRegistry.get(root) ||
96
+ root.__flyfishViewerViewStateProvider
97
+ : null;
98
+ if (direct && (!isProviderElement(root) || root.dataset.viewerViewStateProvider !== 'generic')) {
77
99
  return direct;
78
100
  }
79
- const hosts = Array.from(((_a = root.querySelectorAll) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-view-state-provider]')) || []);
101
+ const hosts = queryProviderHosts(root, '[data-viewer-view-state-provider]');
80
102
  const customHost = hosts.find(host => host.dataset.viewerViewStateProvider !== 'generic');
81
103
  const genericHost = hosts.find(host => host.dataset.viewerViewStateProvider === 'generic');
82
104
  const host = customHost || genericHost;
@@ -147,6 +147,12 @@ const withProviderResult = (result, request, provider) => ({
147
147
  provider: (result === null || result === void 0 ? void 0 : result.provider) || provider,
148
148
  state: result === null || result === void 0 ? void 0 : result.state,
149
149
  });
150
+ const isRetriableFitReason = (reason) => {
151
+ return reason === 'pending' ||
152
+ reason === 'retry' ||
153
+ reason === 'image-not-ready' ||
154
+ reason === 'unmeasurable';
155
+ };
150
156
  const readViewportSize = (root) => {
151
157
  var _a;
152
158
  const rect = (_a = root.getBoundingClientRect) === null || _a === void 0 ? void 0 : _a.call(root);
@@ -237,6 +243,7 @@ export const createFileViewerFitController = ({ root, enabled, getFit = () => un
237
243
  container: currentRoot,
238
244
  };
239
245
  const viewStateProvider = findFileViewerViewStateProvider(currentRoot);
246
+ let lastProviderResult = null;
240
247
  if (viewStateProvider === null || viewStateProvider === void 0 ? void 0 : viewStateProvider.fit) {
241
248
  const result = withProviderResult(await viewStateProvider.fit(request), request, 'view-state');
242
249
  if (result.applied) {
@@ -244,6 +251,7 @@ export const createFileViewerFitController = ({ root, enabled, getFit = () => un
244
251
  onFit === null || onFit === void 0 ? void 0 : onFit(result);
245
252
  return result;
246
253
  }
254
+ lastProviderResult = result;
247
255
  }
248
256
  const zoomProvider = findFileViewerZoomProvider(currentRoot);
249
257
  if (zoomProvider === null || zoomProvider === void 0 ? void 0 : zoomProvider.fit) {
@@ -253,11 +261,12 @@ export const createFileViewerFitController = ({ root, enabled, getFit = () => un
253
261
  onFit === null || onFit === void 0 ? void 0 : onFit(result);
254
262
  return result;
255
263
  }
264
+ lastProviderResult = result;
256
265
  }
257
266
  const noop = createNoopFitResult(normalized, viewStateProvider || zoomProvider
258
267
  ? 'unsupported'
259
268
  : 'no-provider', source);
260
- if (noop.reason === 'no-provider') {
269
+ if (noop.reason === 'no-provider' || isRetriableFitReason(lastProviderResult === null || lastProviderResult === void 0 ? void 0 : lastProviderResult.reason)) {
261
270
  scheduleRetry(fit, source, reason);
262
271
  }
263
272
  return noop;
@@ -7,7 +7,7 @@ export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_
7
7
  export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages';
8
8
  export type { FileViewerI18nInput, FileViewerResolvedLocale, ResolveFileViewerI18nInput, } from './i18n/messages';
9
9
  export type { BuildFileViewerLifecycleContextFromNormalizedSourceInput, BuildFileViewerOperationContextFromLifecycleStateInput, BuildFileViewerLifecycleContextInput, BuiltFileViewerLifecycleContext, BuiltFileViewerOperationContext, CreateFileViewerLifecycleActionsInput, CreateFileViewerPublicApiInput, CreateFileViewerToolbarActionsInput, CreateFileViewerToolbarControllerActionHandlersInput, DispatchFileViewerLifecycleEventInput, DispatchFileViewerOperationAvailabilityChangeInput, DispatchFileViewerOperationContextEventInput, DispatchFileViewerZoomChangeInput, FileViewerActiveUnloadState, FileViewerLifecycleActions, FileViewerLifecycleComponentEmit, FileViewerLifecycleHookErrorLogger, FileViewerLifecycleStateController, FileViewerOperationErrorLogger, FileViewerToolbarActions, FileViewerToolbarControllerActionHandlers, FileViewerToolbarState, FileViewerToolbarZoomSyncSnapshot, FileViewerZoomButtonAction, ReportFileViewerLifecycleHookErrorInput, ReportFileViewerOperationErrorInput, ResolveFileViewerBeforeOperationErrorMessageInput, ResolveFileViewerLifecycleHookErrorMessageInput, ResolveFileViewerOperationAvailabilityInput, ResolveFileViewerToolbarStateInput, RunFileViewerActiveUnloadCompleteInput, RunFileViewerActiveUnloadStartInput, RunFileViewerBeforeOperationInput, RunFileViewerToolbarAvailabilitySyncInput, RunFileViewerToolbarZoomSyncInput, SerializedFileViewerContext, } from './lifecycle/operations';
10
- export { getFileViewerOptionsSearchParam, normalizeFileViewerTheme, parseFileViewerOptions, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
10
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
11
11
  export type { FileViewerSerializableCadOptions, FileViewerSerializableOptions, FileViewerSerializableToolbarOptions, } from './config/options';
12
12
  export { resolveFileViewerPresentationState, } from './presentation/state';
13
13
  export type { FileViewerPresentationState, ResolveFileViewerPresentationStateInput, } from './presentation/state';
@@ -24,4 +24,4 @@ export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRI
24
24
  export type { FileViewerErrorMessageFormatter, } from './viewer/state';
25
25
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
26
26
  export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
27
- export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
27
+ export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/headless.js CHANGED
@@ -9,7 +9,7 @@ export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_
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, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, 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, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
11
11
  export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages.js';
12
- export { getFileViewerOptionsSearchParam, normalizeFileViewerTheme, parseFileViewerOptions, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
12
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
13
13
  export { resolveFileViewerPresentationState, } from './presentation/state.js';
14
14
  export { createRendererRegistry, } from './registry/registry.js';
15
15
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher.js';
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ export { FALLBACK_FILE_VIEWER_LOADING_THEME, FILE_VIEWER_LOADING_THEME_MAP, appl
55
55
  export type { FileViewerLoadingController, FileViewerLoadingControllerActionHandlers, RunFileViewerLoadingExtensionSyncInput, } from './viewer/loading';
56
56
  export { createFileViewerLifecycleFacade, } from './lifecycle/facade';
57
57
  export type { BuildFileViewerLifecycleFacadeLoadStartStateInput, BuildFileViewerLifecycleFacadeRenderCompleteStateInput, CreateFileViewerLifecycleFacadeInput, FileViewerLifecycleFacade, } from './lifecycle/facade';
58
- export { getFileViewerOptionsSearchParam, normalizeFileViewerTheme, parseFileViewerOptions, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
58
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
59
59
  export { resolveFileViewerPresentationState, } from './presentation/state';
60
60
  export type { FileViewerPresentationState, ResolveFileViewerPresentationStateInput, } from './presentation/state';
61
61
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher';
@@ -85,4 +85,4 @@ export type { CreateFileViewerZoomControllerOptions, FileViewerZoomOperation, }
85
85
  export type { CreateViewerOptions } from './viewer/createViewer';
86
86
  export type { BuildExportHtmlDocumentOptions, BuildFileViewerRenderedHtmlDocumentOptions, } from './output/export';
87
87
  export type { CreateFileViewerWorkerControllerOptions, FileViewerWorkerContext, FileViewerWorkerController, FileViewerWorkerErrorHook, FileViewerWorkerEventHandler, FileViewerWorkerFactory, FileViewerWorkerMessageHook, WorkerProvider, WorkerRef, } from './platform/worker';
88
- export type { FileViewerAiOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, 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';
88
+ export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/index.js CHANGED
@@ -166,7 +166,7 @@ export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, cre
166
166
  export { FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, 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, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
167
167
  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';
168
168
  export { createFileViewerLifecycleFacade, } from './lifecycle/facade.js';
169
- export { getFileViewerOptionsSearchParam, normalizeFileViewerTheme, parseFileViewerOptions, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
169
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
170
170
  export { resolveFileViewerPresentationState, } from './presentation/state.js';
171
171
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher.js';
172
172
  export { appendFileViewerStyle, buildFileRenderContextFromLoadContext, applyFileViewerRenderSurfaceState, clearFileViewerRenderSurface, createFileRenderHandlerRendererSession, createFileRenderHandlerRegistry, createFileRenderHandlerLoader, createFileViewerRenderSurfaceActionHandlers, createFileViewerRenderReadinessTarget, createFileViewerRenderSurface, createFileViewerRenderSurfaceState, createFileViewerRenderSurfaceStateTarget, createFileViewerRenderTarget, DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS, DEFAULT_FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_LOGGER, FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE, disposeActiveFileViewerRendererSession, disposeFileViewerRendered, disposeFileViewerRendererSession, getFileViewerShadowRootForNode, isFileViewerShadowRoot, normalizeFileViewerStyleIsolation, removeFileViewerRenderTarget, reportFileViewerRenderSessionDisposeError, resetFileViewerRenderSurface, resolveFileViewerStyleIsolation, resolveFileViewerRenderSessionDisposeErrorMessage, runFileViewerRenderSurfaceClear, runFileViewerRenderSurfaceMount, renderFileViewerHandler, } from './rendering/handler.js';
@@ -1,4 +1,4 @@
1
- import type { FileViewerFileRef, FileViewerOptions, FileViewerThemeMode, FileViewerToolbarOptions } from '../contracts/types';
1
+ import type { FileViewerFileRef, FileViewerOptions, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from '../contracts/types';
2
2
  export interface ResolveFileViewerPresentationStateInput {
3
3
  filename?: string;
4
4
  file?: FileViewerFileRef;
@@ -10,5 +10,6 @@ export interface FileViewerPresentationState {
10
10
  extension: string;
11
11
  toolbar: FileViewerToolbarOptions;
12
12
  theme: FileViewerThemeMode;
13
+ density: FileViewerUiDensity;
13
14
  }
14
15
  export declare const resolveFileViewerPresentationState: ({ filename, file, url, options, }: ResolveFileViewerPresentationStateInput) => FileViewerPresentationState;
@@ -1,5 +1,5 @@
1
1
  import { normalizeFileViewerToolbar } from '../lifecycle/operations.js';
2
- import { normalizeFileViewerTheme } from '../config/options.js';
2
+ import { normalizeFileViewerTheme, resolveFileViewerUiDensity } from '../config/options.js';
3
3
  import { getExtension, resolveFileViewerSourceFilename } from '../source/index.js';
4
4
  export const resolveFileViewerPresentationState = ({ filename, file, url, options, }) => {
5
5
  const displayFilename = resolveFileViewerSourceFilename({
@@ -12,5 +12,6 @@ export const resolveFileViewerPresentationState = ({ filename, file, url, option
12
12
  extension: getExtension(displayFilename),
13
13
  toolbar: normalizeFileViewerToolbar(options),
14
14
  theme: normalizeFileViewerTheme(options === null || options === void 0 ? void 0 : options.theme),
15
+ density: resolveFileViewerUiDensity(options),
15
16
  };
16
17
  };
@@ -1,4 +1,5 @@
1
1
  import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from '../features/document/dom/index.js';
2
+ import { resolveFileViewerFitScale, } from '../features/document/fit.js';
2
3
  import { createFileViewerTranslator } from '../i18n/messages.js';
3
4
  import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from '../features/document/zoom.js';
4
5
  const imageMimeMap = {
@@ -175,6 +176,51 @@ export default async function renderImage(buffer, target, type, context) {
175
176
  zoomEmitter.emit();
176
177
  return getZoomState();
177
178
  };
179
+ const fitImage = (request) => {
180
+ var _a, _b;
181
+ const naturalWidth = image.naturalWidth || 0;
182
+ const naturalHeight = image.naturalHeight || 0;
183
+ if (!naturalWidth || !naturalHeight) {
184
+ return {
185
+ applied: false,
186
+ mode: request.mode,
187
+ resize: request.resize,
188
+ source: request.source,
189
+ reason: 'image-not-ready',
190
+ provider: 'zoom',
191
+ };
192
+ }
193
+ const mode = request.mode === 'auto' ? 'scale-down' : request.mode;
194
+ const scale = resolveFileViewerFitScale({
195
+ mode,
196
+ viewportWidth: Math.max(1, request.viewportWidth || root.clientWidth || 0),
197
+ viewportHeight: Math.max(1, request.viewportHeight || root.clientHeight || viewportHeight || 0),
198
+ contentWidth: naturalWidth,
199
+ contentHeight: naturalHeight,
200
+ currentScale,
201
+ minScale: (_a = request.minScale) !== null && _a !== void 0 ? _a : getMinScale(),
202
+ maxScale: (_b = request.maxScale) !== null && _b !== void 0 ? _b : 5,
203
+ });
204
+ if (!scale) {
205
+ return {
206
+ applied: false,
207
+ mode: request.mode,
208
+ resize: request.resize,
209
+ source: request.source,
210
+ reason: 'unmeasurable',
211
+ provider: 'zoom',
212
+ };
213
+ }
214
+ const state = setZoom(scale);
215
+ return {
216
+ applied: true,
217
+ mode: request.mode,
218
+ resize: request.resize,
219
+ scale: state.scale,
220
+ source: request.source,
221
+ provider: 'zoom',
222
+ };
223
+ };
178
224
  registerFileViewerZoomProvider(root, {
179
225
  zoomIn: () => setZoom(currentScale + 0.15),
180
226
  zoomOut: () => setZoom(currentScale - 0.15),
@@ -185,6 +231,7 @@ export default async function renderImage(buffer, target, type, context) {
185
231
  return getZoomState();
186
232
  },
187
233
  setZoom,
234
+ fit: fitImage,
188
235
  getState: getZoomState,
189
236
  subscribe: zoomEmitter.subscribe,
190
237
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.18",
3
+ "version": "2.1.20",
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",