@file-viewer/core 2.1.17 → 2.1.19
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 +68 -3
- package/dist/features/document/dom/providers.d.ts +5 -3
- package/dist/features/document/dom/providers.js +33 -8
- package/dist/features/document/fit.d.ts +46 -0
- package/dist/features/document/fit.js +348 -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 +67 -16
- package/dist/renderers/index.js +4 -4
- package/dist/rendering/handler.d.ts +33 -5
- package/dist/rendering/handler.js +127 -4
- package/dist/source/loading.d.ts +3 -1
- package/dist/source/loading.js +6 -2
- package/dist/viewer/createViewer.js +66 -11
- 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 +1 -1
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 {
|
|
@@ -593,6 +651,7 @@ export interface FileViewerComponentEventMap {
|
|
|
593
651
|
'location-change': FileViewerDocumentAnchor | null;
|
|
594
652
|
'zoom-change': FileViewerZoomState;
|
|
595
653
|
'view-state-change': FileViewerViewStateChange;
|
|
654
|
+
'fit-change': FileViewerFitResult;
|
|
596
655
|
}
|
|
597
656
|
export type FileViewerEventType = keyof FileViewerComponentEventMap;
|
|
598
657
|
export type FileViewerEvent = {
|
|
@@ -614,14 +673,17 @@ export interface FileViewerComponentEmits {
|
|
|
614
673
|
(event: 'location-change', anchor: FileViewerComponentEventMap['location-change']): void;
|
|
615
674
|
(event: 'zoom-change', state: FileViewerComponentEventMap['zoom-change']): void;
|
|
616
675
|
(event: 'view-state-change', change: FileViewerComponentEventMap['view-state-change']): void;
|
|
676
|
+
(event: 'fit-change', result: FileViewerComponentEventMap['fit-change']): void;
|
|
617
677
|
}
|
|
618
678
|
export interface FileViewerPublicApi {
|
|
679
|
+
destroy(): void;
|
|
619
680
|
downloadOriginalFile(): Promise<void>;
|
|
620
681
|
printRenderedHtml(): Promise<void>;
|
|
621
682
|
exportRenderedHtml(): Promise<void>;
|
|
622
683
|
zoomIn(): Promise<FileViewerZoomState>;
|
|
623
684
|
zoomOut(): Promise<FileViewerZoomState>;
|
|
624
685
|
resetZoom(): Promise<FileViewerZoomState>;
|
|
686
|
+
fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
625
687
|
getZoomState(): FileViewerZoomState;
|
|
626
688
|
getViewState(): FileViewerViewState | null;
|
|
627
689
|
applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
|
|
@@ -671,8 +733,10 @@ export interface NormalizedFileViewerSource {
|
|
|
671
733
|
size?: number;
|
|
672
734
|
}
|
|
673
735
|
export interface RenderSurface {
|
|
736
|
+
host?: HTMLElement;
|
|
674
737
|
container: HTMLElement;
|
|
675
738
|
shadowRoot?: ShadowRoot;
|
|
739
|
+
styleIsolation?: Exclude<FileViewerStyleIsolation, 'auto'>;
|
|
676
740
|
}
|
|
677
741
|
export interface RendererCapability {
|
|
678
742
|
download?: boolean;
|
|
@@ -767,6 +831,7 @@ export interface FileViewerInstance {
|
|
|
767
831
|
zoomIn(): Promise<FileViewerZoomState>;
|
|
768
832
|
zoomOut(): Promise<FileViewerZoomState>;
|
|
769
833
|
resetZoom(): Promise<FileViewerZoomState>;
|
|
834
|
+
fitToView(fit?: FileViewerFitMode | FileViewerFitOptions): Promise<FileViewerFitResult>;
|
|
770
835
|
getZoomState(): FileViewerZoomState;
|
|
771
836
|
getViewState(): FileViewerViewState | null;
|
|
772
837
|
applyViewState(state: FileViewerViewState, options?: FileViewerApplyViewStateOptions): Promise<FileViewerViewState | null>;
|
|
@@ -8,12 +8,14 @@ export interface FileViewerZoomProviderHost extends HTMLElement {
|
|
|
8
8
|
export interface FileViewerViewStateProviderHost extends HTMLElement {
|
|
9
9
|
__flyfishViewerViewStateProvider?: FileViewerViewStateProvider;
|
|
10
10
|
}
|
|
11
|
+
type FileViewerProviderSearchRoot = HTMLElement | ShadowRoot | null | undefined;
|
|
11
12
|
export declare const registerFileViewerSearchProvider: (host: HTMLElement, provider: FileViewerSearchProvider) => void;
|
|
12
13
|
export declare const unregisterFileViewerSearchProvider: (host: HTMLElement | null | undefined) => void;
|
|
13
|
-
export declare const findFileViewerSearchProvider: (root:
|
|
14
|
+
export declare const findFileViewerSearchProvider: (root: FileViewerProviderSearchRoot) => FileViewerSearchProvider | null;
|
|
14
15
|
export declare const registerFileViewerZoomProvider: (host: HTMLElement, provider: FileViewerZoomProvider) => void;
|
|
15
16
|
export declare const unregisterFileViewerZoomProvider: (host: HTMLElement | null | undefined) => void;
|
|
16
|
-
export declare const findFileViewerZoomProvider: (root:
|
|
17
|
+
export declare const findFileViewerZoomProvider: (root: FileViewerProviderSearchRoot) => FileViewerZoomProvider | null;
|
|
17
18
|
export declare const registerFileViewerViewStateProvider: (host: HTMLElement, provider: FileViewerViewStateProvider) => void;
|
|
18
19
|
export declare const unregisterFileViewerViewStateProvider: (host: HTMLElement | null | undefined) => void;
|
|
19
|
-
export declare const findFileViewerViewStateProvider: (root:
|
|
20
|
+
export declare const findFileViewerViewStateProvider: (root: FileViewerProviderSearchRoot) => FileViewerViewStateProvider | null;
|
|
21
|
+
export {};
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
const searchProviderRegistry = new WeakMap();
|
|
2
2
|
const zoomProviderRegistry = new WeakMap();
|
|
3
3
|
const viewStateProviderRegistry = new WeakMap();
|
|
4
|
+
const isProviderElement = (root) => {
|
|
5
|
+
return !!root && root.nodeType === 1;
|
|
6
|
+
};
|
|
7
|
+
const queryProviderHosts = (root, selector) => {
|
|
8
|
+
if (!(root === null || root === void 0 ? void 0 : root.querySelectorAll)) {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
const hosts = Array.from(root.querySelectorAll(selector));
|
|
12
|
+
if (isProviderElement(root) && root.shadowRoot) {
|
|
13
|
+
hosts.push(...queryProviderHosts(root.shadowRoot, selector));
|
|
14
|
+
}
|
|
15
|
+
const elements = Array.from(root.querySelectorAll('*'));
|
|
16
|
+
for (const element of elements) {
|
|
17
|
+
if (element.shadowRoot) {
|
|
18
|
+
hosts.push(...queryProviderHosts(element.shadowRoot, selector));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return hosts;
|
|
22
|
+
};
|
|
4
23
|
export const registerFileViewerSearchProvider = (host, provider) => {
|
|
5
24
|
searchProviderRegistry.set(host, provider);
|
|
6
25
|
host.__flyfishViewerSearchProvider = provider;
|
|
@@ -16,11 +35,13 @@ export const findFileViewerSearchProvider = (root) => {
|
|
|
16
35
|
if (!root) {
|
|
17
36
|
return null;
|
|
18
37
|
}
|
|
19
|
-
const direct =
|
|
38
|
+
const direct = isProviderElement(root)
|
|
39
|
+
? searchProviderRegistry.get(root) || root.__flyfishViewerSearchProvider
|
|
40
|
+
: null;
|
|
20
41
|
if (direct) {
|
|
21
42
|
return direct;
|
|
22
43
|
}
|
|
23
|
-
const host = root
|
|
44
|
+
const host = queryProviderHosts(root, '[data-viewer-search-provider]')[0];
|
|
24
45
|
return host
|
|
25
46
|
? searchProviderRegistry.get(host) || host.__flyfishViewerSearchProvider || null
|
|
26
47
|
: null;
|
|
@@ -42,11 +63,13 @@ export const findFileViewerZoomProvider = (root) => {
|
|
|
42
63
|
if (!root) {
|
|
43
64
|
return null;
|
|
44
65
|
}
|
|
45
|
-
const direct =
|
|
66
|
+
const direct = isProviderElement(root)
|
|
67
|
+
? zoomProviderRegistry.get(root) || root.__flyfishViewerZoomProvider
|
|
68
|
+
: null;
|
|
46
69
|
if (direct) {
|
|
47
70
|
return direct;
|
|
48
71
|
}
|
|
49
|
-
const host = root
|
|
72
|
+
const host = queryProviderHosts(root, '[data-viewer-zoom-provider]')[0];
|
|
50
73
|
return host
|
|
51
74
|
? zoomProviderRegistry.get(host) || host.__flyfishViewerZoomProvider || null
|
|
52
75
|
: null;
|
|
@@ -68,12 +91,14 @@ export const findFileViewerViewStateProvider = (root) => {
|
|
|
68
91
|
if (!root) {
|
|
69
92
|
return null;
|
|
70
93
|
}
|
|
71
|
-
const direct =
|
|
72
|
-
root
|
|
73
|
-
|
|
94
|
+
const direct = isProviderElement(root)
|
|
95
|
+
? viewStateProviderRegistry.get(root) ||
|
|
96
|
+
root.__flyfishViewerViewStateProvider
|
|
97
|
+
: null;
|
|
98
|
+
if (direct && (!isProviderElement(root) || root.dataset.viewerViewStateProvider !== 'generic')) {
|
|
74
99
|
return direct;
|
|
75
100
|
}
|
|
76
|
-
const hosts =
|
|
101
|
+
const hosts = queryProviderHosts(root, '[data-viewer-view-state-provider]');
|
|
77
102
|
const customHost = hosts.find(host => host.dataset.viewerViewStateProvider !== 'generic');
|
|
78
103
|
const genericHost = hosts.find(host => host.dataset.viewerViewStateProvider === 'generic');
|
|
79
104
|
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;
|