@file-viewer/core 2.1.16 → 2.1.18

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
@@ -41,13 +41,16 @@ import {
41
41
 
42
42
  const viewer = createViewer(document.querySelector('#viewer')!, {
43
43
  options: {
44
- toolbar: true
44
+ toolbar: true,
45
+ styleIsolation: 'shadow'
45
46
  }
46
47
  })
47
48
 
48
49
  await viewer.load({ url: '/files/report.pdf' })
49
50
  ```
50
51
 
52
+ `options.styleIsolation` accepts `auto`, `shadow`, `scoped`, or `none`. Use `shadow` when a custom host or framework wrapper needs a ShadowRoot-backed render surface. Core passes the resolved `surface` to renderer `load(context)`, so custom renderers should inject styles into `context.surface.shadowRoot` or the renderer container instead of `document.head`, and should mount overlays inside the same isolated surface when possible.
53
+
51
54
  The root `@file-viewer/core` entry remains the complete compatibility entry for existing integrations. New component packages should prefer the narrowest explicit entry point they need: `headless` for contracts and build-time helpers, `browser` for real browser preview.
52
55
 
53
56
  ```ts
package/README.md CHANGED
@@ -41,13 +41,16 @@ import {
41
41
 
42
42
  const viewer = createViewer(document.querySelector('#viewer')!, {
43
43
  options: {
44
- toolbar: true
44
+ toolbar: true,
45
+ styleIsolation: 'shadow'
45
46
  }
46
47
  })
47
48
 
48
49
  await viewer.load({ url: '/files/report.pdf' })
49
50
  ```
50
51
 
52
+ `options.styleIsolation` accepts `auto`, `shadow`, `scoped`, or `none`. Use `shadow` when a custom host or framework wrapper needs a ShadowRoot-backed render surface. Core passes the resolved `surface` to renderer `load(context)`, so custom renderers should inject styles into `context.surface.shadowRoot` or the renderer container instead of `document.head`, and should mount overlays inside the same isolated surface when possible.
53
+
51
54
  The root `@file-viewer/core` entry remains the complete compatibility entry for existing integrations. New component packages should prefer the narrowest explicit entry point they need: `headless` for contracts and build-time helpers, `browser` for real browser preview.
52
55
 
53
56
  ```ts
@@ -1,7 +1,8 @@
1
1
  export type FileViewerSourceKind = 'file' | 'url' | 'buffer' | 'empty';
2
2
  export type FileViewerThemeMode = 'light' | 'dark' | 'system';
3
3
  export type FileViewerLocale = 'auto' | 'zh-CN' | 'en-US' | (string & {});
4
- export type FileViewerMessageKey = 'toolbar.zoomGroup' | 'toolbar.zoomOut' | 'toolbar.zoomIn' | 'toolbar.zoomReset' | 'toolbar.download' | 'toolbar.downloadTitle' | 'toolbar.print' | 'toolbar.printTitle' | 'toolbar.exportHtml' | 'toolbar.exportHtmlTitle' | 'toolbar.search' | 'toolbar.searchPlaceholder' | 'toolbar.searchPrevious' | 'toolbar.searchNext' | 'toolbar.searchClear' | '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' | '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' | '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.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' | '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';
4
+ export type FileViewerStyleIsolation = 'auto' | 'shadow' | 'scoped' | 'none';
5
+ export type FileViewerMessageKey = 'toolbar.zoomGroup' | 'toolbar.zoomOut' | 'toolbar.zoomIn' | 'toolbar.zoomReset' | 'toolbar.download' | 'toolbar.downloadTitle' | 'toolbar.print' | 'toolbar.printTitle' | 'toolbar.exportHtml' | 'toolbar.exportHtmlTitle' | 'toolbar.search' | 'toolbar.searchPlaceholder' | 'toolbar.searchPrevious' | 'toolbar.searchNext' | 'toolbar.searchClear' | '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' | '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' | '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';
5
6
  export type FileViewerMessageParams = Record<string, string | number | boolean | null | undefined>;
6
7
  export type FileViewerMessageResolver = (key: FileViewerMessageKey, params: FileViewerMessageParams, locale: FileViewerLocale) => string | undefined;
7
8
  export type FileViewerMessages = Partial<Record<FileViewerMessageKey, string>> | FileViewerMessageResolver;
@@ -10,9 +11,20 @@ export interface FileViewerI18nOptions {
10
11
  messages?: FileViewerMessages;
11
12
  }
12
13
  export type FileViewerFileRef = File | Blob | ArrayBuffer;
13
- export type FileViewerToolbarPosition = 'auto' | 'top' | 'bottom-right';
14
+ export type FileViewerToolbarPosition = 'auto' | 'top' | 'top-center' | 'bottom-right';
15
+ export type FileViewerFitMode = 'auto' | 'contain' | 'cover' | 'width' | 'height' | 'actual' | 'scale-down';
16
+ export type FileViewerFitResize = 'until-interaction' | 'always' | 'initial';
17
+ export interface FileViewerFitOptions {
18
+ mode?: FileViewerFitMode;
19
+ resize?: FileViewerFitResize;
20
+ padding?: number;
21
+ minScale?: number;
22
+ maxScale?: number;
23
+ }
14
24
  export type FileViewerLifecyclePhase = 'load-start' | 'load-complete' | 'unload-start' | 'unload-complete';
15
25
  export type FileViewerOperationType = 'download' | 'print' | 'export-html' | 'zoom-in' | 'zoom-out' | 'zoom-reset';
26
+ export type FileViewerToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml' | 'export-html';
27
+ export type FileViewerResolvedToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml';
16
28
  export type FileViewerToolbarActionMap = Partial<Record<FileViewerOperationType, boolean>>;
17
29
  export type FileViewerRenderStateKind = 'idle' | 'loading' | 'ready' | 'empty' | 'unsupported' | 'error';
18
30
  export type FileViewerRendererCategory = 'office' | 'document' | 'archive' | 'email' | 'eda' | 'cad' | 'model' | 'geo' | 'drawing' | 'mindmap' | 'ebook' | 'image' | 'markdown' | 'code' | 'media' | 'asset' | 'fallback';
@@ -36,6 +48,8 @@ export interface FileViewerToolbarOptions {
36
48
  exportHtml?: boolean;
37
49
  zoom?: boolean;
38
50
  search?: boolean;
51
+ /** Built-in toolbar group order. Missing entries keep their default relative order. */
52
+ order?: FileViewerToolbarItem[];
39
53
  /** Controls which built-in toolbar actions are displayed without disabling controller APIs. */
40
54
  items?: FileViewerToolbarActionMap;
41
55
  /** Hard operation permission map. False values block both built-in toolbar and public API calls. */
@@ -143,6 +157,7 @@ export interface FileRenderContext {
143
157
  url?: string;
144
158
  streamUrl?: string;
145
159
  options?: FileViewerOptions;
160
+ surface?: RenderSurface;
146
161
  registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
147
162
  onProgressiveRender?: () => void;
148
163
  renderNestedBuffer?: (buffer: ArrayBuffer, type: string, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance | undefined>;
@@ -279,6 +294,7 @@ export interface FileViewerDrawingOptions {
279
294
  }
280
295
  export type FileViewerCadRenderer = 'auto' | 'webgl' | 'canvas2d';
281
296
  export type FileViewerCadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';
297
+ export type FileViewerCadFitMode = 'best' | 'native';
282
298
  export interface FileViewerCadOptions {
283
299
  wasmPath?: string;
284
300
  workerUrl?: string | URL;
@@ -292,6 +308,16 @@ export interface FileViewerCadOptions {
292
308
  maxInsertDepth?: number;
293
309
  keepRaw?: boolean;
294
310
  preloadDwg?: boolean;
311
+ /**
312
+ * `best` fits the first view to visible drawing geometry and ignores common
313
+ * CAD outliers such as paper-space frames or far-away markers. `native`
314
+ * preserves the raw bounds reported by the underlying CAD renderer.
315
+ */
316
+ fitMode?: FileViewerCadFitMode;
317
+ /**
318
+ * Fraction of the CAD viewport used by fit-to-view. Defaults to 0.92.
319
+ */
320
+ fitPadding?: number;
295
321
  dwfPreferWebgl?: boolean;
296
322
  dwfPreferWasm?: boolean;
297
323
  dwfBackground?: string;
@@ -336,6 +362,12 @@ export interface FileViewerAiOptions {
336
362
  }
337
363
  export interface FileViewerOptions {
338
364
  theme?: FileViewerThemeMode;
365
+ /**
366
+ * Controls how aggressively the viewer protects its DOM and CSS from the
367
+ * host page. `auto` keeps framework integrations compatible while allowing
368
+ * Web Component integrations to opt into Shadow DOM by default.
369
+ */
370
+ styleIsolation?: FileViewerStyleIsolation;
339
371
  /**
340
372
  * Viewer UI language. `auto` follows the browser language, Chinese browsers
341
373
  * resolve to `zh-CN`, and all other languages currently resolve to `en-US`.
@@ -399,6 +431,11 @@ export interface FileViewerOptions {
399
431
  toolbar?: boolean | FileViewerToolbarOptions;
400
432
  search?: boolean | FileViewerSearchOptions;
401
433
  ai?: boolean | FileViewerAiOptions;
434
+ /**
435
+ * Explicit content fitting strategy. When omitted, each renderer keeps its
436
+ * historical first-screen behavior for backward compatibility.
437
+ */
438
+ fit?: FileViewerFitMode | FileViewerFitOptions;
402
439
  /**
403
440
  * Initial renderer view position used after the document becomes ready.
404
441
  *
@@ -479,11 +516,31 @@ export interface FileViewerZoomState {
479
516
  minScale?: number;
480
517
  maxScale?: number;
481
518
  }
519
+ export interface FileViewerFitRequest extends Required<Pick<FileViewerFitOptions, 'mode' | 'resize' | 'padding'>> {
520
+ minScale?: number;
521
+ maxScale?: number;
522
+ source: FileViewerViewStateChangeSource;
523
+ reason: 'initial' | 'resize' | 'api' | 'retry';
524
+ viewportWidth: number;
525
+ viewportHeight: number;
526
+ container?: HTMLElement | null;
527
+ }
528
+ export interface FileViewerFitResult {
529
+ applied: boolean;
530
+ mode: FileViewerFitMode;
531
+ resize: FileViewerFitResize;
532
+ scale?: number;
533
+ source?: FileViewerViewStateChangeSource;
534
+ reason?: string;
535
+ provider?: 'view-state' | 'zoom' | 'none' | (string & {});
536
+ state?: FileViewerViewState;
537
+ }
482
538
  export interface FileViewerZoomProvider {
483
539
  zoomIn: () => FileViewerZoomState | Promise<FileViewerZoomState>;
484
540
  zoomOut: () => FileViewerZoomState | Promise<FileViewerZoomState>;
485
541
  resetZoom: () => FileViewerZoomState | Promise<FileViewerZoomState>;
486
542
  setZoom?: (scale: number) => FileViewerZoomState | Promise<FileViewerZoomState>;
543
+ fit?: (request: FileViewerFitRequest) => FileViewerFitResult | Promise<FileViewerFitResult>;
487
544
  getState: () => FileViewerZoomState;
488
545
  subscribe?: (listener: () => void) => () => void;
489
546
  }
@@ -513,7 +570,7 @@ export interface FileViewerViewState {
513
570
  extra?: Record<string, unknown>;
514
571
  }
515
572
  export type FileViewerViewStateChangeSource = 'initial' | 'api' | 'user' | 'viewer' | (string & {});
516
- export type FileViewerViewStateChangeAction = 'init' | 'restore' | 'page-change' | 'page-click' | 'page-step' | 'outline-click' | 'zoom-change' | 'zoom-in' | 'zoom-out' | 'zoom-reset' | 'rotation-change' | 'rotate-left' | 'rotate-right' | 'scroll' | 'navigation-toggle' | 'navigation-mode-change' | (string & {});
573
+ export type FileViewerViewStateChangeAction = 'init' | 'restore' | 'page-change' | 'page-click' | 'page-step' | 'outline-click' | 'zoom-change' | 'zoom-in' | 'zoom-out' | 'zoom-reset' | 'fit' | 'rotation-change' | 'rotate-left' | 'rotate-right' | 'scroll' | 'navigation-toggle' | 'navigation-mode-change' | (string & {});
517
574
  export interface FileViewerViewStateChange {
518
575
  state: FileViewerViewState;
519
576
  action: FileViewerViewStateChangeAction;
@@ -528,6 +585,7 @@ export interface FileViewerApplyViewStateOptions {
528
585
  export interface FileViewerViewStateProvider {
529
586
  getState: () => FileViewerViewState;
530
587
  applyState?: (state: FileViewerViewState, options?: FileViewerApplyViewStateOptions) => FileViewerViewState | Promise<FileViewerViewState>;
588
+ fit?: (request: FileViewerFitRequest) => FileViewerFitResult | Promise<FileViewerFitResult>;
531
589
  subscribe?: (listener: (change: FileViewerViewStateChange) => void) => () => void;
532
590
  }
533
591
  export interface FileViewerSearchMatch {
@@ -575,6 +633,10 @@ export interface FileViewerDocumentChunk {
575
633
  export interface FileViewerComponentProps {
576
634
  file?: FileViewerFileRef;
577
635
  url?: string;
636
+ name?: string;
637
+ filename?: string;
638
+ type?: string;
639
+ size?: number;
578
640
  options?: FileViewerOptions;
579
641
  }
580
642
  export interface FileViewerComponentEventMap {
@@ -589,6 +651,7 @@ export interface FileViewerComponentEventMap {
589
651
  'location-change': FileViewerDocumentAnchor | null;
590
652
  'zoom-change': FileViewerZoomState;
591
653
  'view-state-change': FileViewerViewStateChange;
654
+ 'fit-change': FileViewerFitResult;
592
655
  }
593
656
  export type FileViewerEventType = keyof FileViewerComponentEventMap;
594
657
  export type FileViewerEvent = {
@@ -610,14 +673,17 @@ export interface FileViewerComponentEmits {
610
673
  (event: 'location-change', anchor: FileViewerComponentEventMap['location-change']): void;
611
674
  (event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
612
675
  (event: 'view-state-change', change: FileViewerComponentEventMap['view-state-change']): void;
676
+ (event: 'fit-change', result: FileViewerComponentEventMap['fit-change']): void;
613
677
  }
614
678
  export interface FileViewerPublicApi {
679
+ destroy(): void;
615
680
  downloadOriginalFile(): Promise<void>;
616
681
  printRenderedHtml(): Promise<void>;
617
682
  exportRenderedHtml(): Promise<void>;
618
683
  zoomIn(): Promise<FileViewerZoomState>;
619
684
  zoomOut(): Promise<FileViewerZoomState>;
620
685
  resetZoom(): Promise<FileViewerZoomState>;
686
+ fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
621
687
  getZoomState(): FileViewerZoomState;
622
688
  getViewState(): FileViewerViewState | null;
623
689
  applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
@@ -667,8 +733,10 @@ export interface NormalizedFileViewerSource {
667
733
  size?: number;
668
734
  }
669
735
  export interface RenderSurface {
736
+ host?: HTMLElement;
670
737
  container: HTMLElement;
671
738
  shadowRoot?: ShadowRoot;
739
+ styleIsolation?: Exclude<FileViewerStyleIsolation, 'auto'>;
672
740
  }
673
741
  export interface RendererCapability {
674
742
  download?: boolean;
@@ -763,6 +831,7 @@ export interface FileViewerInstance {
763
831
  zoomIn(): Promise<FileViewerZoomState>;
764
832
  zoomOut(): Promise<FileViewerZoomState>;
765
833
  resetZoom(): Promise<FileViewerZoomState>;
834
+ fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
766
835
  getZoomState(): FileViewerZoomState;
767
836
  getViewState(): FileViewerViewState | null;
768
837
  applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
@@ -13,6 +13,7 @@ export const unregisterFileViewerSearchProvider = (host) => {
13
13
  delete host.__flyfishViewerSearchProvider;
14
14
  };
15
15
  export const findFileViewerSearchProvider = (root) => {
16
+ var _a;
16
17
  if (!root) {
17
18
  return null;
18
19
  }
@@ -20,7 +21,7 @@ export const findFileViewerSearchProvider = (root) => {
20
21
  if (direct) {
21
22
  return direct;
22
23
  }
23
- const host = root.querySelector('[data-viewer-search-provider]');
24
+ const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-search-provider]');
24
25
  return host
25
26
  ? searchProviderRegistry.get(host) || host.__flyfishViewerSearchProvider || null
26
27
  : null;
@@ -39,6 +40,7 @@ export const unregisterFileViewerZoomProvider = (host) => {
39
40
  delete host.__flyfishViewerZoomProvider;
40
41
  };
41
42
  export const findFileViewerZoomProvider = (root) => {
43
+ var _a;
42
44
  if (!root) {
43
45
  return null;
44
46
  }
@@ -46,7 +48,7 @@ export const findFileViewerZoomProvider = (root) => {
46
48
  if (direct) {
47
49
  return direct;
48
50
  }
49
- const host = root.querySelector('[data-viewer-zoom-provider]');
51
+ const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-zoom-provider]');
50
52
  return host
51
53
  ? zoomProviderRegistry.get(host) || host.__flyfishViewerZoomProvider || null
52
54
  : null;
@@ -65,6 +67,7 @@ export const unregisterFileViewerViewStateProvider = (host) => {
65
67
  delete host.__flyfishViewerViewStateProvider;
66
68
  };
67
69
  export const findFileViewerViewStateProvider = (root) => {
70
+ var _a;
68
71
  if (!root) {
69
72
  return null;
70
73
  }
@@ -73,7 +76,7 @@ export const findFileViewerViewStateProvider = (root) => {
73
76
  if (direct && root.dataset.viewerViewStateProvider !== 'generic') {
74
77
  return direct;
75
78
  }
76
- const hosts = Array.from(root.querySelectorAll('[data-viewer-view-state-provider]'));
79
+ const hosts = Array.from(((_a = root.querySelectorAll) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-view-state-provider]')) || []);
77
80
  const customHost = hosts.find(host => host.dataset.viewerViewStateProvider !== 'generic');
78
81
  const genericHost = hosts.find(host => host.dataset.viewerViewStateProvider === 'generic');
79
82
  const host = customHost || genericHost;
@@ -0,0 +1,46 @@
1
+ import type { FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerViewState, FileViewerViewStateChangeSource } from '../../contracts/types';
2
+ export declare const FILE_VIEWER_FIT_MODES: readonly ["auto", "contain", "cover", "width", "height", "actual", "scale-down"];
3
+ export declare const FILE_VIEWER_FIT_RESIZE_MODES: readonly ["until-interaction", "always", "initial"];
4
+ export interface NormalizedFileViewerFitOptions extends Required<Pick<FileViewerFitOptions, 'mode' | 'resize' | 'padding'>> {
5
+ minScale?: number;
6
+ maxScale?: number;
7
+ }
8
+ export interface ResolveFileViewerFitScaleInput {
9
+ mode: FileViewerFitMode;
10
+ viewportWidth: number;
11
+ viewportHeight: number;
12
+ contentWidth: number;
13
+ contentHeight: number;
14
+ currentScale?: number;
15
+ minScale?: number;
16
+ maxScale?: number;
17
+ }
18
+ export interface CreateFileViewerFitControllerOptions {
19
+ root: () => HTMLElement | null | undefined;
20
+ enabled?: () => boolean;
21
+ getFit?: () => FileViewerFitMode | FileViewerFitOptions | null | undefined;
22
+ onFit?: (result: FileViewerFitResult) => void;
23
+ }
24
+ export interface ApplyInitialFileViewerFitOptions {
25
+ skip?: boolean;
26
+ }
27
+ export interface RunFileViewerFitOptions {
28
+ source?: FileViewerViewStateChangeSource;
29
+ reason?: FileViewerFitRequest['reason'];
30
+ }
31
+ export interface FileViewerFitController {
32
+ normalize(fit?: FileViewerFitMode | FileViewerFitOptions | null): NormalizedFileViewerFitOptions | null;
33
+ fit(fit?: FileViewerFitMode | FileViewerFitOptions | null, options?: RunFileViewerFitOptions): Promise<FileViewerFitResult>;
34
+ applyInitialFit(options?: ApplyInitialFileViewerFitOptions): Promise<FileViewerFitResult>;
35
+ scheduleFit(reason?: FileViewerFitRequest['reason']): void;
36
+ observe(): void;
37
+ markUserInteraction(): void;
38
+ resetAutoFit(): void;
39
+ destroy(): void;
40
+ }
41
+ export declare const isFileViewerFitMode: (value: unknown) => value is FileViewerFitMode;
42
+ export declare const isFileViewerFitResize: (value: unknown) => value is FileViewerFitResize;
43
+ export declare const normalizeFileViewerFitOptions: (fit?: FileViewerFitMode | FileViewerFitOptions | null) => NormalizedFileViewerFitOptions | null;
44
+ export declare const resolveFileViewerFitScale: ({ mode, viewportWidth, viewportHeight, contentWidth, contentHeight, currentScale, minScale, maxScale, }: ResolveFileViewerFitScaleInput) => number | undefined;
45
+ export declare const hasFileViewerExplicitInitialViewState: (state?: FileViewerViewState | null) => boolean;
46
+ export declare const createFileViewerFitController: ({ root, enabled, getFit, onFit, }: CreateFileViewerFitControllerOptions) => FileViewerFitController;