@file-viewer/web 2.0.9 → 2.0.11

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,23 +1,35 @@
1
1
  # @file-viewer/web
2
2
 
3
- The standard pure web native component package for Flyfish File Viewer. It mounts the complete viewer directly into the target DOM and ships the ESM API, IIFE global bundle, and asset-copy CLI for legacy admin pages, script-tag usage, and framework-free systems.
3
+ The standard pure web native component package for Flyfish File Viewer. It ships the `<flyfish-file-viewer>` Web Component, imperative `mountViewer` controller, IIFE global bundle, and asset-copy CLI for legacy admin pages, script-tag usage, micro-frontends, and framework-free systems.
4
4
 
5
5
  ```bash
6
6
  npm install @file-viewer/web
7
7
  ```
8
8
 
9
+ ```html
10
+ <flyfish-file-viewer
11
+ id="viewer"
12
+ src="/example/demo.pdf"
13
+ theme="light"
14
+ toolbar-position="bottom-right"
15
+ style="display:block;height:720px"
16
+ ></flyfish-file-viewer>
17
+ ```
18
+
9
19
  ```ts
10
- import { mountViewer } from '@file-viewer/web'
11
-
12
- const controller = mountViewer(document.getElementById('viewer')!, {
13
- url: '/example/demo.pdf',
14
- options: {
15
- theme: 'light',
16
- toolbar: { position: 'bottom-right' }
17
- }
20
+ import { defineFileViewerElement } from '@file-viewer/web'
21
+
22
+ defineFileViewerElement()
23
+
24
+ const viewer = document.getElementById('viewer')
25
+ viewer.addEventListener('viewer-event', event => {
26
+ console.log(event.detail.type)
18
27
  })
28
+ viewer.zoomIn()
19
29
  ```
20
30
 
31
+ Use `mountViewer(container, options)` when you need a fully imperative controller.
32
+
21
33
  Use the asset copy command when you need to self-host workers, WASM files, and static examples:
22
34
 
23
35
  ```bash
@@ -28,12 +40,11 @@ No-build or legacy admin pages can copy `dist/flyfish-file-viewer-web.iife.js` a
28
40
 
29
41
  ```html
30
42
  <script src="/vendor/file-viewer-web/flyfish-file-viewer-web.iife.js"></script>
31
- <script>
32
- window.FlyfishFileViewerWeb.mountViewer(document.getElementById('viewer'), {
33
- url: '/files/demo.pdf',
34
- options: { theme: 'light' }
35
- })
36
- </script>
43
+ <flyfish-file-viewer
44
+ src="/files/demo.pdf"
45
+ theme="light"
46
+ style="display:block;height:720px"
47
+ ></flyfish-file-viewer>
37
48
  ```
38
49
 
39
50
  The historical package `@flyfish-group/file-viewer-web` remains supported for compatibility. New integrations should prefer the standard package `@file-viewer/web`.
@@ -114,7 +125,7 @@ The table below lists the real props, event channel, and customization entry for
114
125
  | Vue 2.6 `@file-viewer/vue2.6` | Same as Vue 2.7 | `viewer-event` / `viewerEvent` | Separate Vue 2.6 build for long-lived applications that cannot move to Vue 2.7. |
115
126
  | React `@file-viewer/react` | `ViewerMountOptions` plus native `div` props such as `className`, `style`, `data-*`, and `aria-*` | `onEvent`, `onStateChange` | `ref` exposes `FileViewerHandle`; `useFileViewer()` returns `ref`, `props`, `state`, and `handle` for custom toolbars. |
116
127
  | React Legacy `@file-viewer/react-legacy` | Same as the React package | `onEvent`, `onStateChange` | Targets React 16.8 / 17 with a legacy-friendly component export. |
117
- | Pure Web `@file-viewer/web` | `mountViewer(container, ViewerMountOptions, ViewerCoreOptions?)` | `onEvent`, `onStateChange`, `controller.subscribe()` | Returns `ViewerController`; also ships ESM, script-tag IIFE, and the `file-viewer-copy-assets` CLI. |
128
+ | Pure Web `@file-viewer/web` | `<flyfish-file-viewer>` attributes: `src/url`, `filename/name`, `type`, `size`, `theme`, `toolbar`, `toolbar-position`, `watermark`, `search`, `options`; also supports `mountViewer(...)` | `viewer-ready`, `viewer-event`, `viewer-state-change`, `viewer-error`, `onEvent`, `onStateChange`, `controller.subscribe()` | The Custom Element instance exposes the full controller handle; the IIFE script auto-registers it while keeping imperative `mountViewer` and the asset copy CLI. |
118
129
  | jQuery `@file-viewer/jquery` | `$(el).fileViewer(ViewerMountOptions & { replace?: boolean })` | `onEvent`, `onStateChange`, or `getFileViewerController(el).subscribe()` | Plugin methods include `zoomIn`, `printRenderedHtml`, and `searchDocument`; `replace:false` updates the same node in place. |
119
130
  | Svelte `@file-viewer/svelte` | `ViewerMountOptions` plus `className` and `containerStyle` | `on:viewerEvent`, `onEvent`, `onStateChange` | `bind:this` exposes the controller handle; the `use:fileViewer` action is also available and adds `replace`. |
120
131
 
@@ -149,7 +160,7 @@ For fully custom toolbars, hide the built-in toolbar and call the standard ref /
149
160
  | Vue 3 | Pass `:options="{ toolbar: false }"`, call `downloadOriginalFile()`, `printRenderedHtml()`, `exportRenderedHtml()`, `zoomIn()`, `zoomOut()`, and `resetZoom()` through the template ref, and sync buttons with `@operation-availability-change` plus `@zoom-change`. |
150
161
  | Vue 2.7 / 2.6 | Use `toolbar:false`, call instance methods through `$refs.viewer`, and listen to `@viewer-event` for `operation-availability-change` or `zoom-change`. |
151
162
  | React / React Legacy | Prefer `useFileViewer({ options:{ toolbar:false } })`; pass `viewer.props` to the component, bind custom buttons to `viewer.handle`, and read `viewer.state.availability` / `viewer.state.zoom`. |
152
- | Pure Web | Use `mountViewer(container, { options:{ toolbar:false }, onStateChange })`; custom DOM buttons call controller methods, and `controller.subscribe()` covers more advanced state sync. |
163
+ | Pure Web | Use `<flyfish-file-viewer toolbar="false">` or `mountViewer(container, { options:{ toolbar:false }, onStateChange })`; custom DOM buttons can call `zoomIn()`, `printRenderedHtml()`, `searchDocument()`, and other element / controller methods directly. Use `viewer-state-change` or `controller.subscribe()` for advanced state sync. |
153
164
  | jQuery | Use `$("#viewer").fileViewer({ options:{ toolbar:false } })`; buttons can call `$("#viewer").fileViewer("zoomIn")` or read capability state through `getFileViewerController($("#viewer")).subscribe()`. |
154
165
  | Svelte | Use `<FileViewer bind:this={viewer} options={{ toolbar:false }} />`; buttons call `viewer.zoomIn()` / `viewer.printRenderedHtml()`, with `on:viewerEvent` or `onStateChange` for state sync. |
155
166
 
package/README.md CHANGED
@@ -1,23 +1,35 @@
1
1
  # @file-viewer/web
2
2
 
3
- 标准纯 Web native 组件包。它把完整 Flyfish Viewer 直接挂载到目标 DOM,提供 ESM API、IIFE 全局脚本和资源复制 CLI,适合传统后台页面、script 标签接入和无框架系统集成。
3
+ 标准纯 Web native 组件包。它提供 `<flyfish-file-viewer>` 原生 Web Component、`mountViewer` 命令式 controller、IIFE 全局脚本和资源复制 CLI,适合传统后台页面、script 标签接入、微前端壳和无框架系统集成。
4
4
 
5
5
  ```bash
6
6
  npm install @file-viewer/web
7
7
  ```
8
8
 
9
+ ```html
10
+ <flyfish-file-viewer
11
+ id="viewer"
12
+ src="/example/demo.pdf"
13
+ theme="light"
14
+ toolbar-position="bottom-right"
15
+ style="display:block;height:720px"
16
+ ></flyfish-file-viewer>
17
+ ```
18
+
9
19
  ```ts
10
- import { mountViewer } from '@file-viewer/web'
11
-
12
- const controller = mountViewer(document.getElementById('viewer')!, {
13
- url: '/example/demo.pdf',
14
- options: {
15
- theme: 'light',
16
- toolbar: { position: 'bottom-right' }
17
- }
20
+ import { defineFileViewerElement } from '@file-viewer/web'
21
+
22
+ defineFileViewerElement()
23
+
24
+ const viewer = document.getElementById('viewer')
25
+ viewer.addEventListener('viewer-event', event => {
26
+ console.log(event.detail.type)
18
27
  })
28
+ viewer.zoomIn()
19
29
  ```
20
30
 
31
+ 需要完全命令式场景时,仍可使用 `mountViewer(container, options)` 返回完整 controller。
32
+
21
33
  如需自托管 Worker、WASM 和静态示例资源,可以使用资源复制命令:
22
34
 
23
35
  ```bash
@@ -28,12 +40,11 @@ npx file-viewer-copy-assets ./public/file-viewer
28
40
 
29
41
  ```html
30
42
  <script src="/vendor/file-viewer-web/flyfish-file-viewer-web.iife.js"></script>
31
- <script>
32
- window.FlyfishFileViewerWeb.mountViewer(document.getElementById('viewer'), {
33
- url: '/files/demo.pdf',
34
- options: { theme: 'light' }
35
- })
36
- </script>
43
+ <flyfish-file-viewer
44
+ src="/files/demo.pdf"
45
+ theme="light"
46
+ style="display:block;height:720px"
47
+ ></flyfish-file-viewer>
37
48
  ```
38
49
 
39
50
  历史包名 `@flyfish-group/file-viewer-web` 会继续同步维护;新项目建议优先使用标准包 `@file-viewer/web`。English README: [README.en.md](./README.en.md)。
@@ -114,7 +125,7 @@ npx file-viewer-copy-assets ./public/file-viewer
114
125
  | Vue 2.6 `@file-viewer/vue2.6` | 同 Vue 2.7 | `viewer-event` / `viewerEvent` | 独立 Vue 2.6 构建,不要求业务升级到 Vue 2.7。 |
115
126
  | React `@file-viewer/react` | `ViewerMountOptions` + `div` 原生属性,如 `className`、`style`、`data-*`、`aria-*` | `onEvent`、`onStateChange` | `ref` 暴露 `FileViewerHandle`;`useFileViewer()` 会返回 `ref`、`props`、`state`、`handle`,便于自定义工具栏。 |
116
127
  | React Legacy `@file-viewer/react-legacy` | 同 React 标准包 | `onEvent`、`onStateChange` | 面向 React 16.8 / 17;组件名和默认导出保持 legacy 生态友好。 |
117
- | Pure Web `@file-viewer/web` | `mountViewer(container, ViewerMountOptions, ViewerCoreOptions?)` | `onEvent`、`onStateChange`、`controller.subscribe()` | 返回 `ViewerController`;同时提供 ESM、IIFE script 标签包和 `file-viewer-copy-assets`。 |
128
+ | Pure Web `@file-viewer/web` | `<flyfish-file-viewer>` 属性 `src/url`、`filename/name`、`type`、`size`、`theme`、`toolbar`、`toolbar-position`、`watermark`、`search`、`options`;也支持 `mountViewer(...)` | `viewer-ready`、`viewer-event`、`viewer-state-change`、`viewer-error`、`onEvent`、`onStateChange`、`controller.subscribe()` | Custom Element 实例暴露完整 controller handle;IIFE script 标签会自动注册元素,同时保留 `mountViewer` 命令式挂载和资源复制 CLI。 |
118
129
  | jQuery `@file-viewer/jquery` | `$(el).fileViewer(ViewerMountOptions & { replace?: boolean })` | `onEvent`、`onStateChange` 或 `getFileViewerController(el).subscribe()` | 插件方法支持 `zoomIn`、`printRenderedHtml`、`searchDocument` 等;`replace:false` 可在同一节点上原地更新。 |
119
130
  | Svelte `@file-viewer/svelte` | `ViewerMountOptions` + `className`、`containerStyle` | `on:viewerEvent`、`onEvent`、`onStateChange` | `bind:this` 暴露 controller handle;也提供 `use:fileViewer` action,action 额外支持 `replace`。 |
120
131
 
@@ -149,7 +160,7 @@ npx file-viewer-copy-assets ./public/file-viewer
149
160
  | Vue 3 | 传 `:options="{ toolbar: false }"` 隐藏内置工具栏,通过模板 `ref` 调用 `downloadOriginalFile()`、`printRenderedHtml()`、`exportRenderedHtml()`、`zoomIn()`、`zoomOut()`、`resetZoom()`;用 `@operation-availability-change` 和 `@zoom-change` 同步按钮显隐与比例。 |
150
161
  | Vue 2.7 / 2.6 | 同样设置 `toolbar:false`,通过 `$refs.viewer` 调用实例方法;监听 `@viewer-event`,在 `event.type === "operation-availability-change"` 或 `event.type === "zoom-change"` 时更新外部工具栏。 |
151
162
  | React / React Legacy | 推荐 `useFileViewer({ options:{ toolbar:false } })`,把 `viewer.props` 传给组件,把按钮绑定到 `viewer.handle`,并读取 `viewer.state.availability` / `viewer.state.zoom` 控制禁用状态。 |
152
- | Pure Web | `const controller = mountViewer(container, { options:{ toolbar:false }, onStateChange })`;外部 DOM 按钮调用 controller 方法,复杂场景可用 `controller.subscribe()` 做状态同步。 |
163
+ | Pure Web | `<flyfish-file-viewer toolbar="false">` 或 `mountViewer(container, { options:{ toolbar:false }, onStateChange })`;外部 DOM 按钮可直接调用元素实例 / controller `zoomIn()`、`printRenderedHtml()`、`searchDocument()` 等方法,复杂场景用 `viewer-state-change` 或 `controller.subscribe()` 同步状态。 |
153
164
  | jQuery | `$("#viewer").fileViewer({ options:{ toolbar:false } })`;按钮调用 `$("#viewer").fileViewer("zoomIn")` 或通过 `getFileViewerController($("#viewer")).subscribe()` 获取能力状态。 |
154
165
  | Svelte | `<FileViewer bind:this={viewer} options={{ toolbar:false }} />`;按钮直接调用 `viewer.zoomIn()`、`viewer.printRenderedHtml()`,并用 `on:viewerEvent` / `onStateChange` 同步状态。 |
155
166
 
@@ -0,0 +1,91 @@
1
+ import { type FileRef, type ViewerController, type ViewerControllerHandle, type ViewerCoreOptions, type ViewerEvent, type ViewerMountOptions, type ViewerOptions, type ViewerState, type ViewerStateListener } from './controller.js';
2
+ export declare const FILE_VIEWER_ELEMENT_TAG = "flyfish-file-viewer";
3
+ export type FileViewerElementEventName = 'viewer-ready' | 'viewer-event' | 'viewer-state-change' | 'viewer-error';
4
+ export interface FileViewerElementReadyDetail {
5
+ controller: ViewerController;
6
+ }
7
+ export interface FileViewerElementStateChangeDetail {
8
+ state: ViewerState;
9
+ event?: ViewerEvent;
10
+ }
11
+ export interface FileViewerElementErrorDetail {
12
+ error: unknown;
13
+ }
14
+ export interface FileViewerElementSource extends ViewerMountOptions {
15
+ coreOptions?: ViewerCoreOptions;
16
+ }
17
+ declare const ElementBase: typeof HTMLElement;
18
+ declare const observedAttributes: readonly ["src", "url", "filename", "name", "type", "size", "theme", "toolbar", "toolbar-position", "watermark", "search", "options"];
19
+ type ObservedAttributeName = typeof observedAttributes[number];
20
+ export declare class FileViewerElement extends ElementBase implements ViewerControllerHandle {
21
+ static get observedAttributes(): ObservedAttributeName[];
22
+ private mountNode;
23
+ private controller;
24
+ private pendingUpdate;
25
+ private mountOptions;
26
+ private internalCoreOptions;
27
+ get src(): string | undefined;
28
+ set src(value: string | undefined);
29
+ get url(): string | undefined;
30
+ set url(value: string | undefined);
31
+ get file(): FileRef | undefined;
32
+ set file(value: FileRef | undefined);
33
+ get buffer(): ArrayBuffer | undefined;
34
+ set buffer(value: ArrayBuffer | undefined);
35
+ get name(): string | undefined;
36
+ set name(value: string | undefined);
37
+ get filename(): string | undefined;
38
+ set filename(value: string | undefined);
39
+ get type(): string | undefined;
40
+ set type(value: string | undefined);
41
+ get size(): number | undefined;
42
+ set size(value: number | undefined);
43
+ get options(): ViewerOptions | undefined;
44
+ set options(value: ViewerOptions | undefined);
45
+ get source(): FileViewerElementSource;
46
+ set source(value: FileViewerElementSource | undefined);
47
+ get coreOptions(): ViewerCoreOptions;
48
+ set coreOptions(value: ViewerCoreOptions | undefined);
49
+ connectedCallback(): void;
50
+ disconnectedCallback(): void;
51
+ attributeChangedCallback(name: ObservedAttributeName, oldValue: string | null, newValue: string | null): void;
52
+ load(options: ViewerMountOptions): Promise<void>;
53
+ update(options?: ViewerMountOptions): Promise<void>;
54
+ reload(): Promise<void>;
55
+ destroy(): void;
56
+ getController(): ViewerController | null;
57
+ getApi(): ReturnType<ViewerControllerHandle['getApi']>;
58
+ downloadOriginalFile(): Promise<void>;
59
+ printRenderedHtml(): Promise<void>;
60
+ exportRenderedHtml(): Promise<void>;
61
+ zoomIn(): ReturnType<ViewerControllerHandle['zoomIn']>;
62
+ zoomOut(): ReturnType<ViewerControllerHandle['zoomOut']>;
63
+ resetZoom(): ReturnType<ViewerControllerHandle['resetZoom']>;
64
+ searchDocument(query: string): ReturnType<ViewerControllerHandle['searchDocument']>;
65
+ clearDocumentSearch(): ReturnType<ViewerControllerHandle['clearDocumentSearch']>;
66
+ nextSearchResult(): ReturnType<ViewerControllerHandle['nextSearchResult']>;
67
+ previousSearchResult(): ReturnType<ViewerControllerHandle['previousSearchResult']>;
68
+ collectDocumentAnchors(): ReturnType<ViewerControllerHandle['collectDocumentAnchors']>;
69
+ scrollToAnchor(anchor: Parameters<ViewerControllerHandle['scrollToAnchor']>[0]): Promise<boolean>;
70
+ scrollToLine(line: number): Promise<boolean>;
71
+ getDocumentTextChunks(): ReturnType<ViewerControllerHandle['getDocumentTextChunks']>;
72
+ getOperationAvailability(): ReturnType<ViewerControllerHandle['getOperationAvailability']>;
73
+ getZoomState(): ReturnType<ViewerControllerHandle['getZoomState']>;
74
+ getSearchState(): ReturnType<ViewerControllerHandle['getSearchState']>;
75
+ getState(): ReturnType<ViewerControllerHandle['getState']>;
76
+ subscribe(listener: ViewerStateListener): () => void;
77
+ private setMountOptions;
78
+ private mount;
79
+ private remount;
80
+ private remountOrUpdate;
81
+ private ensureMountNode;
82
+ private createEffectiveMountOptions;
83
+ private readAttributeMountOptions;
84
+ private readAttributeViewerOptions;
85
+ private scheduleUpdate;
86
+ private dispatchViewerEvent;
87
+ private dispatchError;
88
+ private dispatchTypedEvent;
89
+ }
90
+ export declare const defineFileViewerElement: (tagName?: string) => CustomElementConstructor | undefined;
91
+ export {};