@file-viewer/core 2.2.3 → 2.2.5

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,11 +1,15 @@
1
1
  import { createFileViewerTranslator } from '../i18n/messages.js';
2
- import { normalizeFileViewerPrintMaskRegion } from './printMask.js';
2
+ import { normalizeFileViewerPrintMaskRegion, normalizeFileViewerPrintStamp, } from './printMask.js';
3
3
  const DESIGNER_STYLE = `
4
4
  .fv-print-mask-layer{position:absolute;inset:0;z-index:2147483000;pointer-events:none;}
5
5
  .fv-print-mask-canvas{position:absolute;inset:0;z-index:2147483000;pointer-events:none;cursor:default;}
6
6
  .fv-print-mask-canvas.is-armed{pointer-events:auto;cursor:crosshair;touch-action:none;}
7
7
  .fv-print-mask-block{position:absolute;background:#000;box-sizing:border-box;pointer-events:auto;}
8
8
  .fv-print-mask-block-remove{position:absolute;right:-8px;top:-8px;width:18px;height:18px;border:0;border-radius:999px;background:#111;color:#fff;font:700 12px/18px system-ui,sans-serif;cursor:pointer;padding:0;}
9
+ .fv-print-stamp{position:absolute;box-sizing:border-box;border:1px dashed rgba(22,119,76,.7);border-radius:4px;pointer-events:auto;touch-action:none;cursor:move;transform-origin:center center;}
10
+ .fv-print-stamp img{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none;user-select:none;}
11
+ .fv-print-stamp-resize{position:absolute;right:-7px;bottom:-7px;width:15px;height:15px;border:2px solid #fff;border-radius:4px;background:#16774c;box-shadow:0 1px 5px rgba(15,23,42,.22);cursor:nwse-resize;touch-action:none;}
12
+ .fv-print-stamp-input{display:none!important;}
9
13
  .fv-print-mask-toolbar{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);z-index:2147483001;display:inline-flex;align-items:center;gap:6px;padding:6px 8px;border:1px solid rgba(20,35,53,.12);border-radius:999px;background:rgba(255,255,255,.94);box-shadow:0 12px 28px rgba(15,23,42,.16);pointer-events:auto;max-width:calc(100% - 24px);flex-wrap:wrap;justify-content:center;}
10
14
  .fv-print-mask-toolbar span{font:600 12px/1.2 system-ui,sans-serif;color:#40546a;white-space:nowrap;}
11
15
  .fv-print-mask-toolbar button{min-width:42px;height:30px;padding:0 10px;border:0;border-radius:999px;background:transparent;color:#40546a;font:800 12px/1 system-ui,sans-serif;cursor:pointer;}
@@ -52,6 +56,24 @@ const visibleArea = (element, viewport) => {
52
56
  const height = Math.max(0, Math.min(rect.bottom, viewport.bottom) - Math.max(rect.top, viewport.top));
53
57
  return width * height;
54
58
  };
59
+ const MAX_PRINT_STAMP_BYTES = 10 * 1024 * 1024;
60
+ const readStampFileAsDataUrl = (file, windowRef) => new Promise((resolve, reject) => {
61
+ if (!/^image\/(?:png|jpe?g|webp|gif|svg\+xml)$/i.test(file.type) || file.size > MAX_PRINT_STAMP_BYTES) {
62
+ reject(new Error('Unsupported print stamp image'));
63
+ return;
64
+ }
65
+ const Reader = (windowRef === null || windowRef === void 0 ? void 0 : windowRef.FileReader) || globalThis.FileReader;
66
+ const reader = new Reader();
67
+ reader.addEventListener('load', () => {
68
+ if (typeof reader.result === 'string' && reader.result.startsWith('data:image/')) {
69
+ resolve(reader.result);
70
+ return;
71
+ }
72
+ reject(new Error('Invalid print stamp image'));
73
+ });
74
+ reader.addEventListener('error', () => reject(reader.error || new Error('Failed to read print stamp image')));
75
+ reader.readAsDataURL(file);
76
+ });
55
77
  /**
56
78
  * Opens a page-aware print-mask designer. Browsing remains the default mode;
57
79
  * drawing is armed for the currently visible page only and disarms after one block.
@@ -64,6 +86,9 @@ export const openFileViewerPrintMaskDesigner = (options) => {
64
86
  const regions = [...(options.initialRegions || [])]
65
87
  .map(region => normalizeFileViewerPrintMaskRegion(region))
66
88
  .filter((region) => !!region);
89
+ const stamps = [...(options.initialStamps || [])]
90
+ .map(stamp => normalizeFileViewerPrintStamp(stamp))
91
+ .filter((stamp) => !!stamp);
67
92
  const providedPages = Array.from(new Set(options.pages || []))
68
93
  .filter(page => page === root || root.contains(page));
69
94
  const pageScoped = providedPages.length > 0;
@@ -104,7 +129,8 @@ export const openFileViewerPrintMaskDesigner = (options) => {
104
129
  const surfaces = pageElements.map((element, index) => (createSurface(element, pageScoped ? index : undefined)));
105
130
  const legacySurface = pageScoped &&
106
131
  !surfaces.some(surface => surface.element === root) &&
107
- regions.some(region => region.pageIndex === undefined)
132
+ (regions.some(region => region.pageIndex === undefined) ||
133
+ stamps.some(stamp => stamp.pageIndex === undefined))
108
134
  ? createSurface(root)
109
135
  : null;
110
136
  const allSurfaces = legacySurface ? [...surfaces, legacySurface] : surfaces;
@@ -117,6 +143,14 @@ export const openFileViewerPrintMaskDesigner = (options) => {
117
143
  const addButton = documentRef.createElement('button');
118
144
  addButton.type = 'button';
119
145
  addButton.textContent = t('toolbar.printMaskAdd');
146
+ const stampInput = documentRef.createElement('input');
147
+ stampInput.type = 'file';
148
+ stampInput.accept = 'image/png,image/jpeg,image/webp,image/gif,image/svg+xml';
149
+ stampInput.className = 'fv-print-stamp-input';
150
+ stampInput.setAttribute('data-viewer-print-stamp-input', 'true');
151
+ const stampButton = documentRef.createElement('button');
152
+ stampButton.type = 'button';
153
+ stampButton.textContent = t('toolbar.printStampUpload');
120
154
  const clearButton = documentRef.createElement('button');
121
155
  clearButton.type = 'button';
122
156
  clearButton.textContent = t('toolbar.printMaskClear');
@@ -127,8 +161,8 @@ export const openFileViewerPrintMaskDesigner = (options) => {
127
161
  confirmButton.type = 'button';
128
162
  confirmButton.className = 'primary';
129
163
  confirmButton.textContent = t('toolbar.printMaskConfirm');
130
- toolbar.append(hint, addButton, clearButton, cancelButton, confirmButton);
131
- layer.append(toolbar);
164
+ toolbar.append(hint, addButton, stampButton, clearButton, cancelButton, confirmButton);
165
+ layer.append(stampInput, toolbar);
132
166
  root.appendChild(layer);
133
167
  const disarm = () => {
134
168
  surfaces.forEach(surface => surface.canvas.classList.remove('is-armed'));
@@ -157,16 +191,16 @@ export const openFileViewerPrintMaskDesigner = (options) => {
157
191
  }
158
192
  resolve(result);
159
193
  };
160
- const surfaceForRegion = (region) => {
161
- if (region.pageIndex === undefined) {
194
+ const surfaceForItem = (item) => {
195
+ if (item.pageIndex === undefined) {
162
196
  return legacySurface || surfaces[0];
163
197
  }
164
- return surfaces.find(surface => surface.pageIndex === region.pageIndex) || null;
198
+ return surfaces.find(surface => surface.pageIndex === item.pageIndex) || null;
165
199
  };
166
200
  const renderRegions = () => {
167
201
  allSurfaces.forEach(surface => surface.canvas.replaceChildren());
168
202
  regions.forEach((region, index) => {
169
- const surface = surfaceForRegion(region);
203
+ const surface = surfaceForItem(region);
170
204
  if (!surface) {
171
205
  return;
172
206
  }
@@ -192,6 +226,105 @@ export const openFileViewerPrintMaskDesigner = (options) => {
192
226
  block.appendChild(remove);
193
227
  surface.canvas.appendChild(block);
194
228
  });
229
+ stamps.forEach((stamp, index) => {
230
+ const surface = surfaceForItem(stamp);
231
+ if (!surface) {
232
+ return;
233
+ }
234
+ const stampElement = documentRef.createElement('div');
235
+ stampElement.className = 'fv-print-stamp';
236
+ stampElement.setAttribute('data-viewer-print-stamp', String(index));
237
+ const applyStampStyle = () => {
238
+ var _a, _b;
239
+ stampElement.style.left = `${stamp.left}%`;
240
+ stampElement.style.top = `${stamp.top}%`;
241
+ stampElement.style.width = `${stamp.width}%`;
242
+ stampElement.style.height = `${stamp.height}%`;
243
+ stampElement.style.opacity = String((_a = stamp.opacity) !== null && _a !== void 0 ? _a : 1);
244
+ stampElement.style.transform = `rotate(${(_b = stamp.rotate) !== null && _b !== void 0 ? _b : 0}deg)`;
245
+ };
246
+ applyStampStyle();
247
+ const image = documentRef.createElement('img');
248
+ image.src = stamp.src;
249
+ image.alt = stamp.alt || '';
250
+ image.draggable = false;
251
+ const remove = documentRef.createElement('button');
252
+ remove.type = 'button';
253
+ remove.className = 'fv-print-mask-block-remove';
254
+ remove.title = t('toolbar.printStampRemove');
255
+ remove.setAttribute('aria-label', t('toolbar.printStampRemove'));
256
+ remove.textContent = '−';
257
+ remove.addEventListener('pointerdown', event => event.stopPropagation());
258
+ remove.addEventListener('click', event => {
259
+ event.preventDefault();
260
+ event.stopPropagation();
261
+ stamps.splice(index, 1);
262
+ renderRegions();
263
+ });
264
+ const resize = documentRef.createElement('span');
265
+ resize.className = 'fv-print-stamp-resize';
266
+ resize.setAttribute('role', 'button');
267
+ resize.setAttribute('aria-label', t('toolbar.printStampResize'));
268
+ resize.title = t('toolbar.printStampResize');
269
+ let interaction = null;
270
+ stampElement.addEventListener('pointerdown', event => {
271
+ var _a;
272
+ if (event.button !== 0 || event.target.closest('button')) {
273
+ return;
274
+ }
275
+ event.preventDefault();
276
+ event.stopPropagation();
277
+ interaction = {
278
+ pointerId: event.pointerId,
279
+ mode: event.target === resize ? 'resize' : 'move',
280
+ startX: event.clientX,
281
+ startY: event.clientY,
282
+ left: stamp.left,
283
+ top: stamp.top,
284
+ width: stamp.width,
285
+ height: stamp.height,
286
+ };
287
+ (_a = stampElement.setPointerCapture) === null || _a === void 0 ? void 0 : _a.call(stampElement, event.pointerId);
288
+ });
289
+ stampElement.addEventListener('pointermove', event => {
290
+ if (!interaction || interaction.pointerId !== event.pointerId) {
291
+ return;
292
+ }
293
+ event.preventDefault();
294
+ const bounds = surface.canvas.getBoundingClientRect();
295
+ if (!bounds.width || !bounds.height) {
296
+ return;
297
+ }
298
+ const deltaX = ((event.clientX - interaction.startX) / bounds.width) * 100;
299
+ const deltaY = ((event.clientY - interaction.startY) / bounds.height) * 100;
300
+ if (interaction.mode === 'move') {
301
+ stamp.left = Math.max(0, Math.min(100 - stamp.width, interaction.left + deltaX));
302
+ stamp.top = Math.max(0, Math.min(100 - stamp.height, interaction.top + deltaY));
303
+ }
304
+ else {
305
+ stamp.width = Math.max(4, Math.min(100 - stamp.left, interaction.width + deltaX));
306
+ stamp.height = Math.max(4, Math.min(100 - stamp.top, interaction.height + deltaY));
307
+ }
308
+ applyStampStyle();
309
+ });
310
+ const endInteraction = (event) => {
311
+ var _a;
312
+ if (!interaction || interaction.pointerId !== event.pointerId) {
313
+ return;
314
+ }
315
+ try {
316
+ (_a = stampElement.releasePointerCapture) === null || _a === void 0 ? void 0 : _a.call(stampElement, interaction.pointerId);
317
+ }
318
+ catch {
319
+ // Pointer capture may already be released by the browser.
320
+ }
321
+ interaction = null;
322
+ };
323
+ stampElement.addEventListener('pointerup', endInteraction);
324
+ stampElement.addEventListener('pointercancel', endInteraction);
325
+ stampElement.append(image, remove, resize);
326
+ surface.canvas.appendChild(stampElement);
327
+ });
195
328
  };
196
329
  const pointFromEvent = (event, canvas) => {
197
330
  const bounds = canvas.getBoundingClientRect();
@@ -257,30 +390,70 @@ export const openFileViewerPrintMaskDesigner = (options) => {
257
390
  renderRegions();
258
391
  });
259
392
  });
260
- addButton.addEventListener('click', () => {
393
+ const getActiveSurface = () => {
261
394
  var _a;
262
- disarm();
263
395
  const viewport = root.getBoundingClientRect();
264
- const activeSurface = ((_a = surfaces
396
+ return ((_a = surfaces
265
397
  .map(surface => ({ surface, area: visibleArea(surface.element, viewport) }))
266
398
  .sort((left, right) => right.area - left.area)[0]) === null || _a === void 0 ? void 0 : _a.surface) || surfaces[0];
399
+ };
400
+ addButton.addEventListener('click', () => {
401
+ disarm();
402
+ const activeSurface = getActiveSurface();
267
403
  activeSurface === null || activeSurface === void 0 ? void 0 : activeSurface.canvas.classList.add('is-armed');
268
404
  addButton.classList.toggle('is-active', Boolean(activeSurface));
269
405
  });
406
+ stampButton.addEventListener('click', () => {
407
+ disarm();
408
+ stampInput.click();
409
+ });
410
+ stampInput.addEventListener('change', async () => {
411
+ var _a;
412
+ const file = (_a = stampInput.files) === null || _a === void 0 ? void 0 : _a[0];
413
+ stampInput.value = '';
414
+ if (!file) {
415
+ return;
416
+ }
417
+ try {
418
+ const src = await readStampFileAsDataUrl(file, documentRef.defaultView);
419
+ const activeSurface = getActiveSurface();
420
+ if (!activeSurface) {
421
+ return;
422
+ }
423
+ const stamp = normalizeFileViewerPrintStamp({
424
+ src,
425
+ alt: file.name,
426
+ left: 38,
427
+ top: 38,
428
+ width: 24,
429
+ height: 18,
430
+ pageIndex: activeSurface.pageIndex,
431
+ });
432
+ if (stamp) {
433
+ stamps.push(stamp);
434
+ renderRegions();
435
+ }
436
+ }
437
+ catch {
438
+ // Unsupported or unreadable images are ignored; the document stays untouched.
439
+ }
440
+ });
270
441
  clearButton.addEventListener('click', () => {
271
442
  regions.splice(0, regions.length);
443
+ stamps.splice(0, stamps.length);
272
444
  disarm();
273
445
  renderRegions();
274
446
  });
275
447
  cancelButton.addEventListener('click', () => finish(null));
276
448
  confirmButton.addEventListener('click', () => {
277
- if (!regions.length) {
449
+ if (!regions.length && !stamps.length) {
278
450
  finish(null);
279
451
  return;
280
452
  }
281
453
  finish({
282
454
  mask: {
283
- regions: regions.map(region => ({ ...region })),
455
+ ...(regions.length ? { regions: regions.map(region => ({ ...region })) } : {}),
456
+ ...(stamps.length ? { stamps: stamps.map(stamp => ({ ...stamp })) } : {}),
284
457
  color,
285
458
  },
286
459
  });
@@ -1,10 +1,12 @@
1
- export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_SCRIPT_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PPT_FONT_PATH, DEFAULT_FILE_VIEWER_PPT_FRAME_CACHE_PATH, DEFAULT_FILE_VIEWER_PPT_MODULE_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH, DEFAULT_FILE_VIEWER_PPT_WASM_PATH, DEFAULT_FILE_VIEWER_PPT_WORKER_PATH, DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPresentationWorkerUrl, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets';
1
+ export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_SCRIPT_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_PPT_FONT_PATH, DEFAULT_FILE_VIEWER_PPT_FRAME_CACHE_PATH, DEFAULT_FILE_VIEWER_PPT_MODULE_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_PPT_WASM_PATH, DEFAULT_FILE_VIEWER_PPT_WORKER_PATH, DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPresentationWorkerUrl, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets';
2
2
  export type { FileViewerRendererAssetDefinition, FileViewerRendererAssetKind, FileViewerRendererAssetManifest, FileViewerRendererAssetOptionPath, FileViewerRendererAssetTarget, ResolveFileViewerAssetUrlOptions, ResolveFileViewerRendererAssetsOptions, ResolvedFileViewerCadAssetUrls, ResolvedFileViewerRendererAsset, } from './assets';
3
3
  export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities';
4
4
  export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model';
5
5
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats';
6
+ export { precheckFileViewerSource } from './source/precheck';
7
+ export type { FileViewerPrecheckOptions, FileViewerPrecheckReason, FileViewerPrecheckResult, FileViewerPrecheckStatus, } from './source/precheck';
6
8
  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';
7
- export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages';
9
+ export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, FILE_VIEWER_SUPPORTED_LOCALES, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages';
8
10
  export type { FileViewerI18nInput, FileViewerResolvedLocale, ResolveFileViewerI18nInput, } from './i18n/messages';
9
11
  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
12
  export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options';
@@ -24,4 +26,4 @@ export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRI
24
26
  export type { FileViewerErrorMessageFormatter, } from './viewer/state';
25
27
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
26
28
  export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
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, FileViewerTextOptions, FileViewerResolvedThemeMode, 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';
29
+ 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, FileViewerPdfBoundingBox, FileViewerPdfBoundingBoxOrigin, FileViewerPdfBoundingBoxUnit, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintMaskOptions, FileViewerPrintMaskRegion, FileViewerPrintOptions, FileViewerPrintStamp, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerTextOptions, FileViewerResolvedThemeMode, 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
@@ -3,12 +3,13 @@
3
3
  // This barrel intentionally re-exports pure helpers, contracts, loading state,
4
4
  // lifecycle operations, and renderer registry utilities without importing any
5
5
  // framework wrapper. It is the safest entrypoint for React/Vue/Web packages.
6
- export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_SCRIPT_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_PPT_FONT_PATH, DEFAULT_FILE_VIEWER_PPT_FRAME_CACHE_PATH, DEFAULT_FILE_VIEWER_PPT_MODULE_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH, DEFAULT_FILE_VIEWER_PPT_WASM_PATH, DEFAULT_FILE_VIEWER_PPT_WORKER_PATH, DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPresentationWorkerUrl, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets.js';
6
+ export { DEFAULT_FILE_VIEWER_ARCHIVE_WORKER_PATH, DEFAULT_FILE_VIEWER_ARCHIVE_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_DWF_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_SCRIPT_PATH, DEFAULT_FILE_VIEWER_CAD_LIBREDWG_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_CAD_WASM_PATH, DEFAULT_FILE_VIEWER_CAD_WORKER_PATH, DEFAULT_FILE_VIEWER_DATA_SQL_WASM_URL, DEFAULT_FILE_VIEWER_DOCX_WORKER_JSZIP_PATH, DEFAULT_FILE_VIEWER_DOCX_WORKER_PATH, DEFAULT_FILE_VIEWER_DOCX_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_PPT_FONT_PATH, DEFAULT_FILE_VIEWER_PPT_FRAME_CACHE_PATH, DEFAULT_FILE_VIEWER_PPT_MODULE_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_PATH, DEFAULT_FILE_VIEWER_PPT_RUNTIME_VERSION, DEFAULT_FILE_VIEWER_PPT_WASM_PATH, DEFAULT_FILE_VIEWER_PPT_WORKER_PATH, DEFAULT_FILE_VIEWER_PRESENTATION_WORKER_PATH, DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS, DEFAULT_FILE_VIEWER_SPREADSHEET_WORKER_PATH, DEFAULT_FILE_VIEWER_TYPST_COMPILER_WASM_URL, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_PACKAGE_PATH, DEFAULT_FILE_VIEWER_TYPST_RENDERER_WASM_URL, getFileViewerRendererAssetManifest, listFileViewerRendererAssetManifests, resolveFileViewerArchiveWasmUrl, resolveFileViewerArchiveWorkerUrl, resolveFileViewerAssetUrl, resolveFileViewerCadAssetUrls, resolveFileViewerDataSqlWasmUrl, resolveFileViewerDocxWorkerJsZipUrl, resolveFileViewerDocxWorkerUrl, resolveFileViewerDrawioViewerScriptUrl, resolveFileViewerPresentationWorkerUrl, resolveFileViewerRendererAssets, resolveFileViewerSpreadsheetWorkerUrl, resolveFileViewerTypstCompilerWasmUrl, resolveFileViewerTypstRendererWasmUrl, } from './assets.js';
7
7
  export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, createUnsupportedAvailability, DEFAULT_OPERATION_AVAILABILITY, DOM_PRINTABLE_EXTENSIONS, getRendererAvailability, isDomPrintableExtension, isKnownNonPrintableExtension, needsDedicatedPrintAdapter, NON_PRINTABLE_EXTENSIONS, resolvePrintAvailability, } from './registry/capabilities.js';
8
8
  export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_SIZE, DEFAULT_FILE_VIEWER_ZOOM_SCALE, buildFileViewerDocumentTextChunks, createEmptyFileViewerSearchState, createFileViewerZoomState, normalizeFileViewerAiOptions, normalizeFileViewerSearchOptions, } from './features/document/model.js';
9
9
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats.js';
10
+ export { precheckFileViewerSource } from './source/precheck.js';
10
11
  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
- export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages.js';
12
+ export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, FILE_VIEWER_SUPPORTED_LOCALES, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages.js';
12
13
  export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options.js';
13
14
  export { resolveFileViewerPresentationState, } from './presentation/state.js';
14
15
  export { createRendererRegistry, } from './registry/registry.js';
@@ -1,5 +1,6 @@
1
1
  import type { FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessages, FileViewerOptions } from '../contracts/types';
2
- export type FileViewerResolvedLocale = 'zh-CN' | 'en-US';
2
+ export declare const FILE_VIEWER_SUPPORTED_LOCALES: readonly ["zh-CN", "en-US", "ja-JP"];
3
+ export type FileViewerResolvedLocale = typeof FILE_VIEWER_SUPPORTED_LOCALES[number];
3
4
  export interface ResolveFileViewerI18nInput {
4
5
  locale?: FileViewerLocale;
5
6
  messages?: FileViewerMessages;
@@ -11,9 +12,10 @@ export declare const FILE_VIEWER_FALLBACK_LOCALE: FileViewerResolvedLocale;
11
12
  export declare const FILE_VIEWER_BUILTIN_MESSAGES: Readonly<{
12
13
  'zh-CN': Record<FileViewerMessageKey, string>;
13
14
  'en-US': Record<FileViewerMessageKey, string>;
15
+ 'ja-JP': Record<FileViewerMessageKey, string>;
14
16
  }>;
15
17
  export declare const normalizeFileViewerLocale: (locale?: FileViewerLocale | null) => FileViewerResolvedLocale;
16
- export declare const resolveFileViewerLocale: (input?: FileViewerI18nInput) => FileViewerResolvedLocale;
18
+ export declare const resolveFileViewerLocale: (input?: FileViewerI18nInput) => "zh-CN" | "en-US" | "ja-JP";
17
19
  export declare const formatFileViewerMessage: (message: string, params?: FileViewerMessageParams) => string;
18
20
  export declare const translateFileViewerMessage: (input: FileViewerI18nInput, key: FileViewerMessageKey, params?: FileViewerMessageParams) => string;
19
21
  export declare const createFileViewerTranslator: (input?: FileViewerI18nInput) => (key: FileViewerMessageKey, params?: FileViewerMessageParams) => string;
@@ -0,0 +1,7 @@
1
+ import type { FileViewerMessageKey } from '../contracts/types';
2
+ /**
3
+ * Built-in Japanese messages for every runtime viewer state and renderer.
4
+ * Keep placeholders such as {count}, {name}, and {type} aligned with the
5
+ * Chinese and English catalogs; scripts/verify-japanese-i18n.mjs enforces it.
6
+ */
7
+ export declare const JA_JP_MESSAGES: Record<FileViewerMessageKey, string>;