@file-viewer/core 2.1.25 → 2.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from '../contracts/types';
1
+ import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from '../contracts/types';
2
2
  export type FileViewerSerializableToolbarOptions = Omit<FileViewerToolbarOptions, 'beforeOperation' | 'beforeDownload' | 'beforePrint' | 'beforeExportHtml'>;
3
3
  export type FileViewerSerializableCadOptions = Omit<FileViewerCadOptions, 'workerUrl'> & {
4
4
  workerUrl?: string;
@@ -9,6 +9,8 @@ export interface FileViewerSerializableOptions extends Omit<FileViewerOptions, '
9
9
  cad?: FileViewerSerializableCadOptions;
10
10
  }
11
11
  export declare const normalizeFileViewerTheme: (theme: FileViewerThemeMode | undefined) => FileViewerThemeMode;
12
+ export declare const resolveFileViewerColorScheme: (theme: FileViewerThemeMode | undefined, systemDark?: boolean) => FileViewerResolvedThemeMode;
13
+ export declare const toggleFileViewerColorScheme: (theme: FileViewerThemeMode | undefined, systemDark?: boolean) => FileViewerResolvedThemeMode;
12
14
  export declare const normalizeFileViewerUiDensity: (density: FileViewerUiDensity | undefined) => FileViewerUiDensity;
13
15
  export declare const resolveFileViewerUiDensity: (options?: Pick<FileViewerOptions, "ui"> | null) => FileViewerUiDensity;
14
16
  export declare const sanitizeFileViewerOptions: (options?: FileViewerOptions | FileViewerSerializableOptions | null) => FileViewerSerializableOptions | undefined;
@@ -51,6 +51,19 @@ const stripExecutionOnlyOptions = (value) => {
51
51
  export const normalizeFileViewerTheme = (theme) => {
52
52
  return theme === 'light' || theme === 'dark' || theme === 'system' ? theme : 'system';
53
53
  };
54
+ const readSystemDarkMode = () => {
55
+ return typeof globalThis.matchMedia === 'function' &&
56
+ globalThis.matchMedia('(prefers-color-scheme: dark)').matches;
57
+ };
58
+ export const resolveFileViewerColorScheme = (theme, systemDark = readSystemDarkMode()) => {
59
+ const normalizedTheme = normalizeFileViewerTheme(theme);
60
+ return normalizedTheme === 'system'
61
+ ? (systemDark ? 'dark' : 'light')
62
+ : normalizedTheme;
63
+ };
64
+ export const toggleFileViewerColorScheme = (theme, systemDark = readSystemDarkMode()) => {
65
+ return resolveFileViewerColorScheme(theme, systemDark) === 'dark' ? 'light' : 'dark';
66
+ };
54
67
  export const normalizeFileViewerUiDensity = (density) => {
55
68
  return density === 'compact' ? 'compact' : 'comfortable';
56
69
  };
@@ -1,8 +1,9 @@
1
1
  export type FileViewerSourceKind = 'file' | 'url' | 'buffer' | 'empty';
2
2
  export type FileViewerThemeMode = 'light' | 'dark' | 'system';
3
+ export type FileViewerResolvedThemeMode = Exclude<FileViewerThemeMode, 'system'>;
3
4
  export type FileViewerLocale = 'auto' | 'zh-CN' | 'en-US' | (string & {});
4
5
  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.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' | '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';
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' | '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
7
  export type FileViewerMessageParams = Record<string, string | number | boolean | null | undefined>;
7
8
  export type FileViewerMessageResolver = (key: FileViewerMessageKey, params: FileViewerMessageParams, locale: FileViewerLocale) => string | undefined;
8
9
  export type FileViewerMessages = Partial<Record<FileViewerMessageKey, string>> | FileViewerMessageResolver;
@@ -23,8 +24,8 @@ export interface FileViewerFitOptions {
23
24
  }
24
25
  export type FileViewerLifecyclePhase = 'load-start' | 'load-complete' | 'unload-start' | 'unload-complete';
25
26
  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';
27
+ export type FileViewerToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml' | 'export-html' | 'theme';
28
+ export type FileViewerResolvedToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml' | 'theme';
28
29
  export type FileViewerToolbarActionMap = Partial<Record<FileViewerOperationType, boolean>>;
29
30
  export type FileViewerRenderStateKind = 'idle' | 'loading' | 'ready' | 'empty' | 'unsupported' | 'error';
30
31
  export type FileViewerRendererCategory = 'office' | 'document' | 'archive' | 'email' | 'eda' | 'cad' | 'model' | 'geo' | 'drawing' | 'mindmap' | 'ebook' | 'image' | 'markdown' | 'code' | 'media' | 'asset' | 'fallback';
@@ -48,6 +49,8 @@ export interface FileViewerToolbarOptions {
48
49
  exportHtml?: boolean;
49
50
  zoom?: boolean;
50
51
  search?: boolean;
52
+ /** Shows a manual light/dark mode toggle without changing the host page theme. */
53
+ theme?: boolean;
51
54
  /** Built-in toolbar group order. Missing entries keep their default relative order. */
52
55
  order?: FileViewerToolbarItem[];
53
56
  /** Controls which built-in toolbar actions are displayed without disabling controller APIs. */
@@ -119,10 +122,33 @@ export interface FileViewerPdfOptions {
119
122
  streaming?: boolean | 'same-origin';
120
123
  rangeChunkSize?: number;
121
124
  withCredentials?: boolean;
125
+ /**
126
+ * Base URL for the self-hosted PDF worker, cMaps, WASM, standard fonts, and
127
+ * CJK fallback fonts. Useful for SPA routes whose document URL is deeper
128
+ * than the deployment public path, for example `/workspace/c/`.
129
+ */
130
+ assetBaseUrl?: string | URL;
122
131
  workerUrl?: string;
123
132
  cMapUrl?: string;
124
133
  wasmUrl?: string;
125
134
  standardFontDataUrl?: string;
135
+ /**
136
+ * Enables the self-hosted CJK fallback used when a PDF references a font
137
+ * such as Microsoft YaHei without embedding the font data. Defaults to true.
138
+ */
139
+ cjkFontFallback?: boolean;
140
+ /**
141
+ * Repairs malformed Identity-H/V CJK fonts that omit ToUnicode when the PDF
142
+ * also embeds a usable same-family TrueType cmap. Defaults to true. The
143
+ * repair is applied only to the in-memory preview and never changes the
144
+ * original file used by download operations.
145
+ */
146
+ identityFontRepair?: boolean;
147
+ /**
148
+ * Directory containing `noto-sans-sc.css`, its `files/` font shards, and
149
+ * the bundled font license. The path is resolved against the document base.
150
+ */
151
+ cjkFontFallbackPath?: string;
126
152
  }
127
153
  export interface FileViewerDocxOptions {
128
154
  worker?: boolean;
@@ -160,6 +186,28 @@ export interface FileViewerPresentationOptions {
160
186
  workerType?: WorkerType;
161
187
  }
162
188
  export type FileRenderExportMode = 'export' | 'print';
189
+ export type FileViewerRenderPurpose = 'preview' | 'thumbnail';
190
+ export type FileViewerThumbnailFormat = 'webp' | 'jpeg' | 'png';
191
+ export type FileViewerThumbnailFit = 'contain' | 'cover';
192
+ export interface FileViewerThumbnailCaptureOptions {
193
+ width: number;
194
+ height: number;
195
+ format: FileViewerThumbnailFormat;
196
+ quality: number;
197
+ fit: FileViewerThumbnailFit;
198
+ background: string;
199
+ signal?: AbortSignal;
200
+ }
201
+ export interface FileRenderThumbnailAdapter {
202
+ /** Prepare lazy content immediately before capture. */
203
+ beforeCapture?: (options: FileViewerThumbnailCaptureOptions) => void | Promise<void>;
204
+ /** Identifies a capture result that comes from packaged metadata rather than rendered content. */
205
+ captureSource?: 'embedded' | 'rendered';
206
+ /** A renderer-native fast path. Returning null delegates to the DOM fallback. */
207
+ capture?: (options: FileViewerThumbnailCaptureOptions) => Blob | null | Promise<Blob | null>;
208
+ /** The first page/slide/sheet/cover element used by the DOM fallback. */
209
+ getTarget?: (options: FileViewerThumbnailCaptureOptions) => Element | null | Promise<Element | null>;
210
+ }
163
211
  export interface FileRenderExportOptions {
164
212
  mode: FileRenderExportMode;
165
213
  title: string;
@@ -176,9 +224,12 @@ export interface FileRenderContext {
176
224
  filename?: string;
177
225
  url?: string;
178
226
  streamUrl?: string;
227
+ signal?: AbortSignal;
179
228
  options?: FileViewerOptions;
180
229
  surface?: RenderSurface;
181
230
  registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
231
+ registerThumbnailAdapter?: (adapter: FileRenderThumbnailAdapter | null) => void;
232
+ renderPurpose?: FileViewerRenderPurpose;
182
233
  onProgressiveRender?: () => void;
183
234
  renderNestedBuffer?: (buffer: ArrayBuffer, type: string, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance | undefined>;
184
235
  }
@@ -380,6 +431,14 @@ export interface FileViewerAiOptions {
380
431
  chunkSize?: number;
381
432
  chunkOverlap?: number;
382
433
  }
434
+ export interface FileViewerTextOptions {
435
+ /** Switches text/code/Markdown to bounded virtual rendering above this byte size. Defaults to 512 KiB. */
436
+ virtualizeAboveBytes?: number;
437
+ /** Maximum source bytes mounted for one very long logical line at a time. Defaults to 16 KiB. */
438
+ maxRenderedLineBytes?: number;
439
+ /** Extra logical lines mounted above and below the visible viewport. Defaults to 12. */
440
+ virtualOverscanLines?: number;
441
+ }
383
442
  export type FileViewerUiDensity = 'comfortable' | 'compact';
384
443
  export interface FileViewerUiOptions {
385
444
  /**
@@ -460,6 +519,7 @@ export interface FileViewerOptions {
460
519
  toolbar?: boolean | FileViewerToolbarOptions;
461
520
  search?: boolean | FileViewerSearchOptions;
462
521
  ai?: boolean | FileViewerAiOptions;
522
+ text?: FileViewerTextOptions;
463
523
  /**
464
524
  * Explicit content fitting strategy. When omitted, each renderer keeps its
465
525
  * historical first-screen behavior for backward compatibility.
@@ -681,6 +741,7 @@ export interface FileViewerComponentEventMap {
681
741
  'zoom-change': FileViewerZoomState;
682
742
  'view-state-change': FileViewerViewStateChange;
683
743
  'fit-change': FileViewerFitResult;
744
+ 'theme-change': FileViewerResolvedThemeMode;
684
745
  }
685
746
  export type FileViewerEventType = keyof FileViewerComponentEventMap;
686
747
  export type FileViewerEvent = {
@@ -703,6 +764,7 @@ export interface FileViewerComponentEmits {
703
764
  (event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
704
765
  (event: 'view-state-change', change: FileViewerComponentEventMap['view-state-change']): void;
705
766
  (event: 'fit-change', result: FileViewerComponentEventMap['fit-change']): void;
767
+ (event: 'theme-change', theme: FileViewerComponentEventMap['theme-change']): void;
706
768
  }
707
769
  export interface FileViewerPublicApi {
708
770
  destroy(): void;
@@ -809,6 +871,7 @@ export interface RendererLoadContext {
809
871
  options: FileViewerOptions;
810
872
  signal?: AbortSignal;
811
873
  registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
874
+ registerThumbnailAdapter?: (adapter: FileRenderThumbnailAdapter | null) => void;
812
875
  renderContext?: FileRenderContext;
813
876
  }
814
877
  export interface RendererSession {
@@ -860,9 +923,15 @@ export interface FileViewerRendererPreset<Handler = FileRenderHandler> {
860
923
  }
861
924
  export type FileViewerRendererPluginInput<Handler = FileRenderHandler> = FileViewerRendererPlugin<Handler> | FileViewerRendererPreset<Handler> | readonly FileViewerRendererPluginInput<Handler>[];
862
925
  export type FileViewerRendererPresetInput<Handler = FileRenderHandler> = FileViewerRendererPresetName | FileViewerRendererPluginInput<Handler> | readonly FileViewerRendererPresetInput<Handler>[];
926
+ export interface FileViewerLoadOptions {
927
+ signal?: AbortSignal;
928
+ }
863
929
  export interface FileViewerInstance {
864
930
  readonly container: HTMLElement;
865
- load(source: FileViewerSource): Promise<RendererSession | null>;
931
+ /** Installs configured renderer plugins without loading a document. */
932
+ prepare?(): Promise<void>;
933
+ load(source: FileViewerSource, options?: FileViewerLoadOptions): Promise<RendererSession | null>;
934
+ unload?(reason?: FileViewerLifecycleContext['reason']): Promise<void>;
866
935
  destroy(reason?: FileViewerLifecycleContext['reason']): Promise<void>;
867
936
  updateOptions(options: Partial<FileViewerOptions>): void;
868
937
  getCapabilities(extension?: string): FileViewerOperationAvailability;
@@ -870,6 +939,8 @@ export interface FileViewerInstance {
870
939
  getSource(): NormalizedFileViewerSource | null;
871
940
  registerExportAdapter(adapter: FileRenderExportAdapter | null): void;
872
941
  getExportAdapter(): FileRenderExportAdapter | null;
942
+ registerThumbnailAdapter?(adapter: FileRenderThumbnailAdapter | null): void;
943
+ getThumbnailAdapter?(): FileRenderThumbnailAdapter | null;
873
944
  download(options?: FileViewerDownloadOptions): Promise<void>;
874
945
  exportHtml(options?: FileViewerExportHtmlOptions): Promise<string>;
875
946
  print(options?: FileViewerPrintOptions): Promise<void>;
@@ -322,7 +322,10 @@ export const createFileViewerDomSearchController = ({ root, options, waitForDomU
322
322
  disconnectObserver();
323
323
  const currentRoot = root();
324
324
  const MutationObserverCtor = getMutationObserverConstructor(currentRoot);
325
- if (!shouldObserve || !currentRoot || !MutationObserverCtor) {
325
+ if (!shouldObserve ||
326
+ !currentRoot ||
327
+ !MutationObserverCtor ||
328
+ findFileViewerSearchProvider(currentRoot)) {
326
329
  return;
327
330
  }
328
331
  observer = new MutationObserverCtor(rerunAfterDomChange);
@@ -7,7 +7,7 @@ export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_
7
7
  export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages';
8
8
  export type { FileViewerI18nInput, FileViewerResolvedLocale, ResolveFileViewerI18nInput, } from './i18n/messages';
9
9
  export type { BuildFileViewerLifecycleContextFromNormalizedSourceInput, BuildFileViewerOperationContextFromLifecycleStateInput, BuildFileViewerLifecycleContextInput, BuiltFileViewerLifecycleContext, BuiltFileViewerOperationContext, CreateFileViewerLifecycleActionsInput, CreateFileViewerPublicApiInput, CreateFileViewerToolbarActionsInput, CreateFileViewerToolbarControllerActionHandlersInput, DispatchFileViewerLifecycleEventInput, DispatchFileViewerOperationAvailabilityChangeInput, DispatchFileViewerOperationContextEventInput, DispatchFileViewerZoomChangeInput, FileViewerActiveUnloadState, FileViewerLifecycleActions, FileViewerLifecycleComponentEmit, FileViewerLifecycleHookErrorLogger, FileViewerLifecycleStateController, FileViewerOperationErrorLogger, FileViewerToolbarActions, FileViewerToolbarControllerActionHandlers, FileViewerToolbarState, FileViewerToolbarZoomSyncSnapshot, FileViewerZoomButtonAction, ReportFileViewerLifecycleHookErrorInput, ReportFileViewerOperationErrorInput, ResolveFileViewerBeforeOperationErrorMessageInput, ResolveFileViewerLifecycleHookErrorMessageInput, ResolveFileViewerOperationAvailabilityInput, ResolveFileViewerToolbarStateInput, RunFileViewerActiveUnloadCompleteInput, RunFileViewerActiveUnloadStartInput, RunFileViewerBeforeOperationInput, RunFileViewerToolbarAvailabilitySyncInput, RunFileViewerToolbarZoomSyncInput, SerializedFileViewerContext, } from './lifecycle/operations';
10
- export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
10
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options';
11
11
  export type { FileViewerSerializableCadOptions, FileViewerSerializableOptions, FileViewerSerializableToolbarOptions, } from './config/options';
12
12
  export { resolveFileViewerPresentationState, } from './presentation/state';
13
13
  export type { FileViewerPresentationState, ResolveFileViewerPresentationStateInput, } from './presentation/state';
@@ -24,4 +24,4 @@ export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRI
24
24
  export type { FileViewerErrorMessageFormatter, } from './viewer/state';
25
25
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
26
26
  export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
27
- export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
27
+ export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerTextOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/headless.js CHANGED
@@ -9,7 +9,7 @@ export { DEFAULT_FILE_VIEWER_TEXT_CHUNK_OVERLAP, DEFAULT_FILE_VIEWER_TEXT_CHUNK_
9
9
  export { ARCHIVE_EXTENSIONS, DEFAULT_RENDERER_DEFINITIONS, DEFAULT_SUPPORTED_EXTENSIONS, IMAGE_EXTENSIONS, MODEL_EXTENSIONS, TEXT_EXTENSIONS, } from './registry/formats.js';
10
10
  export { FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerOperationContextEvent, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarPosition, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
11
11
  export { FILE_VIEWER_BUILTIN_MESSAGES, FILE_VIEWER_DEFAULT_LOCALE, FILE_VIEWER_FALLBACK_LOCALE, createFileViewerTranslator, formatFileViewerMessage, normalizeFileViewerLocale, resolveFileViewerLocale, translateFileViewerMessage, } from './i18n/messages.js';
12
- export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
12
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options.js';
13
13
  export { resolveFileViewerPresentationState, } from './presentation/state.js';
14
14
  export { createRendererRegistry, } from './registry/registry.js';
15
15
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher.js';
@@ -24,6 +24,9 @@ const ZH_CN_MESSAGES = {
24
24
  'toolbar.searchPrevious': '上一个匹配',
25
25
  'toolbar.searchNext': '下一个匹配',
26
26
  'toolbar.searchClear': '清除搜索',
27
+ 'toolbar.theme': '主题',
28
+ 'toolbar.themeToLight': '切换为浅色模式',
29
+ 'toolbar.themeToDark': '切换为深色模式',
27
30
  'state.ready.title': '预览完成',
28
31
  'state.ready.message': '文件内容已完成渲染。',
29
32
  'state.empty.title': '暂无文件',
@@ -251,6 +254,12 @@ const ZH_CN_MESSAGES = {
251
254
  'drawing.toolbar.fitWidth': '适合宽度',
252
255
  'drawing.state.loading': '正在加载绘图预览...',
253
256
  'text.code.loadingHighlight': '正在加载高亮...',
257
+ 'text.code.indexingLargeFile': '正在建立大文件索引 {progress}%',
258
+ 'text.code.virtualized': '大文件 · 虚拟滚动 · 已关闭高亮',
259
+ 'text.code.firstSegment': '首段',
260
+ 'text.code.previousSegment': '上一段',
261
+ 'text.code.nextSegment': '下一段',
262
+ 'text.code.lastSegment': '末段',
254
263
  'ebook.toc': '目录',
255
264
  'ebook.reading': '阅读中',
256
265
  'ebook.itemCount': '{count} 项',
@@ -434,6 +443,9 @@ const EN_US_MESSAGES = {
434
443
  'toolbar.searchPrevious': 'Previous match',
435
444
  'toolbar.searchNext': 'Next match',
436
445
  'toolbar.searchClear': 'Clear search',
446
+ 'toolbar.theme': 'Theme',
447
+ 'toolbar.themeToLight': 'Switch to light mode',
448
+ 'toolbar.themeToDark': 'Switch to dark mode',
437
449
  'state.ready.title': 'Preview ready',
438
450
  'state.ready.message': 'The file has been rendered.',
439
451
  'state.empty.title': 'No file selected',
@@ -661,6 +673,12 @@ const EN_US_MESSAGES = {
661
673
  'drawing.toolbar.fitWidth': 'Fit width',
662
674
  'drawing.state.loading': 'Loading drawing preview...',
663
675
  'text.code.loadingHighlight': 'Loading syntax highlighting...',
676
+ 'text.code.indexingLargeFile': 'Indexing large file {progress}%',
677
+ 'text.code.virtualized': 'Large file · virtual scrolling · highlighting off',
678
+ 'text.code.firstSegment': 'First segment',
679
+ 'text.code.previousSegment': 'Previous segment',
680
+ 'text.code.nextSegment': 'Next segment',
681
+ 'text.code.lastSegment': 'Last segment',
664
682
  'ebook.toc': 'Table of contents',
665
683
  'ebook.reading': 'Reading',
666
684
  'ebook.itemCount': '{count} items',
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ export { FALLBACK_FILE_VIEWER_LOADING_THEME, FILE_VIEWER_LOADING_THEME_MAP, appl
55
55
  export type { FileViewerLoadingController, FileViewerLoadingControllerActionHandlers, RunFileViewerLoadingExtensionSyncInput, } from './viewer/loading';
56
56
  export { createFileViewerLifecycleFacade, } from './lifecycle/facade';
57
57
  export type { BuildFileViewerLifecycleFacadeLoadStartStateInput, BuildFileViewerLifecycleFacadeRenderCompleteStateInput, CreateFileViewerLifecycleFacadeInput, FileViewerLifecycleFacade, } from './lifecycle/facade';
58
- export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options';
58
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options';
59
59
  export { resolveFileViewerPresentationState, } from './presentation/state';
60
60
  export type { FileViewerPresentationState, ResolveFileViewerPresentationStateInput, } from './presentation/state';
61
61
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher';
@@ -88,4 +88,4 @@ export type { CreateFileViewerZoomControllerOptions, FileViewerZoomOperation, }
88
88
  export type { CreateViewerOptions } from './viewer/createViewer';
89
89
  export type { BuildExportHtmlDocumentOptions, BuildFileViewerRenderedHtmlDocumentOptions, } from './output/export';
90
90
  export type { CreateFileViewerWorkerControllerOptions, FileViewerWorkerContext, FileViewerWorkerController, FileViewerWorkerErrorHook, FileViewerWorkerEventHandler, FileViewerWorkerFactory, FileViewerWorkerMessageHook, WorkerProvider, WorkerRef, } from './platform/worker';
91
- export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
91
+ export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLoadOptions, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRenderPurpose, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerThumbnailCaptureOptions, FileViewerThumbnailFit, FileViewerThumbnailFormat, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerTextOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/index.js CHANGED
@@ -166,7 +166,7 @@ export { ADAPTER_PRINT_REQUIRED_EXTENSIONS, applyFileViewerZoomAvailability, cre
166
166
  export { FILE_VIEWER_LIFECYCLE_HOOKS, FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX, DEFAULT_FILE_VIEWER_TOOLBAR_ORDER, FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX, FILE_VIEWER_OPERATION_LABELS, buildFileViewerLifecycleContext, buildFileViewerLifecycleContextFromNormalizedSource, buildFileViewerOperationContext, buildFileViewerOperationContextFromLifecycleState, cloneFileViewerOperationAvailability, createFileViewerLifecycleActions, createFileViewerLifecycleStateController, createFileViewerPublicApi, createFileViewerToolbarActions, createFileViewerToolbarControllerActionHandlers, createFileViewerToolbarZoomSyncSnapshot, DEFAULT_FILE_VIEWER_LIFECYCLE_HOOK_ERROR_LOGGER, DEFAULT_FILE_VIEWER_OPERATION_ERROR_LOGGER, dispatchFileViewerLifecycleEvent, dispatchFileViewerOperationContextEvent, dispatchFileViewerOperationAvailabilityChange, dispatchFileViewerZoomChange, emitFileViewerComponentLifecycleEvent, getFileViewerBeforeOperationHooks, getFileViewerLifecycleHookName, hasVisibleFileViewerToolbarActions, isFileViewerToolbarOperationPermitted, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, reportFileViewerLifecycleHookError, reportFileViewerOperationError, resolveFileViewerLifecycleFallbackSource, resolveFileViewerLifecycleHookErrorMessage, resolveFileViewerBeforeOperationErrorMessage, resolveFileViewerOperationAvailability, resolveFileViewerToolbarOrder, resolveFileViewerToolbarState, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, runFileViewerActiveUnloadComplete, runFileViewerActiveUnloadStart, runFileViewerBeforeOperation, runFileViewerLifecycleHook, runFileViewerToolbarAvailabilitySync, runFileViewerToolbarZoomSync, serializeFileViewerContext, } from './lifecycle/operations.js';
167
167
  export { FALLBACK_FILE_VIEWER_LOADING_THEME, FILE_VIEWER_LOADING_THEME_MAP, applyFileViewerLoadingState, cloneFileViewerLoadingState, createFileViewerLoadingController, createFileViewerLoadingControllerActionHandlers, createFileViewerLoadingState, createFileViewerLoadingStyleVars, runFileViewerLoadingControllerAction, runFileViewerLoadingExtensionSync, resolveFileViewerLoadingTheme, syncFileViewerLoadingControllerState, } from './viewer/loading.js';
168
168
  export { createFileViewerLifecycleFacade, } from './lifecycle/facade.js';
169
- export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, } from './config/options.js';
169
+ export { getFileViewerOptionsSearchParam, normalizeFileViewerUiDensity, normalizeFileViewerTheme, parseFileViewerOptions, resolveFileViewerColorScheme, resolveFileViewerUiDensity, sanitizeFileViewerOptions, serializeFileViewerOptions, setFileViewerOptionsSearchParam, toggleFileViewerColorScheme, } from './config/options.js';
170
170
  export { resolveFileViewerPresentationState, } from './presentation/state.js';
171
171
  export { createFileViewerRendererDispatcher, } from './rendering/dispatcher.js';
172
172
  export { appendFileViewerStyle, buildFileRenderContextFromLoadContext, applyFileViewerRenderSurfaceState, clearFileViewerRenderSurface, createFileRenderHandlerRendererSession, createFileRenderHandlerRegistry, createFileRenderHandlerLoader, createFileViewerRenderSurfaceActionHandlers, createFileViewerRenderReadinessTarget, createFileViewerRenderSurface, createFileViewerRenderSurfaceState, createFileViewerRenderSurfaceStateTarget, createFileViewerRenderTarget, DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS, DEFAULT_FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_LOGGER, FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE, disposeActiveFileViewerRendererSession, disposeFileViewerRendered, disposeFileViewerRendererSession, getFileViewerShadowRootForNode, isFileViewerShadowRoot, normalizeFileViewerStyleIsolation, removeFileViewerRenderTarget, reportFileViewerRenderSessionDisposeError, resetFileViewerRenderSurface, resolveFileViewerStyleIsolation, resolveFileViewerRenderSessionDisposeErrorMessage, runFileViewerRenderSurfaceClear, runFileViewerRenderSurfaceMount, renderFileViewerHandler, } from './rendering/handler.js';
@@ -18,7 +18,7 @@ export declare const FILE_VIEWER_OPERATION_LABELS: {
18
18
  };
19
19
  export declare const FILE_VIEWER_BEFORE_OPERATION_ERROR_PREFIX = "\u64CD\u4F5C\u524D\u7F6E\u6821\u9A8C\u5931\u8D25";
20
20
  export declare const FILE_VIEWER_LIFECYCLE_HOOK_ERROR_MESSAGE_PREFIX = "FileViewer";
21
- export declare const DEFAULT_FILE_VIEWER_TOOLBAR_ORDER: readonly ["search", "zoom", "download", "print", "exportHtml"];
21
+ export declare const DEFAULT_FILE_VIEWER_TOOLBAR_ORDER: readonly ["search", "zoom", "download", "print", "exportHtml", "theme"];
22
22
  export interface FileViewerLifecycleComponentEmit {
23
23
  (event: 'load-start', context: FileViewerLifecycleContext): void;
24
24
  (event: 'load-complete', context: FileViewerLifecycleContext): void;
@@ -35,6 +35,7 @@ export const DEFAULT_FILE_VIEWER_TOOLBAR_ORDER = [
35
35
  'download',
36
36
  'print',
37
37
  'exportHtml',
38
+ 'theme',
38
39
  ];
39
40
  export const buildFileViewerLifecycleContext = ({ phase, version, source, filename, file, url, size, bufferSize, startedAt, duration, timestamp, reason, }) => {
40
41
  var _a;
@@ -257,6 +258,9 @@ const normalizeFileViewerToolbarItem = (item) => {
257
258
  if (item === 'exportHtml' || item === 'export-html') {
258
259
  return 'exportHtml';
259
260
  }
261
+ if (item === 'theme') {
262
+ return 'theme';
263
+ }
260
264
  return undefined;
261
265
  };
262
266
  export const resolveFileViewerToolbarOrder = (toolbar) => {
@@ -498,6 +502,7 @@ export const normalizeFileViewerToolbar = (options) => {
498
502
  exportHtml: false,
499
503
  zoom: false,
500
504
  search: false,
505
+ theme: false,
501
506
  order: resolveFileViewerToolbarOrder(undefined),
502
507
  };
503
508
  }
@@ -508,6 +513,7 @@ export const normalizeFileViewerToolbar = (options) => {
508
513
  exportHtml: toolbar.exportHtml !== false && isFileViewerToolbarOperationVisible(toolbar, 'export-html'),
509
514
  zoom: toolbar.zoom !== false && hasAnyToolbarZoomOperation(toolbar),
510
515
  search: toolbar.search !== false,
516
+ theme: toolbar.theme !== false,
511
517
  order: resolveFileViewerToolbarOrder(toolbar),
512
518
  items: toolbar.items,
513
519
  permissions: toolbar.permissions,
@@ -524,6 +530,7 @@ export const normalizeFileViewerToolbar = (options) => {
524
530
  exportHtml: true,
525
531
  zoom: true,
526
532
  search: true,
533
+ theme: true,
527
534
  order: resolveFileViewerToolbarOrder(undefined),
528
535
  };
529
536
  };
@@ -556,10 +563,11 @@ export const resolveVisibleFileViewerToolbar = (toolbar, availability) => {
556
563
  print: toolbar.print && availability.print,
557
564
  exportHtml: toolbar.exportHtml && availability.exportHtml,
558
565
  zoom: toolbar.zoom && availability.zoom,
566
+ theme: toolbar.theme !== false,
559
567
  };
560
568
  };
561
569
  export const hasVisibleFileViewerToolbarActions = (toolbar) => {
562
- return !!(toolbar.download || toolbar.print || toolbar.exportHtml || toolbar.zoom);
570
+ return !!(toolbar.download || toolbar.print || toolbar.exportHtml || toolbar.zoom || toolbar.theme);
563
571
  };
564
572
  export const isFileViewerZoomButtonDisabled = ({ toolbarDisabled = false, availability, zoomState, action, }) => {
565
573
  const operation = FILE_VIEWER_ZOOM_BUTTON_OPERATIONS[action];
@@ -9,6 +9,7 @@ export declare const DEFAULT_FILE_VIEWER_PDF_WORKER_PATH = "vendor/pdf/pdf.worke
9
9
  export declare const DEFAULT_FILE_VIEWER_PDF_CMAP_PATH = "vendor/pdf/cmaps/";
10
10
  export declare const DEFAULT_FILE_VIEWER_PDF_WASM_PATH = "vendor/pdf/wasm/";
11
11
  export declare const DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH = "vendor/pdf/standard_fonts/";
12
+ export declare const DEFAULT_FILE_VIEWER_PDF_CJK_FONT_FALLBACK_PATH = "vendor/pdf/fonts/";
12
13
  export declare const DEFAULT_FILE_VIEWER_DRAWIO_VIEWER_SCRIPT_PATH = "vendor/drawio/viewer-static.min.js";
13
14
  export declare const DEFAULT_FILE_VIEWER_DRAWIO_ASSET_PATH = "vendor/drawio/";
14
15
  export declare const DEFAULT_FILE_VIEWER_CAD_WASM_PATH = "wasm/cad/";
@@ -38,10 +39,11 @@ export interface ResolvedFileViewerPdfAssetUrls {
38
39
  cMapUrl: string;
39
40
  wasmUrl: string;
40
41
  standardFontDataUrl: string;
42
+ cjkFontFallbackPath: string;
41
43
  }
42
44
  export type FileViewerRendererAssetKind = 'directory' | 'worker' | 'wasm' | 'wasm-directory' | 'script' | 'bundled-wasm';
43
45
  export type FileViewerRendererAssetTarget = 'public' | 'bundled' | 'external';
44
- export type FileViewerRendererAssetOptionPath = 'archive.workerUrl' | 'archive.wasmUrl' | 'cad.wasmPath' | 'cad.workerUrl' | 'cad.dwfWasmUrl' | 'data.sqlWasmUrl' | 'docx.workerJsZipUrl' | 'docx.workerUrl' | 'drawing.viewerScriptUrl' | 'pdf.workerUrl' | 'pdf.cMapUrl' | 'pdf.wasmUrl' | 'pdf.standardFontDataUrl' | 'presentation.workerUrl' | 'spreadsheet.workerUrl' | 'typst.compilerWasmUrl' | 'typst.fontAssetsUrl' | 'typst.rendererWasmUrl';
46
+ export type FileViewerRendererAssetOptionPath = 'archive.workerUrl' | 'archive.wasmUrl' | 'cad.wasmPath' | 'cad.workerUrl' | 'cad.dwfWasmUrl' | 'data.sqlWasmUrl' | 'docx.workerJsZipUrl' | 'docx.workerUrl' | 'drawing.viewerScriptUrl' | 'pdf.workerUrl' | 'pdf.cMapUrl' | 'pdf.wasmUrl' | 'pdf.standardFontDataUrl' | 'pdf.cjkFontFallbackPath' | 'presentation.workerUrl' | 'spreadsheet.workerUrl' | 'typst.compilerWasmUrl' | 'typst.fontAssetsUrl' | 'typst.rendererWasmUrl';
45
47
  export interface FileViewerRendererAssetDefinition {
46
48
  id: string;
47
49
  rendererId: string;
@@ -71,7 +73,7 @@ export declare const resolveFileViewerAssetUrl: (value: string | URL | undefined
71
73
  export declare const resolveFileViewerArchiveWorkerUrl: (options?: Pick<FileViewerArchiveOptions, "workerUrl"> | null, baseUrl?: string) => string;
72
74
  export declare const resolveFileViewerArchiveWasmUrl: (options?: Pick<FileViewerArchiveOptions, "wasmUrl"> | null, fallback?: string) => string;
73
75
  export declare const resolveFileViewerCadAssetUrls: (options?: Pick<FileViewerCadOptions, "wasmPath" | "workerUrl" | "dwfWasmUrl"> | null, documentBaseUrl?: string) => ResolvedFileViewerCadAssetUrls;
74
- export declare const resolveFileViewerPdfAssetUrls: (options?: Pick<FileViewerPdfOptions, "workerUrl" | "cMapUrl" | "wasmUrl" | "standardFontDataUrl"> | null, documentBaseUrl?: string) => ResolvedFileViewerPdfAssetUrls;
76
+ export declare const resolveFileViewerPdfAssetUrls: (options?: Pick<FileViewerPdfOptions, "assetBaseUrl" | "workerUrl" | "cMapUrl" | "wasmUrl" | "standardFontDataUrl" | "cjkFontFallbackPath"> | null, documentBaseUrl?: string) => ResolvedFileViewerPdfAssetUrls;
75
77
  export declare const resolveFileViewerDrawioViewerScriptUrl: (options?: Pick<FileViewerDrawingOptions, "viewerScriptUrl"> | null, documentBaseUrl?: string) => string;
76
78
  export declare const resolveFileViewerDocxWorkerUrl: (options?: Pick<FileViewerDocxOptions, "workerUrl"> | null, documentBaseUrl?: string) => string;
77
79
  export declare const resolveFileViewerDocxWorkerJsZipUrl: (options?: Pick<FileViewerDocxOptions, "workerJsZipUrl"> | null, documentBaseUrl?: string) => string;
@@ -8,6 +8,7 @@ export const DEFAULT_FILE_VIEWER_PDF_WORKER_PATH = 'vendor/pdf/pdf.worker.mjs';
8
8
  export const DEFAULT_FILE_VIEWER_PDF_CMAP_PATH = 'vendor/pdf/cmaps/';
9
9
  export const DEFAULT_FILE_VIEWER_PDF_WASM_PATH = 'vendor/pdf/wasm/';
10
10
  export const DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH = 'vendor/pdf/standard_fonts/';
11
+ export const DEFAULT_FILE_VIEWER_PDF_CJK_FONT_FALLBACK_PATH = 'vendor/pdf/fonts/';
11
12
  export const DEFAULT_FILE_VIEWER_DRAWIO_VIEWER_SCRIPT_PATH = 'vendor/drawio/viewer-static.min.js';
12
13
  export const DEFAULT_FILE_VIEWER_DRAWIO_ASSET_PATH = 'vendor/drawio/';
13
14
  export const DEFAULT_FILE_VIEWER_CAD_WASM_PATH = 'wasm/cad/';
@@ -77,10 +78,10 @@ export const DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS = [
77
78
  rendererId: 'pdf',
78
79
  kind: 'wasm-directory',
79
80
  target: 'public',
80
- required: false,
81
+ required: true,
81
82
  defaultPath: DEFAULT_FILE_VIEWER_PDF_WASM_PATH,
82
83
  optionPath: 'pdf.wasmUrl',
83
- description: 'Optional PDF.js WebAssembly helper directory when the bundled PDF.js version ships one.',
84
+ description: 'PDF.js WebAssembly helpers for image decoding and fully self-hosted PDF rendering.',
84
85
  },
85
86
  {
86
87
  id: 'pdf-standard-fonts',
@@ -92,6 +93,16 @@ export const DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS = [
92
93
  optionPath: 'pdf.standardFontDataUrl',
93
94
  description: 'PDF.js standard font data used when PDF files reference base fonts.',
94
95
  },
96
+ {
97
+ id: 'pdf-cjk-font-fallback',
98
+ rendererId: 'pdf',
99
+ kind: 'directory',
100
+ target: 'public',
101
+ required: true,
102
+ defaultPath: DEFAULT_FILE_VIEWER_PDF_CJK_FONT_FALLBACK_PATH,
103
+ optionPath: 'pdf.cjkFontFallbackPath',
104
+ description: 'Self-hosted Noto Sans SC variable font shards used for missing unembedded CJK fonts.',
105
+ },
95
106
  ],
96
107
  },
97
108
  {
@@ -300,17 +311,22 @@ export const resolveFileViewerCadAssetUrls = (options, documentBaseUrl) => {
300
311
  };
301
312
  };
302
313
  export const resolveFileViewerPdfAssetUrls = (options, documentBaseUrl) => {
314
+ const rawAssetBaseUrl = (options === null || options === void 0 ? void 0 : options.assetBaseUrl) ? String(options.assetBaseUrl) : '';
315
+ const assetBaseUrl = rawAssetBaseUrl
316
+ ? new URL(rawAssetBaseUrl.endsWith('/') ? rawAssetBaseUrl : `${rawAssetBaseUrl}/`, documentBaseUrl || DEFAULT_FILE_VIEWER_DOCUMENT_BASE_URL).href
317
+ : documentBaseUrl;
303
318
  return {
304
319
  workerUrl: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.workerUrl, DEFAULT_FILE_VIEWER_PDF_WORKER_PATH, {
305
- documentBaseUrl,
320
+ documentBaseUrl: assetBaseUrl,
306
321
  }),
307
322
  cMapUrl: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.cMapUrl, DEFAULT_FILE_VIEWER_PDF_CMAP_PATH, {
308
- documentBaseUrl,
323
+ documentBaseUrl: assetBaseUrl,
309
324
  }),
310
325
  wasmUrl: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.wasmUrl, DEFAULT_FILE_VIEWER_PDF_WASM_PATH, {
311
- documentBaseUrl,
326
+ documentBaseUrl: assetBaseUrl,
312
327
  }),
313
- standardFontDataUrl: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.standardFontDataUrl, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, { documentBaseUrl }),
328
+ standardFontDataUrl: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.standardFontDataUrl, DEFAULT_FILE_VIEWER_PDF_STANDARD_FONT_PATH, { documentBaseUrl: assetBaseUrl }),
329
+ cjkFontFallbackPath: resolveFileViewerAssetUrl(options === null || options === void 0 ? void 0 : options.cjkFontFallbackPath, DEFAULT_FILE_VIEWER_PDF_CJK_FONT_FALLBACK_PATH, { documentBaseUrl: assetBaseUrl }),
314
330
  };
315
331
  };
316
332
  export const resolveFileViewerDrawioViewerScriptUrl = (options, documentBaseUrl) => {
@@ -353,7 +369,7 @@ export const getFileViewerRendererAssetManifest = (rendererId) => {
353
369
  return DEFAULT_FILE_VIEWER_RENDERER_ASSET_MANIFESTS.find(manifest => manifest.rendererId === rendererId) || null;
354
370
  };
355
371
  const getRendererAssetOptionValue = (options, optionPath) => {
356
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
372
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
357
373
  switch (optionPath) {
358
374
  case 'archive.workerUrl':
359
375
  return (_a = options === null || options === void 0 ? void 0 : options.archive) === null || _a === void 0 ? void 0 : _a.workerUrl;
@@ -381,16 +397,18 @@ const getRendererAssetOptionValue = (options, optionPath) => {
381
397
  return (_m = options === null || options === void 0 ? void 0 : options.pdf) === null || _m === void 0 ? void 0 : _m.wasmUrl;
382
398
  case 'pdf.standardFontDataUrl':
383
399
  return (_o = options === null || options === void 0 ? void 0 : options.pdf) === null || _o === void 0 ? void 0 : _o.standardFontDataUrl;
400
+ case 'pdf.cjkFontFallbackPath':
401
+ return (_p = options === null || options === void 0 ? void 0 : options.pdf) === null || _p === void 0 ? void 0 : _p.cjkFontFallbackPath;
384
402
  case 'presentation.workerUrl':
385
- return (_p = options === null || options === void 0 ? void 0 : options.presentation) === null || _p === void 0 ? void 0 : _p.workerUrl;
403
+ return (_q = options === null || options === void 0 ? void 0 : options.presentation) === null || _q === void 0 ? void 0 : _q.workerUrl;
386
404
  case 'spreadsheet.workerUrl':
387
- return (_q = options === null || options === void 0 ? void 0 : options.spreadsheet) === null || _q === void 0 ? void 0 : _q.workerUrl;
405
+ return (_r = options === null || options === void 0 ? void 0 : options.spreadsheet) === null || _r === void 0 ? void 0 : _r.workerUrl;
388
406
  case 'typst.compilerWasmUrl':
389
- return (_r = options === null || options === void 0 ? void 0 : options.typst) === null || _r === void 0 ? void 0 : _r.compilerWasmUrl;
407
+ return (_s = options === null || options === void 0 ? void 0 : options.typst) === null || _s === void 0 ? void 0 : _s.compilerWasmUrl;
390
408
  case 'typst.fontAssetsUrl':
391
- return (_s = options === null || options === void 0 ? void 0 : options.typst) === null || _s === void 0 ? void 0 : _s.fontAssetsUrl;
409
+ return (_t = options === null || options === void 0 ? void 0 : options.typst) === null || _t === void 0 ? void 0 : _t.fontAssetsUrl;
392
410
  case 'typst.rendererWasmUrl':
393
- return (_t = options === null || options === void 0 ? void 0 : options.typst) === null || _t === void 0 ? void 0 : _t.rendererWasmUrl;
411
+ return (_u = options === null || options === void 0 ? void 0 : options.typst) === null || _u === void 0 ? void 0 : _u.rendererWasmUrl;
394
412
  default:
395
413
  return undefined;
396
414
  }
@@ -315,4 +315,4 @@ export declare const DEFAULT_RENDERER_DEFINITIONS: readonly [{
315
315
  readonly search: true;
316
316
  };
317
317
  }];
318
- export declare const DEFAULT_SUPPORTED_EXTENSIONS: readonly ("markdown" | "xyz" | "wasm" | "pdf" | "typst" | "zip" | "zipx" | "7z" | "rar" | "tar" | "gz" | "gzip" | "tgz" | "bz2" | "bzip2" | "tbz" | "tbz2" | "xz" | "txz" | "lzma" | "zst" | "tzst" | "cab" | "ar" | "cpio" | "iso" | "xar" | "lha" | "lzh" | "jar" | "war" | "ear" | "apk" | "cbz" | "cbr" | "glb" | "gltf" | "obj" | "stl" | "ply" | "fbx" | "dae" | "3ds" | "3mf" | "amf" | "usd" | "usda" | "usdc" | "usdz" | "kmz" | "step" | "stp" | "iges" | "igs" | "ifc" | "3dm" | "brep" | "pcd" | "wrl" | "vrml" | "vtk" | "vtp" | "txt" | "json" | "js" | "mjs" | "cjs" | "css" | "java" | "py" | "html" | "htm" | "jsx" | "ts" | "tsx" | "xml" | "log" | "vue" | "yaml" | "yml" | "ini" | "sh" | "bash" | "sql" | "go" | "rs" | "php" | "c" | "cpp" | "cc" | "h" | "hpp" | "cs" | "diff" | "patch" | "bundle" | "bdl" | "jsonc" | "json5" | "ipynb" | "toml" | "proto" | "hcl" | "tex" | "gv" | "http" | "react" | "rb" | "swift" | "kt" | "gif" | "jpg" | "jpeg" | "bmp" | "tiff" | "tif" | "png" | "svg" | "webp" | "avif" | "ico" | "heic" | "heif" | "jxl" | "docx" | "docm" | "dotx" | "dotm" | "doc" | "dot" | "pptx" | "pptm" | "potx" | "potm" | "ppsx" | "ppsm" | "rtf" | "odt" | "odp" | "xlsx" | "xltx" | "xlsm" | "xlsb" | "xls" | "xlt" | "xltm" | "csv" | "ods" | "fods" | "numbers" | "ofd" | "typ" | "eml" | "msg" | "mbox" | "olb" | "dra" | "gds" | "oas" | "oasis" | "dxf" | "dwg" | "dwf" | "dwfx" | "xps" | "geojson" | "kml" | "gpx" | "shp" | "excalidraw" | "drawio" | "dio" | "mermaid" | "mmd" | "plantuml" | "puml" | "xmind" | "epub" | "umd" | "md" | "mp4" | "webm" | "m3u8" | "mp3" | "mpeg" | "wav" | "ogg" | "oga" | "opus" | "m4a" | "aac" | "flac" | "weba" | "midi" | "mid" | "ttf" | "otf" | "woff" | "woff2" | "psd" | "ai" | "eps" | "sqlite" | "parquet" | "avro" | "webarchive")[];
318
+ export declare const DEFAULT_SUPPORTED_EXTENSIONS: readonly ("markdown" | "webp" | "jpeg" | "png" | "xyz" | "wasm" | "pdf" | "typst" | "zip" | "zipx" | "7z" | "rar" | "tar" | "gz" | "gzip" | "tgz" | "bz2" | "bzip2" | "tbz" | "tbz2" | "xz" | "txz" | "lzma" | "zst" | "tzst" | "cab" | "ar" | "cpio" | "iso" | "xar" | "lha" | "lzh" | "jar" | "war" | "ear" | "apk" | "cbz" | "cbr" | "glb" | "gltf" | "obj" | "stl" | "ply" | "fbx" | "dae" | "3ds" | "3mf" | "amf" | "usd" | "usda" | "usdc" | "usdz" | "kmz" | "step" | "stp" | "iges" | "igs" | "ifc" | "3dm" | "brep" | "pcd" | "wrl" | "vrml" | "vtk" | "vtp" | "txt" | "json" | "js" | "mjs" | "cjs" | "css" | "java" | "py" | "html" | "htm" | "jsx" | "ts" | "tsx" | "xml" | "log" | "vue" | "yaml" | "yml" | "ini" | "sh" | "bash" | "sql" | "go" | "rs" | "php" | "c" | "cpp" | "cc" | "h" | "hpp" | "cs" | "diff" | "patch" | "bundle" | "bdl" | "jsonc" | "json5" | "ipynb" | "toml" | "proto" | "hcl" | "tex" | "gv" | "http" | "react" | "rb" | "swift" | "kt" | "gif" | "jpg" | "bmp" | "tiff" | "tif" | "svg" | "avif" | "ico" | "heic" | "heif" | "jxl" | "docx" | "docm" | "dotx" | "dotm" | "doc" | "dot" | "pptx" | "pptm" | "potx" | "potm" | "ppsx" | "ppsm" | "rtf" | "odt" | "odp" | "xlsx" | "xltx" | "xlsm" | "xlsb" | "xls" | "xlt" | "xltm" | "csv" | "ods" | "fods" | "numbers" | "ofd" | "typ" | "eml" | "msg" | "mbox" | "olb" | "dra" | "gds" | "oas" | "oasis" | "dxf" | "dwg" | "dwf" | "dwfx" | "xps" | "geojson" | "kml" | "gpx" | "shp" | "excalidraw" | "drawio" | "dio" | "mermaid" | "mmd" | "plantuml" | "puml" | "xmind" | "epub" | "umd" | "md" | "mp4" | "webm" | "m3u8" | "mp3" | "mpeg" | "wav" | "ogg" | "oga" | "opus" | "m4a" | "aac" | "flac" | "weba" | "midi" | "mid" | "ttf" | "otf" | "woff" | "woff2" | "psd" | "ai" | "eps" | "sqlite" | "parquet" | "avro" | "webarchive")[];
@@ -102,10 +102,13 @@ const createLightbox = (documentRef, src, t) => {
102
102
  };
103
103
  };
104
104
  export default async function renderImage(buffer, target, type, context) {
105
- var _a;
105
+ var _a, _b;
106
106
  const t = createFileViewerTranslator(context === null || context === void 0 ? void 0 : context.options);
107
107
  const documentRef = target.ownerDocument || document;
108
108
  const src = await resolveImageUrl(buffer, type);
109
+ (_a = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _a === void 0 ? void 0 : _a.call(context, {
110
+ capture: () => new Blob([buffer], { type: getImageBlobType(type) }),
111
+ });
109
112
  let userZoom = 1;
110
113
  let fitScale = 1;
111
114
  let currentScale = 1;
@@ -236,11 +239,13 @@ export default async function renderImage(buffer, target, type, context) {
236
239
  subscribe: zoomEmitter.subscribe,
237
240
  });
238
241
  target.replaceChildren(createStyle(documentRef), root);
239
- (((_a = context === null || context === void 0 ? void 0 : context.surface) === null || _a === void 0 ? void 0 : _a.shadowRoot) || target).append(lightbox.element);
242
+ (((_b = context === null || context === void 0 ? void 0 : context.surface) === null || _b === void 0 ? void 0 : _b.shadowRoot) || target).append(lightbox.element);
240
243
  updateViewportSize();
241
244
  return {
242
245
  $el: target,
243
246
  unmount() {
247
+ var _a;
248
+ (_a = context === null || context === void 0 ? void 0 : context.registerThumbnailAdapter) === null || _a === void 0 ? void 0 : _a.call(context, null);
244
249
  unregisterFileViewerZoomProvider(root);
245
250
  resizeObserver.disconnect();
246
251
  image.removeEventListener('load', updateViewportSize);
@@ -1,6 +1,6 @@
1
1
  import type { FileViewerRendererDispatcher } from './dispatcher';
2
2
  import { type FileViewerMutableAccessor, type MutableFileViewerRenderReadinessState } from '../source/loading';
3
- import type { FileRenderExportAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from '../contracts/types';
3
+ import type { FileRenderExportAdapter, FileRenderThumbnailAdapter, FileRenderContext, FileRenderHandler, FileViewerLifecycleContext, FileViewerOptions, FileViewerStyleIsolation, RenderSurface, RendererDefinition, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession } from '../contracts/types';
4
4
  export declare const FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE = "\u9884\u89C8\u5185\u5BB9\u5378\u8F7D\u5931\u8D25";
5
5
  export interface ResolveFileViewerRenderSessionDisposeErrorMessageInput {
6
6
  message?: string;
@@ -34,6 +34,7 @@ export interface DisposeFileViewerRendererSessionOptions {
34
34
  export interface FileViewerRenderSurfaceState<Session extends RendererSession = RendererSession> {
35
35
  session: Session | null;
36
36
  exportAdapter: FileRenderExportAdapter | null;
37
+ thumbnailAdapter: FileRenderThumbnailAdapter | null;
37
38
  }
38
39
  export type MutableFileViewerRenderSurfaceState<Session extends RendererSession = RendererSession> = FileViewerRenderSurfaceState<Session>;
39
40
  export interface CreateFileViewerRenderReadinessTargetInput {
@@ -43,6 +44,7 @@ export interface CreateFileViewerRenderReadinessTargetInput {
43
44
  export interface CreateFileViewerRenderSurfaceStateTargetInput<Session extends RendererSession = RendererSession> {
44
45
  session: FileViewerMutableAccessor<Session | null>;
45
46
  exportAdapter: FileViewerMutableAccessor<FileRenderExportAdapter | null>;
47
+ thumbnailAdapter?: FileViewerMutableAccessor<FileRenderThumbnailAdapter | null>;
46
48
  }
47
49
  export interface CreateFileViewerRenderTargetOptions {
48
50
  className?: string;
@@ -171,7 +173,7 @@ export declare const appendFileViewerStyle: (target: HTMLElement | ShadowRoot, c
171
173
  export declare const removeFileViewerRenderTarget: (container: HTMLElement, target: HTMLElement) => boolean;
172
174
  export declare const createFileViewerRenderSurfaceState: <Session extends RendererSession = RendererSession>() => FileViewerRenderSurfaceState<Session>;
173
175
  export declare const createFileViewerRenderReadinessTarget: ({ renderedReady, progressiveReady, }: CreateFileViewerRenderReadinessTargetInput) => MutableFileViewerRenderReadinessState;
174
- export declare const createFileViewerRenderSurfaceStateTarget: <Session extends RendererSession = RendererSession>({ session, exportAdapter, }: CreateFileViewerRenderSurfaceStateTargetInput<Session>) => MutableFileViewerRenderSurfaceState<Session>;
176
+ export declare const createFileViewerRenderSurfaceStateTarget: <Session extends RendererSession = RendererSession>({ session, exportAdapter, thumbnailAdapter, }: CreateFileViewerRenderSurfaceStateTargetInput<Session>) => MutableFileViewerRenderSurfaceState<Session>;
175
177
  export declare const applyFileViewerRenderSurfaceState: <Session extends RendererSession, Target extends MutableFileViewerRenderSurfaceState<Session>>(target: Target, state: Partial<FileViewerRenderSurfaceState<Session>>) => Target;
176
178
  export declare const createFileRenderHandlerRendererSession: <Rendered = unknown>(rendered: Rendered, destroy?: () => void | Promise<void>) => FileRenderHandlerRendererSession<Rendered>;
177
179
  export interface CreateFileRenderHandlerRegistryOptions<Rendered = unknown, Target extends HTMLElement = HTMLElement> extends Omit<CreateFileRenderHandlerLoaderOptions<Rendered, Target>, 'handler'> {
@@ -196,7 +198,7 @@ export declare const resetFileViewerRenderSurface: <Session extends RendererSess
196
198
  export declare const runFileViewerRenderSurfaceClear: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ reason, surfaceState, readinessState, container, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStopZoomObserver, onClearZoomProvider, onStopFitObserver, onStopViewStateObserver, onClearViewStateProvider, }: RunFileViewerRenderSurfaceClearInput<Session, UnloadContext>) => FileViewerRenderSurfaceClearState<Session, UnloadContext>;
197
199
  export declare const runFileViewerRenderSurfaceMount: <Session extends RendererSession>({ buffer, file, version, sourceUrl, streamUrl, getContainer, surfaceState, readinessState, isCurrent, clearRenderedContent, render, waitForContainer, waitForPaint, disposeSession, onStartZoomObserver, onStartFitObserver, onStartViewStateObserver, onApplyInitialFit, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: RunFileViewerRenderSurfaceMountInput<Session>) => Promise<Session | undefined>;
198
200
  export declare const createFileViewerRenderSurfaceActionHandlers: <Session extends RendererSession, UnloadContext = FileViewerLifecycleContext | null>({ getContainer, surfaceState, readinessState, isCurrent, render, waitForContainer, waitForPaint, disposeOptions, onUnloadStart, onUnloadComplete, onClearActiveDocumentContext, onClearDocumentState, onStartZoomObserver, onStopZoomObserver, onClearZoomProvider, onStartFitObserver, onStopFitObserver, onStartViewStateObserver, onStopViewStateObserver, onClearViewStateProvider, onApplyInitialFit, onRefreshDocumentIndex, onRefreshZoomProvider, onRefreshViewStateProvider, }: CreateFileViewerRenderSurfaceActionHandlersInput<Session, UnloadContext>) => FileViewerRenderSurfaceActionHandlers<Session, UnloadContext>;
199
- export declare const buildFileRenderContextFromLoadContext: ({ source, surface, options, registerExportAdapter, renderContext, }: RendererLoadContext) => FileRenderContext;
201
+ export declare const buildFileRenderContextFromLoadContext: ({ source, surface, options, signal, registerExportAdapter, registerThumbnailAdapter, renderContext, }: RendererLoadContext) => FileRenderContext;
200
202
  export declare const renderFileViewerHandler: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ dispatcher, buffer, target, type, context, throwOnMissingHandler, }: RenderFileViewerHandlerInput<Rendered, Target>) => Promise<Rendered | undefined>;
201
203
  export declare const createFileRenderHandlerLoader: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ handler, rendererId, getTarget, createContext, destroy, }: CreateFileRenderHandlerLoaderOptions<Rendered, Target>) => RendererLoader;
202
204
  export declare const createFileRenderHandlerRegistry: <Rendered = unknown, Target extends HTMLElement = HTMLElement>({ definitions, handlers, getTarget, createContext, destroy, }: CreateFileRenderHandlerRegistryOptions<Rendered, Target>) => FileRenderHandlerRegistryResult<Rendered, Target>;
@@ -157,6 +157,7 @@ export const removeFileViewerRenderTarget = (container, target) => {
157
157
  export const createFileViewerRenderSurfaceState = () => ({
158
158
  session: null,
159
159
  exportAdapter: null,
160
+ thumbnailAdapter: null,
160
161
  });
161
162
  export const createFileViewerRenderReadinessTarget = ({ renderedReady, progressiveReady, }) => {
162
163
  return {
@@ -174,7 +175,8 @@ export const createFileViewerRenderReadinessTarget = ({ renderedReady, progressi
174
175
  },
175
176
  };
176
177
  };
177
- export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapter, }) => {
178
+ export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapter, thumbnailAdapter, }) => {
179
+ let localThumbnailAdapter = null;
178
180
  return {
179
181
  get session() {
180
182
  return session.get();
@@ -188,16 +190,27 @@ export const createFileViewerRenderSurfaceStateTarget = ({ session, exportAdapte
188
190
  set exportAdapter(value) {
189
191
  exportAdapter.set(value);
190
192
  },
193
+ get thumbnailAdapter() {
194
+ var _a;
195
+ return (_a = thumbnailAdapter === null || thumbnailAdapter === void 0 ? void 0 : thumbnailAdapter.get()) !== null && _a !== void 0 ? _a : localThumbnailAdapter;
196
+ },
197
+ set thumbnailAdapter(value) {
198
+ localThumbnailAdapter = value;
199
+ thumbnailAdapter === null || thumbnailAdapter === void 0 ? void 0 : thumbnailAdapter.set(value);
200
+ },
191
201
  };
192
202
  };
193
203
  export const applyFileViewerRenderSurfaceState = (target, state) => {
194
- var _a, _b;
204
+ var _a, _b, _c;
195
205
  if ('session' in state) {
196
206
  target.session = (_a = state.session) !== null && _a !== void 0 ? _a : null;
197
207
  }
198
208
  if ('exportAdapter' in state) {
199
209
  target.exportAdapter = (_b = state.exportAdapter) !== null && _b !== void 0 ? _b : null;
200
210
  }
211
+ if ('thumbnailAdapter' in state) {
212
+ target.thumbnailAdapter = (_c = state.thumbnailAdapter) !== null && _c !== void 0 ? _c : null;
213
+ }
201
214
  return target;
202
215
  };
203
216
  export const createFileRenderHandlerRendererSession = (rendered, destroy) => ({
@@ -265,7 +278,7 @@ export const disposeActiveFileViewerRendererSession = (target, options = {}) =>
265
278
  };
266
279
  export const resetFileViewerRenderSurface = ({ surfaceState, readinessState, container, disposeOptions, }) => {
267
280
  const session = disposeActiveFileViewerRendererSession(surfaceState, disposeOptions);
268
- applyFileViewerRenderSurfaceState(surfaceState, { exportAdapter: null });
281
+ applyFileViewerRenderSurfaceState(surfaceState, { exportAdapter: null, thumbnailAdapter: null });
269
282
  applyFileViewerRenderReadinessState(readinessState, {
270
283
  renderedReady: false,
271
284
  progressiveReady: false,
@@ -430,13 +443,15 @@ export const createFileViewerRenderSurfaceActionHandlers = ({ getContainer, surf
430
443
  mountRenderedContent,
431
444
  };
432
445
  };
433
- export const buildFileRenderContextFromLoadContext = ({ source, surface, options, registerExportAdapter, renderContext, }) => ({
446
+ export const buildFileRenderContextFromLoadContext = ({ source, surface, options, signal, registerExportAdapter, registerThumbnailAdapter, renderContext, }) => ({
434
447
  filename: source.filename,
435
448
  url: source.url,
436
449
  streamUrl: source.url,
450
+ signal,
437
451
  options,
438
452
  surface,
439
453
  registerExportAdapter,
454
+ registerThumbnailAdapter,
440
455
  ...renderContext,
441
456
  });
442
457
  export const renderFileViewerHandler = async ({ dispatcher, buffer, target, type = '', context, throwOnMissingHandler = false, }) => {
@@ -1,8 +1,9 @@
1
- import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, RendererRegistry } from '../contracts/types';
1
+ import type { FileViewerEventHandler, FileViewerInstance, FileViewerOptions, FileViewerRenderPurpose, RendererRegistry } from '../contracts/types';
2
2
  export interface CreateViewerOptions {
3
3
  registry?: RendererRegistry;
4
4
  options?: FileViewerOptions;
5
5
  signal?: AbortSignal;
6
6
  onEvent?: FileViewerEventHandler;
7
+ renderPurpose?: FileViewerRenderPurpose;
7
8
  }
8
9
  export declare const createViewer: (container: HTMLElement, createOptions?: CreateViewerOptions) => FileViewerInstance;
@@ -56,6 +56,27 @@ const resolveAutoRenderersEnabled = (options) => {
56
56
  }
57
57
  return (options.rendererMode || 'extend') !== 'replace';
58
58
  };
59
+ const createFileViewerLoadSignal = (controller, signals) => {
60
+ if (!controller) {
61
+ return signals.find(signal => signal);
62
+ }
63
+ const removeListeners = [];
64
+ const cleanup = () => removeListeners.splice(0).forEach(remove => remove());
65
+ controller.signal.addEventListener('abort', cleanup, { once: true });
66
+ for (const signal of signals) {
67
+ if (!signal) {
68
+ continue;
69
+ }
70
+ if (signal.aborted) {
71
+ controller.abort(signal.reason);
72
+ break;
73
+ }
74
+ const onAbort = () => controller.abort(signal.reason);
75
+ signal.addEventListener('abort', onAbort, { once: true });
76
+ removeListeners.push(() => signal.removeEventListener('abort', onAbort));
77
+ }
78
+ return controller.signal;
79
+ };
59
80
  const renderMissingRendererState = (container, type, options) => {
60
81
  const documentRef = container.ownerDocument;
61
82
  const state = createFileViewerUnsupportedState(type, undefined, options);
@@ -427,6 +448,7 @@ export const createViewer = (container, createOptions = {}) => {
427
448
  applyFileViewerRenderSurfaceState(renderSurfaceState, {
428
449
  session: null,
429
450
  exportAdapter: null,
451
+ thumbnailAdapter: null,
430
452
  });
431
453
  removeWatermarkOverlay();
432
454
  await documentActions.clearDocumentState();
@@ -440,8 +462,16 @@ export const createViewer = (container, createOptions = {}) => {
440
462
  };
441
463
  const instance = {
442
464
  container,
443
- async load(source) {
465
+ async prepare() {
466
+ await ensureRendererPluginsInstalled();
467
+ },
468
+ async load(source, loadOptions = {}) {
444
469
  const version = requestScope.requestController.createVersion();
470
+ const requestAbortController = requestScope.requestController.createAbortController();
471
+ const loadSignal = createFileViewerLoadSignal(requestAbortController, [
472
+ createOptions.signal,
473
+ loadOptions.signal,
474
+ ]);
445
475
  await destroyCurrent('replace');
446
476
  await ensureRendererPluginsInstalled();
447
477
  if (!requestScope.isCurrentRequest(version)) {
@@ -470,12 +500,20 @@ export const createViewer = (container, createOptions = {}) => {
470
500
  source: normalized,
471
501
  surface,
472
502
  options,
473
- signal: createOptions.signal,
503
+ signal: loadSignal,
474
504
  registerExportAdapter: adapter => {
475
505
  if (requestScope.isCurrentRequest(version)) {
476
506
  applyFileViewerRenderSurfaceState(renderSurfaceState, { exportAdapter: adapter });
477
507
  }
478
508
  },
509
+ registerThumbnailAdapter: adapter => {
510
+ if (requestScope.isCurrentRequest(version)) {
511
+ applyFileViewerRenderSurfaceState(renderSurfaceState, { thumbnailAdapter: adapter });
512
+ }
513
+ },
514
+ renderContext: {
515
+ renderPurpose: createOptions.renderPurpose || 'preview',
516
+ },
479
517
  });
480
518
  }
481
519
  catch (error) {
@@ -504,6 +542,10 @@ export const createViewer = (container, createOptions = {}) => {
504
542
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
505
543
  return session;
506
544
  },
545
+ async unload(reason = 'replace') {
546
+ requestScope.requestController.createVersion();
547
+ await destroyCurrent(reason);
548
+ },
507
549
  async destroy(reason = 'component-unmount') {
508
550
  requestScope.requestController.createVersion();
509
551
  await destroyCurrent(reason);
@@ -540,6 +582,12 @@ export const createViewer = (container, createOptions = {}) => {
540
582
  getExportAdapter() {
541
583
  return renderSurfaceState.exportAdapter;
542
584
  },
585
+ registerThumbnailAdapter(adapter) {
586
+ applyFileViewerRenderSurfaceState(renderSurfaceState, { thumbnailAdapter: adapter });
587
+ },
588
+ getThumbnailAdapter() {
589
+ return renderSurfaceState.thumbnailAdapter;
590
+ },
543
591
  async download(downloadOptions = {}) {
544
592
  const source = createFileViewerOriginalSourceStateFromNormalizedSource(currentSource);
545
593
  await executeFileViewerDownloadOperation({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.25",
3
+ "version": "2.1.27",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for Flyfish File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",