@file-viewer/core 2.1.17 → 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 {
@@ -593,6 +651,7 @@ export interface FileViewerComponentEventMap {
593
651
  'location-change': FileViewerDocumentAnchor | null;
594
652
  'zoom-change': FileViewerZoomState;
595
653
  'view-state-change': FileViewerViewStateChange;
654
+ 'fit-change': FileViewerFitResult;
596
655
  }
597
656
  export type FileViewerEventType = keyof FileViewerComponentEventMap;
598
657
  export type FileViewerEvent = {
@@ -614,14 +673,17 @@ export interface FileViewerComponentEmits {
614
673
  (event: 'location-change', anchor: FileViewerComponentEventMap['location-change']): void;
615
674
  (event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
616
675
  (event: 'view-state-change', change: FileViewerComponentEventMap['view-state-change']): void;
676
+ (event: 'fit-change', result: FileViewerComponentEventMap['fit-change']): void;
617
677
  }
618
678
  export interface FileViewerPublicApi {
679
+ destroy(): void;
619
680
  downloadOriginalFile(): Promise<void>;
620
681
  printRenderedHtml(): Promise<void>;
621
682
  exportRenderedHtml(): Promise<void>;
622
683
  zoomIn(): Promise<FileViewerZoomState>;
623
684
  zoomOut(): Promise<FileViewerZoomState>;
624
685
  resetZoom(): Promise<FileViewerZoomState>;
686
+ fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
625
687
  getZoomState(): FileViewerZoomState;
626
688
  getViewState(): FileViewerViewState | null;
627
689
  applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
@@ -671,8 +733,10 @@ export interface NormalizedFileViewerSource {
671
733
  size?: number;
672
734
  }
673
735
  export interface RenderSurface {
736
+ host?: HTMLElement;
674
737
  container: HTMLElement;
675
738
  shadowRoot?: ShadowRoot;
739
+ styleIsolation?: Exclude<FileViewerStyleIsolation, 'auto'>;
676
740
  }
677
741
  export interface RendererCapability {
678
742
  download?: boolean;
@@ -767,6 +831,7 @@ export interface FileViewerInstance {
767
831
  zoomIn(): Promise<FileViewerZoomState>;
768
832
  zoomOut(): Promise<FileViewerZoomState>;
769
833
  resetZoom(): Promise<FileViewerZoomState>;
834
+ fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
770
835
  getZoomState(): FileViewerZoomState;
771
836
  getViewState(): FileViewerViewState | null;
772
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;