@file-viewer/core 2.1.16 → 2.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +4 -1
- package/README.md +4 -1
- package/dist/contracts/types.d.ts +72 -3
- package/dist/features/document/dom/providers.js +6 -3
- package/dist/features/document/fit.d.ts +46 -0
- package/dist/features/document/fit.js +339 -0
- package/dist/features/document/viewState.js +64 -4
- package/dist/headless.d.ts +2 -2
- package/dist/headless.js +1 -1
- package/dist/i18n/messages.js +53 -2
- package/dist/index.d.ts +6 -4
- package/dist/index.js +3 -2
- package/dist/lifecycle/operations.d.ts +4 -1
- package/dist/lifecycle/operations.js +39 -2
- package/dist/platform/assets.js +3 -3
- package/dist/renderers/image.d.ts +2 -2
- package/dist/renderers/image.js +20 -16
- package/dist/renderers/index.js +4 -4
- package/dist/rendering/handler.d.ts +33 -5
- package/dist/rendering/handler.js +130 -4
- package/dist/source/loading.d.ts +3 -1
- package/dist/source/loading.js +6 -2
- package/dist/viewer/createViewer.js +131 -20
- package/dist/viewer/operations.js +1 -1
- package/dist/viewer/state.d.ts +2 -2
- package/dist/viewer/state.js +39 -6
- package/package.json +2 -2
package/README.en.md
CHANGED
|
@@ -41,13 +41,16 @@ import {
|
|
|
41
41
|
|
|
42
42
|
const viewer = createViewer(document.querySelector('#viewer')!, {
|
|
43
43
|
options: {
|
|
44
|
-
toolbar: true
|
|
44
|
+
toolbar: true,
|
|
45
|
+
styleIsolation: 'shadow'
|
|
45
46
|
}
|
|
46
47
|
})
|
|
47
48
|
|
|
48
49
|
await viewer.load({ url: '/files/report.pdf' })
|
|
49
50
|
```
|
|
50
51
|
|
|
52
|
+
`options.styleIsolation` accepts `auto`, `shadow`, `scoped`, or `none`. Use `shadow` when a custom host or framework wrapper needs a ShadowRoot-backed render surface. Core passes the resolved `surface` to renderer `load(context)`, so custom renderers should inject styles into `context.surface.shadowRoot` or the renderer container instead of `document.head`, and should mount overlays inside the same isolated surface when possible.
|
|
53
|
+
|
|
51
54
|
The root `@file-viewer/core` entry remains the complete compatibility entry for existing integrations. New component packages should prefer the narrowest explicit entry point they need: `headless` for contracts and build-time helpers, `browser` for real browser preview.
|
|
52
55
|
|
|
53
56
|
```ts
|
package/README.md
CHANGED
|
@@ -41,13 +41,16 @@ import {
|
|
|
41
41
|
|
|
42
42
|
const viewer = createViewer(document.querySelector('#viewer')!, {
|
|
43
43
|
options: {
|
|
44
|
-
toolbar: true
|
|
44
|
+
toolbar: true,
|
|
45
|
+
styleIsolation: 'shadow'
|
|
45
46
|
}
|
|
46
47
|
})
|
|
47
48
|
|
|
48
49
|
await viewer.load({ url: '/files/report.pdf' })
|
|
49
50
|
```
|
|
50
51
|
|
|
52
|
+
`options.styleIsolation` accepts `auto`, `shadow`, `scoped`, or `none`. Use `shadow` when a custom host or framework wrapper needs a ShadowRoot-backed render surface. Core passes the resolved `surface` to renderer `load(context)`, so custom renderers should inject styles into `context.surface.shadowRoot` or the renderer container instead of `document.head`, and should mount overlays inside the same isolated surface when possible.
|
|
53
|
+
|
|
51
54
|
The root `@file-viewer/core` entry remains the complete compatibility entry for existing integrations. New component packages should prefer the narrowest explicit entry point they need: `headless` for contracts and build-time helpers, `browser` for real browser preview.
|
|
52
55
|
|
|
53
56
|
```ts
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export type FileViewerSourceKind = 'file' | 'url' | 'buffer' | 'empty';
|
|
2
2
|
export type FileViewerThemeMode = 'light' | 'dark' | 'system';
|
|
3
3
|
export type FileViewerLocale = 'auto' | 'zh-CN' | 'en-US' | (string & {});
|
|
4
|
-
export type
|
|
4
|
+
export type FileViewerStyleIsolation = 'auto' | 'shadow' | 'scoped' | 'none';
|
|
5
|
+
export type FileViewerMessageKey = 'toolbar.zoomGroup' | 'toolbar.zoomOut' | 'toolbar.zoomIn' | 'toolbar.zoomReset' | 'toolbar.download' | 'toolbar.downloadTitle' | 'toolbar.print' | 'toolbar.printTitle' | 'toolbar.exportHtml' | 'toolbar.exportHtmlTitle' | 'toolbar.search' | 'toolbar.searchPlaceholder' | 'toolbar.searchPrevious' | 'toolbar.searchNext' | 'toolbar.searchClear' | 'state.ready.title' | 'state.ready.message' | 'state.empty.title' | 'state.empty.message' | 'state.unsupported.install.title' | 'state.unsupported.install.message' | 'state.unsupported.install.description' | 'state.unsupported.title' | 'state.unsupported.message' | 'state.unsupported.description' | 'state.error.title' | 'preview.downloading' | 'preview.streamingPdf' | 'preview.reading' | 'error.download' | 'error.print' | 'error.exportHtml' | 'error.noDownloadSource' | 'error.noExportContent' | 'error.printUnavailable' | 'error.printWindowBlocked' | 'error.remoteDownload' | 'error.localRead' | 'error.load' | 'error.stream' | 'error.beforeOperation' | 'error.unknown' | 'error.blobUnavailable' | 'error.sourceUnsupported' | 'error.fileReadArrayBuffer' | 'error.fileReadDataUrl' | 'error.fileReadText' | 'error.imageDataUrlRead' | 'operation.download' | 'operation.print' | 'operation.exportHtml' | 'operation.zoomIn' | 'operation.zoomOut' | 'operation.zoomReset' | 'pdf.toolbar.toggleNavigation' | 'pdf.toolbar.previousPage' | 'pdf.toolbar.nextPage' | 'pdf.toolbar.fitWidth' | 'pdf.toolbar.zoomOut' | 'pdf.toolbar.zoomIn' | 'pdf.toolbar.rotateLeft' | 'pdf.toolbar.rotateRight' | 'pdf.nav.typeLabel' | 'pdf.nav.pagesTab' | 'pdf.nav.outlineTab' | 'pdf.nav.pagesTitle' | 'pdf.nav.outlineTitle' | 'pdf.nav.pageCount' | 'pdf.nav.itemCount' | 'pdf.nav.pageLabel' | 'pdf.nav.outlineEmpty' | 'pdf.nav.outlineFallbackTitle' | 'pdf.thumbnail.alt' | 'pdf.state.loading' | 'pdf.error.browserWindow' | 'pdf.error.missingSource' | 'pdf.error.loadFailed' | 'pdf.error.notLoaded' | 'pdf.error.unloaded' | 'pdf.error.canvasUnavailable' | 'pdf.export.pageTitle' | 'spreadsheet.loading.kicker' | 'spreadsheet.loading.title' | 'spreadsheet.loading.hint' | 'spreadsheet.loading.streaming' | 'spreadsheet.tabs.ariaLabel' | 'spreadsheet.state.parsingWorkbook' | 'spreadsheet.state.preparingSheet' | 'spreadsheet.state.preparingSheetNamed' | 'spreadsheet.state.cachedRows' | 'spreadsheet.state.rows' | 'spreadsheet.state.rowsAndColumns' | 'spreadsheet.error.parseFailed' | 'spreadsheet.error.workerFailed' | 'word.error.invalidDocx' | 'word.error.missingOdfContent' | 'word.error.odfXmlParseFailed' | 'word.title.rtf' | 'word.title.openDocumentPresentation' | 'word.title.openDocumentText' | 'word.page.fallback' | 'word.page.empty' | 'word.body' | 'word.body.empty' | 'ofd.state.loading' | 'ofd.error.empty' | 'ofd.error.parseFailed' | 'presentation.state.loading' | 'presentation.error.title' | 'presentation.error.parseFailed' | 'archive.error.nestedUnsupported' | 'archive.loading.readingDirectory' | 'archive.loading.readingDirectoryHint' | 'archive.search.placeholder' | 'archive.sidebar.hide' | 'archive.sidebar.show' | 'archive.preview.title' | 'archive.preview.chooseFile' | 'archive.preview.downloadFile' | 'archive.error.title' | 'archive.stats.summary' | 'archive.warning.encrypted' | 'archive.password.title' | 'archive.password.description' | 'archive.password.placeholder' | 'archive.password.invalid' | 'archive.password.required' | 'archive.password.cancel' | 'archive.password.confirm' | 'archive.error.passwordRequired' | 'archive.error.encryptedRequiresWorker' | 'archive.empty.title' | 'archive.empty.message' | 'archive.loading.initializingCandidate' | 'archive.loading.initializingCandidateHint' | 'archive.error.candidateInitTimeout' | 'archive.error.encryptedCheckTimeout' | 'archive.loading.directoryReadyHint' | 'archive.error.candidateReadTimeout' | 'archive.loading.workerFallback' | 'archive.loading.workerFallbackHint' | 'archive.notice.workerFallback' | 'archive.error.tooLarge' | 'archive.loading.initializingWorker' | 'archive.loading.initializingWorkerHint' | 'archive.error.workerInitFailed' | 'archive.error.workerUnsupported' | 'archive.error.indexedDbUnavailable' | 'archive.error.entryTooLarge' | 'archive.loading.extracting' | 'archive.loading.rendering' | 'archive.loading.exporting' | 'media.audio.title' | 'media.audio.description' | 'media.audio.unsupported' | 'media.video.title' | 'media.video.unsupported' | 'media.video.hlsHint' | 'media.midi.title' | 'media.midi.loading' | 'media.midi.trackHeader' | 'media.midi.instrumentHeader' | 'media.midi.channelHeader' | 'media.midi.noteCountHeader' | 'media.midi.durationHeader' | 'media.midi.durationStat' | 'media.midi.trackStat' | 'media.midi.noteStat' | 'media.midi.parseFailed' | 'email.mbox.subject' | 'email.mbox.summary' | 'email.error.title' | 'email.meta.from' | 'email.meta.to' | 'email.meta.cc' | 'email.meta.date' | 'email.tabs.text' | 'email.tabs.headers' | 'email.attachments.title' | 'email.attachments.empty' | 'email.attachments.download' | 'email.attachments.opening' | 'email.attachments.nestedUnavailable' | 'email.loading.parsing' | 'data.font.sample' | 'data.error.fontFaceUnsupported' | 'data.title.font' | 'data.title.sqlite' | 'data.title.parquet' | 'data.title.avro' | 'data.title.wasm' | 'data.title.eps' | 'data.title.ai' | 'data.title.webarchive' | 'data.title.summary' | 'data.label.format' | 'data.label.size' | 'data.label.rendering' | 'data.label.objects' | 'data.label.sampleTable' | 'data.label.rows' | 'data.label.columns' | 'data.label.sampleRows' | 'data.label.imports' | 'data.label.exports' | 'data.label.magic' | 'data.label.note' | 'data.label.container' | 'data.value.schemaRead' | 'data.value.schemaUnread' | 'data.note.aiSummary' | 'data.note.postscriptSummary' | 'data.note.webarchive' | 'data.image.alt' | 'psd.title' | 'psd.action.fit' | 'psd.action.showAll' | 'psd.action.hideAll' | 'psd.layers.title' | 'psd.layers.redrawable' | 'psd.layers.empty' | 'psd.layers.hidden' | 'drawing.error.viewerLoadFailed' | 'drawing.error.excalidrawEmpty' | 'drawing.error.excalidrawTimeout' | 'drawing.error.drawioParseFailed' | 'drawing.error.drawioNoModel' | 'drawing.error.drawioNoElements' | 'drawing.error.viewerInitFailed' | 'drawing.error.drawioTimeout' | 'drawing.error.svgParseFailed' | 'drawing.error.plantumlRenderFailed' | 'drawing.title.excalidraw' | 'drawing.title.mermaid' | 'drawing.title.plantuml' | 'drawing.title.drawio' | 'drawing.toolbar.zoomOut' | 'drawing.toolbar.zoomIn' | 'drawing.toolbar.fit' | 'drawing.toolbar.fitWidth' | 'drawing.state.loading' | 'text.code.loadingHighlight' | 'ebook.toc' | 'ebook.reading' | 'ebook.itemCount' | 'epub.title' | 'epub.previousPage' | 'epub.nextPage' | 'epub.loading' | 'epub.chapterFallback' | 'epub.renderIncomplete' | 'umd.title' | 'umd.previousChapter' | 'umd.nextChapter' | 'umd.loading' | 'umd.emptyContent' | 'umd.chapterFallback' | 'umd.galleryFallback' | 'umd.warningBodyTooShort' | 'umd.error.unexpectedEnd' | 'umd.error.invalidFile' | 'typst.summaryRenderer' | 'typst.pageSummary.empty' | 'typst.pageSummary.ready' | 'typst.status.compiling' | 'typst.status.failed' | 'typst.status.rendered' | 'typst.loading.title' | 'typst.loading.hint' | 'typst.error.title' | 'typst.error.timeout' | 'typst.error.timeoutHint' | 'typst.error.assetHint' | 'typst.error.svgParseFailed' | 'typst.error.wasmLoadFailed' | 'xmind.toolbar.zoomOut' | 'xmind.toolbar.zoomIn' | 'xmind.toolbar.fit' | 'xmind.toolbar.fitTitle' | 'xmind.state.loading' | 'xmind.stats.nodes' | 'xmind.stats.depth' | 'xmind.stats.theme' | 'xmind.stats.template' | 'xmind.badge.paused' | 'xmind.badge.collapsed' | 'xmind.badge.floating' | 'xmind.badge.summary' | 'xmind.badge.callout' | 'xmind.imageResource' | 'xmind.error.unrecognized' | 'xmind.error.noCanvas' | 'cad.toolbar.fit' | 'cad.toolbar.zoomOut' | 'cad.toolbar.zoomIn' | 'cad.layers.title' | 'cad.layers.count' | 'cad.inspector.title' | 'cad.inspector.entities' | 'cad.inspector.blocks' | 'cad.inspector.pages' | 'cad.inspector.drawn' | 'cad.state.loadingViewer' | 'cad.state.parsing' | 'cad.error.parseFailed' | 'image.alt' | 'image.lightbox.alt' | 'image.lightbox.close' | 'gitBundle.error.invalid' | 'gitBundle.error.missingPack' | 'gitBundle.notice.delta' | 'gitBundle.title.history' | 'gitBundle.title.fileTree' | 'gitBundle.file.choose' | 'gitBundle.file.noTree' | 'gitBundle.file.none' | 'gitBundle.history.empty' | 'gitBundle.toolbar.summary' | 'gitBundle.meta.bundle' | 'gitBundle.meta.refs' | 'gitBundle.meta.commits' | 'gitBundle.meta.objects' | 'gitBundle.meta.deltas' | 'gitBundle.meta.objectFormat' | 'gitBundle.meta.objectTypes' | 'geo.error.unrecognized' | 'geo.error.xmlParseFailed' | 'geo.error.unsupported' | 'geo.title' | 'geo.featureCount' | 'geo.bounds' | 'geo.geometryTypes' | 'geo.aria' | 'geo.loading' | 'geo.projection' | 'geo.engine' | 'geo.basemap' | 'geo.basemap.offline' | 'geo.basemap.custom' | 'geo.engine.maplibre' | 'geo.engine.svg' | 'geo.error.projection' | 'geo.action.fit' | 'model.toolbar.fit' | 'model.toolbar.rotate' | 'model.toolbar.wireframe' | 'model.toolbar.grid' | 'model.toolbar.axes' | 'model.state.loadingSummary' | 'model.state.loading' | 'model.state.loaded' | 'model.state.parseFailed' | 'model.summary.meshes' | 'model.summary.points' | 'model.error.daeEmpty' | 'model.error.unsupported' | 'model.error.parseFailed' | 'model.notice.signature' | 'loading.generic.label' | 'loading.generic.hint' | 'loading.word.label' | 'loading.word.hint' | 'loading.wordWorker.hint' | 'loading.sheet.label' | 'loading.sheet.hint' | 'loading.csv.label' | 'loading.csv.hint' | 'loading.presentation.label' | 'loading.presentation.hint' | 'loading.pdf.label' | 'loading.pdf.hint' | 'loading.ofd.label' | 'loading.ofd.hint' | 'loading.archive.label' | 'loading.archive.hint' | 'loading.email.label' | 'loading.email.hint' | 'loading.msg.hint' | 'loading.eda.label' | 'loading.eda.hint' | 'loading.cad.label' | 'loading.cad.hint' | 'loading.dwg.hint' | 'loading.dwf.hint' | 'loading.dwfx.hint' | 'loading.xps.hint' | 'loading.drawio.label' | 'loading.drawio.hint' | 'loading.excalidraw.label' | 'loading.excalidraw.hint' | 'loading.epub.label' | 'loading.epub.hint' | 'loading.umd.label' | 'loading.umd.hint' | 'loading.image.label' | 'loading.image.hint' | 'loading.video.label' | 'loading.video.hint' | 'loading.audio.label' | 'loading.audio.hint';
|
|
5
6
|
export type FileViewerMessageParams = Record<string, string | number | boolean | null | undefined>;
|
|
6
7
|
export type FileViewerMessageResolver = (key: FileViewerMessageKey, params: FileViewerMessageParams, locale: FileViewerLocale) => string | undefined;
|
|
7
8
|
export type FileViewerMessages = Partial<Record<FileViewerMessageKey, string>> | FileViewerMessageResolver;
|
|
@@ -10,9 +11,20 @@ export interface FileViewerI18nOptions {
|
|
|
10
11
|
messages?: FileViewerMessages;
|
|
11
12
|
}
|
|
12
13
|
export type FileViewerFileRef = File | Blob | ArrayBuffer;
|
|
13
|
-
export type FileViewerToolbarPosition = 'auto' | 'top' | 'bottom-right';
|
|
14
|
+
export type FileViewerToolbarPosition = 'auto' | 'top' | 'top-center' | 'bottom-right';
|
|
15
|
+
export type FileViewerFitMode = 'auto' | 'contain' | 'cover' | 'width' | 'height' | 'actual' | 'scale-down';
|
|
16
|
+
export type FileViewerFitResize = 'until-interaction' | 'always' | 'initial';
|
|
17
|
+
export interface FileViewerFitOptions {
|
|
18
|
+
mode?: FileViewerFitMode;
|
|
19
|
+
resize?: FileViewerFitResize;
|
|
20
|
+
padding?: number;
|
|
21
|
+
minScale?: number;
|
|
22
|
+
maxScale?: number;
|
|
23
|
+
}
|
|
14
24
|
export type FileViewerLifecyclePhase = 'load-start' | 'load-complete' | 'unload-start' | 'unload-complete';
|
|
15
25
|
export type FileViewerOperationType = 'download' | 'print' | 'export-html' | 'zoom-in' | 'zoom-out' | 'zoom-reset';
|
|
26
|
+
export type FileViewerToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml' | 'export-html';
|
|
27
|
+
export type FileViewerResolvedToolbarItem = 'search' | 'zoom' | 'download' | 'print' | 'exportHtml';
|
|
16
28
|
export type FileViewerToolbarActionMap = Partial<Record<FileViewerOperationType, boolean>>;
|
|
17
29
|
export type FileViewerRenderStateKind = 'idle' | 'loading' | 'ready' | 'empty' | 'unsupported' | 'error';
|
|
18
30
|
export type FileViewerRendererCategory = 'office' | 'document' | 'archive' | 'email' | 'eda' | 'cad' | 'model' | 'geo' | 'drawing' | 'mindmap' | 'ebook' | 'image' | 'markdown' | 'code' | 'media' | 'asset' | 'fallback';
|
|
@@ -36,6 +48,8 @@ export interface FileViewerToolbarOptions {
|
|
|
36
48
|
exportHtml?: boolean;
|
|
37
49
|
zoom?: boolean;
|
|
38
50
|
search?: boolean;
|
|
51
|
+
/** Built-in toolbar group order. Missing entries keep their default relative order. */
|
|
52
|
+
order?: FileViewerToolbarItem[];
|
|
39
53
|
/** Controls which built-in toolbar actions are displayed without disabling controller APIs. */
|
|
40
54
|
items?: FileViewerToolbarActionMap;
|
|
41
55
|
/** Hard operation permission map. False values block both built-in toolbar and public API calls. */
|
|
@@ -143,6 +157,7 @@ export interface FileRenderContext {
|
|
|
143
157
|
url?: string;
|
|
144
158
|
streamUrl?: string;
|
|
145
159
|
options?: FileViewerOptions;
|
|
160
|
+
surface?: RenderSurface;
|
|
146
161
|
registerExportAdapter?: (adapter: FileRenderExportAdapter | null) => void;
|
|
147
162
|
onProgressiveRender?: () => void;
|
|
148
163
|
renderNestedBuffer?: (buffer: ArrayBuffer, type: string, target: HTMLDivElement, context?: FileRenderContext) => Promise<FileViewerRenderedInstance | undefined>;
|
|
@@ -279,6 +294,7 @@ export interface FileViewerDrawingOptions {
|
|
|
279
294
|
}
|
|
280
295
|
export type FileViewerCadRenderer = 'auto' | 'webgl' | 'canvas2d';
|
|
281
296
|
export type FileViewerCadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';
|
|
297
|
+
export type FileViewerCadFitMode = 'best' | 'native';
|
|
282
298
|
export interface FileViewerCadOptions {
|
|
283
299
|
wasmPath?: string;
|
|
284
300
|
workerUrl?: string | URL;
|
|
@@ -292,6 +308,16 @@ export interface FileViewerCadOptions {
|
|
|
292
308
|
maxInsertDepth?: number;
|
|
293
309
|
keepRaw?: boolean;
|
|
294
310
|
preloadDwg?: boolean;
|
|
311
|
+
/**
|
|
312
|
+
* `best` fits the first view to visible drawing geometry and ignores common
|
|
313
|
+
* CAD outliers such as paper-space frames or far-away markers. `native`
|
|
314
|
+
* preserves the raw bounds reported by the underlying CAD renderer.
|
|
315
|
+
*/
|
|
316
|
+
fitMode?: FileViewerCadFitMode;
|
|
317
|
+
/**
|
|
318
|
+
* Fraction of the CAD viewport used by fit-to-view. Defaults to 0.92.
|
|
319
|
+
*/
|
|
320
|
+
fitPadding?: number;
|
|
295
321
|
dwfPreferWebgl?: boolean;
|
|
296
322
|
dwfPreferWasm?: boolean;
|
|
297
323
|
dwfBackground?: string;
|
|
@@ -336,6 +362,12 @@ export interface FileViewerAiOptions {
|
|
|
336
362
|
}
|
|
337
363
|
export interface FileViewerOptions {
|
|
338
364
|
theme?: FileViewerThemeMode;
|
|
365
|
+
/**
|
|
366
|
+
* Controls how aggressively the viewer protects its DOM and CSS from the
|
|
367
|
+
* host page. `auto` keeps framework integrations compatible while allowing
|
|
368
|
+
* Web Component integrations to opt into Shadow DOM by default.
|
|
369
|
+
*/
|
|
370
|
+
styleIsolation?: FileViewerStyleIsolation;
|
|
339
371
|
/**
|
|
340
372
|
* Viewer UI language. `auto` follows the browser language, Chinese browsers
|
|
341
373
|
* resolve to `zh-CN`, and all other languages currently resolve to `en-US`.
|
|
@@ -399,6 +431,11 @@ export interface FileViewerOptions {
|
|
|
399
431
|
toolbar?: boolean | FileViewerToolbarOptions;
|
|
400
432
|
search?: boolean | FileViewerSearchOptions;
|
|
401
433
|
ai?: boolean | FileViewerAiOptions;
|
|
434
|
+
/**
|
|
435
|
+
* Explicit content fitting strategy. When omitted, each renderer keeps its
|
|
436
|
+
* historical first-screen behavior for backward compatibility.
|
|
437
|
+
*/
|
|
438
|
+
fit?: FileViewerFitMode | FileViewerFitOptions;
|
|
402
439
|
/**
|
|
403
440
|
* Initial renderer view position used after the document becomes ready.
|
|
404
441
|
*
|
|
@@ -479,11 +516,31 @@ export interface FileViewerZoomState {
|
|
|
479
516
|
minScale?: number;
|
|
480
517
|
maxScale?: number;
|
|
481
518
|
}
|
|
519
|
+
export interface FileViewerFitRequest extends Required<Pick<FileViewerFitOptions, 'mode' | 'resize' | 'padding'>> {
|
|
520
|
+
minScale?: number;
|
|
521
|
+
maxScale?: number;
|
|
522
|
+
source: FileViewerViewStateChangeSource;
|
|
523
|
+
reason: 'initial' | 'resize' | 'api' | 'retry';
|
|
524
|
+
viewportWidth: number;
|
|
525
|
+
viewportHeight: number;
|
|
526
|
+
container?: HTMLElement | null;
|
|
527
|
+
}
|
|
528
|
+
export interface FileViewerFitResult {
|
|
529
|
+
applied: boolean;
|
|
530
|
+
mode: FileViewerFitMode;
|
|
531
|
+
resize: FileViewerFitResize;
|
|
532
|
+
scale?: number;
|
|
533
|
+
source?: FileViewerViewStateChangeSource;
|
|
534
|
+
reason?: string;
|
|
535
|
+
provider?: 'view-state' | 'zoom' | 'none' | (string & {});
|
|
536
|
+
state?: FileViewerViewState;
|
|
537
|
+
}
|
|
482
538
|
export interface FileViewerZoomProvider {
|
|
483
539
|
zoomIn: () => FileViewerZoomState | Promise<FileViewerZoomState>;
|
|
484
540
|
zoomOut: () => FileViewerZoomState | Promise<FileViewerZoomState>;
|
|
485
541
|
resetZoom: () => FileViewerZoomState | Promise<FileViewerZoomState>;
|
|
486
542
|
setZoom?: (scale: number) => FileViewerZoomState | Promise<FileViewerZoomState>;
|
|
543
|
+
fit?: (request: FileViewerFitRequest) => FileViewerFitResult | Promise<FileViewerFitResult>;
|
|
487
544
|
getState: () => FileViewerZoomState;
|
|
488
545
|
subscribe?: (listener: () => void) => () => void;
|
|
489
546
|
}
|
|
@@ -513,7 +570,7 @@ export interface FileViewerViewState {
|
|
|
513
570
|
extra?: Record<string, unknown>;
|
|
514
571
|
}
|
|
515
572
|
export type FileViewerViewStateChangeSource = 'initial' | 'api' | 'user' | 'viewer' | (string & {});
|
|
516
|
-
export type FileViewerViewStateChangeAction = 'init' | 'restore' | 'page-change' | 'page-click' | 'page-step' | 'outline-click' | 'zoom-change' | 'zoom-in' | 'zoom-out' | 'zoom-reset' | 'rotation-change' | 'rotate-left' | 'rotate-right' | 'scroll' | 'navigation-toggle' | 'navigation-mode-change' | (string & {});
|
|
573
|
+
export type FileViewerViewStateChangeAction = 'init' | 'restore' | 'page-change' | 'page-click' | 'page-step' | 'outline-click' | 'zoom-change' | 'zoom-in' | 'zoom-out' | 'zoom-reset' | 'fit' | 'rotation-change' | 'rotate-left' | 'rotate-right' | 'scroll' | 'navigation-toggle' | 'navigation-mode-change' | (string & {});
|
|
517
574
|
export interface FileViewerViewStateChange {
|
|
518
575
|
state: FileViewerViewState;
|
|
519
576
|
action: FileViewerViewStateChangeAction;
|
|
@@ -528,6 +585,7 @@ export interface FileViewerApplyViewStateOptions {
|
|
|
528
585
|
export interface FileViewerViewStateProvider {
|
|
529
586
|
getState: () => FileViewerViewState;
|
|
530
587
|
applyState?: (state: FileViewerViewState, options?: FileViewerApplyViewStateOptions) => FileViewerViewState | Promise<FileViewerViewState>;
|
|
588
|
+
fit?: (request: FileViewerFitRequest) => FileViewerFitResult | Promise<FileViewerFitResult>;
|
|
531
589
|
subscribe?: (listener: (change: FileViewerViewStateChange) => void) => () => void;
|
|
532
590
|
}
|
|
533
591
|
export interface FileViewerSearchMatch {
|
|
@@ -575,6 +633,10 @@ export interface FileViewerDocumentChunk {
|
|
|
575
633
|
export interface FileViewerComponentProps {
|
|
576
634
|
file?: FileViewerFileRef;
|
|
577
635
|
url?: string;
|
|
636
|
+
name?: string;
|
|
637
|
+
filename?: string;
|
|
638
|
+
type?: string;
|
|
639
|
+
size?: number;
|
|
578
640
|
options?: FileViewerOptions;
|
|
579
641
|
}
|
|
580
642
|
export interface FileViewerComponentEventMap {
|
|
@@ -589,6 +651,7 @@ export interface FileViewerComponentEventMap {
|
|
|
589
651
|
'location-change': FileViewerDocumentAnchor | null;
|
|
590
652
|
'zoom-change': FileViewerZoomState;
|
|
591
653
|
'view-state-change': FileViewerViewStateChange;
|
|
654
|
+
'fit-change': FileViewerFitResult;
|
|
592
655
|
}
|
|
593
656
|
export type FileViewerEventType = keyof FileViewerComponentEventMap;
|
|
594
657
|
export type FileViewerEvent = {
|
|
@@ -610,14 +673,17 @@ export interface FileViewerComponentEmits {
|
|
|
610
673
|
(event: 'location-change', anchor: FileViewerComponentEventMap['location-change']): void;
|
|
611
674
|
(event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
|
|
612
675
|
(event: 'view-state-change', change: FileViewerComponentEventMap['view-state-change']): void;
|
|
676
|
+
(event: 'fit-change', result: FileViewerComponentEventMap['fit-change']): void;
|
|
613
677
|
}
|
|
614
678
|
export interface FileViewerPublicApi {
|
|
679
|
+
destroy(): void;
|
|
615
680
|
downloadOriginalFile(): Promise<void>;
|
|
616
681
|
printRenderedHtml(): Promise<void>;
|
|
617
682
|
exportRenderedHtml(): Promise<void>;
|
|
618
683
|
zoomIn(): Promise<FileViewerZoomState>;
|
|
619
684
|
zoomOut(): Promise<FileViewerZoomState>;
|
|
620
685
|
resetZoom(): Promise<FileViewerZoomState>;
|
|
686
|
+
fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
621
687
|
getZoomState(): FileViewerZoomState;
|
|
622
688
|
getViewState(): FileViewerViewState | null;
|
|
623
689
|
applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
|
|
@@ -667,8 +733,10 @@ export interface NormalizedFileViewerSource {
|
|
|
667
733
|
size?: number;
|
|
668
734
|
}
|
|
669
735
|
export interface RenderSurface {
|
|
736
|
+
host?: HTMLElement;
|
|
670
737
|
container: HTMLElement;
|
|
671
738
|
shadowRoot?: ShadowRoot;
|
|
739
|
+
styleIsolation?: Exclude<FileViewerStyleIsolation, 'auto'>;
|
|
672
740
|
}
|
|
673
741
|
export interface RendererCapability {
|
|
674
742
|
download?: boolean;
|
|
@@ -763,6 +831,7 @@ export interface FileViewerInstance {
|
|
|
763
831
|
zoomIn(): Promise<FileViewerZoomState>;
|
|
764
832
|
zoomOut(): Promise<FileViewerZoomState>;
|
|
765
833
|
resetZoom(): Promise<FileViewerZoomState>;
|
|
834
|
+
fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
766
835
|
getZoomState(): FileViewerZoomState;
|
|
767
836
|
getViewState(): FileViewerViewState | null;
|
|
768
837
|
applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
|
|
@@ -13,6 +13,7 @@ export const unregisterFileViewerSearchProvider = (host) => {
|
|
|
13
13
|
delete host.__flyfishViewerSearchProvider;
|
|
14
14
|
};
|
|
15
15
|
export const findFileViewerSearchProvider = (root) => {
|
|
16
|
+
var _a;
|
|
16
17
|
if (!root) {
|
|
17
18
|
return null;
|
|
18
19
|
}
|
|
@@ -20,7 +21,7 @@ export const findFileViewerSearchProvider = (root) => {
|
|
|
20
21
|
if (direct) {
|
|
21
22
|
return direct;
|
|
22
23
|
}
|
|
23
|
-
const host = root.querySelector('[data-viewer-search-provider]');
|
|
24
|
+
const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-search-provider]');
|
|
24
25
|
return host
|
|
25
26
|
? searchProviderRegistry.get(host) || host.__flyfishViewerSearchProvider || null
|
|
26
27
|
: null;
|
|
@@ -39,6 +40,7 @@ export const unregisterFileViewerZoomProvider = (host) => {
|
|
|
39
40
|
delete host.__flyfishViewerZoomProvider;
|
|
40
41
|
};
|
|
41
42
|
export const findFileViewerZoomProvider = (root) => {
|
|
43
|
+
var _a;
|
|
42
44
|
if (!root) {
|
|
43
45
|
return null;
|
|
44
46
|
}
|
|
@@ -46,7 +48,7 @@ export const findFileViewerZoomProvider = (root) => {
|
|
|
46
48
|
if (direct) {
|
|
47
49
|
return direct;
|
|
48
50
|
}
|
|
49
|
-
const host = root.querySelector('[data-viewer-zoom-provider]');
|
|
51
|
+
const host = (_a = root.querySelector) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-zoom-provider]');
|
|
50
52
|
return host
|
|
51
53
|
? zoomProviderRegistry.get(host) || host.__flyfishViewerZoomProvider || null
|
|
52
54
|
: null;
|
|
@@ -65,6 +67,7 @@ export const unregisterFileViewerViewStateProvider = (host) => {
|
|
|
65
67
|
delete host.__flyfishViewerViewStateProvider;
|
|
66
68
|
};
|
|
67
69
|
export const findFileViewerViewStateProvider = (root) => {
|
|
70
|
+
var _a;
|
|
68
71
|
if (!root) {
|
|
69
72
|
return null;
|
|
70
73
|
}
|
|
@@ -73,7 +76,7 @@ export const findFileViewerViewStateProvider = (root) => {
|
|
|
73
76
|
if (direct && root.dataset.viewerViewStateProvider !== 'generic') {
|
|
74
77
|
return direct;
|
|
75
78
|
}
|
|
76
|
-
const hosts = Array.from(root.querySelectorAll('[data-viewer-view-state-provider]'));
|
|
79
|
+
const hosts = Array.from(((_a = root.querySelectorAll) === null || _a === void 0 ? void 0 : _a.call(root, '[data-viewer-view-state-provider]')) || []);
|
|
77
80
|
const customHost = hosts.find(host => host.dataset.viewerViewStateProvider !== 'generic');
|
|
78
81
|
const genericHost = hosts.find(host => host.dataset.viewerViewStateProvider === 'generic');
|
|
79
82
|
const host = customHost || genericHost;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerViewState, FileViewerViewStateChangeSource } from '../../contracts/types';
|
|
2
|
+
export declare const FILE_VIEWER_FIT_MODES: readonly ["auto", "contain", "cover", "width", "height", "actual", "scale-down"];
|
|
3
|
+
export declare const FILE_VIEWER_FIT_RESIZE_MODES: readonly ["until-interaction", "always", "initial"];
|
|
4
|
+
export interface NormalizedFileViewerFitOptions extends Required<Pick<FileViewerFitOptions, 'mode' | 'resize' | 'padding'>> {
|
|
5
|
+
minScale?: number;
|
|
6
|
+
maxScale?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolveFileViewerFitScaleInput {
|
|
9
|
+
mode: FileViewerFitMode;
|
|
10
|
+
viewportWidth: number;
|
|
11
|
+
viewportHeight: number;
|
|
12
|
+
contentWidth: number;
|
|
13
|
+
contentHeight: number;
|
|
14
|
+
currentScale?: number;
|
|
15
|
+
minScale?: number;
|
|
16
|
+
maxScale?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CreateFileViewerFitControllerOptions {
|
|
19
|
+
root: () => HTMLElement | null | undefined;
|
|
20
|
+
enabled?: () => boolean;
|
|
21
|
+
getFit?: () => FileViewerFitMode | FileViewerFitOptions | null | undefined;
|
|
22
|
+
onFit?: (result: FileViewerFitResult) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface ApplyInitialFileViewerFitOptions {
|
|
25
|
+
skip?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RunFileViewerFitOptions {
|
|
28
|
+
source?: FileViewerViewStateChangeSource;
|
|
29
|
+
reason?: FileViewerFitRequest['reason'];
|
|
30
|
+
}
|
|
31
|
+
export interface FileViewerFitController {
|
|
32
|
+
normalize(fit?: FileViewerFitMode | FileViewerFitOptions | null): NormalizedFileViewerFitOptions | null;
|
|
33
|
+
fit(fit?: FileViewerFitMode | FileViewerFitOptions | null, options?: RunFileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
34
|
+
applyInitialFit(options?: ApplyInitialFileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
35
|
+
scheduleFit(reason?: FileViewerFitRequest['reason']): void;
|
|
36
|
+
observe(): void;
|
|
37
|
+
markUserInteraction(): void;
|
|
38
|
+
resetAutoFit(): void;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare const isFileViewerFitMode: (value: unknown) => value is FileViewerFitMode;
|
|
42
|
+
export declare const isFileViewerFitResize: (value: unknown) => value is FileViewerFitResize;
|
|
43
|
+
export declare const normalizeFileViewerFitOptions: (fit?: FileViewerFitMode | FileViewerFitOptions | null) => NormalizedFileViewerFitOptions | null;
|
|
44
|
+
export declare const resolveFileViewerFitScale: ({ mode, viewportWidth, viewportHeight, contentWidth, contentHeight, currentScale, minScale, maxScale, }: ResolveFileViewerFitScaleInput) => number | undefined;
|
|
45
|
+
export declare const hasFileViewerExplicitInitialViewState: (state?: FileViewerViewState | null) => boolean;
|
|
46
|
+
export declare const createFileViewerFitController: ({ root, enabled, getFit, onFit, }: CreateFileViewerFitControllerOptions) => FileViewerFitController;
|