@embedpdf/plugin-viewport 1.0.0 → 1.0.2
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/dist/index.cjs +21 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +26 -21
- package/dist/index.js.map +1 -1
- package/dist/preact/index.cjs +13 -14
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.d.cts +2 -2
- package/dist/preact/index.d.ts +2 -2
- package/dist/preact/index.js +11 -12
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +11 -12
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +10 -11
- package/dist/react/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -134,6 +134,7 @@ var ViewportPlugin = class extends import_core.BasePlugin {
|
|
|
134
134
|
constructor(id, registry, config) {
|
|
135
135
|
super(id, registry);
|
|
136
136
|
this.id = id;
|
|
137
|
+
this.viewportResize$ = (0, import_core.createBehaviorEmitter)();
|
|
137
138
|
this.viewportMetrics$ = (0, import_core.createBehaviorEmitter)();
|
|
138
139
|
this.scrollMetrics$ = (0, import_core.createBehaviorEmitter)();
|
|
139
140
|
this.scrollReq$ = (0, import_core.createEmitter)();
|
|
@@ -151,38 +152,41 @@ var ViewportPlugin = class extends import_core.BasePlugin {
|
|
|
151
152
|
return {
|
|
152
153
|
getViewportGap: () => this.state.viewportGap,
|
|
153
154
|
getMetrics: () => this.state.viewportMetrics,
|
|
154
|
-
onScrollChange: this.scrollMetrics$.on,
|
|
155
|
-
onViewportChange: this.viewportMetrics$.on,
|
|
156
|
-
registerBoundingRectProvider: (fn) => {
|
|
157
|
-
this.rectProvider = fn;
|
|
158
|
-
},
|
|
159
155
|
getBoundingRect: () => this.rectProvider?.() ?? {
|
|
160
156
|
origin: { x: 0, y: 0 },
|
|
161
157
|
size: { width: 0, height: 0 }
|
|
162
158
|
},
|
|
163
|
-
setViewportMetrics: (viewportMetrics) => {
|
|
164
|
-
this.dispatch(setViewportMetrics(viewportMetrics));
|
|
165
|
-
},
|
|
166
|
-
setViewportScrollMetrics: this.setViewportScrollMetrics.bind(this),
|
|
167
159
|
scrollTo: (pos) => this.scrollTo(pos),
|
|
168
|
-
onScrollRequest: this.scrollReq$.on,
|
|
169
160
|
isScrolling: () => this.state.isScrolling,
|
|
161
|
+
onScrollChange: this.scrollMetrics$.on,
|
|
162
|
+
onViewportChange: this.viewportMetrics$.on,
|
|
163
|
+
onViewportResize: this.viewportResize$.on,
|
|
170
164
|
onScrollActivity: this.scrollActivity$.on
|
|
171
165
|
};
|
|
172
166
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
this.
|
|
176
|
-
this.dispatch(setScrollActivity(false));
|
|
177
|
-
this.scrollEndTimer = void 0;
|
|
178
|
-
}, this.scrollEndDelay);
|
|
167
|
+
setViewportResizeMetrics(viewportMetrics) {
|
|
168
|
+
this.dispatch(setViewportMetrics(viewportMetrics));
|
|
169
|
+
this.viewportResize$.emit(this.state.viewportMetrics);
|
|
179
170
|
}
|
|
180
171
|
setViewportScrollMetrics(scrollMetrics) {
|
|
181
172
|
if (scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop || scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft) {
|
|
182
173
|
this.dispatch(setViewportScrollMetrics(scrollMetrics));
|
|
183
174
|
this.bumpScrollActivity();
|
|
175
|
+
this.scrollMetrics$.emit({
|
|
176
|
+
scrollTop: scrollMetrics.scrollTop,
|
|
177
|
+
scrollLeft: scrollMetrics.scrollLeft
|
|
178
|
+
});
|
|
184
179
|
}
|
|
185
180
|
}
|
|
181
|
+
onScrollRequest(listener) {
|
|
182
|
+
return this.scrollReq$.on(listener);
|
|
183
|
+
}
|
|
184
|
+
registerBoundingRectProvider(provider) {
|
|
185
|
+
this.rectProvider = provider;
|
|
186
|
+
}
|
|
187
|
+
bumpScrollActivity() {
|
|
188
|
+
this.debouncedDispatch(setScrollActivity(false), this.scrollEndDelay);
|
|
189
|
+
}
|
|
186
190
|
scrollTo(pos) {
|
|
187
191
|
const { x, y, center, behavior = "auto" } = pos;
|
|
188
192
|
if (center) {
|
|
@@ -206,10 +210,6 @@ var ViewportPlugin = class extends import_core.BasePlugin {
|
|
|
206
210
|
onStoreUpdated(prevState, newState) {
|
|
207
211
|
if (prevState !== newState) {
|
|
208
212
|
this.viewportMetrics$.emit(newState.viewportMetrics);
|
|
209
|
-
this.scrollMetrics$.emit({
|
|
210
|
-
scrollTop: newState.viewportMetrics.scrollTop,
|
|
211
|
-
scrollLeft: newState.viewportMetrics.scrollLeft
|
|
212
|
-
});
|
|
213
213
|
if (prevState.isScrolling !== newState.isScrolling) {
|
|
214
214
|
this.scrollActivity$.emit(newState.isScrolling);
|
|
215
215
|
}
|
|
@@ -220,6 +220,7 @@ var ViewportPlugin = class extends import_core.BasePlugin {
|
|
|
220
220
|
async destroy() {
|
|
221
221
|
super.destroy();
|
|
222
222
|
this.viewportMetrics$.clear();
|
|
223
|
+
this.viewportResize$.clear();
|
|
223
224
|
this.scrollMetrics$.clear();
|
|
224
225
|
this.scrollReq$.clear();
|
|
225
226
|
this.scrollActivity$.clear();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/viewport-plugin.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import { PluginManifest } from '@embedpdf/core';\n\nimport { ViewportPluginConfig } from './types';\n\nexport const VIEWPORT_PLUGIN_ID = 'viewport';\n\nexport const manifest: PluginManifest<ViewportPluginConfig> = {\n id: VIEWPORT_PLUGIN_ID,\n name: 'Viewport Plugin',\n version: '1.0.0',\n provides: ['viewport'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n viewportGap: 10,\n scrollEndDelay: 300,\n },\n};\n","import { Action } from '@embedpdf/core';\n\nimport { ViewportInputMetrics, ViewportScrollMetrics } from './types';\n\nexport const SET_VIEWPORT_METRICS = 'SET_VIEWPORT_METRICS';\nexport const SET_VIEWPORT_SCROLL_METRICS = 'SET_VIEWPORT_SCROLL_METRICS';\nexport const SET_VIEWPORT_GAP = 'SET_VIEWPORT_GAP';\nexport const SET_SCROLL_ACTIVITY = 'SET_SCROLL_ACTIVITY';\n\nexport interface SetViewportMetricsAction extends Action {\n type: typeof SET_VIEWPORT_METRICS;\n payload: ViewportInputMetrics;\n}\n\nexport interface SetViewportScrollMetricsAction extends Action {\n type: typeof SET_VIEWPORT_SCROLL_METRICS;\n payload: ViewportScrollMetrics;\n}\n\nexport interface SetViewportGapAction extends Action {\n type: typeof SET_VIEWPORT_GAP;\n payload: number;\n}\n\nexport interface SetScrollActivityAction extends Action {\n type: typeof SET_SCROLL_ACTIVITY;\n payload: boolean;\n}\n\nexport type ViewportAction =\n | SetViewportMetricsAction\n | SetViewportScrollMetricsAction\n | SetViewportGapAction\n | SetScrollActivityAction;\n\nexport function setViewportGap(viewportGap: number): SetViewportGapAction {\n return {\n type: SET_VIEWPORT_GAP,\n payload: viewportGap,\n };\n}\n\nexport function setViewportMetrics(\n viewportMetrics: ViewportInputMetrics,\n): SetViewportMetricsAction {\n return {\n type: SET_VIEWPORT_METRICS,\n payload: viewportMetrics,\n };\n}\n\nexport function setViewportScrollMetrics(\n scrollMetrics: ViewportScrollMetrics,\n): SetViewportScrollMetricsAction {\n return {\n type: SET_VIEWPORT_SCROLL_METRICS,\n payload: scrollMetrics,\n };\n}\n\nexport function setScrollActivity(isScrolling: boolean): SetScrollActivityAction {\n return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };\n}\n","import { Reducer } from '@embedpdf/core';\n\nimport {\n SET_VIEWPORT_METRICS,\n SET_VIEWPORT_SCROLL_METRICS,\n SET_VIEWPORT_GAP,\n ViewportAction,\n SET_SCROLL_ACTIVITY,\n} from './actions';\nimport { ViewportState } from './types';\n\nexport const initialState: ViewportState = {\n viewportGap: 0,\n viewportMetrics: {\n width: 0,\n height: 0,\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n scrollWidth: 0,\n scrollHeight: 0,\n relativePosition: {\n x: 0,\n y: 0,\n },\n },\n isScrolling: false,\n};\n\nexport const viewportReducer: Reducer<ViewportState, ViewportAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case SET_VIEWPORT_GAP:\n return { ...state, viewportGap: action.payload };\n case SET_VIEWPORT_METRICS:\n return {\n ...state,\n viewportMetrics: {\n width: action.payload.width,\n height: action.payload.height,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n clientWidth: action.payload.clientWidth,\n clientHeight: action.payload.clientHeight,\n scrollWidth: action.payload.scrollWidth,\n scrollHeight: action.payload.scrollHeight,\n relativePosition: {\n x:\n action.payload.scrollWidth <= action.payload.clientWidth\n ? 0\n : action.payload.scrollLeft /\n (action.payload.scrollWidth - action.payload.clientWidth),\n y:\n action.payload.scrollHeight <= action.payload.clientHeight\n ? 0\n : action.payload.scrollTop /\n (action.payload.scrollHeight - action.payload.clientHeight),\n },\n },\n };\n case SET_VIEWPORT_SCROLL_METRICS:\n return {\n ...state,\n viewportMetrics: {\n ...state.viewportMetrics,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n },\n isScrolling: true,\n };\n case SET_SCROLL_ACTIVITY:\n return { ...state, isScrolling: action.payload };\n default:\n return state;\n }\n};\n","import { BasePlugin, PluginRegistry, createEmitter, createBehaviorEmitter } from '@embedpdf/core';\n\nimport {\n ViewportAction,\n setViewportMetrics,\n setViewportScrollMetrics,\n setViewportGap,\n setScrollActivity,\n} from './actions';\nimport {\n ViewportPluginConfig,\n ViewportState,\n ViewportCapability,\n ViewportMetrics,\n ViewportScrollMetrics,\n ViewportInputMetrics,\n ScrollToPayload,\n} from './types';\nimport { Rect } from '@embedpdf/models';\n\nexport class ViewportPlugin extends BasePlugin<\n ViewportPluginConfig,\n ViewportCapability,\n ViewportState,\n ViewportAction\n> {\n static readonly id = 'viewport' as const;\n\n private readonly viewportMetrics$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly scrollMetrics$ = createBehaviorEmitter<ViewportScrollMetrics>();\n private readonly scrollReq$ = createEmitter<{\n x: number;\n y: number;\n behavior?: ScrollBehavior;\n }>();\n private readonly scrollActivity$ = createBehaviorEmitter<boolean>();\n\n /* ------------------------------------------------------------------ */\n /* “live rect” infrastructure */\n /* ------------------------------------------------------------------ */\n private rectProvider: (() => Rect) | null = null;\n\n private scrollEndTimer?: number;\n private readonly scrollEndDelay: number;\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n config: ViewportPluginConfig,\n ) {\n super(id, registry);\n\n if (config.viewportGap) {\n this.dispatch(setViewportGap(config.viewportGap));\n }\n\n this.scrollEndDelay = config.scrollEndDelay || 300;\n }\n\n protected buildCapability(): ViewportCapability {\n return {\n getViewportGap: () => this.state.viewportGap,\n getMetrics: () => this.state.viewportMetrics,\n onScrollChange: this.scrollMetrics$.on,\n onViewportChange: this.viewportMetrics$.on,\n registerBoundingRectProvider: (fn) => {\n this.rectProvider = fn;\n },\n getBoundingRect: (): Rect =>\n this.rectProvider?.() ?? {\n origin: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n },\n setViewportMetrics: (viewportMetrics: ViewportInputMetrics) => {\n this.dispatch(setViewportMetrics(viewportMetrics));\n },\n setViewportScrollMetrics: this.setViewportScrollMetrics.bind(this),\n scrollTo: (pos: ScrollToPayload) => this.scrollTo(pos),\n onScrollRequest: this.scrollReq$.on,\n isScrolling: () => this.state.isScrolling,\n onScrollActivity: this.scrollActivity$.on,\n };\n }\n\n private bumpScrollActivity() {\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n this.scrollEndTimer = window.setTimeout(() => {\n this.dispatch(setScrollActivity(false));\n this.scrollEndTimer = undefined;\n }, this.scrollEndDelay);\n }\n\n private setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics) {\n if (\n scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop ||\n scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft\n ) {\n this.dispatch(setViewportScrollMetrics(scrollMetrics));\n this.bumpScrollActivity();\n }\n }\n\n private scrollTo(pos: ScrollToPayload) {\n const { x, y, center, behavior = 'auto' } = pos;\n\n if (center) {\n const metrics = this.state.viewportMetrics;\n // Calculate the centered position by adding half the viewport dimensions\n const centeredX = x - metrics.clientWidth / 2;\n const centeredY = y - metrics.clientHeight / 2;\n\n this.scrollReq$.emit({\n x: centeredX,\n y: centeredY,\n behavior,\n });\n } else {\n this.scrollReq$.emit({\n x,\n y,\n behavior,\n });\n }\n }\n\n // Subscribe to store changes to notify onViewportChange\n override onStoreUpdated(prevState: ViewportState, newState: ViewportState): void {\n if (prevState !== newState) {\n this.viewportMetrics$.emit(newState.viewportMetrics);\n this.scrollMetrics$.emit({\n scrollTop: newState.viewportMetrics.scrollTop,\n scrollLeft: newState.viewportMetrics.scrollLeft,\n });\n if (prevState.isScrolling !== newState.isScrolling) {\n this.scrollActivity$.emit(newState.isScrolling);\n }\n }\n }\n\n async initialize(_config: ViewportPluginConfig) {\n // No initialization needed\n }\n\n async destroy(): Promise<void> {\n super.destroy();\n // Clear out any handlers\n this.viewportMetrics$.clear();\n this.scrollMetrics$.clear();\n this.scrollReq$.clear();\n this.scrollActivity$.clear();\n this.rectProvider = null;\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { ViewportAction } from './actions';\nimport { manifest, VIEWPORT_PLUGIN_ID } from './manifest';\nimport { viewportReducer, initialState } from './reducer';\nimport { ViewportPluginConfig, ViewportState } from './types';\nimport { ViewportPlugin } from './viewport-plugin';\n\nexport const ViewportPluginPackage: PluginPackage<\n ViewportPlugin,\n ViewportPluginConfig,\n ViewportState,\n ViewportAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),\n reducer: viewportReducer,\n initialState: initialState,\n};\n\nexport * from './viewport-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/viewport-plugin.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import { PluginManifest } from '@embedpdf/core';\n\nimport { ViewportPluginConfig } from './types';\n\nexport const VIEWPORT_PLUGIN_ID = 'viewport';\n\nexport const manifest: PluginManifest<ViewportPluginConfig> = {\n id: VIEWPORT_PLUGIN_ID,\n name: 'Viewport Plugin',\n version: '1.0.0',\n provides: ['viewport'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n viewportGap: 10,\n scrollEndDelay: 300,\n },\n};\n","import { Action } from '@embedpdf/core';\n\nimport { ViewportInputMetrics, ViewportScrollMetrics } from './types';\n\nexport const SET_VIEWPORT_METRICS = 'SET_VIEWPORT_METRICS';\nexport const SET_VIEWPORT_SCROLL_METRICS = 'SET_VIEWPORT_SCROLL_METRICS';\nexport const SET_VIEWPORT_GAP = 'SET_VIEWPORT_GAP';\nexport const SET_SCROLL_ACTIVITY = 'SET_SCROLL_ACTIVITY';\n\nexport interface SetViewportMetricsAction extends Action {\n type: typeof SET_VIEWPORT_METRICS;\n payload: ViewportInputMetrics;\n}\n\nexport interface SetViewportScrollMetricsAction extends Action {\n type: typeof SET_VIEWPORT_SCROLL_METRICS;\n payload: ViewportScrollMetrics;\n}\n\nexport interface SetViewportGapAction extends Action {\n type: typeof SET_VIEWPORT_GAP;\n payload: number;\n}\n\nexport interface SetScrollActivityAction extends Action {\n type: typeof SET_SCROLL_ACTIVITY;\n payload: boolean;\n}\n\nexport type ViewportAction =\n | SetViewportMetricsAction\n | SetViewportScrollMetricsAction\n | SetViewportGapAction\n | SetScrollActivityAction;\n\nexport function setViewportGap(viewportGap: number): SetViewportGapAction {\n return {\n type: SET_VIEWPORT_GAP,\n payload: viewportGap,\n };\n}\n\nexport function setViewportMetrics(\n viewportMetrics: ViewportInputMetrics,\n): SetViewportMetricsAction {\n return {\n type: SET_VIEWPORT_METRICS,\n payload: viewportMetrics,\n };\n}\n\nexport function setViewportScrollMetrics(\n scrollMetrics: ViewportScrollMetrics,\n): SetViewportScrollMetricsAction {\n return {\n type: SET_VIEWPORT_SCROLL_METRICS,\n payload: scrollMetrics,\n };\n}\n\nexport function setScrollActivity(isScrolling: boolean): SetScrollActivityAction {\n return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };\n}\n","import { Reducer } from '@embedpdf/core';\n\nimport {\n SET_VIEWPORT_METRICS,\n SET_VIEWPORT_SCROLL_METRICS,\n SET_VIEWPORT_GAP,\n ViewportAction,\n SET_SCROLL_ACTIVITY,\n} from './actions';\nimport { ViewportState } from './types';\n\nexport const initialState: ViewportState = {\n viewportGap: 0,\n viewportMetrics: {\n width: 0,\n height: 0,\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n scrollWidth: 0,\n scrollHeight: 0,\n relativePosition: {\n x: 0,\n y: 0,\n },\n },\n isScrolling: false,\n};\n\nexport const viewportReducer: Reducer<ViewportState, ViewportAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case SET_VIEWPORT_GAP:\n return { ...state, viewportGap: action.payload };\n case SET_VIEWPORT_METRICS:\n return {\n ...state,\n viewportMetrics: {\n width: action.payload.width,\n height: action.payload.height,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n clientWidth: action.payload.clientWidth,\n clientHeight: action.payload.clientHeight,\n scrollWidth: action.payload.scrollWidth,\n scrollHeight: action.payload.scrollHeight,\n relativePosition: {\n x:\n action.payload.scrollWidth <= action.payload.clientWidth\n ? 0\n : action.payload.scrollLeft /\n (action.payload.scrollWidth - action.payload.clientWidth),\n y:\n action.payload.scrollHeight <= action.payload.clientHeight\n ? 0\n : action.payload.scrollTop /\n (action.payload.scrollHeight - action.payload.clientHeight),\n },\n },\n };\n case SET_VIEWPORT_SCROLL_METRICS:\n return {\n ...state,\n viewportMetrics: {\n ...state.viewportMetrics,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n },\n isScrolling: true,\n };\n case SET_SCROLL_ACTIVITY:\n return { ...state, isScrolling: action.payload };\n default:\n return state;\n }\n};\n","import {\n BasePlugin,\n PluginRegistry,\n createEmitter,\n createBehaviorEmitter,\n Listener,\n EventListener,\n} from '@embedpdf/core';\n\nimport {\n ViewportAction,\n setViewportMetrics,\n setViewportScrollMetrics,\n setViewportGap,\n setScrollActivity,\n} from './actions';\nimport {\n ViewportPluginConfig,\n ViewportState,\n ViewportCapability,\n ViewportMetrics,\n ViewportScrollMetrics,\n ViewportInputMetrics,\n ScrollToPayload,\n} from './types';\nimport { Rect } from '@embedpdf/models';\n\nexport class ViewportPlugin extends BasePlugin<\n ViewportPluginConfig,\n ViewportCapability,\n ViewportState,\n ViewportAction\n> {\n static readonly id = 'viewport' as const;\n\n private readonly viewportResize$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly viewportMetrics$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly scrollMetrics$ = createBehaviorEmitter<ViewportScrollMetrics>();\n private readonly scrollReq$ = createEmitter<{\n x: number;\n y: number;\n behavior?: ScrollBehavior;\n }>();\n private readonly scrollActivity$ = createBehaviorEmitter<boolean>();\n\n /* ------------------------------------------------------------------ */\n /* “live rect” infrastructure */\n /* ------------------------------------------------------------------ */\n private rectProvider: (() => Rect) | null = null;\n\n private scrollEndTimer?: number;\n private readonly scrollEndDelay: number;\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n config: ViewportPluginConfig,\n ) {\n super(id, registry);\n\n if (config.viewportGap) {\n this.dispatch(setViewportGap(config.viewportGap));\n }\n\n this.scrollEndDelay = config.scrollEndDelay || 300;\n }\n\n protected buildCapability(): ViewportCapability {\n return {\n getViewportGap: () => this.state.viewportGap,\n getMetrics: () => this.state.viewportMetrics,\n getBoundingRect: (): Rect =>\n this.rectProvider?.() ?? {\n origin: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n },\n scrollTo: (pos: ScrollToPayload) => this.scrollTo(pos),\n isScrolling: () => this.state.isScrolling,\n onScrollChange: this.scrollMetrics$.on,\n onViewportChange: this.viewportMetrics$.on,\n onViewportResize: this.viewportResize$.on,\n onScrollActivity: this.scrollActivity$.on,\n };\n }\n\n public setViewportResizeMetrics(viewportMetrics: ViewportInputMetrics) {\n this.dispatch(setViewportMetrics(viewportMetrics));\n this.viewportResize$.emit(this.state.viewportMetrics);\n }\n\n public setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics) {\n if (\n scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop ||\n scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft\n ) {\n this.dispatch(setViewportScrollMetrics(scrollMetrics));\n this.bumpScrollActivity();\n this.scrollMetrics$.emit({\n scrollTop: scrollMetrics.scrollTop,\n scrollLeft: scrollMetrics.scrollLeft,\n });\n }\n }\n\n public onScrollRequest(listener: Listener<ScrollToPayload>) {\n return this.scrollReq$.on(listener);\n }\n\n public registerBoundingRectProvider(provider: (() => Rect) | null) {\n this.rectProvider = provider;\n }\n\n private bumpScrollActivity() {\n this.debouncedDispatch(setScrollActivity(false), this.scrollEndDelay);\n }\n\n private scrollTo(pos: ScrollToPayload) {\n const { x, y, center, behavior = 'auto' } = pos;\n\n if (center) {\n const metrics = this.state.viewportMetrics;\n // Calculate the centered position by adding half the viewport dimensions\n const centeredX = x - metrics.clientWidth / 2;\n const centeredY = y - metrics.clientHeight / 2;\n\n this.scrollReq$.emit({\n x: centeredX,\n y: centeredY,\n behavior,\n });\n } else {\n this.scrollReq$.emit({\n x,\n y,\n behavior,\n });\n }\n }\n\n // Subscribe to store changes to notify onViewportChange\n override onStoreUpdated(prevState: ViewportState, newState: ViewportState): void {\n if (prevState !== newState) {\n this.viewportMetrics$.emit(newState.viewportMetrics);\n if (prevState.isScrolling !== newState.isScrolling) {\n this.scrollActivity$.emit(newState.isScrolling);\n }\n }\n }\n\n async initialize(_config: ViewportPluginConfig) {\n // No initialization needed\n }\n\n async destroy(): Promise<void> {\n super.destroy();\n // Clear out any handlers\n this.viewportMetrics$.clear();\n this.viewportResize$.clear();\n this.scrollMetrics$.clear();\n this.scrollReq$.clear();\n this.scrollActivity$.clear();\n this.rectProvider = null;\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { ViewportAction } from './actions';\nimport { manifest, VIEWPORT_PLUGIN_ID } from './manifest';\nimport { viewportReducer, initialState } from './reducer';\nimport { ViewportPluginConfig, ViewportState } from './types';\nimport { ViewportPlugin } from './viewport-plugin';\n\nexport const ViewportPluginPackage: PluginPackage<\n ViewportPlugin,\n ViewportPluginConfig,\n ViewportState,\n ViewportAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),\n reducer: viewportReducer,\n initialState: initialState,\n};\n\nexport * from './viewport-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _embedpdf_core from '@embedpdf/core';
|
|
2
|
+
import { BasePluginConfig, EventHook, Action, BasePlugin, PluginRegistry, Listener, PluginManifest, PluginPackage } from '@embedpdf/core';
|
|
2
3
|
import { Rect } from '@embedpdf/models';
|
|
3
4
|
|
|
4
5
|
interface ViewportState {
|
|
@@ -43,16 +44,13 @@ interface ScrollToPayload {
|
|
|
43
44
|
interface ViewportCapability {
|
|
44
45
|
getViewportGap: () => number;
|
|
45
46
|
getMetrics: () => ViewportMetrics;
|
|
46
|
-
setViewportMetrics: (metrics: ViewportInputMetrics) => void;
|
|
47
|
-
setViewportScrollMetrics: (metrics: ViewportScrollMetrics) => void;
|
|
48
|
-
onViewportChange: (handler: (metrics: ViewportMetrics) => void, options?: EventControlOptions) => (metrics: ViewportMetrics) => void;
|
|
49
47
|
scrollTo(position: ScrollToPayload): void;
|
|
50
|
-
|
|
48
|
+
onViewportChange: EventHook<ViewportMetrics>;
|
|
49
|
+
onViewportResize: EventHook<ViewportMetrics>;
|
|
51
50
|
onScrollChange: EventHook<ViewportScrollMetrics>;
|
|
52
51
|
onScrollActivity: EventHook<boolean>;
|
|
53
52
|
isScrolling: () => boolean;
|
|
54
53
|
getBoundingRect(): Rect;
|
|
55
|
-
registerBoundingRectProvider(fn: (() => Rect) | null): void;
|
|
56
54
|
}
|
|
57
55
|
|
|
58
56
|
declare const SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
|
|
@@ -80,6 +78,7 @@ type ViewportAction = SetViewportMetricsAction | SetViewportScrollMetricsAction
|
|
|
80
78
|
declare class ViewportPlugin extends BasePlugin<ViewportPluginConfig, ViewportCapability, ViewportState, ViewportAction> {
|
|
81
79
|
readonly id: string;
|
|
82
80
|
static readonly id: "viewport";
|
|
81
|
+
private readonly viewportResize$;
|
|
83
82
|
private readonly viewportMetrics$;
|
|
84
83
|
private readonly scrollMetrics$;
|
|
85
84
|
private readonly scrollReq$;
|
|
@@ -89,8 +88,11 @@ declare class ViewportPlugin extends BasePlugin<ViewportPluginConfig, ViewportCa
|
|
|
89
88
|
private readonly scrollEndDelay;
|
|
90
89
|
constructor(id: string, registry: PluginRegistry, config: ViewportPluginConfig);
|
|
91
90
|
protected buildCapability(): ViewportCapability;
|
|
91
|
+
setViewportResizeMetrics(viewportMetrics: ViewportInputMetrics): void;
|
|
92
|
+
setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics): void;
|
|
93
|
+
onScrollRequest(listener: Listener<ScrollToPayload>): _embedpdf_core.Unsubscribe;
|
|
94
|
+
registerBoundingRectProvider(provider: (() => Rect) | null): void;
|
|
92
95
|
private bumpScrollActivity;
|
|
93
|
-
private setViewportScrollMetrics;
|
|
94
96
|
private scrollTo;
|
|
95
97
|
onStoreUpdated(prevState: ViewportState, newState: ViewportState): void;
|
|
96
98
|
initialize(_config: ViewportPluginConfig): Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _embedpdf_core from '@embedpdf/core';
|
|
2
|
+
import { BasePluginConfig, EventHook, Action, BasePlugin, PluginRegistry, Listener, PluginManifest, PluginPackage } from '@embedpdf/core';
|
|
2
3
|
import { Rect } from '@embedpdf/models';
|
|
3
4
|
|
|
4
5
|
interface ViewportState {
|
|
@@ -43,16 +44,13 @@ interface ScrollToPayload {
|
|
|
43
44
|
interface ViewportCapability {
|
|
44
45
|
getViewportGap: () => number;
|
|
45
46
|
getMetrics: () => ViewportMetrics;
|
|
46
|
-
setViewportMetrics: (metrics: ViewportInputMetrics) => void;
|
|
47
|
-
setViewportScrollMetrics: (metrics: ViewportScrollMetrics) => void;
|
|
48
|
-
onViewportChange: (handler: (metrics: ViewportMetrics) => void, options?: EventControlOptions) => (metrics: ViewportMetrics) => void;
|
|
49
47
|
scrollTo(position: ScrollToPayload): void;
|
|
50
|
-
|
|
48
|
+
onViewportChange: EventHook<ViewportMetrics>;
|
|
49
|
+
onViewportResize: EventHook<ViewportMetrics>;
|
|
51
50
|
onScrollChange: EventHook<ViewportScrollMetrics>;
|
|
52
51
|
onScrollActivity: EventHook<boolean>;
|
|
53
52
|
isScrolling: () => boolean;
|
|
54
53
|
getBoundingRect(): Rect;
|
|
55
|
-
registerBoundingRectProvider(fn: (() => Rect) | null): void;
|
|
56
54
|
}
|
|
57
55
|
|
|
58
56
|
declare const SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
|
|
@@ -80,6 +78,7 @@ type ViewportAction = SetViewportMetricsAction | SetViewportScrollMetricsAction
|
|
|
80
78
|
declare class ViewportPlugin extends BasePlugin<ViewportPluginConfig, ViewportCapability, ViewportState, ViewportAction> {
|
|
81
79
|
readonly id: string;
|
|
82
80
|
static readonly id: "viewport";
|
|
81
|
+
private readonly viewportResize$;
|
|
83
82
|
private readonly viewportMetrics$;
|
|
84
83
|
private readonly scrollMetrics$;
|
|
85
84
|
private readonly scrollReq$;
|
|
@@ -89,8 +88,11 @@ declare class ViewportPlugin extends BasePlugin<ViewportPluginConfig, ViewportCa
|
|
|
89
88
|
private readonly scrollEndDelay;
|
|
90
89
|
constructor(id: string, registry: PluginRegistry, config: ViewportPluginConfig);
|
|
91
90
|
protected buildCapability(): ViewportCapability;
|
|
91
|
+
setViewportResizeMetrics(viewportMetrics: ViewportInputMetrics): void;
|
|
92
|
+
setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics): void;
|
|
93
|
+
onScrollRequest(listener: Listener<ScrollToPayload>): _embedpdf_core.Unsubscribe;
|
|
94
|
+
registerBoundingRectProvider(provider: (() => Rect) | null): void;
|
|
92
95
|
private bumpScrollActivity;
|
|
93
|
-
private setViewportScrollMetrics;
|
|
94
96
|
private scrollTo;
|
|
95
97
|
onStoreUpdated(prevState: ViewportState, newState: ViewportState): void;
|
|
96
98
|
initialize(_config: ViewportPluginConfig): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -100,11 +100,16 @@ var viewportReducer = (state = initialState, action) => {
|
|
|
100
100
|
};
|
|
101
101
|
|
|
102
102
|
// src/lib/viewport-plugin.ts
|
|
103
|
-
import {
|
|
103
|
+
import {
|
|
104
|
+
BasePlugin,
|
|
105
|
+
createEmitter,
|
|
106
|
+
createBehaviorEmitter
|
|
107
|
+
} from "@embedpdf/core";
|
|
104
108
|
var ViewportPlugin = class extends BasePlugin {
|
|
105
109
|
constructor(id, registry, config) {
|
|
106
110
|
super(id, registry);
|
|
107
111
|
this.id = id;
|
|
112
|
+
this.viewportResize$ = createBehaviorEmitter();
|
|
108
113
|
this.viewportMetrics$ = createBehaviorEmitter();
|
|
109
114
|
this.scrollMetrics$ = createBehaviorEmitter();
|
|
110
115
|
this.scrollReq$ = createEmitter();
|
|
@@ -122,38 +127,41 @@ var ViewportPlugin = class extends BasePlugin {
|
|
|
122
127
|
return {
|
|
123
128
|
getViewportGap: () => this.state.viewportGap,
|
|
124
129
|
getMetrics: () => this.state.viewportMetrics,
|
|
125
|
-
onScrollChange: this.scrollMetrics$.on,
|
|
126
|
-
onViewportChange: this.viewportMetrics$.on,
|
|
127
|
-
registerBoundingRectProvider: (fn) => {
|
|
128
|
-
this.rectProvider = fn;
|
|
129
|
-
},
|
|
130
130
|
getBoundingRect: () => this.rectProvider?.() ?? {
|
|
131
131
|
origin: { x: 0, y: 0 },
|
|
132
132
|
size: { width: 0, height: 0 }
|
|
133
133
|
},
|
|
134
|
-
setViewportMetrics: (viewportMetrics) => {
|
|
135
|
-
this.dispatch(setViewportMetrics(viewportMetrics));
|
|
136
|
-
},
|
|
137
|
-
setViewportScrollMetrics: this.setViewportScrollMetrics.bind(this),
|
|
138
134
|
scrollTo: (pos) => this.scrollTo(pos),
|
|
139
|
-
onScrollRequest: this.scrollReq$.on,
|
|
140
135
|
isScrolling: () => this.state.isScrolling,
|
|
136
|
+
onScrollChange: this.scrollMetrics$.on,
|
|
137
|
+
onViewportChange: this.viewportMetrics$.on,
|
|
138
|
+
onViewportResize: this.viewportResize$.on,
|
|
141
139
|
onScrollActivity: this.scrollActivity$.on
|
|
142
140
|
};
|
|
143
141
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
this.dispatch(setScrollActivity(false));
|
|
148
|
-
this.scrollEndTimer = void 0;
|
|
149
|
-
}, this.scrollEndDelay);
|
|
142
|
+
setViewportResizeMetrics(viewportMetrics) {
|
|
143
|
+
this.dispatch(setViewportMetrics(viewportMetrics));
|
|
144
|
+
this.viewportResize$.emit(this.state.viewportMetrics);
|
|
150
145
|
}
|
|
151
146
|
setViewportScrollMetrics(scrollMetrics) {
|
|
152
147
|
if (scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop || scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft) {
|
|
153
148
|
this.dispatch(setViewportScrollMetrics(scrollMetrics));
|
|
154
149
|
this.bumpScrollActivity();
|
|
150
|
+
this.scrollMetrics$.emit({
|
|
151
|
+
scrollTop: scrollMetrics.scrollTop,
|
|
152
|
+
scrollLeft: scrollMetrics.scrollLeft
|
|
153
|
+
});
|
|
155
154
|
}
|
|
156
155
|
}
|
|
156
|
+
onScrollRequest(listener) {
|
|
157
|
+
return this.scrollReq$.on(listener);
|
|
158
|
+
}
|
|
159
|
+
registerBoundingRectProvider(provider) {
|
|
160
|
+
this.rectProvider = provider;
|
|
161
|
+
}
|
|
162
|
+
bumpScrollActivity() {
|
|
163
|
+
this.debouncedDispatch(setScrollActivity(false), this.scrollEndDelay);
|
|
164
|
+
}
|
|
157
165
|
scrollTo(pos) {
|
|
158
166
|
const { x, y, center, behavior = "auto" } = pos;
|
|
159
167
|
if (center) {
|
|
@@ -177,10 +185,6 @@ var ViewportPlugin = class extends BasePlugin {
|
|
|
177
185
|
onStoreUpdated(prevState, newState) {
|
|
178
186
|
if (prevState !== newState) {
|
|
179
187
|
this.viewportMetrics$.emit(newState.viewportMetrics);
|
|
180
|
-
this.scrollMetrics$.emit({
|
|
181
|
-
scrollTop: newState.viewportMetrics.scrollTop,
|
|
182
|
-
scrollLeft: newState.viewportMetrics.scrollLeft
|
|
183
|
-
});
|
|
184
188
|
if (prevState.isScrolling !== newState.isScrolling) {
|
|
185
189
|
this.scrollActivity$.emit(newState.isScrolling);
|
|
186
190
|
}
|
|
@@ -191,6 +195,7 @@ var ViewportPlugin = class extends BasePlugin {
|
|
|
191
195
|
async destroy() {
|
|
192
196
|
super.destroy();
|
|
193
197
|
this.viewportMetrics$.clear();
|
|
198
|
+
this.viewportResize$.clear();
|
|
194
199
|
this.scrollMetrics$.clear();
|
|
195
200
|
this.scrollReq$.clear();
|
|
196
201
|
this.scrollActivity$.clear();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/viewport-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\n\nimport { ViewportPluginConfig } from './types';\n\nexport const VIEWPORT_PLUGIN_ID = 'viewport';\n\nexport const manifest: PluginManifest<ViewportPluginConfig> = {\n id: VIEWPORT_PLUGIN_ID,\n name: 'Viewport Plugin',\n version: '1.0.0',\n provides: ['viewport'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n viewportGap: 10,\n scrollEndDelay: 300,\n },\n};\n","import { Action } from '@embedpdf/core';\n\nimport { ViewportInputMetrics, ViewportScrollMetrics } from './types';\n\nexport const SET_VIEWPORT_METRICS = 'SET_VIEWPORT_METRICS';\nexport const SET_VIEWPORT_SCROLL_METRICS = 'SET_VIEWPORT_SCROLL_METRICS';\nexport const SET_VIEWPORT_GAP = 'SET_VIEWPORT_GAP';\nexport const SET_SCROLL_ACTIVITY = 'SET_SCROLL_ACTIVITY';\n\nexport interface SetViewportMetricsAction extends Action {\n type: typeof SET_VIEWPORT_METRICS;\n payload: ViewportInputMetrics;\n}\n\nexport interface SetViewportScrollMetricsAction extends Action {\n type: typeof SET_VIEWPORT_SCROLL_METRICS;\n payload: ViewportScrollMetrics;\n}\n\nexport interface SetViewportGapAction extends Action {\n type: typeof SET_VIEWPORT_GAP;\n payload: number;\n}\n\nexport interface SetScrollActivityAction extends Action {\n type: typeof SET_SCROLL_ACTIVITY;\n payload: boolean;\n}\n\nexport type ViewportAction =\n | SetViewportMetricsAction\n | SetViewportScrollMetricsAction\n | SetViewportGapAction\n | SetScrollActivityAction;\n\nexport function setViewportGap(viewportGap: number): SetViewportGapAction {\n return {\n type: SET_VIEWPORT_GAP,\n payload: viewportGap,\n };\n}\n\nexport function setViewportMetrics(\n viewportMetrics: ViewportInputMetrics,\n): SetViewportMetricsAction {\n return {\n type: SET_VIEWPORT_METRICS,\n payload: viewportMetrics,\n };\n}\n\nexport function setViewportScrollMetrics(\n scrollMetrics: ViewportScrollMetrics,\n): SetViewportScrollMetricsAction {\n return {\n type: SET_VIEWPORT_SCROLL_METRICS,\n payload: scrollMetrics,\n };\n}\n\nexport function setScrollActivity(isScrolling: boolean): SetScrollActivityAction {\n return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };\n}\n","import { Reducer } from '@embedpdf/core';\n\nimport {\n SET_VIEWPORT_METRICS,\n SET_VIEWPORT_SCROLL_METRICS,\n SET_VIEWPORT_GAP,\n ViewportAction,\n SET_SCROLL_ACTIVITY,\n} from './actions';\nimport { ViewportState } from './types';\n\nexport const initialState: ViewportState = {\n viewportGap: 0,\n viewportMetrics: {\n width: 0,\n height: 0,\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n scrollWidth: 0,\n scrollHeight: 0,\n relativePosition: {\n x: 0,\n y: 0,\n },\n },\n isScrolling: false,\n};\n\nexport const viewportReducer: Reducer<ViewportState, ViewportAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case SET_VIEWPORT_GAP:\n return { ...state, viewportGap: action.payload };\n case SET_VIEWPORT_METRICS:\n return {\n ...state,\n viewportMetrics: {\n width: action.payload.width,\n height: action.payload.height,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n clientWidth: action.payload.clientWidth,\n clientHeight: action.payload.clientHeight,\n scrollWidth: action.payload.scrollWidth,\n scrollHeight: action.payload.scrollHeight,\n relativePosition: {\n x:\n action.payload.scrollWidth <= action.payload.clientWidth\n ? 0\n : action.payload.scrollLeft /\n (action.payload.scrollWidth - action.payload.clientWidth),\n y:\n action.payload.scrollHeight <= action.payload.clientHeight\n ? 0\n : action.payload.scrollTop /\n (action.payload.scrollHeight - action.payload.clientHeight),\n },\n },\n };\n case SET_VIEWPORT_SCROLL_METRICS:\n return {\n ...state,\n viewportMetrics: {\n ...state.viewportMetrics,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n },\n isScrolling: true,\n };\n case SET_SCROLL_ACTIVITY:\n return { ...state, isScrolling: action.payload };\n default:\n return state;\n }\n};\n","import { BasePlugin, PluginRegistry, createEmitter, createBehaviorEmitter } from '@embedpdf/core';\n\nimport {\n ViewportAction,\n setViewportMetrics,\n setViewportScrollMetrics,\n setViewportGap,\n setScrollActivity,\n} from './actions';\nimport {\n ViewportPluginConfig,\n ViewportState,\n ViewportCapability,\n ViewportMetrics,\n ViewportScrollMetrics,\n ViewportInputMetrics,\n ScrollToPayload,\n} from './types';\nimport { Rect } from '@embedpdf/models';\n\nexport class ViewportPlugin extends BasePlugin<\n ViewportPluginConfig,\n ViewportCapability,\n ViewportState,\n ViewportAction\n> {\n static readonly id = 'viewport' as const;\n\n private readonly viewportMetrics$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly scrollMetrics$ = createBehaviorEmitter<ViewportScrollMetrics>();\n private readonly scrollReq$ = createEmitter<{\n x: number;\n y: number;\n behavior?: ScrollBehavior;\n }>();\n private readonly scrollActivity$ = createBehaviorEmitter<boolean>();\n\n /* ------------------------------------------------------------------ */\n /* “live rect” infrastructure */\n /* ------------------------------------------------------------------ */\n private rectProvider: (() => Rect) | null = null;\n\n private scrollEndTimer?: number;\n private readonly scrollEndDelay: number;\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n config: ViewportPluginConfig,\n ) {\n super(id, registry);\n\n if (config.viewportGap) {\n this.dispatch(setViewportGap(config.viewportGap));\n }\n\n this.scrollEndDelay = config.scrollEndDelay || 300;\n }\n\n protected buildCapability(): ViewportCapability {\n return {\n getViewportGap: () => this.state.viewportGap,\n getMetrics: () => this.state.viewportMetrics,\n onScrollChange: this.scrollMetrics$.on,\n onViewportChange: this.viewportMetrics$.on,\n registerBoundingRectProvider: (fn) => {\n this.rectProvider = fn;\n },\n getBoundingRect: (): Rect =>\n this.rectProvider?.() ?? {\n origin: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n },\n setViewportMetrics: (viewportMetrics: ViewportInputMetrics) => {\n this.dispatch(setViewportMetrics(viewportMetrics));\n },\n setViewportScrollMetrics: this.setViewportScrollMetrics.bind(this),\n scrollTo: (pos: ScrollToPayload) => this.scrollTo(pos),\n onScrollRequest: this.scrollReq$.on,\n isScrolling: () => this.state.isScrolling,\n onScrollActivity: this.scrollActivity$.on,\n };\n }\n\n private bumpScrollActivity() {\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n this.scrollEndTimer = window.setTimeout(() => {\n this.dispatch(setScrollActivity(false));\n this.scrollEndTimer = undefined;\n }, this.scrollEndDelay);\n }\n\n private setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics) {\n if (\n scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop ||\n scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft\n ) {\n this.dispatch(setViewportScrollMetrics(scrollMetrics));\n this.bumpScrollActivity();\n }\n }\n\n private scrollTo(pos: ScrollToPayload) {\n const { x, y, center, behavior = 'auto' } = pos;\n\n if (center) {\n const metrics = this.state.viewportMetrics;\n // Calculate the centered position by adding half the viewport dimensions\n const centeredX = x - metrics.clientWidth / 2;\n const centeredY = y - metrics.clientHeight / 2;\n\n this.scrollReq$.emit({\n x: centeredX,\n y: centeredY,\n behavior,\n });\n } else {\n this.scrollReq$.emit({\n x,\n y,\n behavior,\n });\n }\n }\n\n // Subscribe to store changes to notify onViewportChange\n override onStoreUpdated(prevState: ViewportState, newState: ViewportState): void {\n if (prevState !== newState) {\n this.viewportMetrics$.emit(newState.viewportMetrics);\n this.scrollMetrics$.emit({\n scrollTop: newState.viewportMetrics.scrollTop,\n scrollLeft: newState.viewportMetrics.scrollLeft,\n });\n if (prevState.isScrolling !== newState.isScrolling) {\n this.scrollActivity$.emit(newState.isScrolling);\n }\n }\n }\n\n async initialize(_config: ViewportPluginConfig) {\n // No initialization needed\n }\n\n async destroy(): Promise<void> {\n super.destroy();\n // Clear out any handlers\n this.viewportMetrics$.clear();\n this.scrollMetrics$.clear();\n this.scrollReq$.clear();\n this.scrollActivity$.clear();\n this.rectProvider = null;\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { ViewportAction } from './actions';\nimport { manifest, VIEWPORT_PLUGIN_ID } from './manifest';\nimport { viewportReducer, initialState } from './reducer';\nimport { ViewportPluginConfig, ViewportState } from './types';\nimport { ViewportPlugin } from './viewport-plugin';\n\nexport const ViewportPluginPackage: PluginPackage<\n ViewportPlugin,\n ViewportPluginConfig,\n ViewportState,\n ViewportAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),\n reducer: viewportReducer,\n initialState: initialState,\n};\n\nexport * from './viewport-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/viewport-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\n\nimport { ViewportPluginConfig } from './types';\n\nexport const VIEWPORT_PLUGIN_ID = 'viewport';\n\nexport const manifest: PluginManifest<ViewportPluginConfig> = {\n id: VIEWPORT_PLUGIN_ID,\n name: 'Viewport Plugin',\n version: '1.0.0',\n provides: ['viewport'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n viewportGap: 10,\n scrollEndDelay: 300,\n },\n};\n","import { Action } from '@embedpdf/core';\n\nimport { ViewportInputMetrics, ViewportScrollMetrics } from './types';\n\nexport const SET_VIEWPORT_METRICS = 'SET_VIEWPORT_METRICS';\nexport const SET_VIEWPORT_SCROLL_METRICS = 'SET_VIEWPORT_SCROLL_METRICS';\nexport const SET_VIEWPORT_GAP = 'SET_VIEWPORT_GAP';\nexport const SET_SCROLL_ACTIVITY = 'SET_SCROLL_ACTIVITY';\n\nexport interface SetViewportMetricsAction extends Action {\n type: typeof SET_VIEWPORT_METRICS;\n payload: ViewportInputMetrics;\n}\n\nexport interface SetViewportScrollMetricsAction extends Action {\n type: typeof SET_VIEWPORT_SCROLL_METRICS;\n payload: ViewportScrollMetrics;\n}\n\nexport interface SetViewportGapAction extends Action {\n type: typeof SET_VIEWPORT_GAP;\n payload: number;\n}\n\nexport interface SetScrollActivityAction extends Action {\n type: typeof SET_SCROLL_ACTIVITY;\n payload: boolean;\n}\n\nexport type ViewportAction =\n | SetViewportMetricsAction\n | SetViewportScrollMetricsAction\n | SetViewportGapAction\n | SetScrollActivityAction;\n\nexport function setViewportGap(viewportGap: number): SetViewportGapAction {\n return {\n type: SET_VIEWPORT_GAP,\n payload: viewportGap,\n };\n}\n\nexport function setViewportMetrics(\n viewportMetrics: ViewportInputMetrics,\n): SetViewportMetricsAction {\n return {\n type: SET_VIEWPORT_METRICS,\n payload: viewportMetrics,\n };\n}\n\nexport function setViewportScrollMetrics(\n scrollMetrics: ViewportScrollMetrics,\n): SetViewportScrollMetricsAction {\n return {\n type: SET_VIEWPORT_SCROLL_METRICS,\n payload: scrollMetrics,\n };\n}\n\nexport function setScrollActivity(isScrolling: boolean): SetScrollActivityAction {\n return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };\n}\n","import { Reducer } from '@embedpdf/core';\n\nimport {\n SET_VIEWPORT_METRICS,\n SET_VIEWPORT_SCROLL_METRICS,\n SET_VIEWPORT_GAP,\n ViewportAction,\n SET_SCROLL_ACTIVITY,\n} from './actions';\nimport { ViewportState } from './types';\n\nexport const initialState: ViewportState = {\n viewportGap: 0,\n viewportMetrics: {\n width: 0,\n height: 0,\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n scrollWidth: 0,\n scrollHeight: 0,\n relativePosition: {\n x: 0,\n y: 0,\n },\n },\n isScrolling: false,\n};\n\nexport const viewportReducer: Reducer<ViewportState, ViewportAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n case SET_VIEWPORT_GAP:\n return { ...state, viewportGap: action.payload };\n case SET_VIEWPORT_METRICS:\n return {\n ...state,\n viewportMetrics: {\n width: action.payload.width,\n height: action.payload.height,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n clientWidth: action.payload.clientWidth,\n clientHeight: action.payload.clientHeight,\n scrollWidth: action.payload.scrollWidth,\n scrollHeight: action.payload.scrollHeight,\n relativePosition: {\n x:\n action.payload.scrollWidth <= action.payload.clientWidth\n ? 0\n : action.payload.scrollLeft /\n (action.payload.scrollWidth - action.payload.clientWidth),\n y:\n action.payload.scrollHeight <= action.payload.clientHeight\n ? 0\n : action.payload.scrollTop /\n (action.payload.scrollHeight - action.payload.clientHeight),\n },\n },\n };\n case SET_VIEWPORT_SCROLL_METRICS:\n return {\n ...state,\n viewportMetrics: {\n ...state.viewportMetrics,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft,\n },\n isScrolling: true,\n };\n case SET_SCROLL_ACTIVITY:\n return { ...state, isScrolling: action.payload };\n default:\n return state;\n }\n};\n","import {\n BasePlugin,\n PluginRegistry,\n createEmitter,\n createBehaviorEmitter,\n Listener,\n EventListener,\n} from '@embedpdf/core';\n\nimport {\n ViewportAction,\n setViewportMetrics,\n setViewportScrollMetrics,\n setViewportGap,\n setScrollActivity,\n} from './actions';\nimport {\n ViewportPluginConfig,\n ViewportState,\n ViewportCapability,\n ViewportMetrics,\n ViewportScrollMetrics,\n ViewportInputMetrics,\n ScrollToPayload,\n} from './types';\nimport { Rect } from '@embedpdf/models';\n\nexport class ViewportPlugin extends BasePlugin<\n ViewportPluginConfig,\n ViewportCapability,\n ViewportState,\n ViewportAction\n> {\n static readonly id = 'viewport' as const;\n\n private readonly viewportResize$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly viewportMetrics$ = createBehaviorEmitter<ViewportMetrics>();\n private readonly scrollMetrics$ = createBehaviorEmitter<ViewportScrollMetrics>();\n private readonly scrollReq$ = createEmitter<{\n x: number;\n y: number;\n behavior?: ScrollBehavior;\n }>();\n private readonly scrollActivity$ = createBehaviorEmitter<boolean>();\n\n /* ------------------------------------------------------------------ */\n /* “live rect” infrastructure */\n /* ------------------------------------------------------------------ */\n private rectProvider: (() => Rect) | null = null;\n\n private scrollEndTimer?: number;\n private readonly scrollEndDelay: number;\n\n constructor(\n public readonly id: string,\n registry: PluginRegistry,\n config: ViewportPluginConfig,\n ) {\n super(id, registry);\n\n if (config.viewportGap) {\n this.dispatch(setViewportGap(config.viewportGap));\n }\n\n this.scrollEndDelay = config.scrollEndDelay || 300;\n }\n\n protected buildCapability(): ViewportCapability {\n return {\n getViewportGap: () => this.state.viewportGap,\n getMetrics: () => this.state.viewportMetrics,\n getBoundingRect: (): Rect =>\n this.rectProvider?.() ?? {\n origin: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n },\n scrollTo: (pos: ScrollToPayload) => this.scrollTo(pos),\n isScrolling: () => this.state.isScrolling,\n onScrollChange: this.scrollMetrics$.on,\n onViewportChange: this.viewportMetrics$.on,\n onViewportResize: this.viewportResize$.on,\n onScrollActivity: this.scrollActivity$.on,\n };\n }\n\n public setViewportResizeMetrics(viewportMetrics: ViewportInputMetrics) {\n this.dispatch(setViewportMetrics(viewportMetrics));\n this.viewportResize$.emit(this.state.viewportMetrics);\n }\n\n public setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics) {\n if (\n scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop ||\n scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft\n ) {\n this.dispatch(setViewportScrollMetrics(scrollMetrics));\n this.bumpScrollActivity();\n this.scrollMetrics$.emit({\n scrollTop: scrollMetrics.scrollTop,\n scrollLeft: scrollMetrics.scrollLeft,\n });\n }\n }\n\n public onScrollRequest(listener: Listener<ScrollToPayload>) {\n return this.scrollReq$.on(listener);\n }\n\n public registerBoundingRectProvider(provider: (() => Rect) | null) {\n this.rectProvider = provider;\n }\n\n private bumpScrollActivity() {\n this.debouncedDispatch(setScrollActivity(false), this.scrollEndDelay);\n }\n\n private scrollTo(pos: ScrollToPayload) {\n const { x, y, center, behavior = 'auto' } = pos;\n\n if (center) {\n const metrics = this.state.viewportMetrics;\n // Calculate the centered position by adding half the viewport dimensions\n const centeredX = x - metrics.clientWidth / 2;\n const centeredY = y - metrics.clientHeight / 2;\n\n this.scrollReq$.emit({\n x: centeredX,\n y: centeredY,\n behavior,\n });\n } else {\n this.scrollReq$.emit({\n x,\n y,\n behavior,\n });\n }\n }\n\n // Subscribe to store changes to notify onViewportChange\n override onStoreUpdated(prevState: ViewportState, newState: ViewportState): void {\n if (prevState !== newState) {\n this.viewportMetrics$.emit(newState.viewportMetrics);\n if (prevState.isScrolling !== newState.isScrolling) {\n this.scrollActivity$.emit(newState.isScrolling);\n }\n }\n }\n\n async initialize(_config: ViewportPluginConfig) {\n // No initialization needed\n }\n\n async destroy(): Promise<void> {\n super.destroy();\n // Clear out any handlers\n this.viewportMetrics$.clear();\n this.viewportResize$.clear();\n this.scrollMetrics$.clear();\n this.scrollReq$.clear();\n this.scrollActivity$.clear();\n this.rectProvider = null;\n if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { ViewportAction } from './actions';\nimport { manifest, VIEWPORT_PLUGIN_ID } from './manifest';\nimport { viewportReducer, initialState } from './reducer';\nimport { ViewportPluginConfig, ViewportState } from './types';\nimport { ViewportPlugin } from './viewport-plugin';\n\nexport const ViewportPluginPackage: PluginPackage<\n ViewportPlugin,\n ViewportPluginConfig,\n ViewportState,\n ViewportAction\n> = {\n manifest,\n create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),\n reducer: viewportReducer,\n initialState: initialState,\n};\n\nexport * from './viewport-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
package/dist/preact/index.cjs
CHANGED
|
@@ -21,15 +21,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var preact_exports = {};
|
|
22
22
|
__export(preact_exports, {
|
|
23
23
|
Viewport: () => Viewport,
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
useViewportCapability: () => useViewportCapability,
|
|
25
|
+
useViewportPlugin: () => useViewportPlugin
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(preact_exports);
|
|
28
28
|
|
|
29
29
|
// src/preact/hooks/use-viewport.ts
|
|
30
30
|
var import_preact = require("@embedpdf/core/preact");
|
|
31
31
|
var import_plugin_viewport = require("@embedpdf/plugin-viewport");
|
|
32
|
-
var
|
|
32
|
+
var useViewportPlugin = () => (0, import_preact.usePlugin)(import_plugin_viewport.ViewportPlugin.id);
|
|
33
33
|
var useViewportCapability = () => (0, import_preact.useCapability)(import_plugin_viewport.ViewportPlugin.id);
|
|
34
34
|
|
|
35
35
|
// src/preact/components/viewport.tsx
|
|
@@ -38,10 +38,10 @@ var import_hooks2 = require("preact/hooks");
|
|
|
38
38
|
// src/preact/hooks/use-viewport-ref.ts
|
|
39
39
|
var import_hooks = require("preact/hooks");
|
|
40
40
|
function useViewportRef() {
|
|
41
|
-
const {
|
|
41
|
+
const { plugin: viewportPlugin } = useViewportPlugin();
|
|
42
42
|
const containerRef = (0, import_hooks.useRef)(null);
|
|
43
43
|
(0, import_hooks.useLayoutEffect)(() => {
|
|
44
|
-
if (!
|
|
44
|
+
if (!viewportPlugin) return;
|
|
45
45
|
const container = containerRef.current;
|
|
46
46
|
if (!container) return;
|
|
47
47
|
const provideRect = () => {
|
|
@@ -51,17 +51,16 @@ function useViewportRef() {
|
|
|
51
51
|
size: { width: r.width, height: r.height }
|
|
52
52
|
};
|
|
53
53
|
};
|
|
54
|
-
|
|
54
|
+
viewportPlugin.registerBoundingRectProvider(provideRect);
|
|
55
55
|
const onScroll = () => {
|
|
56
|
-
|
|
56
|
+
viewportPlugin.setViewportScrollMetrics({
|
|
57
57
|
scrollTop: container.scrollTop,
|
|
58
58
|
scrollLeft: container.scrollLeft
|
|
59
59
|
});
|
|
60
60
|
};
|
|
61
61
|
container.addEventListener("scroll", onScroll);
|
|
62
62
|
const resizeObserver = new ResizeObserver(() => {
|
|
63
|
-
|
|
64
|
-
viewportProvides.setViewportMetrics({
|
|
63
|
+
viewportPlugin.setViewportResizeMetrics({
|
|
65
64
|
width: container.offsetWidth,
|
|
66
65
|
height: container.offsetHeight,
|
|
67
66
|
clientWidth: container.clientWidth,
|
|
@@ -73,7 +72,7 @@ function useViewportRef() {
|
|
|
73
72
|
});
|
|
74
73
|
});
|
|
75
74
|
resizeObserver.observe(container);
|
|
76
|
-
const unsubscribeScrollRequest =
|
|
75
|
+
const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(
|
|
77
76
|
({ x, y, behavior = "auto" }) => {
|
|
78
77
|
requestAnimationFrame(() => {
|
|
79
78
|
container.scrollTo({ left: x, top: y, behavior });
|
|
@@ -81,12 +80,12 @@ function useViewportRef() {
|
|
|
81
80
|
}
|
|
82
81
|
);
|
|
83
82
|
return () => {
|
|
84
|
-
|
|
83
|
+
viewportPlugin.registerBoundingRectProvider(null);
|
|
85
84
|
container.removeEventListener("scroll", onScroll);
|
|
86
85
|
resizeObserver.disconnect();
|
|
87
86
|
unsubscribeScrollRequest();
|
|
88
87
|
};
|
|
89
|
-
}, [
|
|
88
|
+
}, [viewportPlugin]);
|
|
90
89
|
return containerRef;
|
|
91
90
|
}
|
|
92
91
|
|
|
@@ -118,7 +117,7 @@ function Viewport({ children, ...props }) {
|
|
|
118
117
|
// Annotate the CommonJS export names for ESM import in node:
|
|
119
118
|
0 && (module.exports = {
|
|
120
119
|
Viewport,
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
useViewportCapability,
|
|
121
|
+
useViewportPlugin
|
|
123
122
|
});
|
|
124
123
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-viewport.ts","../../src/preact/components/viewport.tsx","../../src/preact/hooks/use-viewport-ref.ts"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-viewport.ts","../../src/preact/components/viewport.tsx","../../src/preact/hooks/use-viewport-ref.ts"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const useViewportPlugin = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = JSX.HTMLAttributes<HTMLDivElement> & {\n children: ComponentChildren;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { Rect } from '@embedpdf/models';\nimport { useLayoutEffect, useRef } from 'preact/hooks';\n\nimport { useViewportPlugin } from './use-viewport';\n\nexport function useViewportRef() {\n const { plugin: viewportPlugin } = useViewportPlugin();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportPlugin) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n /* ---------- live rect provider --------------------------------- */\n const provideRect = (): Rect => {\n const r = container.getBoundingClientRect();\n return {\n origin: { x: r.left, y: r.top },\n size: { width: r.width, height: r.height },\n };\n };\n viewportPlugin.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportPlugin.setViewportScrollMetrics({\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n });\n };\n container.addEventListener('scroll', onScroll);\n\n // Example: On resize, call setMetrics\n const resizeObserver = new ResizeObserver(() => {\n viewportPlugin.setViewportResizeMetrics({\n width: container.offsetWidth,\n height: container.offsetHeight,\n clientWidth: container.clientWidth,\n clientHeight: container.clientHeight,\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n scrollWidth: container.scrollWidth,\n scrollHeight: container.scrollHeight,\n });\n });\n resizeObserver.observe(container);\n\n const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(\n ({ x, y, behavior = 'auto' }) => {\n requestAnimationFrame(() => {\n container.scrollTo({ left: x, top: y, behavior });\n });\n },\n );\n\n // Cleanup\n return () => {\n viewportPlugin.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportPlugin]);\n\n // Return the ref so your React code can attach it to a div\n return containerRef;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAyC;AACzC,6BAA+B;AAExB,IAAM,oBAAoB,UAAM,yBAA0B,sCAAe,EAAE;AAC3E,IAAM,wBAAwB,UAAM,6BAA8B,sCAAe,EAAE;;;ACF1F,IAAAA,gBAAoC;;;ACDpC,mBAAwC;AAIjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,QAAQ,eAAe,IAAI,kBAAkB;AACrD,QAAM,mBAAe,qBAAuB,IAAI;AAEhD,oCAAgB,MAAM;AACpB,QAAI,CAAC,eAAgB;AAErB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,UAAM,cAAc,MAAY;AAC9B,YAAM,IAAI,UAAU,sBAAsB;AAC1C,aAAO;AAAA,QACL,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,QAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,MAC3C;AAAA,IACF;AACA,mBAAe,6BAA6B,WAAW;AAGvD,UAAM,WAAW,MAAM;AACrB,qBAAe,yBAAyB;AAAA,QACtC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,qBAAe,yBAAyB;AAAA,QACtC,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,QACxB,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,QACtB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AACD,mBAAe,QAAQ,SAAS;AAEhC,UAAM,2BAA2B,eAAe;AAAA,MAC9C,CAAC,EAAE,GAAG,GAAG,WAAW,OAAO,MAAM;AAC/B,8BAAsB,MAAM;AAC1B,oBAAU,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,MAAM;AACX,qBAAe,6BAA6B,IAAI;AAChD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,SAAO;AACT;;;AD5CI;AAbG,SAAS,SAAS,EAAE,UAAU,GAAG,MAAM,GAAkB;AAC9D,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,CAAC;AAChD,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAE7D,+BAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,qBAAe,iBAAiB,eAAe,CAAC;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,EAAE,OAAO,GAAG,UAAU,IAAI;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,QACL,GAAI,OAAO,UAAU,WAAW,QAAQ,CAAC;AAAA,QACzC,SAAS,GAAG,WAAW;AAAA,MACzB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":["import_hooks"]}
|
package/dist/preact/index.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import * as _embedpdf_plugin_viewport from '@embedpdf/plugin-viewport';
|
|
|
2
2
|
import { ViewportPlugin } from '@embedpdf/plugin-viewport';
|
|
3
3
|
import { JSX, ComponentChildren } from 'preact';
|
|
4
4
|
|
|
5
|
-
declare const
|
|
5
|
+
declare const useViewportPlugin: () => {
|
|
6
6
|
plugin: ViewportPlugin | null;
|
|
7
7
|
isLoading: boolean;
|
|
8
8
|
ready: Promise<void>;
|
|
@@ -20,4 +20,4 @@ type ViewportProps = JSX.HTMLAttributes<HTMLDivElement> & {
|
|
|
20
20
|
};
|
|
21
21
|
declare function Viewport({ children, ...props }: ViewportProps): JSX.Element;
|
|
22
22
|
|
|
23
|
-
export { Viewport,
|
|
23
|
+
export { Viewport, useViewportCapability, useViewportPlugin };
|
package/dist/preact/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as _embedpdf_plugin_viewport from '@embedpdf/plugin-viewport';
|
|
|
2
2
|
import { ViewportPlugin } from '@embedpdf/plugin-viewport';
|
|
3
3
|
import { JSX, ComponentChildren } from 'preact';
|
|
4
4
|
|
|
5
|
-
declare const
|
|
5
|
+
declare const useViewportPlugin: () => {
|
|
6
6
|
plugin: ViewportPlugin | null;
|
|
7
7
|
isLoading: boolean;
|
|
8
8
|
ready: Promise<void>;
|
|
@@ -20,4 +20,4 @@ type ViewportProps = JSX.HTMLAttributes<HTMLDivElement> & {
|
|
|
20
20
|
};
|
|
21
21
|
declare function Viewport({ children, ...props }: ViewportProps): JSX.Element;
|
|
22
22
|
|
|
23
|
-
export { Viewport,
|
|
23
|
+
export { Viewport, useViewportCapability, useViewportPlugin };
|
package/dist/preact/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/preact/hooks/use-viewport.ts
|
|
2
2
|
import { useCapability, usePlugin } from "@embedpdf/core/preact";
|
|
3
3
|
import { ViewportPlugin } from "@embedpdf/plugin-viewport";
|
|
4
|
-
var
|
|
4
|
+
var useViewportPlugin = () => usePlugin(ViewportPlugin.id);
|
|
5
5
|
var useViewportCapability = () => useCapability(ViewportPlugin.id);
|
|
6
6
|
|
|
7
7
|
// src/preact/components/viewport.tsx
|
|
@@ -10,10 +10,10 @@ import { useEffect, useState } from "preact/hooks";
|
|
|
10
10
|
// src/preact/hooks/use-viewport-ref.ts
|
|
11
11
|
import { useLayoutEffect, useRef } from "preact/hooks";
|
|
12
12
|
function useViewportRef() {
|
|
13
|
-
const {
|
|
13
|
+
const { plugin: viewportPlugin } = useViewportPlugin();
|
|
14
14
|
const containerRef = useRef(null);
|
|
15
15
|
useLayoutEffect(() => {
|
|
16
|
-
if (!
|
|
16
|
+
if (!viewportPlugin) return;
|
|
17
17
|
const container = containerRef.current;
|
|
18
18
|
if (!container) return;
|
|
19
19
|
const provideRect = () => {
|
|
@@ -23,17 +23,16 @@ function useViewportRef() {
|
|
|
23
23
|
size: { width: r.width, height: r.height }
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
viewportPlugin.registerBoundingRectProvider(provideRect);
|
|
27
27
|
const onScroll = () => {
|
|
28
|
-
|
|
28
|
+
viewportPlugin.setViewportScrollMetrics({
|
|
29
29
|
scrollTop: container.scrollTop,
|
|
30
30
|
scrollLeft: container.scrollLeft
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
33
|
container.addEventListener("scroll", onScroll);
|
|
34
34
|
const resizeObserver = new ResizeObserver(() => {
|
|
35
|
-
|
|
36
|
-
viewportProvides.setViewportMetrics({
|
|
35
|
+
viewportPlugin.setViewportResizeMetrics({
|
|
37
36
|
width: container.offsetWidth,
|
|
38
37
|
height: container.offsetHeight,
|
|
39
38
|
clientWidth: container.clientWidth,
|
|
@@ -45,7 +44,7 @@ function useViewportRef() {
|
|
|
45
44
|
});
|
|
46
45
|
});
|
|
47
46
|
resizeObserver.observe(container);
|
|
48
|
-
const unsubscribeScrollRequest =
|
|
47
|
+
const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(
|
|
49
48
|
({ x, y, behavior = "auto" }) => {
|
|
50
49
|
requestAnimationFrame(() => {
|
|
51
50
|
container.scrollTo({ left: x, top: y, behavior });
|
|
@@ -53,12 +52,12 @@ function useViewportRef() {
|
|
|
53
52
|
}
|
|
54
53
|
);
|
|
55
54
|
return () => {
|
|
56
|
-
|
|
55
|
+
viewportPlugin.registerBoundingRectProvider(null);
|
|
57
56
|
container.removeEventListener("scroll", onScroll);
|
|
58
57
|
resizeObserver.disconnect();
|
|
59
58
|
unsubscribeScrollRequest();
|
|
60
59
|
};
|
|
61
|
-
}, [
|
|
60
|
+
}, [viewportPlugin]);
|
|
62
61
|
return containerRef;
|
|
63
62
|
}
|
|
64
63
|
|
|
@@ -89,7 +88,7 @@ function Viewport({ children, ...props }) {
|
|
|
89
88
|
}
|
|
90
89
|
export {
|
|
91
90
|
Viewport,
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
useViewportCapability,
|
|
92
|
+
useViewportPlugin
|
|
94
93
|
};
|
|
95
94
|
//# sourceMappingURL=index.js.map
|
package/dist/preact/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preact/hooks/use-viewport.ts","../../src/preact/components/viewport.tsx","../../src/preact/hooks/use-viewport-ref.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../../src/preact/hooks/use-viewport.ts","../../src/preact/components/viewport.tsx","../../src/preact/hooks/use-viewport-ref.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const useViewportPlugin = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = JSX.HTMLAttributes<HTMLDivElement> & {\n children: ComponentChildren;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { Rect } from '@embedpdf/models';\nimport { useLayoutEffect, useRef } from 'preact/hooks';\n\nimport { useViewportPlugin } from './use-viewport';\n\nexport function useViewportRef() {\n const { plugin: viewportPlugin } = useViewportPlugin();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportPlugin) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n /* ---------- live rect provider --------------------------------- */\n const provideRect = (): Rect => {\n const r = container.getBoundingClientRect();\n return {\n origin: { x: r.left, y: r.top },\n size: { width: r.width, height: r.height },\n };\n };\n viewportPlugin.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportPlugin.setViewportScrollMetrics({\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n });\n };\n container.addEventListener('scroll', onScroll);\n\n // Example: On resize, call setMetrics\n const resizeObserver = new ResizeObserver(() => {\n viewportPlugin.setViewportResizeMetrics({\n width: container.offsetWidth,\n height: container.offsetHeight,\n clientWidth: container.clientWidth,\n clientHeight: container.clientHeight,\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n scrollWidth: container.scrollWidth,\n scrollHeight: container.scrollHeight,\n });\n });\n resizeObserver.observe(container);\n\n const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(\n ({ x, y, behavior = 'auto' }) => {\n requestAnimationFrame(() => {\n container.scrollTo({ left: x, top: y, behavior });\n });\n },\n );\n\n // Cleanup\n return () => {\n viewportPlugin.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportPlugin]);\n\n // Return the ref so your React code can attach it to a div\n return containerRef;\n}\n"],"mappings":";AAAA,SAAS,eAAe,iBAAiB;AACzC,SAAS,sBAAsB;AAExB,IAAM,oBAAoB,MAAM,UAA0B,eAAe,EAAE;AAC3E,IAAM,wBAAwB,MAAM,cAA8B,eAAe,EAAE;;;ACF1F,SAAS,WAAW,gBAAgB;;;ACDpC,SAAS,iBAAiB,cAAc;AAIjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,QAAQ,eAAe,IAAI,kBAAkB;AACrD,QAAM,eAAe,OAAuB,IAAI;AAEhD,kBAAgB,MAAM;AACpB,QAAI,CAAC,eAAgB;AAErB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,UAAM,cAAc,MAAY;AAC9B,YAAM,IAAI,UAAU,sBAAsB;AAC1C,aAAO;AAAA,QACL,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,QAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,MAC3C;AAAA,IACF;AACA,mBAAe,6BAA6B,WAAW;AAGvD,UAAM,WAAW,MAAM;AACrB,qBAAe,yBAAyB;AAAA,QACtC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,qBAAe,yBAAyB;AAAA,QACtC,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,QACxB,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,QACtB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AACD,mBAAe,QAAQ,SAAS;AAEhC,UAAM,2BAA2B,eAAe;AAAA,MAC9C,CAAC,EAAE,GAAG,GAAG,WAAW,OAAO,MAAM;AAC/B,8BAAsB,MAAM;AAC1B,oBAAU,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,MAAM;AACX,qBAAe,6BAA6B,IAAI;AAChD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,SAAO;AACT;;;AD5CI;AAbG,SAAS,SAAS,EAAE,UAAU,GAAG,MAAM,GAAkB;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAE7D,YAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,qBAAe,iBAAiB,eAAe,CAAC;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,EAAE,OAAO,GAAG,UAAU,IAAI;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,QACL,GAAI,OAAO,UAAU,WAAW,QAAQ,CAAC;AAAA,QACzC,SAAS,GAAG,WAAW;AAAA,MACzB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
package/dist/react/index.cjs
CHANGED
|
@@ -21,8 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var react_exports = {};
|
|
22
22
|
__export(react_exports, {
|
|
23
23
|
Viewport: () => Viewport,
|
|
24
|
-
useViewport: () => useViewport,
|
|
25
24
|
useViewportCapability: () => useViewportCapability,
|
|
25
|
+
useViewportPlugin: () => useViewportPlugin,
|
|
26
26
|
useViewportRef: () => useViewportRef
|
|
27
27
|
});
|
|
28
28
|
module.exports = __toCommonJS(react_exports);
|
|
@@ -33,16 +33,16 @@ var import_react3 = require("react");
|
|
|
33
33
|
// src/react/hooks/use-viewport.ts
|
|
34
34
|
var import_react = require("@embedpdf/core/react");
|
|
35
35
|
var import_plugin_viewport = require("@embedpdf/plugin-viewport");
|
|
36
|
-
var
|
|
36
|
+
var useViewportPlugin = () => (0, import_react.usePlugin)(import_plugin_viewport.ViewportPlugin.id);
|
|
37
37
|
var useViewportCapability = () => (0, import_react.useCapability)(import_plugin_viewport.ViewportPlugin.id);
|
|
38
38
|
|
|
39
39
|
// src/react/hooks/use-viewport-ref.ts
|
|
40
40
|
var import_react2 = require("react");
|
|
41
41
|
function useViewportRef() {
|
|
42
|
-
const {
|
|
42
|
+
const { plugin: viewportPlugin } = useViewportPlugin();
|
|
43
43
|
const containerRef = (0, import_react2.useRef)(null);
|
|
44
44
|
(0, import_react2.useLayoutEffect)(() => {
|
|
45
|
-
if (!
|
|
45
|
+
if (!viewportPlugin) return;
|
|
46
46
|
const container = containerRef.current;
|
|
47
47
|
if (!container) return;
|
|
48
48
|
const provideRect = () => {
|
|
@@ -52,17 +52,16 @@ function useViewportRef() {
|
|
|
52
52
|
size: { width: r.width, height: r.height }
|
|
53
53
|
};
|
|
54
54
|
};
|
|
55
|
-
|
|
55
|
+
viewportPlugin.registerBoundingRectProvider(provideRect);
|
|
56
56
|
const onScroll = () => {
|
|
57
|
-
|
|
57
|
+
viewportPlugin.setViewportScrollMetrics({
|
|
58
58
|
scrollTop: container.scrollTop,
|
|
59
59
|
scrollLeft: container.scrollLeft
|
|
60
60
|
});
|
|
61
61
|
};
|
|
62
62
|
container.addEventListener("scroll", onScroll);
|
|
63
63
|
const resizeObserver = new ResizeObserver(() => {
|
|
64
|
-
|
|
65
|
-
viewportProvides.setViewportMetrics({
|
|
64
|
+
viewportPlugin.setViewportResizeMetrics({
|
|
66
65
|
width: container.offsetWidth,
|
|
67
66
|
height: container.offsetHeight,
|
|
68
67
|
clientWidth: container.clientWidth,
|
|
@@ -74,7 +73,7 @@ function useViewportRef() {
|
|
|
74
73
|
});
|
|
75
74
|
});
|
|
76
75
|
resizeObserver.observe(container);
|
|
77
|
-
const unsubscribeScrollRequest =
|
|
76
|
+
const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(
|
|
78
77
|
({ x, y, behavior = "auto" }) => {
|
|
79
78
|
requestAnimationFrame(() => {
|
|
80
79
|
container.scrollTo({ left: x, top: y, behavior });
|
|
@@ -82,12 +81,12 @@ function useViewportRef() {
|
|
|
82
81
|
}
|
|
83
82
|
);
|
|
84
83
|
return () => {
|
|
85
|
-
|
|
84
|
+
viewportPlugin.registerBoundingRectProvider(null);
|
|
86
85
|
container.removeEventListener("scroll", onScroll);
|
|
87
86
|
resizeObserver.disconnect();
|
|
88
87
|
unsubscribeScrollRequest();
|
|
89
88
|
};
|
|
90
|
-
}, [
|
|
89
|
+
}, [viewportPlugin]);
|
|
91
90
|
return containerRef;
|
|
92
91
|
}
|
|
93
92
|
|
|
@@ -119,8 +118,8 @@ function Viewport({ children, ...props }) {
|
|
|
119
118
|
// Annotate the CommonJS export names for ESM import in node:
|
|
120
119
|
0 && (module.exports = {
|
|
121
120
|
Viewport,
|
|
122
|
-
useViewport,
|
|
123
121
|
useViewportCapability,
|
|
122
|
+
useViewportPlugin,
|
|
124
123
|
useViewportRef
|
|
125
124
|
});
|
|
126
125
|
//# sourceMappingURL=index.cjs.map
|
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.ts","../../src/react/components/viewport.tsx","../../src/react/hooks/use-viewport.ts","../../src/react/hooks/use-viewport-ref.ts"],"sourcesContent":["export * from './components';\nexport * from './hooks';\n","import React, { ReactNode, useEffect, useState } from 'react';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/react/components/viewport.tsx","../../src/react/hooks/use-viewport.ts","../../src/react/hooks/use-viewport-ref.ts"],"sourcesContent":["export * from './components';\nexport * from './hooks';\n","import React, { ReactNode, useEffect, useState } from 'react';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const useViewportPlugin = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","import { Rect } from '@embedpdf/models';\nimport { useLayoutEffect, useRef } from 'react';\n\nimport { useViewportPlugin } from './use-viewport';\n\nexport function useViewportRef() {\n const { plugin: viewportPlugin } = useViewportPlugin();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportPlugin) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n /* ---------- live rect provider --------------------------------- */\n const provideRect = (): Rect => {\n const r = container.getBoundingClientRect();\n return {\n origin: { x: r.left, y: r.top },\n size: { width: r.width, height: r.height },\n };\n };\n viewportPlugin.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportPlugin.setViewportScrollMetrics({\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n });\n };\n container.addEventListener('scroll', onScroll);\n\n // Example: On resize, call setMetrics\n const resizeObserver = new ResizeObserver(() => {\n viewportPlugin.setViewportResizeMetrics({\n width: container.offsetWidth,\n height: container.offsetHeight,\n clientWidth: container.clientWidth,\n clientHeight: container.clientHeight,\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n scrollWidth: container.scrollWidth,\n scrollHeight: container.scrollHeight,\n });\n });\n resizeObserver.observe(container);\n\n const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(\n ({ x, y, behavior = 'auto' }) => {\n requestAnimationFrame(() => {\n container.scrollTo({ left: x, top: y, behavior });\n });\n },\n );\n\n // Cleanup\n return () => {\n viewportPlugin.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportPlugin]);\n\n // Return the ref so your React code can attach it to a div\n return containerRef;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAAsD;;;ACAtD,mBAAyC;AACzC,6BAA+B;AAExB,IAAM,oBAAoB,UAAM,wBAA0B,sCAAe,EAAE;AAC3E,IAAM,wBAAwB,UAAM,4BAA8B,sCAAe,EAAE;;;ACH1F,IAAAC,gBAAwC;AAIjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,QAAQ,eAAe,IAAI,kBAAkB;AACrD,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,qCAAgB,MAAM;AACpB,QAAI,CAAC,eAAgB;AAErB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,UAAM,cAAc,MAAY;AAC9B,YAAM,IAAI,UAAU,sBAAsB;AAC1C,aAAO;AAAA,QACL,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,QAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,MAC3C;AAAA,IACF;AACA,mBAAe,6BAA6B,WAAW;AAGvD,UAAM,WAAW,MAAM;AACrB,qBAAe,yBAAyB;AAAA,QACtC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,qBAAe,yBAAyB;AAAA,QACtC,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,QACxB,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,QACtB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AACD,mBAAe,QAAQ,SAAS;AAEhC,UAAM,2BAA2B,eAAe;AAAA,MAC9C,CAAC,EAAE,GAAG,GAAG,WAAW,OAAO,MAAM;AAC/B,8BAAsB,MAAM;AAC1B,oBAAU,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,MAAM;AACX,qBAAe,6BAA6B,IAAI;AAChD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,SAAO;AACT;;;AF9CI;AAbG,SAAS,SAAS,EAAE,UAAU,GAAG,MAAM,GAAkB;AAC9D,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,CAAC;AAChD,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAE7D,+BAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,qBAAe,iBAAiB,eAAe,CAAC;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,EAAE,OAAO,GAAG,UAAU,IAAI;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,QACL,GAAI,OAAO,UAAU,WAAW,QAAQ,CAAC;AAAA,QACzC,SAAS,GAAG,WAAW;AAAA,MACzB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":["import_react","import_react"]}
|
package/dist/react/index.d.cts
CHANGED
|
@@ -9,7 +9,7 @@ type ViewportProps = React__default.HTMLAttributes<HTMLDivElement> & {
|
|
|
9
9
|
};
|
|
10
10
|
declare function Viewport({ children, ...props }: ViewportProps): react_jsx_runtime.JSX.Element;
|
|
11
11
|
|
|
12
|
-
declare const
|
|
12
|
+
declare const useViewportPlugin: () => {
|
|
13
13
|
plugin: ViewportPlugin | null;
|
|
14
14
|
isLoading: boolean;
|
|
15
15
|
ready: Promise<void>;
|
|
@@ -22,4 +22,4 @@ declare const useViewportCapability: () => {
|
|
|
22
22
|
|
|
23
23
|
declare function useViewportRef(): React.RefObject<HTMLDivElement>;
|
|
24
24
|
|
|
25
|
-
export { Viewport,
|
|
25
|
+
export { Viewport, useViewportCapability, useViewportPlugin, useViewportRef };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ type ViewportProps = React__default.HTMLAttributes<HTMLDivElement> & {
|
|
|
9
9
|
};
|
|
10
10
|
declare function Viewport({ children, ...props }: ViewportProps): react_jsx_runtime.JSX.Element;
|
|
11
11
|
|
|
12
|
-
declare const
|
|
12
|
+
declare const useViewportPlugin: () => {
|
|
13
13
|
plugin: ViewportPlugin | null;
|
|
14
14
|
isLoading: boolean;
|
|
15
15
|
ready: Promise<void>;
|
|
@@ -22,4 +22,4 @@ declare const useViewportCapability: () => {
|
|
|
22
22
|
|
|
23
23
|
declare function useViewportRef(): React.RefObject<HTMLDivElement>;
|
|
24
24
|
|
|
25
|
-
export { Viewport,
|
|
25
|
+
export { Viewport, useViewportCapability, useViewportPlugin, useViewportRef };
|
package/dist/react/index.js
CHANGED
|
@@ -4,16 +4,16 @@ import { useEffect, useState } from "react";
|
|
|
4
4
|
// src/react/hooks/use-viewport.ts
|
|
5
5
|
import { useCapability, usePlugin } from "@embedpdf/core/react";
|
|
6
6
|
import { ViewportPlugin } from "@embedpdf/plugin-viewport";
|
|
7
|
-
var
|
|
7
|
+
var useViewportPlugin = () => usePlugin(ViewportPlugin.id);
|
|
8
8
|
var useViewportCapability = () => useCapability(ViewportPlugin.id);
|
|
9
9
|
|
|
10
10
|
// src/react/hooks/use-viewport-ref.ts
|
|
11
11
|
import { useLayoutEffect, useRef } from "react";
|
|
12
12
|
function useViewportRef() {
|
|
13
|
-
const {
|
|
13
|
+
const { plugin: viewportPlugin } = useViewportPlugin();
|
|
14
14
|
const containerRef = useRef(null);
|
|
15
15
|
useLayoutEffect(() => {
|
|
16
|
-
if (!
|
|
16
|
+
if (!viewportPlugin) return;
|
|
17
17
|
const container = containerRef.current;
|
|
18
18
|
if (!container) return;
|
|
19
19
|
const provideRect = () => {
|
|
@@ -23,17 +23,16 @@ function useViewportRef() {
|
|
|
23
23
|
size: { width: r.width, height: r.height }
|
|
24
24
|
};
|
|
25
25
|
};
|
|
26
|
-
|
|
26
|
+
viewportPlugin.registerBoundingRectProvider(provideRect);
|
|
27
27
|
const onScroll = () => {
|
|
28
|
-
|
|
28
|
+
viewportPlugin.setViewportScrollMetrics({
|
|
29
29
|
scrollTop: container.scrollTop,
|
|
30
30
|
scrollLeft: container.scrollLeft
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
33
|
container.addEventListener("scroll", onScroll);
|
|
34
34
|
const resizeObserver = new ResizeObserver(() => {
|
|
35
|
-
|
|
36
|
-
viewportProvides.setViewportMetrics({
|
|
35
|
+
viewportPlugin.setViewportResizeMetrics({
|
|
37
36
|
width: container.offsetWidth,
|
|
38
37
|
height: container.offsetHeight,
|
|
39
38
|
clientWidth: container.clientWidth,
|
|
@@ -45,7 +44,7 @@ function useViewportRef() {
|
|
|
45
44
|
});
|
|
46
45
|
});
|
|
47
46
|
resizeObserver.observe(container);
|
|
48
|
-
const unsubscribeScrollRequest =
|
|
47
|
+
const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(
|
|
49
48
|
({ x, y, behavior = "auto" }) => {
|
|
50
49
|
requestAnimationFrame(() => {
|
|
51
50
|
container.scrollTo({ left: x, top: y, behavior });
|
|
@@ -53,12 +52,12 @@ function useViewportRef() {
|
|
|
53
52
|
}
|
|
54
53
|
);
|
|
55
54
|
return () => {
|
|
56
|
-
|
|
55
|
+
viewportPlugin.registerBoundingRectProvider(null);
|
|
57
56
|
container.removeEventListener("scroll", onScroll);
|
|
58
57
|
resizeObserver.disconnect();
|
|
59
58
|
unsubscribeScrollRequest();
|
|
60
59
|
};
|
|
61
|
-
}, [
|
|
60
|
+
}, [viewportPlugin]);
|
|
62
61
|
return containerRef;
|
|
63
62
|
}
|
|
64
63
|
|
|
@@ -89,8 +88,8 @@ function Viewport({ children, ...props }) {
|
|
|
89
88
|
}
|
|
90
89
|
export {
|
|
91
90
|
Viewport,
|
|
92
|
-
useViewport,
|
|
93
91
|
useViewportCapability,
|
|
92
|
+
useViewportPlugin,
|
|
94
93
|
useViewportRef
|
|
95
94
|
};
|
|
96
95
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/components/viewport.tsx","../../src/react/hooks/use-viewport.ts","../../src/react/hooks/use-viewport-ref.ts"],"sourcesContent":["import React, { ReactNode, useEffect, useState } from 'react';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../../src/react/components/viewport.tsx","../../src/react/hooks/use-viewport.ts","../../src/react/hooks/use-viewport-ref.ts"],"sourcesContent":["import React, { ReactNode, useEffect, useState } from 'react';\n\nimport { useViewportCapability } from '../hooks';\nimport { useViewportRef } from '../hooks/use-viewport-ref';\n\ntype ViewportProps = React.HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n};\n\nexport function Viewport({ children, ...props }: ViewportProps) {\n const [viewportGap, setViewportGap] = useState(0);\n const viewportRef = useViewportRef();\n const { provides: viewportProvides } = useViewportCapability();\n\n useEffect(() => {\n if (viewportProvides) {\n setViewportGap(viewportProvides.getViewportGap());\n }\n }, [viewportProvides]);\n\n const { style, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={viewportRef}\n style={{\n ...(typeof style === 'object' ? style : {}),\n padding: `${viewportGap}px`,\n }}\n >\n {children}\n </div>\n );\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport { ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nexport const useViewportPlugin = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","import { Rect } from '@embedpdf/models';\nimport { useLayoutEffect, useRef } from 'react';\n\nimport { useViewportPlugin } from './use-viewport';\n\nexport function useViewportRef() {\n const { plugin: viewportPlugin } = useViewportPlugin();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportPlugin) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n /* ---------- live rect provider --------------------------------- */\n const provideRect = (): Rect => {\n const r = container.getBoundingClientRect();\n return {\n origin: { x: r.left, y: r.top },\n size: { width: r.width, height: r.height },\n };\n };\n viewportPlugin.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportPlugin.setViewportScrollMetrics({\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n });\n };\n container.addEventListener('scroll', onScroll);\n\n // Example: On resize, call setMetrics\n const resizeObserver = new ResizeObserver(() => {\n viewportPlugin.setViewportResizeMetrics({\n width: container.offsetWidth,\n height: container.offsetHeight,\n clientWidth: container.clientWidth,\n clientHeight: container.clientHeight,\n scrollTop: container.scrollTop,\n scrollLeft: container.scrollLeft,\n scrollWidth: container.scrollWidth,\n scrollHeight: container.scrollHeight,\n });\n });\n resizeObserver.observe(container);\n\n const unsubscribeScrollRequest = viewportPlugin.onScrollRequest(\n ({ x, y, behavior = 'auto' }) => {\n requestAnimationFrame(() => {\n container.scrollTo({ left: x, top: y, behavior });\n });\n },\n );\n\n // Cleanup\n return () => {\n viewportPlugin.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportPlugin]);\n\n // Return the ref so your React code can attach it to a div\n return containerRef;\n}\n"],"mappings":";AAAA,SAA2B,WAAW,gBAAgB;;;ACAtD,SAAS,eAAe,iBAAiB;AACzC,SAAS,sBAAsB;AAExB,IAAM,oBAAoB,MAAM,UAA0B,eAAe,EAAE;AAC3E,IAAM,wBAAwB,MAAM,cAA8B,eAAe,EAAE;;;ACH1F,SAAS,iBAAiB,cAAc;AAIjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,QAAQ,eAAe,IAAI,kBAAkB;AACrD,QAAM,eAAe,OAAuB,IAAI;AAEhD,kBAAgB,MAAM;AACpB,QAAI,CAAC,eAAgB;AAErB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,UAAM,cAAc,MAAY;AAC9B,YAAM,IAAI,UAAU,sBAAsB;AAC1C,aAAO;AAAA,QACL,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAAA,QAC9B,MAAM,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,MAC3C;AAAA,IACF;AACA,mBAAe,6BAA6B,WAAW;AAGvD,UAAM,WAAW,MAAM;AACrB,qBAAe,yBAAyB;AAAA,QACtC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,qBAAe,yBAAyB;AAAA,QACtC,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,QACxB,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,QACtB,aAAa,UAAU;AAAA,QACvB,cAAc,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AACD,mBAAe,QAAQ,SAAS;AAEhC,UAAM,2BAA2B,eAAe;AAAA,MAC9C,CAAC,EAAE,GAAG,GAAG,WAAW,OAAO,MAAM;AAC/B,8BAAsB,MAAM;AAC1B,oBAAU,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,WAAO,MAAM;AACX,qBAAe,6BAA6B,IAAI;AAChD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,SAAO;AACT;;;AF9CI;AAbG,SAAS,SAAS,EAAE,UAAU,GAAG,MAAM,GAAkB;AAC9D,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,cAAc,eAAe;AACnC,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAE7D,YAAU,MAAM;AACd,QAAI,kBAAkB;AACpB,qBAAe,iBAAiB,eAAe,CAAC;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,EAAE,OAAO,GAAG,UAAU,IAAI;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,QACL,GAAI,OAAO,UAAU,WAAW,QAAQ,CAAC;AAAA,QACzC,SAAS,GAAG,WAAW;AAAA,MACzB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/plugin-viewport",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
"@types/react": "^18.2.0",
|
|
28
28
|
"tsup": "^8.0.0",
|
|
29
29
|
"typescript": "^5.0.0",
|
|
30
|
-
"@embedpdf/models": "1.0.
|
|
31
|
-
"@embedpdf/core": "1.0.
|
|
30
|
+
"@embedpdf/models": "1.0.2",
|
|
31
|
+
"@embedpdf/core": "1.0.2"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": ">=16.8.0",
|
|
35
35
|
"react-dom": ">=16.8.0",
|
|
36
36
|
"preact": "^10.26.4",
|
|
37
|
-
"@embedpdf/core": "1.0.
|
|
37
|
+
"@embedpdf/core": "1.0.2"
|
|
38
38
|
},
|
|
39
39
|
"files": [
|
|
40
40
|
"dist",
|