@file-viewer/core 3.2.2 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @file-viewer/core
2
2
 
3
+ [English](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.md) · [简体中文](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.zh-CN.md)
4
+
3
5
  <!-- FILE_VIEWER_PACKAGE_HEADER -->
4
6
  <p>
5
7
  <a href="https://www.npmjs.com/package/@file-viewer/core"><img src="https://img.shields.io/npm/v/@file-viewer%2Fcore?logo=npm" alt="npm version"></a>
@@ -9,7 +11,7 @@
9
11
  </p>
10
12
 
11
13
  <p>
12
- <a href="https://github.com/flyfish-dev/file-viewer">GitHub</a> · <a href="https://doc.file-viewer.app/">Docs</a> · <a href="https://demo.file-viewer.app/">Live demo</a> · <a href="https://doc.file-viewer.app/guide/formats">Format matrix</a> · <a href="https://github.com/flyfish-dev/file-viewer/issues">Issues</a> · <a href="https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.md">简体中文</a>
14
+ <a href="https://github.com/flyfish-dev/file-viewer">GitHub</a> · <a href="https://doc.file-viewer.app/">Docs</a> · <a href="https://demo.file-viewer.app/">Live demo</a> · <a href="https://doc.file-viewer.app/guide/formats">Format matrix</a> · <a href="https://github.com/flyfish-dev/file-viewer/issues">Issues</a> · <a href="https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.zh-CN.md">简体中文</a>
13
15
  </p>
14
16
 
15
17
  <p>
@@ -84,6 +86,15 @@ const viewer = createViewer(document.querySelector('#viewer')!, {
84
86
  await viewer.load({ url: '/files/report.pdf' })
85
87
  ```
86
88
 
89
+ Zoom buttons keep their positions and become disabled at their limits. Configure the existing `toolbar.items` map to hide reset controls while retaining the `resetZoom()` API. Set `pdf.zoomToolbar` to `false` to hide the PDF renderer's zoom group while keeping its page navigation and rotation controls:
90
+
91
+ ```ts
92
+ const options = {
93
+ toolbar: { items: { 'zoom-reset': false } },
94
+ pdf: { zoomToolbar: false }
95
+ }
96
+ ```
97
+
87
98
  HTML document builders live in the opt-in export entry so ordinary previews do
88
99
  not download the sanitizer. The viewer's `exportHtml()` and `print()` methods
89
100
  load this entry only when invoked. For v3, migrate direct builder imports from
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @file-viewer/core
2
2
 
3
+ [English](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.md) · [简体中文](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.zh-CN.md)
4
+
3
5
  <!-- FILE_VIEWER_PACKAGE_HEADER -->
4
6
  <p>
5
7
  <a href="https://www.npmjs.com/package/@file-viewer/core"><img src="https://img.shields.io/npm/v/@file-viewer%2Fcore?logo=npm" alt="npm version"></a>
@@ -9,38 +11,38 @@
9
11
  </p>
10
12
 
11
13
  <p>
12
- <a href="https://github.com/flyfish-dev/file-viewer">GitHub</a> · <a href="https://doc.file-viewer.app/zh/">文档</a> · <a href="https://demo.file-viewer.app/">在线 Demo</a> · <a href="https://doc.file-viewer.app/guide/formats">格式矩阵</a> · <a href="https://github.com/flyfish-dev/file-viewer/issues">问题反馈</a> · <a href="https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.en.md">English</a>
14
+ <a href="https://github.com/flyfish-dev/file-viewer">GitHub</a> · <a href="https://doc.file-viewer.app/">Docs</a> · <a href="https://demo.file-viewer.app/">Live demo</a> · <a href="https://doc.file-viewer.app/guide/formats">Format matrix</a> · <a href="https://github.com/flyfish-dev/file-viewer/issues">Issues</a> · <a href="https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.zh-CN.md">简体中文</a>
13
15
  </p>
14
16
 
15
17
  <p>
16
- <a href="https://demo.file-viewer.app/"><img src="https://raw.githubusercontent.com/flyfish-dev/file-viewer/main/docs/public/_media/file-viewer-demo-v3-zh.webp" width="760" alt="File Viewer 在线演示:Word、Excel、PPT、3D 模型、CAD 图纸与二进制检查器"></a>
18
+ <a href="https://demo.file-viewer.app/"><img src="https://raw.githubusercontent.com/flyfish-dev/file-viewer/main/docs/public/_media/file-viewer-demo-v3-en.webp" width="760" alt="File Viewer live demo: Word, Excel, PowerPoint, 3D model, CAD drawing and binary inspector"></a>
17
19
  </p>
18
20
 
19
- > ⭐ 如果 File Viewer 对你有帮助,欢迎到 [GitHub](https://github.com/flyfish-dev/file-viewer) 点个 Star。
21
+ > ⭐ If File Viewer helps you, please [star the repo on GitHub](https://github.com/flyfish-dev/file-viewer).
20
22
 
21
23
  Framework-neutral TypeScript foundation for Flyfish File Viewer.
22
24
 
23
- This package is the migration base for the next architecture: one pure TypeScript core package with internal `headless`, `browser`, and `renderers` layers, plus multiple native standard component packages for Vue, React, pure JavaScript, jQuery and Svelte. Core owns the shared format matrix, source detection, renderer protocol, capability calculation, lifecycle context, operation/event/search/location/zoom/print/export contracts, heavy renderer asset manifests, option normalization, pure state models, and framework-neutral browser rendering engine.
25
+ This package is the migration base for the next architecture: one pure TypeScript core package with internal `headless`, `browser`, and `renderers` layers, plus multiple native standard component packages for Vue, React, pure JavaScript, jQuery, and Svelte. Core owns the shared format matrix, source detection, renderer protocol, capability calculation, lifecycle context, operation guards, operation/event/search/location/zoom/print/export contracts, heavy renderer asset manifests, option normalization, pure state models, and framework-neutral browser rendering engine.
24
26
 
25
- Browser execution belongs inside core only when it remains framework-neutral TypeScript. DOM mounting, the standard browser shell and toolbar, `HTMLElement` traversal, search highlights, zoom provider discovery, print windows, download triggers, Canvas, Worker and WASM renderers must not depend on Vue, React, Svelte or any component package. Framework component packages keep their own component lifecycle, public type surface, compatibility defaults, and ecosystem interaction layer while depending on `@file-viewer/core` as the only shared base.
27
+ Browser execution belongs inside core only when it remains framework-neutral TypeScript. DOM mounting, the standard browser shell and toolbar, `HTMLElement` traversal, search highlights, zoom provider discovery, print windows, download triggers, Canvas, Worker, and WASM renderers must not depend on Vue, React, Svelte, or any component package. Framework component packages keep their own component lifecycle, public type surface, compatibility defaults, and ecosystem interaction layer while depending on `@file-viewer/core` as the only shared base.
26
28
 
27
29
  `@file-viewer/core` is the only shared foundation package. It owns the headless contracts plus browser/renderers layers for the direct `createViewer(container, options)` engine, renderer registry, DOM provider registry, print layout helpers, browser asset resolution, and framework-neutral DOM/Canvas/Worker/WASM rendering contracts. Core source is public; the private Gitea aggregate remains available for the complete workspace, unified release automation, sponsorship, and priority support.
28
30
 
29
- Current framework-neutral browser renderers still inside core are limited to the low-cost image path. Spreadsheet rendering has moved to `@file-viewer/renderer-spreadsheet`; CAD rendering has moved to `@file-viewer/renderer-cad`; Typst rendering has moved to `@file-viewer/renderer-typst`; OFD rendering has moved to `@file-viewer/renderer-ofd`; PDF rendering has moved to `@file-viewer/renderer-pdf`; archive rendering has moved to `@file-viewer/renderer-archive`; email rendering has moved to `@file-viewer/renderer-email`; EPUB and UMD ebook rendering has moved to `@file-viewer/renderer-epub`; 3D model rendering has moved to `@file-viewer/renderer-3d`; Draw.io, Excalidraw, Mermaid, and PlantUML rendering has moved to `@file-viewer/renderer-drawing`; audio, video, HLS and MIDI rendering has moved to `@file-viewer/renderer-media`; code, text, Markdown, patch and git bundle rendering has moved to `@file-viewer/renderer-text`; Word DOCX/DOC/RTF/ODT rendering has moved to `@file-viewer/renderer-word`; PowerPoint rendering has moved to `@file-viewer/renderer-presentation`; XMind rendering has moved to `@file-viewer/renderer-mindmap`; geospatial rendering has moved to `@file-viewer/renderer-geo`; data asset rendering has moved to `@file-viewer/renderer-data`; EDA rendering and parsing has moved to `@file-viewer/renderer-eda`. Core-only installs now avoid direct OFD, PDF, Word, Spreadsheet, PPTX, CAD, Typst, XMind, Geo, media, 3D, drawing, archive, email, EPUB, UMD, data asset, EDA, `ofd-xml-parser`, `jszip`, `pdfjs-dist`, `styled-exceljs`, `e-virt-table`, `tinycolor2`, `@flyfish-dev/cad-viewer`, `@myriaddreamin/*`, `highlight.js`, `marked`, `diff2html`, `pako`, `mermaid`, `plantuml-encoder`, `@panzoom/panzoom`, `hls.js`, `@tonejs/midi`, `three`, `@excalidraw/excalidraw`, `roughjs`, `libarchive.js`, `postal-mime`, `@kenjiuno/msgreader`, `epubjs`, `ag-psd`, `sql.js`, `hyparquet`, `avsc` and `cfb` engine dependencies.
31
+ Current framework-neutral browser renderers still inside core are limited to the low-cost image path. Spreadsheet rendering has moved to `@file-viewer/renderer-spreadsheet`; CAD rendering has moved to `@file-viewer/renderer-cad`; Typst rendering has moved to `@file-viewer/renderer-typst`; OFD rendering has moved to `@file-viewer/renderer-ofd`; PDF rendering has moved to `@file-viewer/renderer-pdf`; archive rendering has moved to `@file-viewer/renderer-archive`; email rendering has moved to `@file-viewer/renderer-email`; EPUB and UMD ebook rendering has moved to `@file-viewer/renderer-epub`; 3D model rendering has moved to `@file-viewer/renderer-3d`; Draw.io, Excalidraw, Mermaid, and PlantUML rendering has moved to `@file-viewer/renderer-drawing`; audio, video, HLS, and MIDI rendering has moved to `@file-viewer/renderer-media`; code, text, Markdown, patch, and git bundle rendering has moved to `@file-viewer/renderer-text`; Word DOCX/DOC/RTF/ODT rendering has moved to `@file-viewer/renderer-word`; PowerPoint rendering has moved to `@file-viewer/renderer-presentation`; XMind rendering has moved to `@file-viewer/renderer-mindmap`; geospatial rendering has moved to `@file-viewer/renderer-geo`; data asset rendering has moved to `@file-viewer/renderer-data`; EDA rendering and parsing has moved to `@file-viewer/renderer-eda`. Core-only installs now avoid direct OFD, PDF, Word, Spreadsheet, PPTX, CAD, Typst, XMind, Geo, media, 3D, drawing, archive, email, EPUB, UMD, data asset, EDA, `ofd-xml-parser`, `jszip`, `pdfjs-dist`, `styled-exceljs`, `e-virt-table`, `tinycolor2`, `@flyfish-dev/cad-viewer`, `@myriaddreamin/*`, `highlight.js`, `marked`, `diff2html`, `pako`, `mermaid`, `plantuml-encoder`, `@panzoom/panzoom`, `hls.js`, `@tonejs/midi`, `three`, `@excalidraw/excalidraw`, `roughjs`, `libarchive.js`, `postal-mime`, `@kenjiuno/msgreader`, `epubjs`, `ag-psd`, `sql.js`, `hyparquet`, `avsc`, and `cfb` engine dependencies.
30
32
 
31
33
  ```bash
32
34
  npm install @file-viewer/core
33
35
  ```
34
36
 
35
- ## 渲染前预检
37
+ ## Preflight Before Rendering
36
38
 
37
- `precheckFileViewerSource()` 不会创建 viewer,也不会加载重型 renderer。它先检查当前扩展名是否在能力范围内,并对 PDF、OpenXML / OpenDocument、旧版 OLE Office、RTF 等格式执行签名或包结构检查。`valid: null` 明确表示该格式只有能力检查、没有做完整解析;真实 renderer 仍是畸形文件的最终判断者。
39
+ `precheckFileViewerSource()` does not create a viewer or load a heavy renderer. It checks whether the extension is available and validates known PDF, OpenXML / OpenDocument, legacy OLE Office, and RTF signatures or package parts. `valid: null` explicitly means capability-only detection, not a full parse; the real renderer remains the final authority for malformed content.
38
40
 
39
41
  ```ts
40
42
  import { precheckFileViewerSource } from '@file-viewer/core/headless'
41
43
 
42
44
  const result = await precheckFileViewerSource(file, {
43
- // 可传当前产品实际安装的扩展名列表,避免把未装 preset 的格式报成可预览
45
+ // Restrict this to the extensions actually installed by this product.
44
46
  supportedExtensions: ['pdf', 'docx', 'xlsx', 'pptx']
45
47
  })
46
48
 
@@ -51,7 +53,7 @@ if (!result.previewable) {
51
53
 
52
54
  ## Entry points
53
55
 
54
- Use `@file-viewer/core/headless` when a component package, server-side helper or build script only needs framework-neutral contracts: format support, source normalization, renderer capability metadata, lifecycle/operation context, option normalization, state helpers and static asset resolution. This entry intentionally does not expose the DOM viewer engine or browser renderers.
56
+ Use `@file-viewer/core/headless` when a component package, server-side helper, or build script only needs framework-neutral contracts: format support, source normalization, renderer capability metadata, lifecycle/operation context, option normalization, state helpers, and static asset resolution. This entry intentionally does not expose the DOM viewer engine or browser renderers.
55
57
 
56
58
  ```ts
57
59
  import {
@@ -66,7 +68,7 @@ const pdfAssets = resolveFileViewerRendererAssets('pdf', {
66
68
  })
67
69
  ```
68
70
 
69
- Use `@file-viewer/core/browser` when a native component package or a pure browser integration needs the shared browser shell and toolbar, direct DOM engine, renderer registry, search/zoom providers, print/export adapters and framework-neutral Canvas/Worker/WASM renderers.
71
+ Use `@file-viewer/core/browser` when a native component package or pure browser integration needs the shared browser shell and toolbar, direct DOM engine, renderer registry, search/zoom providers, print/export adapters, and framework-neutral Canvas/Worker/WASM renderers.
70
72
 
71
73
  ```ts
72
74
  import {
@@ -84,6 +86,15 @@ const viewer = createViewer(document.querySelector('#viewer')!, {
84
86
  await viewer.load({ url: '/files/report.pdf' })
85
87
  ```
86
88
 
89
+ Zoom buttons keep their positions and become disabled at their limits. Configure the existing `toolbar.items` map to hide reset controls while retaining the `resetZoom()` API. Set `pdf.zoomToolbar` to `false` to hide the PDF renderer's zoom group while keeping its page navigation and rotation controls:
90
+
91
+ ```ts
92
+ const options = {
93
+ toolbar: { items: { 'zoom-reset': false } },
94
+ pdf: { zoomToolbar: false }
95
+ }
96
+ ```
97
+
87
98
  HTML document builders live in the opt-in export entry so ordinary previews do
88
99
  not download the sanitizer. The viewer's `exportHtml()` and `print()` methods
89
100
  load this entry only when invoked. For v3, migrate direct builder imports from
@@ -96,10 +107,10 @@ import {
96
107
  } from '@file-viewer/core/export'
97
108
  ```
98
109
 
99
- Vue 3 模板中已弃用的兼容导出在 v3 中改为异步,以保持这条懒加载边界;
100
- 旧调用需要使用 `await buildExportHtmlDocument(...)` 或
101
- `await collectDocumentStyles()`。直接从 `export` 子路径导入时,返回类型仍
102
- 按该子路径的 API 文档保持不变。
110
+ The deprecated Vue 3 template re-exports are asynchronous in v3 to preserve
111
+ this lazy boundary, so legacy calls must use `await buildExportHtmlDocument(...)`
112
+ or `await collectDocumentStyles()`. Direct imports from the `export` subpath
113
+ keep their documented return types.
103
114
 
104
115
  `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.
105
116
 
@@ -112,13 +123,8 @@ import {
112
123
  } from '@file-viewer/core'
113
124
 
114
125
  const manifests = listFileViewerRendererAssetManifests()
115
- const cadAssets = resolveFileViewerRendererAssets('cad', {
116
- baseUrl: '/file-viewer/',
117
- options: {
118
- cad: {
119
- wasmPath: '/file-viewer/wasm/cad/'
120
- }
121
- }
126
+ const archiveAssets = resolveFileViewerRendererAssets('archive', {
127
+ baseUrl: '/file-viewer/'
122
128
  })
123
129
  ```
124
130
 
@@ -132,7 +138,7 @@ import { setDefaultFileViewerAssetBaseUrl } from '@file-viewer/core'
132
138
  setDefaultFileViewerAssetBaseUrl('/tenant/static/file-viewer/')
133
139
  ```
134
140
 
135
- The manifest API lets wrappers and deployment scripts discover archive, DOCX, Spreadsheet, CAD, Typst and data-asset worker/WASM resources from the same core contract instead of hard-coding per-framework paths. Spreadsheet assets remain part of the shared deployment contract for `@file-viewer/renderer-spreadsheet`; CAD assets remain part of the shared deployment contract for `@file-viewer/renderer-cad`; archive assets remain part of the shared deployment contract for `@file-viewer/renderer-archive`; DOCX assets remain part of the shared deployment contract for `@file-viewer/renderer-word`; SQLite WASM asset resolution remains in core so `@file-viewer/renderer-data` and deployment tools share one stable offline path.
141
+ The manifest API lets wrappers and deployment scripts discover archive, DOCX, Spreadsheet, CAD, Typst, and data-asset worker/WASM resources from the same core contract instead of hard-coding per-framework paths. Spreadsheet assets remain part of the shared deployment contract for `@file-viewer/renderer-spreadsheet`; CAD assets remain part of the shared deployment contract for `@file-viewer/renderer-cad`; archive assets remain part of the shared deployment contract for `@file-viewer/renderer-archive`; DOCX assets remain part of the shared deployment contract for `@file-viewer/renderer-word`; SQLite WASM asset resolution remains in core so `@file-viewer/renderer-data` and deployment tools share one stable offline path.
136
142
 
137
143
  Official documentation: https://doc.file-viewer.app/
138
144
 
@@ -147,14 +153,14 @@ The GitHub/Gitee repositories are distributed public source packages. The privat
147
153
 
148
154
  License: Apache-2.0. For second development or commercial use, keep clear Flyfish Viewer attribution and contribute shared compatibility improvements where possible.
149
155
 
150
- ## 格式与相关包
156
+ ## Formats and related packages
151
157
 
152
- File Viewer 在浏览器内预览 275+ 种扩展名,覆盖 Office、PDF/OFD、CAD、3D、压缩包、邮件、图片、音视频和代码,无需服务端转码;完整清单见 [格式矩阵](https://doc.file-viewer.app/guide/formats)。
158
+ File Viewer previews 275+ file extensions in the browser, covering Office, PDF/OFD, CAD, 3D, archives, email, images, media and code, without server-side conversion. See the [format matrix](https://doc.file-viewer.app/guide/formats) for the full list.
153
159
 
154
- - 组件:`@file-viewer/web`、`@file-viewer/vue3`、`@file-viewer/vue2.7`、`@file-viewer/vue2.6`、`@file-viewer/react`、`@file-viewer/react-legacy`、`@file-viewer/svelte`、`@file-viewer/jquery`,以及对应的 `-full` 包
155
- - 能力组合:`@file-viewer/preset-lite`、`@file-viewer/preset-office`、`@file-viewer/preset-engineering`、`@file-viewer/preset-all`
156
- - 构建:`@file-viewer/vite-plugin`、`file-viewer-copy-assets`
160
+ - Components: `@file-viewer/web`, `@file-viewer/vue3`, `@file-viewer/vue2.7`, `@file-viewer/vue2.6`, `@file-viewer/react`, `@file-viewer/react-legacy`, `@file-viewer/svelte`, `@file-viewer/jquery`, plus their `-full` packages
161
+ - Presets: `@file-viewer/preset-lite`, `@file-viewer/preset-office`, `@file-viewer/preset-engineering`, `@file-viewer/preset-all`
162
+ - Build: `@file-viewer/vite-plugin`, `file-viewer-copy-assets`
157
163
 
158
- ## 许可证
164
+ ## License
159
165
 
160
- 本包采用 Apache-2.0。详见 [LICENSE](https://github.com/flyfish-dev/file-viewer/blob/main/LICENSE)。
166
+ This package is Apache-2.0. See [LICENSE](https://github.com/flyfish-dev/file-viewer/blob/main/LICENSE).
@@ -0,0 +1,171 @@
1
+ # @file-viewer/core
2
+
3
+ [English](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.md) · [简体中文](https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.zh-CN.md)
4
+
5
+ <!-- FILE_VIEWER_PACKAGE_HEADER -->
6
+ <p>
7
+ <a href="https://www.npmjs.com/package/@file-viewer/core"><img src="https://img.shields.io/npm/v/@file-viewer%2Fcore?logo=npm" alt="npm version"></a>
8
+ <a href="https://www.npmjs.com/package/@file-viewer/core"><img src="https://img.shields.io/npm/dm/@file-viewer%2Fcore?logo=npm" alt="npm downloads"></a>
9
+ <a href="https://github.com/flyfish-dev/file-viewer/stargazers"><img src="https://img.shields.io/github/stars/flyfish-dev/file-viewer?style=flat&logo=github" alt="GitHub stars"></a>
10
+ <a href="https://github.com/flyfish-dev/file-viewer/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue" alt="License: Apache-2.0"></a>
11
+ </p>
12
+
13
+ <p>
14
+ <a href="https://github.com/flyfish-dev/file-viewer">GitHub</a> · <a href="https://doc.file-viewer.app/zh/">文档</a> · <a href="https://demo.file-viewer.app/">在线 Demo</a> · <a href="https://doc.file-viewer.app/guide/formats">格式矩阵</a> · <a href="https://github.com/flyfish-dev/file-viewer/issues">问题反馈</a> · <a href="https://github.com/flyfish-dev/file-viewer/blob/main/packages/core/README.md">English</a>
15
+ </p>
16
+
17
+ <p>
18
+ <a href="https://demo.file-viewer.app/"><img src="https://raw.githubusercontent.com/flyfish-dev/file-viewer/main/docs/public/_media/file-viewer-demo-v3-zh.webp" width="760" alt="File Viewer 在线演示:Word、Excel、PPT、3D 模型、CAD 图纸与二进制检查器"></a>
19
+ </p>
20
+
21
+ > ⭐ 如果 File Viewer 对你有帮助,欢迎到 [GitHub](https://github.com/flyfish-dev/file-viewer) 点个 Star。
22
+
23
+ Framework-neutral TypeScript foundation for Flyfish File Viewer.
24
+
25
+ This package is the migration base for the next architecture: one pure TypeScript core package with internal `headless`, `browser`, and `renderers` layers, plus multiple native standard component packages for Vue, React, pure JavaScript, jQuery and Svelte. Core owns the shared format matrix, source detection, renderer protocol, capability calculation, lifecycle context, operation/event/search/location/zoom/print/export contracts, heavy renderer asset manifests, option normalization, pure state models, and framework-neutral browser rendering engine.
26
+
27
+ Browser execution belongs inside core only when it remains framework-neutral TypeScript. DOM mounting, the standard browser shell and toolbar, `HTMLElement` traversal, search highlights, zoom provider discovery, print windows, download triggers, Canvas, Worker and WASM renderers must not depend on Vue, React, Svelte or any component package. Framework component packages keep their own component lifecycle, public type surface, compatibility defaults, and ecosystem interaction layer while depending on `@file-viewer/core` as the only shared base.
28
+
29
+ `@file-viewer/core` is the only shared foundation package. It owns the headless contracts plus browser/renderers layers for the direct `createViewer(container, options)` engine, renderer registry, DOM provider registry, print layout helpers, browser asset resolution, and framework-neutral DOM/Canvas/Worker/WASM rendering contracts. Core source is public; the private Gitea aggregate remains available for the complete workspace, unified release automation, sponsorship, and priority support.
30
+
31
+ Current framework-neutral browser renderers still inside core are limited to the low-cost image path. Spreadsheet rendering has moved to `@file-viewer/renderer-spreadsheet`; CAD rendering has moved to `@file-viewer/renderer-cad`; Typst rendering has moved to `@file-viewer/renderer-typst`; OFD rendering has moved to `@file-viewer/renderer-ofd`; PDF rendering has moved to `@file-viewer/renderer-pdf`; archive rendering has moved to `@file-viewer/renderer-archive`; email rendering has moved to `@file-viewer/renderer-email`; EPUB and UMD ebook rendering has moved to `@file-viewer/renderer-epub`; 3D model rendering has moved to `@file-viewer/renderer-3d`; Draw.io, Excalidraw, Mermaid, and PlantUML rendering has moved to `@file-viewer/renderer-drawing`; audio, video, HLS and MIDI rendering has moved to `@file-viewer/renderer-media`; code, text, Markdown, patch and git bundle rendering has moved to `@file-viewer/renderer-text`; Word DOCX/DOC/RTF/ODT rendering has moved to `@file-viewer/renderer-word`; PowerPoint rendering has moved to `@file-viewer/renderer-presentation`; XMind rendering has moved to `@file-viewer/renderer-mindmap`; geospatial rendering has moved to `@file-viewer/renderer-geo`; data asset rendering has moved to `@file-viewer/renderer-data`; EDA rendering and parsing has moved to `@file-viewer/renderer-eda`. Core-only installs now avoid direct OFD, PDF, Word, Spreadsheet, PPTX, CAD, Typst, XMind, Geo, media, 3D, drawing, archive, email, EPUB, UMD, data asset, EDA, `ofd-xml-parser`, `jszip`, `pdfjs-dist`, `styled-exceljs`, `e-virt-table`, `tinycolor2`, `@flyfish-dev/cad-viewer`, `@myriaddreamin/*`, `highlight.js`, `marked`, `diff2html`, `pako`, `mermaid`, `plantuml-encoder`, `@panzoom/panzoom`, `hls.js`, `@tonejs/midi`, `three`, `@excalidraw/excalidraw`, `roughjs`, `libarchive.js`, `postal-mime`, `@kenjiuno/msgreader`, `epubjs`, `ag-psd`, `sql.js`, `hyparquet`, `avsc` and `cfb` engine dependencies.
32
+
33
+ ```bash
34
+ npm install @file-viewer/core
35
+ ```
36
+
37
+ ## 渲染前预检
38
+
39
+ `precheckFileViewerSource()` 不会创建 viewer,也不会加载重型 renderer。它先检查当前扩展名是否在能力范围内,并对 PDF、OpenXML / OpenDocument、旧版 OLE Office、RTF 等格式执行签名或包结构检查。`valid: null` 明确表示该格式只有能力检查、没有做完整解析;真实 renderer 仍是畸形文件的最终判断者。
40
+
41
+ ```ts
42
+ import { precheckFileViewerSource } from '@file-viewer/core/headless'
43
+
44
+ const result = await precheckFileViewerSource(file, {
45
+ // 可传当前产品实际安装的扩展名列表,避免把未装 preset 的格式报成可预览
46
+ supportedExtensions: ['pdf', 'docx', 'xlsx', 'pptx']
47
+ })
48
+
49
+ if (!result.previewable) {
50
+ console.warn(result.reason, result.missingParts)
51
+ }
52
+ ```
53
+
54
+ ## Entry points
55
+
56
+ Use `@file-viewer/core/headless` when a component package, server-side helper or build script only needs framework-neutral contracts: format support, source normalization, renderer capability metadata, lifecycle/operation context, option normalization, state helpers and static asset resolution. This entry intentionally does not expose the DOM viewer engine or browser renderers.
57
+
58
+ ```ts
59
+ import {
60
+ DEFAULT_SUPPORTED_EXTENSIONS,
61
+ normalizeSource,
62
+ resolveFileViewerRendererAssets
63
+ } from '@file-viewer/core/headless'
64
+
65
+ const source = normalizeSource({ url: '/files/report.pdf' })
66
+ const pdfAssets = resolveFileViewerRendererAssets('pdf', {
67
+ baseUrl: '/file-viewer/'
68
+ })
69
+ ```
70
+
71
+ Use `@file-viewer/core/browser` when a native component package or a pure browser integration needs the shared browser shell and toolbar, direct DOM engine, renderer registry, search/zoom providers, print/export adapters and framework-neutral Canvas/Worker/WASM renderers.
72
+
73
+ ```ts
74
+ import {
75
+ createViewer,
76
+ coreBrowserRendererHandlers
77
+ } from '@file-viewer/core/browser'
78
+
79
+ const viewer = createViewer(document.querySelector('#viewer')!, {
80
+ options: {
81
+ toolbar: true,
82
+ styleIsolation: 'shadow'
83
+ }
84
+ })
85
+
86
+ await viewer.load({ url: '/files/report.pdf' })
87
+ ```
88
+
89
+ 缩放按钮在达到边界时保持位置并禁用。使用现有的 `toolbar.items` 配置隐藏重置入口,`resetZoom()` API 仍然可用。设置 `pdf.zoomToolbar: false` 可仅隐藏 PDF 渲染器内部的缩放组,同时保留翻页和旋转控件:
90
+
91
+ ```ts
92
+ const options = {
93
+ toolbar: { items: { 'zoom-reset': false } },
94
+ pdf: { zoomToolbar: false }
95
+ }
96
+ ```
97
+
98
+ HTML document builders live in the opt-in export entry so ordinary previews do
99
+ not download the sanitizer. The viewer's `exportHtml()` and `print()` methods
100
+ load this entry only when invoked. For v3, migrate direct builder imports from
101
+ the package root to the explicit subpath:
102
+
103
+ ```ts
104
+ import {
105
+ buildExportHtmlDocument,
106
+ buildFileViewerRenderedHtmlDocument
107
+ } from '@file-viewer/core/export'
108
+ ```
109
+
110
+ Vue 3 模板中已弃用的兼容导出在 v3 中改为异步,以保持这条懒加载边界;
111
+ 旧调用需要使用 `await buildExportHtmlDocument(...)` 或
112
+ `await collectDocumentStyles()`。直接从 `export` 子路径导入时,返回类型仍
113
+ 按该子路径的 API 文档保持不变。
114
+
115
+ `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.
116
+
117
+ The root `@file-viewer/core` entry remains the normal browser-compatible entry. New component packages should prefer the narrowest explicit entry point they need: `headless` for contracts and build-time helpers, `browser` for real browser preview, and `export` for sanitized standalone HTML documents.
118
+
119
+ ```ts
120
+ import {
121
+ listFileViewerRendererAssetManifests,
122
+ resolveFileViewerRendererAssets
123
+ } from '@file-viewer/core'
124
+
125
+ const manifests = listFileViewerRendererAssetManifests()
126
+ const cadAssets = resolveFileViewerRendererAssets('cad', {
127
+ baseUrl: '/file-viewer/',
128
+ options: {
129
+ cad: {
130
+ wasmPath: '/file-viewer/wasm/cad/'
131
+ }
132
+ }
133
+ })
134
+ ```
135
+
136
+ For non-Vite hosts or custom static directories, configure one runtime asset
137
+ base before loading a file. Renderer-specific URLs still take priority. The
138
+ Vite plugin sets this automatically from `copyAssets.baseDir`.
139
+
140
+ ```ts
141
+ import { setDefaultFileViewerAssetBaseUrl } from '@file-viewer/core'
142
+
143
+ setDefaultFileViewerAssetBaseUrl('/tenant/static/file-viewer/')
144
+ ```
145
+
146
+ The manifest API lets wrappers and deployment scripts discover archive, DOCX, Spreadsheet, CAD, Typst and data-asset worker/WASM resources from the same core contract instead of hard-coding per-framework paths. Spreadsheet assets remain part of the shared deployment contract for `@file-viewer/renderer-spreadsheet`; CAD assets remain part of the shared deployment contract for `@file-viewer/renderer-cad`; archive assets remain part of the shared deployment contract for `@file-viewer/renderer-archive`; DOCX assets remain part of the shared deployment contract for `@file-viewer/renderer-word`; SQLite WASM asset resolution remains in core so `@file-viewer/renderer-data` and deployment tools share one stable offline path.
147
+
148
+ Official documentation: https://doc.file-viewer.app/
149
+
150
+ Online demo: https://demo.file-viewer.app/
151
+
152
+ Public source repositories:
153
+
154
+ - GitHub: https://github.com/flyfish-dev/file-viewer-core
155
+ - Gitee: https://gitee.com/flyfish-dev/file-viewer-core
156
+
157
+ The GitHub/Gitee repositories are distributed public source packages. The private Gitea aggregate remains useful for the complete workspace, release automation, integration history, sponsorship, and priority support.
158
+
159
+ License: Apache-2.0. For second development or commercial use, keep clear Flyfish Viewer attribution and contribute shared compatibility improvements where possible.
160
+
161
+ ## 格式与相关包
162
+
163
+ File Viewer 在浏览器内预览 275+ 种扩展名,覆盖 Office、PDF/OFD、CAD、3D、压缩包、邮件、图片、音视频和代码,无需服务端转码;完整清单见 [格式矩阵](https://doc.file-viewer.app/guide/formats)。
164
+
165
+ - 组件:`@file-viewer/web`、`@file-viewer/vue3`、`@file-viewer/vue2.7`、`@file-viewer/vue2.6`、`@file-viewer/react`、`@file-viewer/react-legacy`、`@file-viewer/svelte`、`@file-viewer/jquery`,以及对应的 `-full` 包
166
+ - 能力组合:`@file-viewer/preset-lite`、`@file-viewer/preset-office`、`@file-viewer/preset-engineering`、`@file-viewer/preset-all`
167
+ - 构建:`@file-viewer/vite-plugin`、`file-viewer-copy-assets`
168
+
169
+ ## 许可证
170
+
171
+ 本包采用 Apache-2.0。详见 [LICENSE](https://github.com/flyfish-dev/file-viewer/blob/main/LICENSE)。