@file-viewer/core 3.3.1 → 3.3.3

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.
Files changed (111) hide show
  1. package/dist/assets.d.ts +2 -2
  2. package/dist/assets.js +1 -5
  3. package/dist/browser/controller.d.ts +1 -2
  4. package/dist/browser/controller.js +8 -39
  5. package/dist/browser/source-feedback.d.ts +1 -2
  6. package/dist/browser/source-feedback.js +2 -3
  7. package/dist/browser/toolbar-focus.d.ts +0 -1
  8. package/dist/browser/toolbar-focus.js +0 -3
  9. package/dist/browser/toolbar-keyboard.d.ts +1 -0
  10. package/dist/browser/toolbar-keyboard.js +63 -0
  11. package/dist/browser.d.ts +2 -2
  12. package/dist/browser.js +2 -2
  13. package/dist/config/options.d.ts +1 -1
  14. package/dist/contracts/types.d.ts +1 -470
  15. package/dist/contracts/xml.d.ts +0 -11
  16. package/dist/export.d.ts +3 -10
  17. package/dist/export.js +2 -9
  18. package/dist/exportDocument.d.ts +1 -12
  19. package/dist/exportDocument.js +2 -31
  20. package/dist/features/document/dom/anchors.d.ts +1 -1
  21. package/dist/features/document/dom/index.d.ts +5 -5
  22. package/dist/features/document/dom/index.js +3 -3
  23. package/dist/features/document/dom/providers.d.ts +1 -1
  24. package/dist/features/document/events.d.ts +2 -2
  25. package/dist/features/document/events.js +3 -3
  26. package/dist/features/document/fit.d.ts +1 -1
  27. package/dist/features/document/fit.js +1 -1
  28. package/dist/features/document/imageHandTool.d.ts +0 -2
  29. package/dist/features/document/imageHandTool.js +1 -5
  30. package/dist/features/document/model.d.ts +1 -1
  31. package/dist/features/document/search.d.ts +1 -1
  32. package/dist/features/document/search.js +2 -2
  33. package/dist/features/document/viewState.d.ts +1 -1
  34. package/dist/features/document/viewState.js +2 -2
  35. package/dist/features/document/zoom.d.ts +1 -1
  36. package/dist/features/document/zoom.js +3 -3
  37. package/dist/features/document/zoomGestures.d.ts +2 -2
  38. package/dist/features/document/zoomGestures.js +0 -2
  39. package/dist/features/printMask.d.ts +1 -1
  40. package/dist/features/printMaskDesigner.d.ts +2 -6
  41. package/dist/features/printMaskDesigner.js +2 -11
  42. package/dist/features/printMaskLoader.d.ts +1 -7
  43. package/dist/features/printMaskLoader.js +1 -7
  44. package/dist/features/watermark.d.ts +1 -1
  45. package/dist/headless.d.ts +29 -29
  46. package/dist/headless.js +16 -21
  47. package/dist/i18n/messages.d.ts +1 -1
  48. package/dist/i18n/messages.de.d.ts +1 -5
  49. package/dist/i18n/messages.de.js +1 -5
  50. package/dist/i18n/messages.ja.d.ts +1 -6
  51. package/dist/i18n/messages.ja.js +1 -6
  52. package/dist/i18n/messages.js +4 -4
  53. package/dist/index.d.ts +77 -77
  54. package/dist/index.js +39 -39
  55. package/dist/lifecycle/facade.d.ts +4 -4
  56. package/dist/lifecycle/facade.js +2 -2
  57. package/dist/lifecycle/operations.d.ts +4 -5
  58. package/dist/lifecycle/operations.js +4 -10
  59. package/dist/output/canvasImage.d.ts +1 -2
  60. package/dist/output/canvasImage.js +1 -4
  61. package/dist/output/export.d.ts +1 -3
  62. package/dist/output/export.js +0 -12
  63. package/dist/output/printLayout.d.ts +0 -5
  64. package/dist/output/printLayout.js +0 -4
  65. package/dist/output/snapshotDownload.d.ts +1 -2
  66. package/dist/output/snapshotDownload.js +2 -3
  67. package/dist/platform/assets.d.ts +4 -11
  68. package/dist/platform/assets.js +20 -45
  69. package/dist/platform/copiedAssets.d.ts +0 -1
  70. package/dist/platform/copiedAssets.js +1 -2
  71. package/dist/presentation/colorScheme.d.ts +1 -2
  72. package/dist/presentation/colorScheme.js +1 -2
  73. package/dist/presentation/state.d.ts +1 -1
  74. package/dist/presentation/state.js +3 -3
  75. package/dist/print-mask.d.ts +2 -2
  76. package/dist/print-mask.js +1 -1
  77. package/dist/registry/capabilities.d.ts +1 -14
  78. package/dist/registry/capabilities.js +2 -15
  79. package/dist/registry/formats.d.ts +1 -1
  80. package/dist/registry/formats.generated.d.ts +2 -3
  81. package/dist/registry/formats.generated.js +2 -3
  82. package/dist/registry/formats.js +2 -2
  83. package/dist/registry/registry.d.ts +1 -15
  84. package/dist/registry/registry.js +2 -10
  85. package/dist/renderers/image.d.ts +1 -1
  86. package/dist/renderers/image.js +5 -7
  87. package/dist/renderers/index.d.ts +3 -3
  88. package/dist/renderers/index.js +5 -11
  89. package/dist/rendering/dispatcher.d.ts +1 -6
  90. package/dist/rendering/dispatcher.js +3 -3
  91. package/dist/rendering/handler.d.ts +3 -13
  92. package/dist/rendering/handler.js +9 -21
  93. package/dist/security/svgResources.d.ts +0 -10
  94. package/dist/security/svgResources.js +0 -12
  95. package/dist/source/index.d.ts +3 -3
  96. package/dist/source/index.js +1 -1
  97. package/dist/source/loading.d.ts +4 -4
  98. package/dist/source/loading.js +4 -7
  99. package/dist/source/precheck.d.ts +1 -13
  100. package/dist/source/precheck.js +2 -9
  101. package/dist/source/textEncoding.d.ts +0 -18
  102. package/dist/source/textEncoding.js +0 -15
  103. package/dist/viewer/createViewer.d.ts +1 -1
  104. package/dist/viewer/createViewer.js +17 -28
  105. package/dist/viewer/loading.d.ts +2 -6
  106. package/dist/viewer/loading.js +1 -9
  107. package/dist/viewer/operations.d.ts +3 -3
  108. package/dist/viewer/operations.js +6 -14
  109. package/dist/viewer/state.d.ts +2 -6
  110. package/dist/viewer/state.js +3 -8
  111. package/package.json +3 -1
@@ -1,5 +1,5 @@
1
- import { DEFAULT_RENDERER_DEFINITIONS } from './formats.js';
2
- import { getExtension, normalizeFileExtension, normalizeFilename } from '../source/index.js';
1
+ import { DEFAULT_RENDERER_DEFINITIONS } from "./formats.js";
2
+ import { getExtension, normalizeFileExtension, normalizeFilename } from "../source/index.js";
3
3
  const autoRendererBucketKey = '__flyfish_file_viewer_auto_renderer_presets__';
4
4
  const getAutoRendererBucket = () => {
5
5
  const host = globalThis;
@@ -217,7 +217,6 @@ const createRendererDefinitionInstallPlan = (registry, definitions) => {
217
217
  ...regularDefinitions,
218
218
  ...enhancerDefinitions,
219
219
  ];
220
- // Validate the complete ownership transition before mutating the caller's registry.
221
220
  const validationRegistry = createRendererRegistry(registry.list());
222
221
  plannedDefinitions.forEach(definition => validationRegistry.register(definition));
223
222
  return { definitions: plannedDefinitions };
@@ -328,13 +327,6 @@ export const hasFileViewerRendererPresetName = (input) => {
328
327
  }
329
328
  return false;
330
329
  };
331
- /**
332
- * Normalizes `options.preset` / `options.presets` into renderer plugin inputs.
333
- *
334
- * Passing a preset object is the most portable integration style because it
335
- * works in any bundler. String selectors intentionally only resolve presets
336
- * that are already registered by a side-effect import or by build tooling.
337
- */
338
330
  export const resolveFileViewerRendererPresetInputs = (input) => {
339
331
  if (!input) {
340
332
  return [];
@@ -1,2 +1,2 @@
1
- import type { FileRenderContext, FileViewerRenderedInstance } from '../contracts/types.js';
1
+ import type { FileRenderContext, FileViewerRenderedInstance } from "../contracts/types.js";
2
2
  export default function renderImage(buffer: ArrayBuffer, target: HTMLDivElement, type?: string, context?: FileRenderContext): Promise<FileViewerRenderedInstance>;
@@ -1,8 +1,8 @@
1
- import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from '../features/document/dom/index.js';
2
- import { installFileViewerImageHandTool } from '../features/document/imageHandTool.js';
3
- import { resolveFileViewerFitScale, } from '../features/document/fit.js';
4
- import { createFileViewerTranslator } from '../i18n/messages.js';
5
- import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from '../features/document/zoom.js';
1
+ import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from "../features/document/dom/index.js";
2
+ import { installFileViewerImageHandTool } from "../features/document/imageHandTool.js";
3
+ import { resolveFileViewerFitScale, } from "../features/document/fit.js";
4
+ import { createFileViewerTranslator } from "../i18n/messages.js";
5
+ import { createFileViewerZoomChangeEmitter as createZoomChangeEmitter } from "../features/document/zoom.js";
6
6
  const imageMimeMap = {
7
7
  avif: 'image/avif',
8
8
  bmp: 'image/bmp',
@@ -201,8 +201,6 @@ export default async function renderImage(buffer, target, type, context) {
201
201
  applyImageZoom();
202
202
  zoomEmitter.emit();
203
203
  };
204
- // Zoom subscribers may resize the parent toolbar. Keep geometry writes out
205
- // of ResizeObserver delivery so ancestor notifications remain deliverable.
206
204
  const scheduleViewportUpdate = () => {
207
205
  if (destroyed || viewportResizeFrame !== null)
208
206
  return;
@@ -1,4 +1,4 @@
1
- import type { FileViewerBuiltinRendererPreset, FileRenderHandler, FileViewerRenderedInstance } from '../contracts/types.js';
1
+ import type { FileViewerBuiltinRendererPreset, FileRenderHandler, FileViewerRenderedInstance } from "../contracts/types.js";
2
2
  type CoreBrowserRendererHandler = FileRenderHandler<FileViewerRenderedInstance, HTMLDivElement>;
3
3
  interface CoreBrowserRendererHandlerEntry {
4
4
  rendererId: string;
@@ -56,7 +56,7 @@ export declare const coreLiteRendererDefinitions: ({
56
56
  readonly packageName: "@file-viewer/renderer-ppt";
57
57
  readonly presets: readonly ["office", "all"];
58
58
  readonly containerVersions: readonly ["PowerPoint 97-2003 Binary"];
59
- readonly knownLimits: readonly ["Embedded engine watermark is retained", "Macros are never executed"];
59
+ readonly knownLimits: readonly ["Host fonts and complex effects can differ from PowerPoint", "Macros are never executed"];
60
60
  readonly capabilities: {
61
61
  readonly download: true;
62
62
  readonly print: "adapter";
@@ -724,7 +724,7 @@ export declare const coreLiteRendererDefinitions: ({
724
724
  readonly status: "experimental";
725
725
  readonly packageName: "@file-viewer/renderer-design";
726
726
  readonly presets: readonly [];
727
- readonly containerVersions: readonly ["IDML package", "@paged-media/introspect-wasm 0.70.2"];
727
+ readonly containerVersions: readonly ["IDML package", "@paged-media/introspect-wasm 0.73.4"];
728
728
  readonly knownLimits: readonly ["Pages are rendered locally by the CPU WASM engine in a module Worker; the browser never uploads the IDML package", "ZIP64, encrypted, multi-disk, overlapping, unsafe-path, unsupported-compression, and configured expansion-limit packages are rejected before the WASM engine opens them", "The current engine page tree lists TextFrame and Rectangle objects only even though other supported objects may still appear in rendered page pixels", "Each page render rebuilds the upstream document internally; interactive requests are latest-wins, preview is lazy, and print-all is bounded by the configured total RGBA working-set limit"];
729
729
  readonly capabilities: {
730
730
  readonly download: true;
@@ -1,23 +1,17 @@
1
- // Browser renderer strategy registry.
2
- //
3
- // Each entry lazy-loads a concrete renderer only after its format is selected.
4
- // Keep renderer-specific dependencies inside the leaf renderer files so the
5
- // core shell and framework wrappers stay fast on first load.
6
- import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
7
- import { createFileRenderHandlerRegistry } from '../rendering/handler.js';
8
- import { createFileViewerRendererDispatcher } from '../rendering/dispatcher.js';
9
- import { createFileViewerUnsupportedState } from '../viewer/state.js';
1
+ import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
2
+ import { createFileRenderHandlerRegistry } from "../rendering/handler.js";
3
+ import { createFileViewerRendererDispatcher } from "../rendering/dispatcher.js";
4
+ import { createFileViewerUnsupportedState } from "../viewer/state.js";
10
5
  const createWrapper = (el) => ({
11
6
  $el: el,
12
7
  unmount() {
13
- // DOM renderers clean themselves up through their own returned instance.
14
8
  },
15
9
  });
16
10
  export const coreBrowserRendererHandlers = [
17
11
  {
18
12
  rendererId: 'image',
19
13
  handler: async (buffer, target, type, context) => {
20
- const { default: renderImage } = await import('./image.js');
14
+ const { default: renderImage } = await import("./image.js");
21
15
  return renderImage(buffer, target, type, context);
22
16
  },
23
17
  },
@@ -1,13 +1,8 @@
1
- import type { RendererRegistry } from '../contracts/types.js';
1
+ import type { RendererRegistry } from "../contracts/types.js";
2
2
  export interface FileViewerRendererHandlerEntry<Handler> {
3
3
  rendererId: string;
4
4
  handler: Handler;
5
5
  }
6
- /**
7
- * Content-signature aware renderers can throw this shape when the filename
8
- * extension points at the wrong container. The orchestration layer follows the
9
- * redirect once, using the handler registered for the detected renderer id.
10
- */
11
6
  export interface FileViewerRendererRedirectError extends Error {
12
7
  actualRendererId: string;
13
8
  }
@@ -1,6 +1,6 @@
1
- import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
2
- import { createRendererRegistry } from '../registry/registry.js';
3
- import { normalizeFileExtension } from '../source/index.js';
1
+ import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
2
+ import { createRendererRegistry } from "../registry/registry.js";
3
+ import { normalizeFileExtension } from "../source/index.js";
4
4
  export const resolveFileViewerRendererRedirectId = (error) => {
5
5
  if (!error || typeof error !== 'object' || !('actualRendererId' in error)) {
6
6
  return undefined;
@@ -1,6 +1,6 @@
1
- import type { FileViewerRendererDispatcher } from './dispatcher.js';
2
- import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from '../source/loading.js';
3
- import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from '../contracts/types.js';
1
+ import type { FileViewerRendererDispatcher } from "./dispatcher.js";
2
+ import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from "../source/loading.js";
3
+ import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from "../contracts/types.js";
4
4
  export declare const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = "\u9884\u89C8\u5185\u5BB9\u5378\u8F7D\u5931\u8D25";
5
5
  export interface ResolveFileViewerRenderSessionDisposeErrorMessageInput {
6
6
  message?: string;
@@ -21,7 +21,6 @@ export interface RenderFileViewerHandlerInput<Rendered = unknown, Target extends
21
21
  export interface CreateFileRenderHandlerLoaderOptions<Rendered = unknown, Target extends HTMLElement = HTMLElement> {
22
22
  handler: FileRenderHandler<Rendered, Target>;
23
23
  rendererId?: string;
24
- /** Allows stream-preferred handlers to receive an empty buffer plus context.streamUrl. */
25
24
  allowUrlSource?: boolean;
26
25
  getTarget?: (context: RendererLoadContext) => Target;
27
26
  createContext?: (context: RendererLoadContext) => FileRenderContext;
@@ -61,10 +60,6 @@ export interface FileViewerStyleHandle {
61
60
  remove(): void;
62
61
  }
63
62
  export interface AppendFileViewerStyleOptions {
64
- /**
65
- * Constructable stylesheets are useful for long-lived ShadowRoots. Keep this
66
- * opt-in so renderer styles still clean up naturally with their target node.
67
- */
68
63
  adoptedStyleSheet?: boolean;
69
64
  }
70
65
  export interface ResetFileViewerRenderSurfaceInput<Session extends RendererSession = RendererSession> {
@@ -169,11 +164,6 @@ export interface CreateFileViewerRenderSurfaceActionHandlersInput<Session extend
169
164
  export declare const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = "file-render";
170
165
  export declare const FILE_VIEWER_RENDER_SURFACE_BACKGROUND_PROPERTY = "--file-viewer-render-surface-background";
171
166
  export declare const normalizeFileViewerRenderSurfaceBackground: (value: unknown) => string | null;
172
- /**
173
- * Keeps the public UI option and the renderer-facing CSS custom property in
174
- * sync. Custom properties inherit through Shadow DOM, so setting this on the
175
- * render host covers both scoped and shadow-isolated renderer targets.
176
- */
177
167
  export declare const syncFileViewerRenderSurfaceBackground: (target: HTMLElement | null | undefined, options?: Pick<FileViewerOptions, "ui"> | null) => string | null;
178
168
  export declare const isFileViewerShadowRoot: (value: unknown) => value is ShadowRoot;
179
169
  export declare const getFileViewerShadowRootForNode: (node: Node | null | undefined) => ShadowRoot | null;
@@ -1,17 +1,12 @@
1
- // Rendering orchestration layer.
2
- //
3
- // This module adapts registry entries into disposable renderer sessions. It is
4
- // the only place that should bridge raw buffers, DOM targets, render contexts,
5
- // export adapters, and readiness state.
6
- import { DEFAULT_RENDERER_DEFINITIONS } from '../registry/formats.js';
7
- import { waitForFileViewerNextPaint } from '../output/export.js';
8
- import { createFileViewerRendererDispatcher } from './dispatcher.js';
9
- import { resolveFileViewerRendererRedirectId } from './dispatcher.js';
10
- import { createRendererRegistry } from '../registry/registry.js';
11
- import { getExtension, normalizeFileExtension } from '../source/index.js';
12
- import { applyFileViewerRenderReadinessState, } from '../source/loading.js';
13
- import { findFileViewerViewStateProvider } from '../features/document/dom/index.js';
14
- import { registerFileViewerGenericViewStateProvider } from '../features/document/viewState.js';
1
+ import { DEFAULT_RENDERER_DEFINITIONS } from "../registry/formats.js";
2
+ import { waitForFileViewerNextPaint } from "../output/export.js";
3
+ import { createFileViewerRendererDispatcher } from "./dispatcher.js";
4
+ import { resolveFileViewerRendererRedirectId } from "./dispatcher.js";
5
+ import { createRendererRegistry } from "../registry/registry.js";
6
+ import { getExtension, normalizeFileExtension } from "../source/index.js";
7
+ import { applyFileViewerRenderReadinessState, } from "../source/loading.js";
8
+ import { findFileViewerViewStateProvider } from "../features/document/dom/index.js";
9
+ import { registerFileViewerGenericViewStateProvider } from "../features/document/viewState.js";
15
10
  export const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = '预览内容卸载失败';
16
11
  export const DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS = 'file-render';
17
12
  export const FILE_VIEWER_RENDER_SURFACE_BACKGROUND_PROPERTY = '--file-viewer-render-surface-background';
@@ -24,11 +19,6 @@ export const normalizeFileViewerRenderSurfaceBackground = (value) => {
24
19
  const normalized = value.trim();
25
20
  return normalized && normalized.toLowerCase() !== 'auto' ? normalized : null;
26
21
  };
27
- /**
28
- * Keeps the public UI option and the renderer-facing CSS custom property in
29
- * sync. Custom properties inherit through Shadow DOM, so setting this on the
30
- * render host covers both scoped and shadow-isolated renderer targets.
31
- */
32
22
  export const syncFileViewerRenderSurfaceBackground = (target, options) => {
33
23
  var _a;
34
24
  if (!target) {
@@ -161,8 +151,6 @@ export const appendFileViewerStyle = (target, css, options = {}) => {
161
151
  const shadowRoot = getFileViewerShadowRootForNode(target);
162
152
  const StyleSheet = shadowRoot ? getConstructableStyleSheet(shadowRoot) : null;
163
153
  if (options.adoptedStyleSheet && shadowRoot && StyleSheet) {
164
- // Use the target document's constructor. A stylesheet constructed in the
165
- // parent window cannot be adopted by a ShadowRoot owned by an iframe.
166
154
  const sheet = new StyleSheet();
167
155
  sheet.replaceSync(css);
168
156
  shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, sheet];
@@ -1,13 +1,3 @@
1
- /**
2
- * Keep ordinary SVG styles while preventing imports and resource requests.
3
- * Obfuscated URL tokens fail closed instead of depending on parser quirks.
4
- */
5
1
  export declare const sanitizeFileViewerSvgCss: (value: string) => string;
6
- /** Remove executable attributes and every SVG resource URL that can load data remotely. */
7
2
  export declare const sanitizeFileViewerSvgResources: (root: ParentNode) => void;
8
- /**
9
- * Mermaid 11 resolves image-node URLs with `new Image()` while rendering,
10
- * before its SVG can be sanitized. Reject image metadata and explicit remote
11
- * URLs before calling Mermaid so an untrusted diagram cannot initiate I/O.
12
- */
13
3
  export declare const assertFileViewerMermaidSourceHasNoExternalResources: (source: string) => void;
@@ -44,10 +44,6 @@ const isSafeSvgCssUrl = (value) => {
44
44
  /^blob:/i.test(normalized) ||
45
45
  SAFE_EMBEDDED_IMAGE_DATA_URL.test(normalized);
46
46
  };
47
- /**
48
- * Keep ordinary SVG styles while preventing imports and resource requests.
49
- * Obfuscated URL tokens fail closed instead of depending on parser quirks.
50
- */
51
47
  export const sanitizeFileViewerSvgCss = (value) => {
52
48
  const normalizedCharacters = [];
53
49
  for (const character of value) {
@@ -93,7 +89,6 @@ export const sanitizeFileViewerSvgCss = (value) => {
93
89
  chunks.push(normalized.slice(segmentStart));
94
90
  return chunks.join('');
95
91
  };
96
- /** Remove executable attributes and every SVG resource URL that can load data remotely. */
97
92
  export const sanitizeFileViewerSvgResources = (root) => {
98
93
  root.querySelectorAll('*').forEach(element => {
99
94
  for (const attribute of Array.from(element.attributes)) {
@@ -160,17 +155,10 @@ const canonicalizeMermaidSourceForResourceScan = (source) => {
160
155
  }
161
156
  return output;
162
157
  };
163
- /**
164
- * Mermaid 11 resolves image-node URLs with `new Image()` while rendering,
165
- * before its SVG can be sanitized. Reject image metadata and explicit remote
166
- * URLs before calling Mermaid so an untrusted diagram cannot initiate I/O.
167
- */
168
158
  export const assertFileViewerMermaidSourceHasNoExternalResources = (source) => {
169
159
  const normalized = canonicalizeMermaidSourceForResourceScan(String(source || ''));
170
160
  const compact = normalized.replace(/[\t\r\n ]+/g, '');
171
161
  const hasImageMetadata = /(?:^|[,{])\s*(?:img|["']img["'])\s*:/im.test(normalized);
172
- // HTML math labels are created by Mermaid before its SVG is returned. Reject
173
- // loading elements even when their URL uses entities or a relative path.
174
162
  const hasLoadingElement = /<\s*(?:img|image|iframe|object|embed|video|audio|source|link|script|style)\b/i.test(normalized);
175
163
  const hasRemoteUrl = /(?:https?|ftp):\/\//i.test(compact) ||
176
164
  /(?:^|[\s"'(=:,])(?:\/\/|\\\\)[A-Za-z0-9]/m.test(normalized);
@@ -1,6 +1,6 @@
1
- import type { FileViewerFileRef, FileViewerSource, NormalizedFileViewerSource } from '../contracts/types.js';
2
- export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from './textEncoding.js';
3
- export type { DecodedFileViewerText, FileViewerSingleByteTextEncoding, FileViewerTextEncoding, ResolvedFileViewerTextEncoding, ResolvedFileViewerTextSource, } from './textEncoding.js';
1
+ import type { FileViewerFileRef, FileViewerSource, NormalizedFileViewerSource } from "../contracts/types.js";
2
+ export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from "./textEncoding.js";
3
+ export type { DecodedFileViewerText, FileViewerSingleByteTextEncoding, FileViewerTextEncoding, ResolvedFileViewerTextEncoding, ResolvedFileViewerTextSource, } from "./textEncoding.js";
4
4
  export type FileViewerReadResult = string | ArrayBuffer | undefined | null;
5
5
  export declare const DEFAULT_FILE_VIEWER_SOURCE_FILENAME = "preview.bin";
6
6
  export declare const normalizeFileExtension: (extension: string) => string;
@@ -1,4 +1,4 @@
1
- export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from './textEncoding.js';
1
+ export { DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING, createFileViewerTextDecoder, decodeFileViewerTextBuffer, isSingleByteFileViewerTextEncoding, isValidFileViewerUtf8, resolveFileViewerTextEncoding, } from "./textEncoding.js";
2
2
  export const DEFAULT_FILE_VIEWER_SOURCE_FILENAME = 'preview.bin';
3
3
  export const normalizeFileExtension = (extension) => {
4
4
  return extension.trim().replace(/^\./, '').toLowerCase();
@@ -1,7 +1,7 @@
1
- import type { FileViewerFileRef, FileViewerLifecycleContext, FileViewerPdfOptions } from '../contracts/types.js';
2
- import { type FileViewerLifecycleStateController } from '../lifecycle/operations.js';
3
- import { type FileViewerErrorMessageFormatter } from '../viewer/state.js';
4
- import type { FileViewerI18nInput } from '../i18n/messages.js';
1
+ import type { FileViewerFileRef, FileViewerLifecycleContext, FileViewerPdfOptions } from "../contracts/types.js";
2
+ import { type FileViewerLifecycleStateController } from "../lifecycle/operations.js";
3
+ import { type FileViewerErrorMessageFormatter } from "../viewer/state.js";
4
+ import type { FileViewerI18nInput } from "../i18n/messages.js";
5
5
  export declare const DEFAULT_PDF_RANGE_CHUNK_SIZE: number;
6
6
  export declare const DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME = "preview.pdf";
7
7
  export declare const FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE = "\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25";
@@ -1,7 +1,7 @@
1
- import { buildFileViewerLifecycleContext, } from '../lifecycle/operations.js';
2
- import { resolveFileViewerPreviewMessages, } from '../viewer/state.js';
3
- import { translateFileViewerMessage } from '../i18n/messages.js';
4
- import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, getExtension, normalizeFilename, normalizeFileExtension, readFileViewerBuffer, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from './index.js';
1
+ import { buildFileViewerLifecycleContext, } from "../lifecycle/operations.js";
2
+ import { resolveFileViewerPreviewMessages, } from "../viewer/state.js";
3
+ import { translateFileViewerMessage } from "../i18n/messages.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 = '文件下载失败';
@@ -117,7 +117,6 @@ const encodeFileViewerUrlPathSegment = (segment) => {
117
117
  decoded = decodeURIComponent(segment);
118
118
  }
119
119
  catch {
120
- // Invalid percent escapes are treated as literal filename characters.
121
120
  }
122
121
  return encodeURIComponent(decoded)
123
122
  .replace(/%3A/gi, ':')
@@ -607,8 +606,6 @@ export const runFileViewerRemoteFilePreview = async ({ url, filename, type, vers
607
606
  });
608
607
  const sourceUrl = remoteSource.url;
609
608
  const controller = requestController.createAbortController();
610
- // The streaming helper finalizes its own load state; probe/download paths
611
- // are finalized here, including cancellation before a renderer is mounted.
612
609
  let streamFinalized = false;
613
610
  try {
614
611
  if (!remoteSource.streamPdf && shouldStreamRemoteUrl) {
@@ -1,14 +1,10 @@
1
- import type { FileViewerFileRef, FileViewerSource } from '../contracts/types.js';
1
+ import type { FileViewerFileRef, FileViewerSource } from "../contracts/types.js";
2
2
  export type FileViewerPrecheckStatus = 'ready' | 'invalid' | 'unsupported';
3
3
  export type FileViewerPrecheckReason = 'content-valid' | 'content-not-inspected' | 'content-inconclusive' | 'empty-structured-file' | 'signature-mismatch' | 'invalid-package' | 'missing-package-part' | 'unsupported-extension';
4
4
  export interface FileViewerPrecheckOptions {
5
- /** Filename used when a Blob or ArrayBuffer has no name. */
6
5
  filename?: string;
7
- /** Explicit extension, with or without a leading dot. */
8
6
  type?: string;
9
- /** Restricts the result to the renderers installed by the host application. */
10
7
  supportedExtensions?: Iterable<string>;
11
- /** Maximum ZIP central-directory bytes read from a Blob. Defaults to 8 MiB. */
12
8
  maxPackageMetadataBytes?: number;
13
9
  }
14
10
  export interface FileViewerPrecheckResult {
@@ -17,7 +13,6 @@ export interface FileViewerPrecheckResult {
17
13
  rendererId: string | null;
18
14
  supported: boolean;
19
15
  inspected: boolean;
20
- /** `null` means the extension is supported but no structural validator exists. */
21
16
  valid: boolean | null;
22
17
  previewable: boolean;
23
18
  status: FileViewerPrecheckStatus;
@@ -25,12 +20,5 @@ export interface FileViewerPrecheckResult {
25
20
  missingParts: string[];
26
21
  }
27
22
  type FileViewerPrecheckInput = FileViewerSource | FileViewerFileRef;
28
- /**
29
- * Performs a cheap, renderer-free capability and structure check.
30
- *
31
- * This intentionally does not promise rendering fidelity. A `ready` result
32
- * means the extension is available and any known container/signature checks
33
- * passed; the real renderer remains the final authority for malformed content.
34
- */
35
23
  export declare const precheckFileViewerSource: (input: FileViewerPrecheckInput, options?: FileViewerPrecheckOptions) => Promise<FileViewerPrecheckResult>;
36
24
  export {};
@@ -1,5 +1,5 @@
1
- import { DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS } from '../registry/formats.js';
2
- import { getExtension, normalizeFileExtension, normalizeFilename, normalizeSource, } from './index.js';
1
+ import { DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS } from "../registry/formats.js";
2
+ import { getExtension, normalizeFileExtension, normalizeFilename, normalizeSource, } from "./index.js";
3
3
  const DEFAULT_MAX_PACKAGE_METADATA_BYTES = 8 * 1024 * 1024;
4
4
  const ZIP_LOCAL_SIGNATURE = 0x04034b50;
5
5
  const ZIP_CENTRAL_SIGNATURE = 0x02014b50;
@@ -203,13 +203,6 @@ const inspectStructuredContent = async (source, extension, maxPackageMetadataByt
203
203
  }
204
204
  return { inspected: false, valid: null, reason: 'content-not-inspected' };
205
205
  };
206
- /**
207
- * Performs a cheap, renderer-free capability and structure check.
208
- *
209
- * This intentionally does not promise rendering fidelity. A `ready` result
210
- * means the extension is available and any known container/signature checks
211
- * passed; the real renderer remains the final authority for malformed content.
212
- */
213
206
  export const precheckFileViewerSource = async (input, options = {}) => {
214
207
  var _a;
215
208
  const source = toSource(input, options);
@@ -1,15 +1,6 @@
1
- /**
2
- * Single-byte legacy encodings supported by the browser TextDecoder API.
3
- * Each byte decodes to one UTF-16 code unit, so the virtual
4
- * large-text renderer can slice them at any byte offset.
5
- */
6
1
  export type FileViewerSingleByteTextEncoding = 'iso-8859-1' | 'iso-8859-2' | 'iso-8859-15' | 'windows-1250' | 'windows-1251' | 'windows-1252';
7
2
  export type FileViewerTextEncoding = 'auto' | 'utf-8' | 'utf-16le' | 'utf-16be' | 'gbk' | 'gb18030' | FileViewerSingleByteTextEncoding;
8
3
  export type ResolvedFileViewerTextEncoding = Exclude<FileViewerTextEncoding, 'auto' | 'gbk'>;
9
- /**
10
- * Encoding used by `auto` when the bytes carry no BOM, do not look like
11
- * UTF-16, and are not valid UTF-8. GB18030 keeps the historical behavior.
12
- */
13
4
  export declare const DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING: ResolvedFileViewerTextEncoding;
14
5
  export declare const isSingleByteFileViewerTextEncoding: (encoding: string | undefined) => encoding is FileViewerSingleByteTextEncoding;
15
6
  export interface DecodedFileViewerText {
@@ -21,15 +12,6 @@ export interface ResolvedFileViewerTextSource {
21
12
  bomLength: number;
22
13
  }
23
14
  export declare const isValidFileViewerUtf8: (bytes: Uint8Array) => boolean;
24
- /**
25
- * Picks the decoder for a text buffer.
26
- *
27
- * `encoding` other than `auto` is used as-is. In `auto` mode the order is:
28
- * BOM, UTF-16 byte structure, strict UTF-8, then `fallbackEncoding`. The
29
- * fallback defaults to GB18030; pass `windows-1252`, `windows-1251`, or
30
- * another supported label for Latin, Cyrillic, or Central European legacy
31
- * files, which are otherwise misread as CJK text.
32
- */
33
15
  export declare const resolveFileViewerTextEncoding: (bytes: Uint8Array, encoding?: FileViewerTextEncoding | string, fallbackEncoding?: FileViewerTextEncoding | string) => ResolvedFileViewerTextSource;
34
16
  export declare const createFileViewerTextDecoder: (encoding: ResolvedFileViewerTextEncoding) => TextDecoder;
35
17
  export declare const decodeFileViewerTextBuffer: (data: ArrayBuffer, encoding?: FileViewerTextEncoding | string, fallbackEncoding?: FileViewerTextEncoding | string) => DecodedFileViewerText;
@@ -1,7 +1,3 @@
1
- /**
2
- * Encoding used by `auto` when the bytes carry no BOM, do not look like
3
- * UTF-16, and are not valid UTF-8. GB18030 keeps the historical behavior.
4
- */
5
1
  export const DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING = 'gb18030';
6
2
  const SINGLE_BYTE_ENCODING_ALIASES = new Map([
7
3
  ['iso-8859-1', 'iso-8859-1'],
@@ -76,8 +72,6 @@ const normalizeFallbackEncoding = (fallbackEncoding) => {
76
72
  const isContinuationByte = (value) => {
77
73
  return value !== undefined && value >= 0x80 && value <= 0xbf;
78
74
  };
79
- // Validate bytes directly because older WebViews can accept the fatal option
80
- // while still replacing malformed input. That would hide the GB18030 fallback.
81
75
  export const isValidFileViewerUtf8 = (bytes) => {
82
76
  for (let index = 0; index < bytes.length;) {
83
77
  const first = bytes[index];
@@ -158,15 +152,6 @@ const inferBomlessUtf16 = (bytes) => {
158
152
  }
159
153
  return null;
160
154
  };
161
- /**
162
- * Picks the decoder for a text buffer.
163
- *
164
- * `encoding` other than `auto` is used as-is. In `auto` mode the order is:
165
- * BOM, UTF-16 byte structure, strict UTF-8, then `fallbackEncoding`. The
166
- * fallback defaults to GB18030; pass `windows-1252`, `windows-1251`, or
167
- * another supported label for Latin, Cyrillic, or Central European legacy
168
- * files, which are otherwise misread as CJK text.
169
- */
170
155
  export const resolveFileViewerTextEncoding = (bytes, encoding = 'auto', fallbackEncoding = DEFAULT_FILE_VIEWER_TEXT_FALLBACK_ENCODING) => {
171
156
  const normalized = normalizeEncoding(encoding);
172
157
  if (normalized !== 'auto') {
@@ -1,4 +1,4 @@
1
- import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from '../contracts/types.js';
1
+ import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from "../contracts/types.js";
2
2
  export interface CreateViewerOptions {
3
3
  registry?: RendererRegistry;
4
4
  options?: FileViewerOptions;
@@ -1,26 +1,20 @@
1
- // Imperative viewer composition root.
2
- //
3
- // `createViewer` wires source normalization, lifecycle hooks, renderer
4
- // sessions, document features, watermarking, and public operations into a
5
- // framework-neutral controller. Framework packages should wrap this API instead
6
- // of reimplementing the orchestration.
7
- import { createEmptyFileViewerSearchState, } from '../features/document/model.js';
8
- import { createFileViewerDocumentFeatureControllerActionHandlers, } from '../features/document/events.js';
9
- import { createFileViewerZoomController } from '../features/document/zoom.js';
10
- import { createFileViewerViewStateController } from '../features/document/viewState.js';
11
- import { createFileViewerFitController, hasFileViewerExplicitInitialViewState, } from '../features/document/fit.js';
12
- 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';
13
- import { openFileViewerPrintMaskDesignerAsync } from '../features/printMaskLoader.js';
14
- import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from '../registry/capabilities.js';
15
- import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from '../lifecycle/operations.js';
16
- import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, resolveFileViewerRendererDefinition, } from '../registry/registry.js';
17
- import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderSurface, removeFileViewerRenderTarget, syncFileViewerRenderSurfaceBackground, } from '../rendering/handler.js';
18
- import { createFileViewerCoreRendererRegistry } from '../renderers/index.js';
19
- import { createFileViewerRequestScope } from '../source/loading.js';
20
- import { normalizeSource } from '../source/index.js';
21
- import { buildFileViewerWatermarkInlineStyle } from '../features/watermark.js';
22
- import { createFileViewerSnapshotDownload } from '../output/snapshotDownload.js';
23
- import { createFileViewerErrorState, createFileViewerUnsupportedState } from './state.js';
1
+ import { createEmptyFileViewerSearchState, } from "../features/document/model.js";
2
+ import { createFileViewerDocumentFeatureControllerActionHandlers, } from "../features/document/events.js";
3
+ import { createFileViewerZoomController } from "../features/document/zoom.js";
4
+ import { createFileViewerViewStateController } from "../features/document/viewState.js";
5
+ import { createFileViewerFitController, hasFileViewerExplicitInitialViewState, } from "../features/document/fit.js";
6
+ 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";
7
+ import { openFileViewerPrintMaskDesignerAsync } from "../features/printMaskLoader.js";
8
+ import { applyFileViewerZoomAvailability, createUnsupportedAvailability, getRendererAvailability, } from "../registry/capabilities.js";
9
+ import { buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, runFileViewerBeforeOperation, runFileViewerLifecycleHook, } from "../lifecycle/operations.js";
10
+ import { collectFileViewerRendererPlugins, createRendererRegistry, getFileViewerAutoRendererPresetVersion, hasFileViewerRendererPresetName, installFileViewerRendererPlugins, listFileViewerAutoRendererPresets, resolveFileViewerRendererPresetInputs, resolveFileViewerRendererDefinition, } from "../registry/registry.js";
11
+ import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, createFileViewerRenderSurfaceState, createFileViewerRenderSurface, removeFileViewerRenderTarget, syncFileViewerRenderSurfaceBackground, } from "../rendering/handler.js";
12
+ import { createFileViewerCoreRendererRegistry } from "../renderers/index.js";
13
+ import { createFileViewerRequestScope } from "../source/loading.js";
14
+ import { normalizeSource } from "../source/index.js";
15
+ import { buildFileViewerWatermarkInlineStyle } from "../features/watermark.js";
16
+ import { createFileViewerSnapshotDownload } from "../output/snapshotDownload.js";
17
+ import { createFileViewerErrorState, createFileViewerUnsupportedState } from "./state.js";
24
18
  const emitLifecycle = async (options, onEvent, phase, source, version, startedAt, reason) => {
25
19
  const now = Date.now();
26
20
  const context = buildFileViewerLifecycleContextFromNormalizedSource({
@@ -390,9 +384,6 @@ export const createViewer = (container, createOptions = {}) => {
390
384
  registry,
391
385
  options: {
392
386
  ...inheritedOptions,
393
- // The parent already resolved its renderer assembly into `registry`.
394
- // Reuse that exact registry without reinstalling presets or mutating a
395
- // shared registry while an attachment is open.
396
387
  autoRenderers: false,
397
388
  rendererMode: 'extend',
398
389
  renderers: undefined,
@@ -686,8 +677,6 @@ export const createViewer = (container, createOptions = {}) => {
686
677
  zoomController.refreshProvider();
687
678
  viewStateController.refreshProvider();
688
679
  const finishStaleLoad = async () => {
689
- // unload/replace may already have disposed this session. Clear only
690
- // the session still owned by this load, preserving a replacement.
691
680
  if (renderSurfaceState.session === session && currentRenderTarget === targetHost) {
692
681
  await destroyCurrent('replace');
693
682
  }
@@ -1,5 +1,5 @@
1
- import { type FileViewerI18nInput } from '../i18n/messages.js';
2
- import type { FileViewerStateTheme } from '../contracts/types.js';
1
+ import { type FileViewerI18nInput } from "../i18n/messages.js";
2
+ import type { FileViewerStateTheme } from "../contracts/types.js";
3
3
  export type FileViewerLoadingTheme = FileViewerStateTheme;
4
4
  export interface FileViewerLoadingState {
5
5
  loading: boolean;
@@ -51,8 +51,4 @@ export declare const syncFileViewerLoadingControllerState: <Target extends Mutab
51
51
  export declare const runFileViewerLoadingControllerAction: <Target extends MutableFileViewerLoadingState>(target: Target, action: () => FileViewerLoadingState) => Target;
52
52
  export declare const runFileViewerLoadingExtensionSync: <Target extends MutableFileViewerLoadingState>({ target, controller, extension, }: RunFileViewerLoadingExtensionSyncInput<Target>) => Target;
53
53
  export declare const createFileViewerLoadingControllerActionHandlers: <Target extends MutableFileViewerLoadingState>(target: Target, controller: FileViewerLoadingController) => FileViewerLoadingControllerActionHandlers;
54
- /**
55
- * 统一管理加载、错误、文案和主题色。
56
- * wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
57
- */
58
54
  export declare const createFileViewerLoadingController: (extend?: string, initialI18n?: FileViewerI18nInput) => FileViewerLoadingController;
@@ -1,4 +1,4 @@
1
- import { translateFileViewerMessage, } from '../i18n/messages.js';
1
+ import { translateFileViewerMessage, } from "../i18n/messages.js";
2
2
  export const FALLBACK_FILE_VIEWER_LOADING_THEME = {
3
3
  accent: '#5f6f82',
4
4
  soft: 'rgba(95, 111, 130, 0.12)',
@@ -418,10 +418,6 @@ const FILE_VIEWER_LOADING_COPY_KEYS = {
418
418
  flac: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
419
419
  weba: { label: 'loading.audio.label', hint: 'loading.audio.hint' },
420
420
  };
421
- /**
422
- * 根据扩展名返回统一的加载主题。
423
- * 这样不同预览器可以复用同一套视觉语义,避免颜色、图标和文案各写一份。
424
- */
425
421
  const localizeFileViewerLoadingTheme = (theme, extend = '', i18n) => {
426
422
  const normalized = extend.trim().toLowerCase();
427
423
  const keys = FILE_VIEWER_LOADING_COPY_KEYS[normalized] || {
@@ -511,10 +507,6 @@ export const createFileViewerLoadingControllerActionHandlers = (target, controll
511
507
  },
512
508
  };
513
509
  };
514
- /**
515
- * 统一管理加载、错误、文案和主题色。
516
- * wrapper 只负责把这个加载状态映射到各自框架的响应式系统。
517
- */
518
510
  export const createFileViewerLoadingController = (extend = '', initialI18n) => {
519
511
  let currentExtend = extend;
520
512
  let currentI18n = initialI18n;
@@ -1,6 +1,6 @@
1
- import type { FileViewerErrorMessageFormatter } from './state.js';
2
- import { type FileViewerI18nInput } from '../i18n/messages.js';
3
- import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from '../contracts/types.js';
1
+ import type { FileViewerErrorMessageFormatter } from "./state.js";
2
+ import { type FileViewerI18nInput } from "../i18n/messages.js";
3
+ import type { FileRenderExportAdapter, FileViewerDownloadOptions, FileViewerExportHtmlOptions, FileViewerOperationType, FileViewerPrintOptions, NormalizedFileViewerSource } from "../contracts/types.js";
4
4
  export interface FileViewerOriginalSourceState {
5
5
  buffer?: ArrayBuffer | null;
6
6
  file?: File | Blob | null;