@file-viewer/core 3.2.2 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -167,11 +167,12 @@ export const parseEdaFile = async (buffer, type) => {
167
167
  throw new Error('EDA parsing has moved out of @file-viewer/core. Import parseEdaFile from @file-viewer/renderer-eda instead.');
168
168
  };
169
169
  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";
170
- 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";
170
+ 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, resolveFileViewerToolbarZoomButtons, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from "./lifecycle/operations.js";
171
171
  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";
172
172
  export { createFileViewerLifecycleFacade, } from "./lifecycle/facade.js";
173
173
  export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from "./config/options.js";
174
174
  export { resolveFileViewerPresentationState, } from "./presentation/state.js";
175
+ export { observeFileViewerColorScheme } from "./presentation/colorScheme.js";
175
176
  export { createFileViewerRendererDispatcher, } from "./rendering/dispatcher.js";
176
177
  export { appendFileViewerStyle, buildFileRenderContextFromLoadContext, applyFileViewerRenderSurfaceState, clearFileViewerRenderSurface, createFileRenderHandlerRendererSession, createFileRenderHandlerRegistry, createFileRenderHandlerLoader, createFileViewerRenderSurfaceActionHandlers, createFileViewerRenderReadinessTarget, createFileViewerRenderSurface, createFileViewerRenderSurfaceState, createFileViewerRenderSurfaceStateTarget, createFileViewerRenderTarget, DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS, FILE_VIEWER_RENDER_SURFACE_BACKGROUND_PROPERTY, DEFAULT_FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_LOGGER, FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE, disposeActiveFileViewerRendererSession, disposeFileViewerRendered, disposeFileViewerRendererSession, getFileViewerShadowRootForNode, isFileViewerShadowRoot, normalizeFileViewerStyleIsolation, normalizeFileViewerRenderSurfaceBackground, removeFileViewerRenderTarget, reportFileViewerRenderSessionDisposeError, resetFileViewerRenderSurface, resolveFileViewerStyleIsolation, resolveFileViewerRenderSessionDisposeErrorMessage, runFileViewerRenderSurfaceClear, runFileViewerRenderSurfaceMount, syncFileViewerRenderSurfaceBackground, renderFileViewerHandler, } from "./rendering/handler.js";
177
178
  export { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, decodeFilename, getExtension, normalizeFileExtension, normalizeFilename, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, resolveFileViewerSourceFilename, normalizeSource, readFileViewerBuffer, readFileViewerDataUrl, readFileViewerText, wrapFileViewerFileRef, } from "./source/index.js";
@@ -183,3 +184,4 @@ export { cancelFileViewerPreviewRequest, DEFAULT_FILE_VIEWER_STREAMING_PDF_FILEN
183
184
  export { createViewer } from "./viewer/createViewer.js";
184
185
  export { WorkerRefImpl, createFileViewerWorkerController, refWorker, } from "./platform/worker.js";
185
186
  export { resolveFileViewerCopiedAssetUrl } from "./platform/copiedAssets.js";
187
+ export { installFileViewerImageHandTool } from "./features/document/imageHandTool.js";
@@ -282,6 +282,7 @@ export declare const resolveFileViewerOperationAvailability: ({ extension, hasOr
282
282
  export declare const cloneFileViewerOperationAvailability: (availability: FileViewerOperationAvailability) => FileViewerOperationAvailability;
283
283
  export declare const resolveVisibleFileViewerToolbar: (toolbar: FileViewerToolbarOptions, availability: FileViewerOperationAvailability, searchEnabled?: boolean) => FileViewerToolbarOptions;
284
284
  export declare const hasVisibleFileViewerToolbarActions: (toolbar: FileViewerToolbarOptions) => boolean;
285
+ export declare const resolveFileViewerToolbarZoomButtons: ({ toolbar, zoomState, renderedReady, hasError, }: Pick<ResolveFileViewerToolbarStateInput, "toolbar" | "zoomState" | "renderedReady" | "hasError">) => Pick<FileViewerOperationAvailability, "zoomIn" | "zoomOut" | "zoomReset">;
285
286
  export declare const isFileViewerZoomButtonDisabled: ({ toolbarDisabled, availability, zoomState, action, }: {
286
287
  toolbarDisabled?: boolean;
287
288
  availability: FileViewerOperationAvailability;
@@ -571,6 +571,15 @@ export const hasVisibleFileViewerToolbarActions = (toolbar) => {
571
571
  toolbar.search ||
572
572
  toolbar.theme);
573
573
  };
574
+ export const resolveFileViewerToolbarZoomButtons = ({ toolbar, zoomState, renderedReady, hasError = false, }) => {
575
+ const visible = !!toolbar.zoom && renderedReady && !hasError &&
576
+ (zoomState.canZoomIn || zoomState.canZoomOut || zoomState.canReset);
577
+ return {
578
+ zoomIn: visible && isFileViewerToolbarOperationVisible(toolbar, 'zoom-in'),
579
+ zoomOut: visible && isFileViewerToolbarOperationVisible(toolbar, 'zoom-out'),
580
+ zoomReset: visible && isFileViewerToolbarOperationVisible(toolbar, 'zoom-reset'),
581
+ };
582
+ };
574
583
  export const isFileViewerZoomButtonDisabled = ({ toolbarDisabled = false, availability, zoomState, action, }) => {
575
584
  const operation = FILE_VIEWER_ZOOM_BUTTON_OPERATIONS[action];
576
585
  const operationAllowed = operation === 'zoom-in'
@@ -586,6 +595,8 @@ export const isFileViewerToolbarDisabled = ({ loading = false, hasError = false,
586
595
  export const resolveFileViewerToolbarState = ({ toolbar, options, searchAvailable = true, loading = false, ...availabilityInput }) => {
587
596
  const operationAvailability = applyToolbarPermissionsToAvailability(resolveFileViewerOperationAvailability(availabilityInput), options === null || options === void 0 ? void 0 : options.toolbar);
588
597
  const visibleToolbar = resolveVisibleFileViewerToolbar(toolbar, operationAvailability, (options === null || options === void 0 ? void 0 : options.search) !== false && searchAvailable);
598
+ const zoomButtons = resolveFileViewerToolbarZoomButtons({ toolbar, ...availabilityInput });
599
+ visibleToolbar.zoom = zoomButtons.zoomIn || zoomButtons.zoomOut || zoomButtons.zoomReset;
589
600
  return {
590
601
  operationAvailability,
591
602
  visibleToolbar,
@@ -9,7 +9,7 @@ export declare const DEFAULT_FILE_VIEWER_CHM_WASM_PATH = "vendor/chm/chm_wasm_bg
9
9
  export declare const DEFAULT_FILE_VIEWER_CHM_WASM_PACKAGE_PATH = "@file-viewer/renderer-chm/wasm/chm_wasm_bg.wasm";
10
10
  export declare const DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH = "vendor/docx/docx.worker.js";
11
11
  export declare const DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH = "vendor/docx/jszip.min.js";
12
- export declare const DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION = "0.3.36";
12
+ export declare const DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION = "0.3.39";
13
13
  export declare const DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH = "vendor/pptx/pptx.worker.js";
14
14
  export declare const DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH = "vendor/ppt";
15
15
  export declare const DEFAULT_FILE_VIEWER_PPT_RUNTIME_VERSION = "0.3.6";
@@ -8,7 +8,7 @@ export const DEFAULT_FILE_VIEWER_CHM_WASM_PATH = 'vendor/chm/chm_wasm_bg.wasm';
8
8
  export const DEFAULT_FILE_VIEWER_CHM_WASM_PACKAGE_PATH = '@file-viewer/renderer-chm/wasm/chm_wasm_bg.wasm';
9
9
  export const DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH = 'vendor/docx/docx.worker.js';
10
10
  export const DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH = 'vendor/docx/jszip.min.js';
11
- export const DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION = '0.3.36';
11
+ export const DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION = '0.3.39';
12
12
  export const DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH = 'vendor/pptx/pptx.worker.js';
13
13
  export const DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH = 'vendor/ppt';
14
14
  export const DEFAULT_FILE_VIEWER_PPT_RUNTIME_VERSION = '0.3.6';
@@ -0,0 +1,2 @@
1
+ import type { FileViewerResolvedThemeMode, FileViewerThemeMode } from "../contracts/types.js";
2
+ export declare const observeFileViewerColorScheme: (target: HTMLElement, fallback: FileViewerThemeMode | undefined, apply: (theme: FileViewerResolvedThemeMode) => void) => () => void;
@@ -0,0 +1,39 @@
1
+ import { resolveFileViewerColorScheme } from "../config/options.js";
2
+ export const observeFileViewerColorScheme = (target, fallback, apply) => {
3
+ var _a;
4
+ const view = target.ownerDocument.defaultView;
5
+ const media = (_a = view === null || view === void 0 ? void 0 : view.matchMedia) === null || _a === void 0 ? void 0 : _a.call(view, '(prefers-color-scheme: dark)');
6
+ const ancestors = [];
7
+ let element = target;
8
+ while (element) {
9
+ ancestors.push(element);
10
+ const root = element.getRootNode();
11
+ element = element.parentElement || root.host || null;
12
+ }
13
+ let current;
14
+ const update = () => {
15
+ var _a;
16
+ const inherited = ancestors
17
+ .map((node) => node.getAttribute('data-viewer-theme'))
18
+ .find((value) => value === 'light' || value === 'dark' || value === 'system');
19
+ const next = resolveFileViewerColorScheme(inherited || fallback, (_a = media === null || media === void 0 ? void 0 : media.matches) !== null && _a !== void 0 ? _a : false);
20
+ if (next !== current) {
21
+ current = next;
22
+ apply(next);
23
+ }
24
+ };
25
+ const observer = (view === null || view === void 0 ? void 0 : view.MutationObserver) ? new view.MutationObserver(update) : undefined;
26
+ ancestors.forEach((node) => observer === null || observer === void 0 ? void 0 : observer.observe(node, { attributes: true, attributeFilter: ['data-viewer-theme'] }));
27
+ if (media === null || media === void 0 ? void 0 : media.addEventListener)
28
+ media.addEventListener('change', update);
29
+ else
30
+ media === null || media === void 0 ? void 0 : media.addListener(update);
31
+ update();
32
+ return () => {
33
+ observer === null || observer === void 0 ? void 0 : observer.disconnect();
34
+ if (media === null || media === void 0 ? void 0 : media.removeEventListener)
35
+ media.removeEventListener('change', update);
36
+ else
37
+ media === null || media === void 0 ? void 0 : media.removeListener(update);
38
+ };
39
+ };
@@ -1,4 +1,5 @@
1
1
  import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from "../features/document/dom/index.js";
2
+ import { installFileViewerImageHandTool } from "../features/document/imageHandTool.js";
2
3
  import { resolveFileViewerFitScale, } from "../features/document/fit.js";
3
4
  import { createFileViewerTranslator } from "../i18n/messages.js";
4
5
  import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from "../features/document/zoom.js";
@@ -20,7 +21,7 @@ const imageMimeMap = {
20
21
  };
21
22
  const imageStyle = `
22
23
  .image-viewer{position:relative;width:100%;height:100%;overflow:auto;background:var(--file-viewer-render-surface-background,#eef1f4);box-sizing:border-box}
23
- .image-stage{min-width:100%;min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box}
24
+ .image-stage{width:max-content;min-width:100%;min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box}
24
25
  .image-stage img{display:block;width:auto;max-width:none;margin:0 auto;border:0;box-shadow:0 18px 48px rgba(15,23,42,.16);background:#fff;cursor:zoom-in}
25
26
  .image-stage img:focus-visible{outline:3px solid #2563eb;outline-offset:4px}
26
27
  .image-lightbox{position:absolute;inset:0;z-index:40;display:flex;align-items:center;justify-content:center;padding:40px;background:rgba(15,23,42,.9);box-sizing:border-box;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s ease,visibility 0s linear .18s}
@@ -127,7 +128,7 @@ const createLightbox = (documentRef, src, t) => {
127
128
  };
128
129
  };
129
130
  export default async function renderImage(buffer, target, type, context) {
130
- var _a, _b;
131
+ var _a, _b, _c, _d;
131
132
  const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
132
133
  const documentRef = target.ownerDocument || document;
133
134
  const targetWindow = documentRef.defaultView;
@@ -155,6 +156,8 @@ export default async function renderImage(buffer, target, type, context) {
155
156
  image.setAttribute('aria-haspopup', 'dialog');
156
157
  stage.append(image);
157
158
  root.append(stage);
159
+ const disposeHandTool = ((_c = (_b = context === null || context === void 0 ? void 0 : context.options) === null || _b === void 0 ? void 0 : _b.image) === null || _c === void 0 ? void 0 : _c.handTool) === true
160
+ ? installFileViewerImageHandTool(root, context.signal) : () => { };
158
161
  const lightbox = createLightbox(documentRef, src, t);
159
162
  const openLightbox = () => lightbox.open(image);
160
163
  const openLightboxFromKeyboard = (event) => {
@@ -290,7 +293,7 @@ export default async function renderImage(buffer, target, type, context) {
290
293
  subscribe: zoomEmitter.subscribe,
291
294
  });
292
295
  target.replaceChildren(createStyle(documentRef), root);
293
- (((_b = context === null || context === void 0 ? void 0 : context.surface) === null || _b === void 0 ? void 0 : _b.shadowRoot) || target).append(lightbox.element);
296
+ (((_d = context === null || context === void 0 ? void 0 : context.surface) === null || _d === void 0 ? void 0 : _d.shadowRoot) || target).append(lightbox.element);
294
297
  updateViewportSize();
295
298
  return {
296
299
  $el: target,
@@ -303,6 +306,7 @@ export default async function renderImage(buffer, target, type, context) {
303
306
  }
304
307
  (_a = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _a === void 0 ? void 0 : _a.call(context, null);
305
308
  unregisterFileViewerZoomProvider(root);
309
+ disposeHandTool();
306
310
  resizeObserver.disconnect();
307
311
  image.removeEventListener('load', updateViewportSize);
308
312
  image.removeEventListener('click', openLightbox);
@@ -314,6 +314,8 @@ export declare const reportFileViewerPreviewLoadError: ({ onLogError, onErrorMes
314
314
  export declare const reportFileViewerMissingRemoteData: ({ onErrorMessage, ...messageInput }?: ReportFileViewerMissingRemoteDataInput) => string;
315
315
  export interface RunFileViewerRemoteFilePreviewInput<Session = unknown> {
316
316
  url: string;
317
+ filename?: string;
318
+ type?: string;
317
319
  version: number;
318
320
  pageHref?: string;
319
321
  streaming?: FileViewerPdfOptions['streaming'];
@@ -471,6 +473,8 @@ export interface CreateFileViewerSourceLoadingActionHandlersInput<Session = unkn
471
473
  getFile: () => FileViewerFileRef | null | undefined;
472
474
  getUrl: () => string | null | undefined;
473
475
  getCurrentFilename?: () => string | undefined;
476
+ getSourceFilename?: () => string | undefined;
477
+ getSourceType?: () => string | undefined;
474
478
  shouldStreamLocalFile?: (input: {
475
479
  file: File;
476
480
  filename: string;
@@ -550,8 +554,8 @@ export declare const commitFileViewerRenderCompleteState: <Session = unknown>({
550
554
  export declare const runFileViewerReadAndRenderFile: <Session = unknown>({ file, version, signal, sourceUrl, source, fallbackFilename, previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildRenderCompleteState, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, }: RunFileViewerReadAndRenderFileInput<Session>) => Promise<FileViewerReadAndRenderFileState<Session>>;
551
555
  export declare const runFileViewerStreamingPdfPreview: <Session = unknown>({ url, version, filename, previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildRenderCompleteState, loadingMessage, signal, typeOverride, i18n, onStartLoading, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onError, }: RunFileViewerStreamingPdfPreviewInput<Session>) => Promise<FileViewerStreamingPdfPreviewState<Session>>;
552
556
  export declare const runFileViewerLocalFilePreview: <Session = unknown>({ source, version, currentFilename, fallbackFilename, shouldStreamLocalFile, requestController, previewTarget, isCurrent, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, onMarkLoadStarted, onStartLoading, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onError, }: RunFileViewerLocalFilePreviewInput<Session>) => Promise<FileViewerLocalFilePreviewState<Session>>;
553
- export declare const runFileViewerRemoteFilePreview: <Session = unknown>({ url, version, pageHref, streaming, shouldStreamRemoteUrl, previewTarget, requestController, isCurrent, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, i18n, onMarkLoadStarted, onStartLoading, onSetLoadingMessage, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onMissingData, onError, }: RunFileViewerRemoteFilePreviewInput<Session>) => Promise<FileViewerRemoteFilePreviewState<Session>>;
554
- export declare const createFileViewerSourceLoadingActionHandlers: <Session = unknown>({ getFile, getUrl, getCurrentFilename, shouldStreamLocalFile, getPdfStreaming, shouldStreamRemoteUrl, getI18n, getPageHref, previewTarget, requestController, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, formatErrorMessage, onMarkLoadStarted, onClearLoadStarted, onStartLoading, onSetLoadingMessage, onStopLoading, onShowError, onClearError, onResetLoading, onClearRenderedContent, onSession, onActiveDocumentContext, onLifecycle, }: CreateFileViewerSourceLoadingActionHandlersInput<Session>) => FileViewerSourceLoadingActionHandlers<Session>;
557
+ export declare const runFileViewerRemoteFilePreview: <Session = unknown>({ url, filename, type, version, pageHref, streaming, shouldStreamRemoteUrl, previewTarget, requestController, isCurrent, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, i18n, onMarkLoadStarted, onStartLoading, onSetLoadingMessage, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onMissingData, onError, }: RunFileViewerRemoteFilePreviewInput<Session>) => Promise<FileViewerRemoteFilePreviewState<Session>>;
558
+ export declare const createFileViewerSourceLoadingActionHandlers: <Session = unknown>({ getFile, getUrl, getCurrentFilename, getSourceFilename, getSourceType, shouldStreamLocalFile, getPdfStreaming, shouldStreamRemoteUrl, getI18n, getPageHref, previewTarget, requestController, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, formatErrorMessage, onMarkLoadStarted, onClearLoadStarted, onStartLoading, onSetLoadingMessage, onStopLoading, onShowError, onClearError, onResetLoading, onClearRenderedContent, onSession, onActiveDocumentContext, onLifecycle, }: CreateFileViewerSourceLoadingActionHandlersInput<Session>) => FileViewerSourceLoadingActionHandlers<Session>;
555
559
  export declare const finalizeFileViewerPreviewLoadState: ({ version, isCurrent, onClearLoadStarted, onStopLoading, }: FinalizeFileViewerPreviewLoadStateInput) => void;
556
560
  export declare const resolveFileViewerLoadStartMessage: (source: FileViewerLifecycleContext["source"], i18n?: FileViewerI18nInput) => string;
557
561
  export declare const commitFileViewerLoadStartState: ({ version, filename, fallbackFilename, filenameTarget, buildState, onMarkLoadStarted, onLifecycle, onStartLoading, }: CommitFileViewerLoadStartStateInput) => FileViewerLoadStartState;
@@ -601,8 +605,9 @@ export interface FileViewerLocationLike {
601
605
  href?: string | null;
602
606
  }
603
607
  export declare const resolveFileViewerPageHref: (locationLike?: FileViewerLocationLike) => string | undefined;
604
- export declare const resolveFileViewerRemoteSourcePlan: ({ filename, fallbackFilename, pageHref, streaming, shouldStreamRemoteUrl, url, }: {
608
+ export declare const resolveFileViewerRemoteSourcePlan: ({ filename, type, fallbackFilename, pageHref, streaming, shouldStreamRemoteUrl, url, }: {
605
609
  filename?: string;
610
+ type?: string;
606
611
  fallbackFilename?: string;
607
612
  pageHref?: string;
608
613
  streaming?: FileViewerPdfOptions["streaming"];
@@ -1,7 +1,7 @@
1
1
  import { buildFileViewerLifecycleContext, } from "../lifecycle/operations.js";
2
2
  import { resolveFileViewerPreviewMessages, } from "../viewer/state.js";
3
3
  import { translateFileViewerMessage } from "../i18n/messages.js";
4
- import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from "./index.js";
4
+ import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, normalizeFileExtension, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from "./index.js";
5
5
  export const DEFAULT_PDF_RANGE_CHUNK_SIZE = 64 * 1024;
6
6
  export const DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME = 'preview.pdf';
7
7
  export const FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE = '文件下载失败';
@@ -596,8 +596,10 @@ export const runFileViewerLocalFilePreview = async ({ source, version, currentFi
596
596
  });
597
597
  }
598
598
  };
599
- export const runFileViewerRemoteFilePreview = async ({ url, version, pageHref, streaming, shouldStreamRemoteUrl, previewTarget, requestController, isCurrent, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, i18n, onMarkLoadStarted, onStartLoading, onSetLoadingMessage, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onMissingData, onError, }) => {
599
+ export const runFileViewerRemoteFilePreview = async ({ url, filename, type, version, pageHref, streaming, shouldStreamRemoteUrl, previewTarget, requestController, isCurrent, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, i18n, onMarkLoadStarted, onStartLoading, onSetLoadingMessage, onSession, onActiveDocumentContext, onLifecycle, onClearLoadStarted, onStopLoading, onMissingData, onError, }) => {
600
600
  let remoteSource = resolveFileViewerRemoteSourcePlan({
601
+ filename,
602
+ type,
601
603
  pageHref,
602
604
  streaming,
603
605
  url,
@@ -664,7 +666,7 @@ export const runFileViewerRemoteFilePreview = async ({ url, version, pageHref, s
664
666
  ? undefined
665
667
  : resolveFileViewerPreviewMessages(i18n).downloading,
666
668
  signal: controller === null || controller === void 0 ? void 0 : controller.signal,
667
- typeOverride: remoteSource.streamType,
669
+ typeOverride: remoteSource.streamPdf ? 'pdf' : remoteSource.streamType,
668
670
  onStartLoading,
669
671
  onSession,
670
672
  onActiveDocumentContext,
@@ -808,7 +810,7 @@ export const runFileViewerRemoteFilePreview = async ({ url, version, pageHref, s
808
810
  }
809
811
  }
810
812
  };
811
- export const createFileViewerSourceLoadingActionHandlers = ({ getFile, getUrl, getCurrentFilename, shouldStreamLocalFile, getPdfStreaming, shouldStreamRemoteUrl, getI18n, getPageHref, previewTarget, requestController, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, formatErrorMessage, onMarkLoadStarted, onClearLoadStarted, onStartLoading, onSetLoadingMessage, onStopLoading, onShowError, onClearError, onResetLoading, onClearRenderedContent, onSession, onActiveDocumentContext, onLifecycle, }) => {
813
+ export const createFileViewerSourceLoadingActionHandlers = ({ getFile, getUrl, getCurrentFilename, getSourceFilename, getSourceType, shouldStreamLocalFile, getPdfStreaming, shouldStreamRemoteUrl, getI18n, getPageHref, previewTarget, requestController, downloadFile, mountRenderedContent, destroyRenderSession, buildLoadStartState, buildRenderCompleteState, formatErrorMessage, onMarkLoadStarted, onClearLoadStarted, onStartLoading, onSetLoadingMessage, onStopLoading, onShowError, onClearError, onResetLoading, onClearRenderedContent, onSession, onActiveDocumentContext, onLifecycle, }) => {
812
814
  const isCurrentRequest = (version) => requestController.isCurrent(version);
813
815
  const previewLocalFile = async (source, version) => {
814
816
  var _a;
@@ -853,6 +855,8 @@ export const createFileViewerSourceLoadingActionHandlers = ({ getFile, getUrl, g
853
855
  const previewRemoteFile = async (url, version) => {
854
856
  return await runFileViewerRemoteFilePreview({
855
857
  url,
858
+ filename: getSourceFilename === null || getSourceFilename === void 0 ? void 0 : getSourceFilename(),
859
+ type: getSourceType === null || getSourceType === void 0 ? void 0 : getSourceType(),
856
860
  version,
857
861
  pageHref: getPageHref === null || getPageHref === void 0 ? void 0 : getPageHref(),
858
862
  streaming: getPdfStreaming === null || getPdfStreaming === void 0 ? void 0 : getPdfStreaming(),
@@ -1034,18 +1038,16 @@ export const shouldStreamPdfUrl = ({ extension, pageHref, streaming, url, }) =>
1034
1038
  export const resolveFileViewerPageHref = (locationLike) => {
1035
1039
  return (locationLike === null || locationLike === void 0 ? void 0 : locationLike.href) || undefined;
1036
1040
  };
1037
- export const resolveFileViewerRemoteSourcePlan = ({ filename, fallbackFilename = DEFAULT_FILE_VIEWER_SOURCE_FILENAME, pageHref, streaming, shouldStreamRemoteUrl, url, }) => {
1041
+ export const resolveFileViewerRemoteSourcePlan = ({ filename, type, fallbackFilename = DEFAULT_FILE_VIEWER_SOURCE_FILENAME, pageHref, streaming, shouldStreamRemoteUrl, url, }) => {
1038
1042
  const sourceUrl = normalizeFileViewerSourceUrl(url) || url;
1039
1043
  const nextFilename = normalizeFilename(filename || url, fallbackFilename);
1040
- const extension = getExtension(nextFilename);
1041
- const streamPdf = pageHref
1042
- ? shouldStreamPdfUrl({
1043
- extension,
1044
- pageHref,
1045
- streaming,
1046
- url: sourceUrl,
1047
- })
1048
- : false;
1044
+ const extension = normalizeFileExtension(type || getExtension(nextFilename));
1045
+ const streamPdf = shouldStreamPdfUrl({
1046
+ extension,
1047
+ pageHref: pageHref || '',
1048
+ streaming,
1049
+ url: sourceUrl,
1050
+ });
1049
1051
  const streamDecision = !streamPdf
1050
1052
  ? shouldStreamRemoteUrl === null || shouldStreamRemoteUrl === void 0 ? void 0 : shouldStreamRemoteUrl({
1051
1053
  url: sourceUrl,
@@ -259,6 +259,7 @@ export const createViewer = (container, createOptions = {}) => {
259
259
  surface.container.style.height = '100%';
260
260
  }
261
261
  syncFileViewerRenderSurfaceBackground(target, options);
262
+ target.setAttribute('data-viewer-theme', options.theme || 'system');
262
263
  currentRenderTarget = target;
263
264
  return surface;
264
265
  };
@@ -722,6 +723,7 @@ export const createViewer = (container, createOptions = {}) => {
722
723
  ...nextOptions,
723
724
  };
724
725
  syncFileViewerRenderSurfaceBackground(currentRenderTarget, options);
726
+ currentRenderTarget === null || currentRenderTarget === void 0 ? void 0 : currentRenderTarget.setAttribute('data-viewer-theme', options.theme || 'system');
725
727
  syncWatermarkOverlay();
726
728
  if ('fit' in nextOptions && nextOptions.fit !== previousFit) {
727
729
  fitController.resetAutoFit();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "3.2.2",
3
+ "version": "3.3.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",
@@ -84,6 +84,8 @@
84
84
  "dist/browser.js",
85
85
  "dist/browser/controller.d.ts",
86
86
  "dist/browser/controller.js",
87
+ "dist/browser/toolbar-focus.d.ts",
88
+ "dist/browser/toolbar-focus.js",
87
89
  "dist/config/options.d.ts",
88
90
  "dist/config/options.js",
89
91
  "dist/contracts/types.d.ts",
@@ -106,6 +108,8 @@
106
108
  "dist/features/document/events.js",
107
109
  "dist/features/document/fit.d.ts",
108
110
  "dist/features/document/fit.js",
111
+ "dist/features/document/imageHandTool.d.ts",
112
+ "dist/features/document/imageHandTool.js",
109
113
  "dist/features/document/model.d.ts",
110
114
  "dist/features/document/model.js",
111
115
  "dist/features/document/search.d.ts",
@@ -152,6 +156,8 @@
152
156
  "dist/platform/copiedAssets.js",
153
157
  "dist/platform/worker.d.ts",
154
158
  "dist/platform/worker.js",
159
+ "dist/presentation/colorScheme.d.ts",
160
+ "dist/presentation/colorScheme.js",
155
161
  "dist/presentation/state.d.ts",
156
162
  "dist/presentation/state.js",
157
163
  "dist/print-mask.d.ts",
@@ -196,10 +202,11 @@
196
202
  "print-mask.d.ts",
197
203
  "print-mask.js",
198
204
  "README.en.md",
199
- "README.md"
205
+ "README.md",
206
+ "README.zh-CN.md"
200
207
  ],
201
208
  "dependencies": {
202
- "dompurify": "3.4.16"
209
+ "dompurify": "3.4.17"
203
210
  },
204
211
  "license": "Apache-2.0",
205
212
  "fileViewer": {