@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.
package/README.en.md CHANGED
@@ -14,6 +14,23 @@ Current framework-neutral browser renderers still inside core are limited to the
14
14
  npm install @file-viewer/core
15
15
  ```
16
16
 
17
+ ## Preflight Before Rendering
18
+
19
+ `precheckFileViewerSource()` does not create a viewer or load a heavy renderer. It checks whether the extension is available and validates known PDF, OpenXML / OpenDocument, legacy OLE Office, and RTF signatures or package parts. `valid: null` explicitly means capability-only detection, not a full parse; the real renderer remains the final authority for malformed content.
20
+
21
+ ```ts
22
+ import { precheckFileViewerSource } from '@file-viewer/core/headless'
23
+
24
+ const result = await precheckFileViewerSource(file, {
25
+ // Restrict this to the extensions actually installed by this product.
26
+ supportedExtensions: ['pdf', 'docx', 'xlsx', 'pptx']
27
+ })
28
+
29
+ if (!result.previewable) {
30
+ console.warn(result.reason, result.missingParts)
31
+ }
32
+ ```
33
+
17
34
  ## Entry points
18
35
 
19
36
  Use `@file-viewer/core/headless` when a component package, server-side helper, or build script only needs framework-neutral contracts: format support, source normalization, renderer capability metadata, lifecycle/operation context, option normalization, state helpers, and static asset resolution. This entry intentionally does not expose the DOM viewer engine or browser renderers.
package/README.md CHANGED
@@ -14,6 +14,23 @@ Current framework-neutral browser renderers still inside core are limited to the
14
14
  npm install @file-viewer/core
15
15
  ```
16
16
 
17
+ ## 渲染前预检
18
+
19
+ `precheckFileViewerSource()` 不会创建 viewer,也不会加载重型 renderer。它先检查当前扩展名是否在能力范围内,并对 PDF、OpenXML / OpenDocument、旧版 OLE Office、RTF 等格式执行签名或包结构检查。`valid: null` 明确表示该格式只有能力检查、没有做完整解析;真实 renderer 仍是畸形文件的最终判断者。
20
+
21
+ ```ts
22
+ import { precheckFileViewerSource } from '@file-viewer/core/headless'
23
+
24
+ const result = await precheckFileViewerSource(file, {
25
+ // 可传当前产品实际安装的扩展名列表,避免把未装 preset 的格式报成可预览
26
+ supportedExtensions: ['pdf', 'docx', 'xlsx', 'pptx']
27
+ })
28
+
29
+ if (!result.previewable) {
30
+ console.warn(result.reason, result.missingParts)
31
+ }
32
+ ```
33
+
17
34
  ## Entry points
18
35
 
19
36
  Use `@file-viewer/core/headless` when a component package, server-side helper or build script only needs framework-neutral contracts: format support, source normalization, renderer capability metadata, lifecycle/operation context, option normalization, state helpers and static asset resolution. This entry intentionally does not expose the DOM viewer engine or browser renderers.
@@ -462,9 +462,9 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
462
462
  const options = currentOptions.options || {};
463
463
  const toolbar = normalizeFileViewerToolbar(options);
464
464
  const availability = getToolbarAvailability();
465
- const visibleToolbar = resolveVisibleFileViewerToolbar(toolbar, availability);
466
465
  const showSearchToolbar = isSearchToolbarVisible(toolbar, options);
467
- const showToolbar = hasVisibleFileViewerToolbarActions(visibleToolbar) || showSearchToolbar;
466
+ const visibleToolbar = resolveVisibleFileViewerToolbar(toolbar, availability, showSearchToolbar);
467
+ const showToolbar = hasVisibleFileViewerToolbarActions(visibleToolbar);
468
468
  const toolbarPosition = resolveFileViewerToolbarPosition(options, getCurrentExtension());
469
469
  const toolbarDisabled = state.loading || !!state.error;
470
470
  const zoomState = getToolbarZoomState();
@@ -1,9 +1,9 @@
1
1
  export type FileViewerSourceKind = 'file' | 'url' | 'buffer' | 'empty';
2
2
  export type FileViewerThemeMode = 'light' | 'dark' | 'system';
3
3
  export type FileViewerResolvedThemeMode = Exclude<FileViewerThemeMode, 'system'>;
4
- export type FileViewerLocale = 'auto' | 'zh-CN' | 'en-US' | (string & {});
4
+ export type FileViewerLocale = 'auto' | 'zh-CN' | 'en-US' | 'ja-JP' | (string & {});
5
5
  export type FileViewerStyleIsolation = 'auto' | 'shadow' | 'scoped' | 'none';
6
- export type FileViewerMessageKey = 'toolbar.zoomGroup' | 'toolbar.zoomOut' | 'toolbar.zoomIn' | 'toolbar.zoomReset' | 'toolbar.download' | 'toolbar.downloadTitle' | 'toolbar.print' | 'toolbar.printTitle' | 'toolbar.printDirect' | 'toolbar.printMask' | 'toolbar.printMaskTitle' | 'toolbar.printMaskAdd' | 'toolbar.printMaskClear' | 'toolbar.printMaskCancel' | 'toolbar.printMaskConfirm' | 'toolbar.printMaskHint' | 'toolbar.exportHtml' | 'toolbar.exportHtmlTitle' | 'toolbar.search' | 'toolbar.searchPlaceholder' | 'toolbar.searchPrevious' | 'toolbar.searchNext' | 'toolbar.searchClear' | 'toolbar.theme' | 'toolbar.themeToLight' | 'toolbar.themeToDark' | 'state.ready.title' | 'state.ready.message' | 'state.empty.title' | 'state.empty.message' | 'state.unsupported.install.title' | 'state.unsupported.install.message' | 'state.unsupported.install.description' | 'state.unsupported.title' | 'state.unsupported.message' | 'state.unsupported.description' | 'state.error.title' | 'preview.downloading' | 'preview.streamingPdf' | 'preview.reading' | 'error.download' | 'error.print' | 'error.exportHtml' | 'error.noDownloadSource' | 'error.noExportContent' | 'error.printUnavailable' | 'error.printWindowBlocked' | 'error.remoteDownload' | 'error.localRead' | 'error.load' | 'error.stream' | 'error.beforeOperation' | 'error.unknown' | 'error.blobUnavailable' | 'error.sourceUnsupported' | 'error.fileReadArrayBuffer' | 'error.fileReadDataUrl' | 'error.fileReadText' | 'error.imageDataUrlRead' | 'operation.download' | 'operation.print' | 'operation.exportHtml' | 'operation.zoomIn' | 'operation.zoomOut' | 'operation.zoomReset' | 'pdf.toolbar.toggleNavigation' | 'pdf.toolbar.previousPage' | 'pdf.toolbar.nextPage' | 'pdf.toolbar.fitWidth' | 'pdf.toolbar.zoomOut' | 'pdf.toolbar.zoomIn' | 'pdf.toolbar.rotateLeft' | 'pdf.toolbar.rotateRight' | 'pdf.nav.typeLabel' | 'pdf.nav.pagesTab' | 'pdf.nav.outlineTab' | 'pdf.nav.pagesTitle' | 'pdf.nav.outlineTitle' | 'pdf.nav.pageCount' | 'pdf.nav.itemCount' | 'pdf.nav.pageLabel' | 'pdf.nav.outlineEmpty' | 'pdf.nav.outlineFallbackTitle' | 'pdf.thumbnail.alt' | 'pdf.state.loading' | 'pdf.error.browserWindow' | 'pdf.error.missingSource' | 'pdf.error.loadFailed' | 'pdf.error.notLoaded' | 'pdf.error.unloaded' | 'pdf.error.canvasUnavailable' | 'pdf.export.pageTitle' | 'spreadsheet.loading.kicker' | 'spreadsheet.loading.title' | 'spreadsheet.loading.hint' | 'spreadsheet.loading.streaming' | 'spreadsheet.tabs.ariaLabel' | 'spreadsheet.state.parsingWorkbook' | 'spreadsheet.state.preparingSheet' | 'spreadsheet.state.preparingSheetNamed' | 'spreadsheet.state.cachedRows' | 'spreadsheet.state.rows' | 'spreadsheet.state.rowsAndColumns' | 'spreadsheet.error.parseFailed' | 'spreadsheet.error.workerFailed' | 'word.error.invalidDocx' | 'word.error.missingOdfContent' | 'word.error.odfXmlParseFailed' | 'word.title.rtf' | 'word.title.openDocumentPresentation' | 'word.title.openDocumentText' | 'word.page.fallback' | 'word.page.empty' | 'word.body' | 'word.body.empty' | 'ofd.state.loading' | 'ofd.error.empty' | 'ofd.error.parseFailed' | 'presentation.state.loading' | 'presentation.error.title' | 'presentation.error.parseFailed' | 'presentation.ppt.state.loading' | 'presentation.ppt.error.title' | 'presentation.ppt.error.parseFailed' | 'presentation.ppt.error.assetHint' | 'archive.error.nestedUnsupported' | 'archive.loading.readingDirectory' | 'archive.loading.readingDirectoryHint' | 'archive.search.placeholder' | 'archive.sidebar.hide' | 'archive.sidebar.show' | 'archive.preview.title' | 'archive.preview.chooseFile' | 'archive.preview.downloadFile' | 'archive.error.title' | 'archive.stats.summary' | 'archive.warning.encrypted' | 'archive.password.title' | 'archive.password.description' | 'archive.password.placeholder' | 'archive.password.invalid' | 'archive.password.required' | 'archive.password.cancel' | 'archive.password.confirm' | 'archive.error.passwordRequired' | 'archive.error.encryptedRequiresWorker' | 'archive.empty.title' | 'archive.empty.message' | 'archive.loading.initializingCandidate' | 'archive.loading.initializingCandidateHint' | 'archive.error.candidateInitTimeout' | 'archive.error.encryptedCheckTimeout' | 'archive.loading.directoryReadyHint' | 'archive.error.candidateReadTimeout' | 'archive.loading.workerFallback' | 'archive.loading.workerFallbackHint' | 'archive.notice.workerFallback' | 'archive.error.tooLarge' | 'archive.loading.initializingWorker' | 'archive.loading.initializingWorkerHint' | 'archive.error.workerInitFailed' | 'archive.error.workerUnsupported' | 'archive.error.indexedDbUnavailable' | 'archive.error.entryTooLarge' | 'archive.loading.extracting' | 'archive.loading.rendering' | 'archive.loading.exporting' | 'media.audio.title' | 'media.audio.description' | 'media.audio.unsupported' | 'media.video.title' | 'media.video.unsupported' | 'media.video.hlsHint' | 'media.midi.title' | 'media.midi.loading' | 'media.midi.trackHeader' | 'media.midi.instrumentHeader' | 'media.midi.channelHeader' | 'media.midi.noteCountHeader' | 'media.midi.durationHeader' | 'media.midi.durationStat' | 'media.midi.trackStat' | 'media.midi.noteStat' | 'media.midi.parseFailed' | 'email.mbox.subject' | 'email.mbox.summary' | 'email.error.title' | 'email.meta.from' | 'email.meta.to' | 'email.meta.cc' | 'email.meta.date' | 'email.tabs.text' | 'email.tabs.headers' | 'email.attachments.title' | 'email.attachments.empty' | 'email.attachments.download' | 'email.attachments.opening' | 'email.attachments.nestedUnavailable' | 'email.loading.parsing' | 'data.font.sample' | 'data.error.fontFaceUnsupported' | 'data.title.font' | 'data.title.sqlite' | 'data.title.parquet' | 'data.title.avro' | 'data.title.wasm' | 'data.title.eps' | 'data.title.ai' | 'data.title.webarchive' | 'data.title.summary' | 'data.label.format' | 'data.label.size' | 'data.label.rendering' | 'data.label.objects' | 'data.label.sampleTable' | 'data.label.rows' | 'data.label.columns' | 'data.label.sampleRows' | 'data.label.imports' | 'data.label.exports' | 'data.label.magic' | 'data.label.note' | 'data.label.container' | 'data.value.schemaRead' | 'data.value.schemaUnread' | 'data.note.aiSummary' | 'data.note.postscriptSummary' | 'data.note.webarchive' | 'data.image.alt' | 'psd.title' | 'psd.action.fit' | 'psd.action.showAll' | 'psd.action.hideAll' | 'psd.layers.title' | 'psd.layers.redrawable' | 'psd.layers.empty' | 'psd.layers.hidden' | 'drawing.error.viewerLoadFailed' | 'drawing.error.excalidrawEmpty' | 'drawing.error.excalidrawTimeout' | 'drawing.error.drawioParseFailed' | 'drawing.error.drawioNoModel' | 'drawing.error.drawioNoElements' | 'drawing.error.viewerInitFailed' | 'drawing.error.drawioTimeout' | 'drawing.error.svgParseFailed' | 'drawing.error.plantumlRenderFailed' | 'drawing.title.excalidraw' | 'drawing.title.mermaid' | 'drawing.title.plantuml' | 'drawing.title.drawio' | 'drawing.toolbar.zoomOut' | 'drawing.toolbar.zoomIn' | 'drawing.toolbar.fit' | 'drawing.toolbar.fitWidth' | 'drawing.state.loading' | 'text.code.loadingHighlight' | 'text.code.indexingLargeFile' | 'text.code.virtualized' | 'text.code.firstSegment' | 'text.code.previousSegment' | 'text.code.nextSegment' | 'text.code.lastSegment' | 'ebook.toc' | 'ebook.reading' | 'ebook.itemCount' | 'epub.title' | 'epub.previousPage' | 'epub.nextPage' | 'epub.loading' | 'epub.chapterFallback' | 'epub.renderIncomplete' | 'umd.title' | 'umd.previousChapter' | 'umd.nextChapter' | 'umd.loading' | 'umd.emptyContent' | 'umd.chapterFallback' | 'umd.galleryFallback' | 'umd.warningBodyTooShort' | 'umd.error.unexpectedEnd' | 'umd.error.invalidFile' | 'typst.summaryRenderer' | 'typst.pageSummary.empty' | 'typst.pageSummary.ready' | 'typst.status.compiling' | 'typst.status.failed' | 'typst.status.rendered' | 'typst.loading.title' | 'typst.loading.hint' | 'typst.error.title' | 'typst.error.timeout' | 'typst.error.timeoutHint' | 'typst.error.assetHint' | 'typst.error.svgParseFailed' | 'typst.error.wasmLoadFailed' | 'xmind.toolbar.zoomOut' | 'xmind.toolbar.zoomIn' | 'xmind.toolbar.fit' | 'xmind.toolbar.fitTitle' | 'xmind.state.loading' | 'xmind.stats.nodes' | 'xmind.stats.depth' | 'xmind.stats.theme' | 'xmind.stats.template' | 'xmind.badge.paused' | 'xmind.badge.collapsed' | 'xmind.badge.floating' | 'xmind.badge.summary' | 'xmind.badge.callout' | 'xmind.imageResource' | 'xmind.error.unrecognized' | 'xmind.error.noCanvas' | 'cad.toolbar.fit' | 'cad.toolbar.zoomOut' | 'cad.toolbar.zoomIn' | 'cad.layers.title' | 'cad.layers.count' | 'cad.inspector.title' | 'cad.inspector.entities' | 'cad.inspector.blocks' | 'cad.inspector.pages' | 'cad.inspector.drawn' | 'cad.state.loadingViewer' | 'cad.state.parsing' | 'cad.error.parseFailed' | 'image.alt' | 'image.lightbox.alt' | 'image.lightbox.close' | 'gitBundle.error.invalid' | 'gitBundle.error.missingPack' | 'gitBundle.notice.delta' | 'gitBundle.title.history' | 'gitBundle.title.fileTree' | 'gitBundle.file.choose' | 'gitBundle.file.noTree' | 'gitBundle.file.none' | 'gitBundle.history.empty' | 'gitBundle.toolbar.summary' | 'gitBundle.meta.bundle' | 'gitBundle.meta.refs' | 'gitBundle.meta.commits' | 'gitBundle.meta.objects' | 'gitBundle.meta.deltas' | 'gitBundle.meta.objectFormat' | 'gitBundle.meta.objectTypes' | 'geo.error.unrecognized' | 'geo.error.xmlParseFailed' | 'geo.error.unsupported' | 'geo.title' | 'geo.featureCount' | 'geo.bounds' | 'geo.geometryTypes' | 'geo.aria' | 'geo.loading' | 'geo.projection' | 'geo.engine' | 'geo.basemap' | 'geo.basemap.offline' | 'geo.basemap.custom' | 'geo.engine.maplibre' | 'geo.engine.svg' | 'geo.error.projection' | 'geo.action.fit' | 'model.toolbar.fit' | 'model.toolbar.rotate' | 'model.toolbar.wireframe' | 'model.toolbar.grid' | 'model.toolbar.axes' | 'model.state.loadingSummary' | 'model.state.loading' | 'model.state.loaded' | 'model.state.parseFailed' | 'model.summary.meshes' | 'model.summary.points' | 'model.error.daeEmpty' | 'model.error.unsupported' | 'model.error.parseFailed' | 'model.notice.signature' | 'loading.generic.label' | 'loading.generic.hint' | 'loading.word.label' | 'loading.word.hint' | 'loading.wordWorker.hint' | 'loading.sheet.label' | 'loading.sheet.hint' | 'loading.csv.label' | 'loading.csv.hint' | 'loading.presentation.label' | 'loading.presentation.hint' | 'loading.pdf.label' | 'loading.pdf.hint' | 'loading.ofd.label' | 'loading.ofd.hint' | 'loading.archive.label' | 'loading.archive.hint' | 'loading.email.label' | 'loading.email.hint' | 'loading.msg.hint' | 'loading.eda.label' | 'loading.eda.hint' | 'loading.cad.label' | 'loading.cad.hint' | 'loading.dwg.hint' | 'loading.dwf.hint' | 'loading.dwfx.hint' | 'loading.xps.hint' | 'loading.drawio.label' | 'loading.drawio.hint' | 'loading.excalidraw.label' | 'loading.excalidraw.hint' | 'loading.epub.label' | 'loading.epub.hint' | 'loading.umd.label' | 'loading.umd.hint' | 'loading.image.label' | 'loading.image.hint' | 'loading.video.label' | 'loading.video.hint' | 'loading.audio.label' | 'loading.audio.hint';
6
+ export type FileViewerMessageKey = 'toolbar.zoomGroup' | 'toolbar.zoomOut' | 'toolbar.zoomIn' | 'toolbar.zoomReset' | 'toolbar.download' | 'toolbar.downloadTitle' | 'toolbar.print' | 'toolbar.printTitle' | 'toolbar.printDirect' | 'toolbar.printMask' | 'toolbar.printMaskTitle' | 'toolbar.printMaskAdd' | 'toolbar.printMaskClear' | 'toolbar.printMaskCancel' | 'toolbar.printMaskConfirm' | 'toolbar.printMaskHint' | 'toolbar.printStampUpload' | 'toolbar.printStampRemove' | 'toolbar.printStampResize' | 'toolbar.exportHtml' | 'toolbar.exportHtmlTitle' | 'toolbar.search' | 'toolbar.searchPlaceholder' | 'toolbar.searchPrevious' | 'toolbar.searchNext' | 'toolbar.searchClear' | 'toolbar.theme' | 'toolbar.themeToLight' | 'toolbar.themeToDark' | 'state.ready.title' | 'state.ready.message' | 'state.empty.title' | 'state.empty.message' | 'state.unsupported.install.title' | 'state.unsupported.install.message' | 'state.unsupported.install.description' | 'state.unsupported.title' | 'state.unsupported.message' | 'state.unsupported.description' | 'state.error.title' | 'preview.downloading' | 'preview.streamingPdf' | 'preview.reading' | 'error.download' | 'error.print' | 'error.exportHtml' | 'error.noDownloadSource' | 'error.noExportContent' | 'error.printUnavailable' | 'error.printWindowBlocked' | 'error.remoteDownload' | 'error.localRead' | 'error.load' | 'error.stream' | 'error.beforeOperation' | 'error.unknown' | 'error.blobUnavailable' | 'error.sourceUnsupported' | 'error.fileReadArrayBuffer' | 'error.fileReadDataUrl' | 'error.fileReadText' | 'error.imageDataUrlRead' | 'operation.download' | 'operation.print' | 'operation.exportHtml' | 'operation.zoomIn' | 'operation.zoomOut' | 'operation.zoomReset' | 'pdf.toolbar.toggleNavigation' | 'pdf.toolbar.previousPage' | 'pdf.toolbar.nextPage' | 'pdf.toolbar.fitWidth' | 'pdf.toolbar.zoomOut' | 'pdf.toolbar.zoomIn' | 'pdf.toolbar.rotateLeft' | 'pdf.toolbar.rotateRight' | 'pdf.nav.typeLabel' | 'pdf.nav.pagesTab' | 'pdf.nav.outlineTab' | 'pdf.nav.pagesTitle' | 'pdf.nav.outlineTitle' | 'pdf.nav.pageCount' | 'pdf.nav.itemCount' | 'pdf.nav.pageLabel' | 'pdf.nav.outlineEmpty' | 'pdf.nav.outlineFallbackTitle' | 'pdf.thumbnail.alt' | 'pdf.state.loading' | 'pdf.error.browserWindow' | 'pdf.error.missingSource' | 'pdf.error.loadFailed' | 'pdf.error.notLoaded' | 'pdf.error.unloaded' | 'pdf.error.canvasUnavailable' | 'pdf.export.pageTitle' | 'spreadsheet.loading.kicker' | 'spreadsheet.loading.title' | 'spreadsheet.loading.hint' | 'spreadsheet.loading.streaming' | 'spreadsheet.tabs.ariaLabel' | 'spreadsheet.state.parsingWorkbook' | 'spreadsheet.state.preparingSheet' | 'spreadsheet.state.preparingSheetNamed' | 'spreadsheet.state.cachedRows' | 'spreadsheet.state.rows' | 'spreadsheet.state.rowsAndColumns' | 'spreadsheet.error.parseFailed' | 'spreadsheet.error.workerFailed' | 'word.error.invalidDocx' | 'word.error.missingOdfContent' | 'word.error.odfXmlParseFailed' | 'word.title.rtf' | 'word.title.openDocumentPresentation' | 'word.title.openDocumentText' | 'word.page.fallback' | 'word.page.empty' | 'word.body' | 'word.body.empty' | 'ofd.state.loading' | 'ofd.error.empty' | 'ofd.error.parseFailed' | 'presentation.state.loading' | 'presentation.error.title' | 'presentation.error.parseFailed' | 'presentation.ppt.state.loading' | 'presentation.ppt.error.title' | 'presentation.ppt.error.parseFailed' | 'presentation.ppt.error.assetHint' | 'archive.error.nestedUnsupported' | 'archive.loading.readingDirectory' | 'archive.loading.readingDirectoryHint' | 'archive.search.placeholder' | 'archive.sidebar.hide' | 'archive.sidebar.show' | 'archive.preview.title' | 'archive.preview.chooseFile' | 'archive.preview.downloadFile' | 'archive.error.title' | 'archive.stats.summary' | 'archive.warning.encrypted' | 'archive.password.title' | 'archive.password.description' | 'archive.password.placeholder' | 'archive.password.invalid' | 'archive.password.required' | 'archive.password.cancel' | 'archive.password.confirm' | 'archive.error.passwordRequired' | 'archive.error.encryptedRequiresWorker' | 'archive.empty.title' | 'archive.empty.message' | 'archive.loading.initializingCandidate' | 'archive.loading.initializingCandidateHint' | 'archive.error.candidateInitTimeout' | 'archive.error.encryptedCheckTimeout' | 'archive.loading.directoryReadyHint' | 'archive.error.candidateReadTimeout' | 'archive.loading.workerFallback' | 'archive.loading.workerFallbackHint' | 'archive.notice.workerFallback' | 'archive.error.tooLarge' | 'archive.loading.initializingWorker' | 'archive.loading.initializingWorkerHint' | 'archive.error.workerInitFailed' | 'archive.error.workerUnsupported' | 'archive.error.indexedDbUnavailable' | 'archive.error.entryTooLarge' | 'archive.loading.extracting' | 'archive.loading.rendering' | 'archive.loading.exporting' | 'media.audio.title' | 'media.audio.description' | 'media.audio.unsupported' | 'media.video.title' | 'media.video.unsupported' | 'media.video.hlsHint' | 'media.midi.title' | 'media.midi.loading' | 'media.midi.trackHeader' | 'media.midi.instrumentHeader' | 'media.midi.channelHeader' | 'media.midi.noteCountHeader' | 'media.midi.durationHeader' | 'media.midi.durationStat' | 'media.midi.trackStat' | 'media.midi.noteStat' | 'media.midi.parseFailed' | 'email.mbox.subject' | 'email.mbox.summary' | 'email.error.title' | 'email.meta.from' | 'email.meta.to' | 'email.meta.cc' | 'email.meta.date' | 'email.tabs.text' | 'email.tabs.headers' | 'email.attachments.title' | 'email.attachments.empty' | 'email.attachments.download' | 'email.attachments.opening' | 'email.attachments.nestedUnavailable' | 'email.loading.parsing' | 'data.font.sample' | 'data.error.fontFaceUnsupported' | 'data.title.font' | 'data.title.sqlite' | 'data.title.parquet' | 'data.title.avro' | 'data.title.wasm' | 'data.title.eps' | 'data.title.ai' | 'data.title.webarchive' | 'data.title.summary' | 'data.label.format' | 'data.label.size' | 'data.label.rendering' | 'data.label.objects' | 'data.label.sampleTable' | 'data.label.rows' | 'data.label.columns' | 'data.label.sampleRows' | 'data.label.imports' | 'data.label.exports' | 'data.label.magic' | 'data.label.note' | 'data.label.container' | 'data.value.schemaRead' | 'data.value.schemaUnread' | 'data.note.aiSummary' | 'data.note.postscriptSummary' | 'data.note.webarchive' | 'data.image.alt' | 'psd.title' | 'psd.action.fit' | 'psd.action.showAll' | 'psd.action.hideAll' | 'psd.layers.title' | 'psd.layers.redrawable' | 'psd.layers.empty' | 'psd.layers.hidden' | 'drawing.error.viewerLoadFailed' | 'drawing.error.excalidrawEmpty' | 'drawing.error.excalidrawTimeout' | 'drawing.error.drawioParseFailed' | 'drawing.error.drawioNoModel' | 'drawing.error.drawioNoElements' | 'drawing.error.viewerInitFailed' | 'drawing.error.drawioTimeout' | 'drawing.error.svgParseFailed' | 'drawing.error.plantumlRenderFailed' | 'drawing.title.excalidraw' | 'drawing.title.mermaid' | 'drawing.title.plantuml' | 'drawing.title.drawio' | 'drawing.toolbar.zoomOut' | 'drawing.toolbar.zoomIn' | 'drawing.toolbar.fit' | 'drawing.toolbar.fitWidth' | 'drawing.state.loading' | 'text.code.loadingHighlight' | 'text.code.indexingLargeFile' | 'text.code.virtualized' | 'text.code.firstSegment' | 'text.code.previousSegment' | 'text.code.nextSegment' | 'text.code.lastSegment' | 'ebook.toc' | 'ebook.reading' | 'ebook.itemCount' | 'epub.title' | 'epub.previousPage' | 'epub.nextPage' | 'epub.loading' | 'epub.chapterFallback' | 'epub.renderIncomplete' | 'umd.title' | 'umd.previousChapter' | 'umd.nextChapter' | 'umd.loading' | 'umd.emptyContent' | 'umd.chapterFallback' | 'umd.galleryFallback' | 'umd.warningBodyTooShort' | 'umd.error.unexpectedEnd' | 'umd.error.invalidFile' | 'typst.summaryRenderer' | 'typst.pageSummary.empty' | 'typst.pageSummary.ready' | 'typst.status.compiling' | 'typst.status.failed' | 'typst.status.rendered' | 'typst.loading.title' | 'typst.loading.hint' | 'typst.error.title' | 'typst.error.timeout' | 'typst.error.timeoutHint' | 'typst.error.assetHint' | 'typst.error.svgParseFailed' | 'typst.error.wasmLoadFailed' | 'xmind.toolbar.zoomOut' | 'xmind.toolbar.zoomIn' | 'xmind.toolbar.fit' | 'xmind.toolbar.fitTitle' | 'xmind.state.loading' | 'xmind.stats.nodes' | 'xmind.stats.depth' | 'xmind.stats.theme' | 'xmind.stats.template' | 'xmind.badge.paused' | 'xmind.badge.collapsed' | 'xmind.badge.floating' | 'xmind.badge.summary' | 'xmind.badge.callout' | 'xmind.imageResource' | 'xmind.error.unrecognized' | 'xmind.error.noCanvas' | 'cad.toolbar.fit' | 'cad.toolbar.zoomOut' | 'cad.toolbar.zoomIn' | 'cad.layers.title' | 'cad.layers.count' | 'cad.layers.merged' | 'cad.inspector.title' | 'cad.inspector.entities' | 'cad.inspector.blocks' | 'cad.inspector.pages' | 'cad.inspector.drawn' | 'cad.state.loadingViewer' | 'cad.state.parsing' | 'cad.error.parseFailed' | 'image.alt' | 'image.toolbar.rotation' | 'image.toolbar.rotateLeft' | 'image.toolbar.rotateRight' | 'image.lightbox.alt' | 'image.lightbox.close' | 'gitBundle.error.invalid' | 'gitBundle.error.missingPack' | 'gitBundle.notice.delta' | 'gitBundle.title.history' | 'gitBundle.title.fileTree' | 'gitBundle.file.choose' | 'gitBundle.file.noTree' | 'gitBundle.file.none' | 'gitBundle.history.empty' | 'gitBundle.toolbar.summary' | 'gitBundle.meta.bundle' | 'gitBundle.meta.refs' | 'gitBundle.meta.commits' | 'gitBundle.meta.objects' | 'gitBundle.meta.deltas' | 'gitBundle.meta.objectFormat' | 'gitBundle.meta.objectTypes' | 'geo.error.unrecognized' | 'geo.error.xmlParseFailed' | 'geo.error.unsupported' | 'geo.title' | 'geo.featureCount' | 'geo.bounds' | 'geo.geometryTypes' | 'geo.aria' | 'geo.loading' | 'geo.projection' | 'geo.engine' | 'geo.basemap' | 'geo.basemap.offline' | 'geo.basemap.custom' | 'geo.engine.maplibre' | 'geo.engine.svg' | 'geo.error.projection' | 'geo.action.fit' | 'model.toolbar.fit' | 'model.toolbar.rotate' | 'model.toolbar.wireframe' | 'model.toolbar.grid' | 'model.toolbar.axes' | 'model.state.loadingSummary' | 'model.state.loading' | 'model.state.loaded' | 'model.state.parseFailed' | 'model.summary.meshes' | 'model.summary.points' | 'model.error.daeEmpty' | 'model.error.unsupported' | 'model.error.parseFailed' | 'model.notice.signature' | 'loading.generic.label' | 'loading.generic.hint' | 'loading.word.label' | 'loading.word.hint' | 'loading.wordWorker.hint' | 'loading.sheet.label' | 'loading.sheet.hint' | 'loading.csv.label' | 'loading.csv.hint' | 'loading.presentation.label' | 'loading.presentation.hint' | 'loading.pdf.label' | 'loading.pdf.hint' | 'loading.ofd.label' | 'loading.ofd.hint' | 'loading.archive.label' | 'loading.archive.hint' | 'loading.email.label' | 'loading.email.hint' | 'loading.msg.hint' | 'loading.eda.label' | 'loading.eda.hint' | 'loading.cad.label' | 'loading.cad.hint' | 'loading.dwg.hint' | 'loading.dwf.hint' | 'loading.dwfx.hint' | 'loading.xps.hint' | 'loading.drawio.label' | 'loading.drawio.hint' | 'loading.excalidraw.label' | 'loading.excalidraw.hint' | 'loading.epub.label' | 'loading.epub.hint' | 'loading.umd.label' | 'loading.umd.hint' | 'loading.image.label' | 'loading.image.hint' | 'loading.video.label' | 'loading.video.hint' | 'loading.audio.label' | 'loading.audio.hint';
7
7
  export type FileViewerMessageParams = Record<string, string | number | boolean | null | undefined>;
8
8
  export type FileViewerMessageResolver = (key: FileViewerMessageKey, params: FileViewerMessageParams, locale: FileViewerLocale) => string | undefined;
9
9
  export type FileViewerMessages = Partial<Record<FileViewerMessageKey, string>> | FileViewerMessageResolver;
@@ -114,6 +114,12 @@ export interface FileViewerPdfOptions {
114
114
  defaultNavigationVisible?: boolean;
115
115
  thumbnails?: boolean;
116
116
  rotation?: number;
117
+ /**
118
+ * Highlights and focuses one or more PDF regions after the document loads.
119
+ * Use `pixel` with `sourceWidth` / `sourceHeight` for OCR coordinates, or
120
+ * `pdf-point` for native PDF coordinates. Page numbers are one-based.
121
+ */
122
+ bbox?: FileViewerPdfBoundingBox | readonly FileViewerPdfBoundingBox[];
117
123
  /**
118
124
  * Initial PDF view position. Prefer the top-level `initialViewState` when the
119
125
  * same state should be passed through framework-neutral viewer APIs.
@@ -150,6 +156,29 @@ export interface FileViewerPdfOptions {
150
156
  */
151
157
  cjkFontFallbackPath?: string;
152
158
  }
159
+ export type FileViewerPdfBoundingBoxUnit = 'ratio' | 'percent' | 'pixel' | 'pdf-point';
160
+ export type FileViewerPdfBoundingBoxOrigin = 'top-left' | 'bottom-left';
161
+ export interface FileViewerPdfBoundingBox {
162
+ id?: string;
163
+ /** One-based PDF page number. Defaults to the current page, then page 1. */
164
+ page?: number;
165
+ x: number;
166
+ y: number;
167
+ width: number;
168
+ height: number;
169
+ /** Defaults to `pdf-point`. */
170
+ unit?: FileViewerPdfBoundingBoxUnit;
171
+ /** Defaults to `bottom-left` for PDF points and `top-left` otherwise. */
172
+ origin?: FileViewerPdfBoundingBoxOrigin;
173
+ /** Required when `unit` is `pixel`; this is the OCR/source image width. */
174
+ sourceWidth?: number;
175
+ /** Required when `unit` is `pixel`; this is the OCR/source image height. */
176
+ sourceHeight?: number;
177
+ /** CSS color used for the outline and translucent fill. */
178
+ color?: string;
179
+ /** Optional accessible description for the highlighted region. */
180
+ label?: string;
181
+ }
153
182
  export interface FileViewerDocxOptions {
154
183
  worker?: boolean;
155
184
  workerUrl?: string;
@@ -316,13 +345,16 @@ export interface FileViewerModelOptions {
316
345
  export interface FileViewerDataOptions {
317
346
  sqlWasmUrl?: string;
318
347
  }
319
- export type FileViewerGeoBasemapPreset = 'none' | 'offline' | 'openfreemap' | 'openfreemap-liberty' | 'openfreemap-bright' | 'openfreemap-positron' | 'openfreemap-dark' | 'openfreemap-fiord' | 'osm-raster';
348
+ export type FileViewerGeoBasemapPreset = 'none' | 'offline' | 'openfreemap' | 'openfreemap-liberty' | 'openfreemap-bright' | 'openfreemap-positron' | 'openfreemap-dark' | 'openfreemap-fiord' | 'osm-raster' | 'tianditu-vector' | 'tianditu-imagery' | 'tianditu-terrain';
349
+ export type FileViewerTiandituMapStyle = 'vector' | 'imagery' | 'terrain';
320
350
  export interface FileViewerGeoBasemapOptions {
321
351
  /**
322
352
  * `raster` uses XYZ/TMS image tiles. `vector-style` uses a MapLibre style
323
353
  * object or URL, which is the best path for OpenFreeMap/OpenMapTiles stacks.
354
+ * `tianditu` builds the official base and annotation raster layers from the
355
+ * caller-provided Tianditu token.
324
356
  */
325
- type?: 'raster' | 'vector-style';
357
+ type?: 'raster' | 'vector-style' | 'tianditu';
326
358
  /**
327
359
  * Raster XYZ/TMS tile template, for example `/tiles/{z}/{x}/{y}.png`.
328
360
  */
@@ -346,6 +378,12 @@ export interface FileViewerGeoBasemapOptions {
346
378
  maxZoom?: number;
347
379
  scheme?: 'xyz' | 'tms';
348
380
  rasterOpacity?: number;
381
+ /** Tianditu API token. Required when `type` is `tianditu`. */
382
+ token?: string;
383
+ /** Tianditu map family. Defaults to `vector`. */
384
+ mapStyle?: FileViewerTiandituMapStyle;
385
+ /** Include the matching Tianditu annotation layer. Defaults to true. */
386
+ labels?: boolean;
349
387
  }
350
388
  export interface FileViewerGeoOptions {
351
389
  /**
@@ -371,6 +409,11 @@ export interface FileViewerGeoOptions {
371
409
  * self-hosted or intranet style/tile URL.
372
410
  */
373
411
  basemap?: false | FileViewerGeoBasemapPreset | FileViewerGeoBasemapOptions;
412
+ /**
413
+ * Tianditu API token used by the `tianditu-*` presets. The viewer never
414
+ * supplies or persists a token; obtain one for the deployment's own domain.
415
+ */
416
+ tiandituToken?: string;
374
417
  /**
375
418
  * Defaults to true. When no CRS is declared and coordinates exceed longitude
376
419
  * or latitude ranges, the geo renderer treats Web Mercator-sized values as
@@ -891,9 +934,21 @@ export interface FileViewerPrintMaskRegion {
891
934
  /** Zero-based rendered page index. Omitted regions retain legacy whole-document coordinates. */
892
935
  pageIndex?: number;
893
936
  }
937
+ /** Page-aware image placed above rendered content for printing, such as a seal or signature. */
938
+ export interface FileViewerPrintStamp extends FileViewerPrintMaskRegion {
939
+ /** Image URL. Uploaded stamps are converted to a local data URL by the designer. */
940
+ src: string;
941
+ /** Image opacity from 0 to 1. Defaults to 1. */
942
+ opacity?: number;
943
+ /** Clockwise rotation in degrees. Defaults to 0. */
944
+ rotate?: number;
945
+ alt?: string;
946
+ }
894
947
  export interface FileViewerPrintMaskOptions {
895
948
  /** Solid black cover blocks, matching common OFD/business redaction UX. */
896
949
  regions?: FileViewerPrintMaskRegion[];
950
+ /** Image overlays, including locally uploaded seals and signatures. */
951
+ stamps?: FileViewerPrintStamp[];
897
952
  /** Fill color for print masks. Defaults to opaque black. */
898
953
  color?: string;
899
954
  }
@@ -1,6 +1,7 @@
1
- import type { FileViewerPrintMaskOptions, FileViewerPrintMaskRegion } from '../contracts/types';
1
+ import type { FileViewerPrintMaskOptions, FileViewerPrintMaskRegion, FileViewerPrintStamp } from '../contracts/types';
2
2
  export declare const normalizeFileViewerPrintMaskRegion: (region: Partial<FileViewerPrintMaskRegion> | null | undefined) => FileViewerPrintMaskRegion | null;
3
+ export declare const normalizeFileViewerPrintStamp: (stamp: Partial<FileViewerPrintStamp> | null | undefined) => FileViewerPrintStamp | null;
3
4
  export declare const normalizeFileViewerPrintMaskOptions: (mask?: FileViewerPrintMaskOptions | null) => FileViewerPrintMaskOptions | null;
4
5
  export declare const buildFileViewerPrintMaskOverlayHtml: (mask?: FileViewerPrintMaskOptions | null, pageScoped?: boolean) => string;
5
- export declare const FILE_VIEWER_PRINT_MASK_STYLE = "\n .viewer-export-print-mask{position:absolute;inset:0;z-index:15;pointer-events:none;print-color-adjust:exact;-webkit-print-color-adjust:exact;}\n .viewer-export-print-mask--page{z-index:2147483647;}\n .viewer-export-print-mask-block{position:absolute;box-sizing:border-box;print-color-adjust:exact;-webkit-print-color-adjust:exact;}\n [data-viewer-print-page-index]{position:relative!important;isolation:isolate;}\n";
6
+ export declare const FILE_VIEWER_PRINT_MASK_STYLE = "\n .viewer-export-print-mask{position:absolute;inset:0;z-index:15;pointer-events:none;print-color-adjust:exact;-webkit-print-color-adjust:exact;}\n .viewer-export-print-mask--page{z-index:2147483647;}\n .viewer-export-print-mask-block{position:absolute;box-sizing:border-box;print-color-adjust:exact;-webkit-print-color-adjust:exact;}\n .viewer-export-print-stamp{position:absolute;display:block;object-fit:contain;transform-origin:center center;print-color-adjust:exact;-webkit-print-color-adjust:exact;}\n [data-viewer-print-page-index]{position:relative!important;isolation:isolate;}\n";
6
7
  export declare const applyFileViewerPagePrintMasksToHtml: (contentHtml: string, mask?: FileViewerPrintMaskOptions | null) => string;
@@ -23,47 +23,99 @@ export const normalizeFileViewerPrintMaskRegion = (region) => {
23
23
  ...(pageIndex === undefined ? {} : { pageIndex }),
24
24
  };
25
25
  };
26
+ const normalizeStampSource = (value) => {
27
+ if (typeof value !== 'string') {
28
+ return '';
29
+ }
30
+ const source = value.trim();
31
+ if (/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml);/i.test(source) ||
32
+ /^(?:blob:|https?:\/\/|\/|\.\.?\/)/i.test(source)) {
33
+ return source;
34
+ }
35
+ return '';
36
+ };
37
+ const clampOpacity = (value) => {
38
+ const opacity = Number(value);
39
+ return Number.isFinite(opacity) ? Math.max(0, Math.min(1, opacity)) : 1;
40
+ };
41
+ const normalizeRotation = (value) => {
42
+ const rotation = Number(value);
43
+ if (!Number.isFinite(rotation)) {
44
+ return 0;
45
+ }
46
+ return ((rotation % 360) + 360) % 360;
47
+ };
48
+ export const normalizeFileViewerPrintStamp = (stamp) => {
49
+ const region = normalizeFileViewerPrintMaskRegion(stamp);
50
+ const src = normalizeStampSource(stamp === null || stamp === void 0 ? void 0 : stamp.src);
51
+ if (!region || !src) {
52
+ return null;
53
+ }
54
+ return {
55
+ ...region,
56
+ src,
57
+ opacity: clampOpacity(stamp === null || stamp === void 0 ? void 0 : stamp.opacity),
58
+ rotate: normalizeRotation(stamp === null || stamp === void 0 ? void 0 : stamp.rotate),
59
+ ...(typeof (stamp === null || stamp === void 0 ? void 0 : stamp.alt) === 'string' && stamp.alt.trim()
60
+ ? { alt: stamp.alt.trim() }
61
+ : {}),
62
+ };
63
+ };
26
64
  export const normalizeFileViewerPrintMaskOptions = (mask) => {
27
- if (!mask || !Array.isArray(mask.regions) || !mask.regions.length) {
65
+ if (!mask) {
28
66
  return null;
29
67
  }
30
- const regions = mask.regions
68
+ const regions = (mask.regions || [])
31
69
  .map(region => normalizeFileViewerPrintMaskRegion(region))
32
70
  .filter((region) => !!region);
33
- if (!regions.length) {
71
+ const stamps = (mask.stamps || [])
72
+ .map(stamp => normalizeFileViewerPrintStamp(stamp))
73
+ .filter((stamp) => !!stamp);
74
+ if (!regions.length && !stamps.length) {
34
75
  return null;
35
76
  }
36
77
  return {
37
- regions,
78
+ ...(regions.length ? { regions } : {}),
79
+ ...(stamps.length ? { stamps } : {}),
38
80
  color: mask.color || '#000000',
39
81
  };
40
82
  };
83
+ const escapeHtmlAttribute = (value) => value
84
+ .replace(/&/g, '&amp;')
85
+ .replace(/"/g, '&quot;')
86
+ .replace(/</g, '&lt;')
87
+ .replace(/>/g, '&gt;');
41
88
  export const buildFileViewerPrintMaskOverlayHtml = (mask, pageScoped = false) => {
42
- var _a;
43
89
  const normalized = normalizeFileViewerPrintMaskOptions(mask);
44
- if (!((_a = normalized === null || normalized === void 0 ? void 0 : normalized.regions) === null || _a === void 0 ? void 0 : _a.length)) {
90
+ if (!normalized) {
45
91
  return '';
46
92
  }
47
93
  const color = normalized.color || '#000000';
48
- const blocks = normalized.regions.map(region => (`<div class="viewer-export-print-mask-block" style="left:${region.left}%;top:${region.top}%;width:${region.width}%;height:${region.height}%;background:${color};"></div>`)).join('');
94
+ const blocks = (normalized.regions || []).map(region => (`<div class="viewer-export-print-mask-block" style="left:${region.left}%;top:${region.top}%;width:${region.width}%;height:${region.height}%;background:${color};"></div>`)).join('');
95
+ const stamps = (normalized.stamps || []).map(stamp => {
96
+ var _a, _b;
97
+ return (`<img class="viewer-export-print-stamp" src="${escapeHtmlAttribute(stamp.src)}" alt="${escapeHtmlAttribute(stamp.alt || '')}" draggable="false" style="left:${stamp.left}%;top:${stamp.top}%;width:${stamp.width}%;height:${stamp.height}%;opacity:${(_a = stamp.opacity) !== null && _a !== void 0 ? _a : 1};transform:rotate(${(_b = stamp.rotate) !== null && _b !== void 0 ? _b : 0}deg);" />`);
98
+ }).join('');
49
99
  const className = pageScoped
50
100
  ? 'viewer-export-print-mask viewer-export-print-mask--page'
51
101
  : 'viewer-export-print-mask';
52
- return `<div class="${className}" aria-hidden="true">${blocks}</div>`;
102
+ return `<div class="${className}" aria-hidden="true">${blocks}${stamps}</div>`;
53
103
  };
54
104
  export const FILE_VIEWER_PRINT_MASK_STYLE = `
55
105
  .viewer-export-print-mask{position:absolute;inset:0;z-index:15;pointer-events:none;print-color-adjust:exact;-webkit-print-color-adjust:exact;}
56
106
  .viewer-export-print-mask--page{z-index:2147483647;}
57
107
  .viewer-export-print-mask-block{position:absolute;box-sizing:border-box;print-color-adjust:exact;-webkit-print-color-adjust:exact;}
108
+ .viewer-export-print-stamp{position:absolute;display:block;object-fit:contain;transform-origin:center center;print-color-adjust:exact;-webkit-print-color-adjust:exact;}
58
109
  [data-viewer-print-page-index]{position:relative!important;isolation:isolate;}
59
110
  `;
60
111
  export const applyFileViewerPagePrintMasksToHtml = (contentHtml, mask) => {
61
- var _a;
112
+ var _a, _b;
62
113
  const normalized = normalizeFileViewerPrintMaskOptions(mask);
63
114
  if (!normalized) {
64
115
  return contentHtml;
65
116
  }
66
117
  const regionsByPage = new Map();
118
+ const stampsByPage = new Map();
67
119
  (_a = normalized.regions) === null || _a === void 0 ? void 0 : _a.forEach(region => {
68
120
  if (region.pageIndex === undefined) {
69
121
  return;
@@ -72,16 +124,26 @@ export const applyFileViewerPagePrintMasksToHtml = (contentHtml, mask) => {
72
124
  pageRegions.push(region);
73
125
  regionsByPage.set(region.pageIndex, pageRegions);
74
126
  });
75
- if (!regionsByPage.size) {
127
+ (_b = normalized.stamps) === null || _b === void 0 ? void 0 : _b.forEach(stamp => {
128
+ if (stamp.pageIndex === undefined) {
129
+ return;
130
+ }
131
+ const pageStamps = stampsByPage.get(stamp.pageIndex) || [];
132
+ pageStamps.push(stamp);
133
+ stampsByPage.set(stamp.pageIndex, pageStamps);
134
+ });
135
+ if (!regionsByPage.size && !stampsByPage.size) {
76
136
  return contentHtml;
77
137
  }
78
138
  return contentHtml.replace(/(<[A-Za-z][^>]*\sdata-viewer-print-page-index=(['"])(\d+)\2[^>]*>)/g, (match, openingTag, _quote, rawPageIndex) => {
79
139
  const pageRegions = regionsByPage.get(Number(rawPageIndex));
80
- if (!(pageRegions === null || pageRegions === void 0 ? void 0 : pageRegions.length)) {
140
+ const pageStamps = stampsByPage.get(Number(rawPageIndex));
141
+ if (!(pageRegions === null || pageRegions === void 0 ? void 0 : pageRegions.length) && !(pageStamps === null || pageStamps === void 0 ? void 0 : pageStamps.length)) {
81
142
  return match;
82
143
  }
83
144
  return `${openingTag}${buildFileViewerPrintMaskOverlayHtml({
84
- regions: pageRegions,
145
+ regions: pageRegions || [],
146
+ stamps: pageStamps || [],
85
147
  color: normalized.color,
86
148
  }, true)}`;
87
149
  });
@@ -1,4 +1,4 @@
1
- import type { FileViewerPrintMaskOptions, FileViewerPrintMaskRegion } from '../contracts/types';
1
+ import type { FileViewerPrintMaskOptions, FileViewerPrintMaskRegion, FileViewerPrintStamp } from '../contracts/types';
2
2
  import { type FileViewerI18nInput } from '../i18n/messages';
3
3
  export interface OpenFileViewerPrintMaskDesignerOptions {
4
4
  root: HTMLElement;
@@ -6,6 +6,7 @@ export interface OpenFileViewerPrintMaskDesignerOptions {
6
6
  i18n?: FileViewerI18nInput;
7
7
  color?: string;
8
8
  initialRegions?: FileViewerPrintMaskRegion[];
9
+ initialStamps?: FileViewerPrintStamp[];
9
10
  }
10
11
  export interface FileViewerPrintMaskDesignerResult {
11
12
  mask: FileViewerPrintMaskOptions;