@embedpdf/plugin-viewport 1.0.0 → 1.0.1

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 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
- bumpScrollActivity() {
174
- if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);
175
- this.scrollEndTimer = window.setTimeout(() => {
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();
@@ -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 { BasePluginConfig, EventControlOptions, EventHook, Action, BasePlugin, PluginRegistry, PluginManifest, PluginPackage } from '@embedpdf/core';
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
- onScrollRequest: EventHook<ScrollToPayload>;
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 { BasePluginConfig, EventControlOptions, EventHook, Action, BasePlugin, PluginRegistry, PluginManifest, PluginPackage } from '@embedpdf/core';
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
- onScrollRequest: EventHook<ScrollToPayload>;
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 { BasePlugin, createEmitter, createBehaviorEmitter } from "@embedpdf/core";
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
- bumpScrollActivity() {
145
- if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);
146
- this.scrollEndTimer = window.setTimeout(() => {
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":[]}
@@ -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
- useViewport: () => useViewport,
25
- useViewportCapability: () => useViewportCapability
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 useViewport = () => (0, import_preact.usePlugin)(import_plugin_viewport.ViewportPlugin.id);
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 { provides: viewportProvides } = useViewportCapability();
41
+ const { plugin: viewportPlugin } = useViewportPlugin();
42
42
  const containerRef = (0, import_hooks.useRef)(null);
43
43
  (0, import_hooks.useLayoutEffect)(() => {
44
- if (!viewportProvides) return;
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
- viewportProvides.registerBoundingRectProvider(provideRect);
54
+ viewportPlugin.registerBoundingRectProvider(provideRect);
55
55
  const onScroll = () => {
56
- viewportProvides.setViewportScrollMetrics({
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
- const rect = container.getBoundingClientRect();
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 = viewportProvides.onScrollRequest(
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
- viewportProvides.registerBoundingRectProvider(null);
83
+ viewportPlugin.registerBoundingRectProvider(null);
85
84
  container.removeEventListener("scroll", onScroll);
86
85
  resizeObserver.disconnect();
87
86
  unsubscribeScrollRequest();
88
87
  };
89
- }, [viewportProvides]);
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
- useViewport,
122
- useViewportCapability
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 useViewport = () => 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 { useLayoutEffect, useRef } from 'preact/hooks';\n\nimport { useViewportCapability } from './use-viewport';\nimport { Rect } from '@embedpdf/models';\n\nexport function useViewportRef() {\n const { provides: viewportProvides } = useViewportCapability();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportProvides) 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 viewportProvides.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportProvides.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 const rect = container.getBoundingClientRect();\n\n viewportProvides.setViewportMetrics({\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 = viewportProvides.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 viewportProvides.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportProvides]);\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,cAAc,UAAM,yBAA0B,sCAAe,EAAE;AACrE,IAAM,wBAAwB,UAAM,6BAA8B,sCAAe,EAAE;;;ACF1F,IAAAA,gBAAoC;;;ACFpC,mBAAwC;AAKjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAC7D,QAAM,mBAAe,qBAAuB,IAAI;AAEhD,oCAAgB,MAAM;AACpB,QAAI,CAAC,iBAAkB;AAEvB,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,qBAAiB,6BAA6B,WAAW;AAGzD,UAAM,WAAW,MAAM;AACrB,uBAAiB,yBAAyB;AAAA,QACxC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,YAAM,OAAO,UAAU,sBAAsB;AAE7C,uBAAiB,mBAAmB;AAAA,QAClC,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,iBAAiB;AAAA,MAChD,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,uBAAiB,6BAA6B,IAAI;AAClD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAGrB,SAAO;AACT;;;AD9CI;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"]}
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"]}
@@ -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 useViewport: () => {
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, useViewport, useViewportCapability };
23
+ export { Viewport, useViewportCapability, useViewportPlugin };
@@ -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 useViewport: () => {
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, useViewport, useViewportCapability };
23
+ export { Viewport, useViewportCapability, useViewportPlugin };
@@ -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 useViewport = () => usePlugin(ViewportPlugin.id);
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 { provides: viewportProvides } = useViewportCapability();
13
+ const { plugin: viewportPlugin } = useViewportPlugin();
14
14
  const containerRef = useRef(null);
15
15
  useLayoutEffect(() => {
16
- if (!viewportProvides) return;
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
- viewportProvides.registerBoundingRectProvider(provideRect);
26
+ viewportPlugin.registerBoundingRectProvider(provideRect);
27
27
  const onScroll = () => {
28
- viewportProvides.setViewportScrollMetrics({
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
- const rect = container.getBoundingClientRect();
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 = viewportProvides.onScrollRequest(
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
- viewportProvides.registerBoundingRectProvider(null);
55
+ viewportPlugin.registerBoundingRectProvider(null);
57
56
  container.removeEventListener("scroll", onScroll);
58
57
  resizeObserver.disconnect();
59
58
  unsubscribeScrollRequest();
60
59
  };
61
- }, [viewportProvides]);
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
- useViewport,
93
- useViewportCapability
91
+ useViewportCapability,
92
+ useViewportPlugin
94
93
  };
95
94
  //# sourceMappingURL=index.js.map
@@ -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 useViewport = () => 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 { useLayoutEffect, useRef } from 'preact/hooks';\n\nimport { useViewportCapability } from './use-viewport';\nimport { Rect } from '@embedpdf/models';\n\nexport function useViewportRef() {\n const { provides: viewportProvides } = useViewportCapability();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportProvides) 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 viewportProvides.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportProvides.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 const rect = container.getBoundingClientRect();\n\n viewportProvides.setViewportMetrics({\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 = viewportProvides.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 viewportProvides.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportProvides]);\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,cAAc,MAAM,UAA0B,eAAe,EAAE;AACrE,IAAM,wBAAwB,MAAM,cAA8B,eAAe,EAAE;;;ACF1F,SAAS,WAAW,gBAAgB;;;ACFpC,SAAS,iBAAiB,cAAc;AAKjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAC7D,QAAM,eAAe,OAAuB,IAAI;AAEhD,kBAAgB,MAAM;AACpB,QAAI,CAAC,iBAAkB;AAEvB,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,qBAAiB,6BAA6B,WAAW;AAGzD,UAAM,WAAW,MAAM;AACrB,uBAAiB,yBAAyB;AAAA,QACxC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,YAAM,OAAO,UAAU,sBAAsB;AAE7C,uBAAiB,mBAAmB;AAAA,QAClC,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,iBAAiB;AAAA,MAChD,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,uBAAiB,6BAA6B,IAAI;AAClD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAGrB,SAAO;AACT;;;AD9CI;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":[]}
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":[]}
@@ -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 useViewport = () => (0, import_react.usePlugin)(import_plugin_viewport.ViewportPlugin.id);
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 { provides: viewportProvides } = useViewportCapability();
42
+ const { plugin: viewportPlugin } = useViewportPlugin();
43
43
  const containerRef = (0, import_react2.useRef)(null);
44
44
  (0, import_react2.useLayoutEffect)(() => {
45
- if (!viewportProvides) return;
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
- viewportProvides.registerBoundingRectProvider(provideRect);
55
+ viewportPlugin.registerBoundingRectProvider(provideRect);
56
56
  const onScroll = () => {
57
- viewportProvides.setViewportScrollMetrics({
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
- const rect = container.getBoundingClientRect();
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 = viewportProvides.onScrollRequest(
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
- viewportProvides.registerBoundingRectProvider(null);
84
+ viewportPlugin.registerBoundingRectProvider(null);
86
85
  container.removeEventListener("scroll", onScroll);
87
86
  resizeObserver.disconnect();
88
87
  unsubscribeScrollRequest();
89
88
  };
90
- }, [viewportProvides]);
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
@@ -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 useViewport = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","import { useLayoutEffect, useRef } from 'react';\n\nimport { useViewportCapability } from './use-viewport';\nimport { Rect } from '@embedpdf/models';\n\nexport function useViewportRef() {\n const { provides: viewportProvides } = useViewportCapability();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportProvides) 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 viewportProvides.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportProvides.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 const rect = container.getBoundingClientRect();\n\n viewportProvides.setViewportMetrics({\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 = viewportProvides.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 viewportProvides.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportProvides]);\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,cAAc,UAAM,wBAA0B,sCAAe,EAAE;AACrE,IAAM,wBAAwB,UAAM,4BAA8B,sCAAe,EAAE;;;ACJ1F,IAAAC,gBAAwC;AAKjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAC7D,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,qCAAgB,MAAM;AACpB,QAAI,CAAC,iBAAkB;AAEvB,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,qBAAiB,6BAA6B,WAAW;AAGzD,UAAM,WAAW,MAAM;AACrB,uBAAiB,yBAAyB;AAAA,QACxC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,YAAM,OAAO,UAAU,sBAAsB;AAE7C,uBAAiB,mBAAmB;AAAA,QAClC,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,iBAAiB;AAAA,MAChD,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,uBAAiB,6BAA6B,IAAI;AAClD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAGrB,SAAO;AACT;;;AFhDI;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"]}
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"]}
@@ -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 useViewport: () => {
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, useViewport, useViewportCapability, useViewportRef };
25
+ export { Viewport, useViewportCapability, useViewportPlugin, useViewportRef };
@@ -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 useViewport: () => {
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, useViewport, useViewportCapability, useViewportRef };
25
+ export { Viewport, useViewportCapability, useViewportPlugin, useViewportRef };
@@ -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 useViewport = () => usePlugin(ViewportPlugin.id);
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 { provides: viewportProvides } = useViewportCapability();
13
+ const { plugin: viewportPlugin } = useViewportPlugin();
14
14
  const containerRef = useRef(null);
15
15
  useLayoutEffect(() => {
16
- if (!viewportProvides) return;
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
- viewportProvides.registerBoundingRectProvider(provideRect);
26
+ viewportPlugin.registerBoundingRectProvider(provideRect);
27
27
  const onScroll = () => {
28
- viewportProvides.setViewportScrollMetrics({
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
- const rect = container.getBoundingClientRect();
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 = viewportProvides.onScrollRequest(
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
- viewportProvides.registerBoundingRectProvider(null);
55
+ viewportPlugin.registerBoundingRectProvider(null);
57
56
  container.removeEventListener("scroll", onScroll);
58
57
  resizeObserver.disconnect();
59
58
  unsubscribeScrollRequest();
60
59
  };
61
- }, [viewportProvides]);
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
@@ -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 useViewport = () => usePlugin<ViewportPlugin>(ViewportPlugin.id);\nexport const useViewportCapability = () => useCapability<ViewportPlugin>(ViewportPlugin.id);\n","import { useLayoutEffect, useRef } from 'react';\n\nimport { useViewportCapability } from './use-viewport';\nimport { Rect } from '@embedpdf/models';\n\nexport function useViewportRef() {\n const { provides: viewportProvides } = useViewportCapability();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!viewportProvides) 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 viewportProvides.registerBoundingRectProvider(provideRect);\n\n // Example: On scroll, call setMetrics\n const onScroll = () => {\n viewportProvides.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 const rect = container.getBoundingClientRect();\n\n viewportProvides.setViewportMetrics({\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 = viewportProvides.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 viewportProvides.registerBoundingRectProvider(null);\n container.removeEventListener('scroll', onScroll);\n resizeObserver.disconnect();\n unsubscribeScrollRequest();\n };\n }, [viewportProvides]);\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,cAAc,MAAM,UAA0B,eAAe,EAAE;AACrE,IAAM,wBAAwB,MAAM,cAA8B,eAAe,EAAE;;;ACJ1F,SAAS,iBAAiB,cAAc;AAKjC,SAAS,iBAAiB;AAC/B,QAAM,EAAE,UAAU,iBAAiB,IAAI,sBAAsB;AAC7D,QAAM,eAAe,OAAuB,IAAI;AAEhD,kBAAgB,MAAM;AACpB,QAAI,CAAC,iBAAkB;AAEvB,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,qBAAiB,6BAA6B,WAAW;AAGzD,UAAM,WAAW,MAAM;AACrB,uBAAiB,yBAAyB;AAAA,QACxC,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AACA,cAAU,iBAAiB,UAAU,QAAQ;AAG7C,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,YAAM,OAAO,UAAU,sBAAsB;AAE7C,uBAAiB,mBAAmB;AAAA,QAClC,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,iBAAiB;AAAA,MAChD,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,uBAAiB,6BAA6B,IAAI;AAClD,gBAAU,oBAAoB,UAAU,QAAQ;AAChD,qBAAe,WAAW;AAC1B,+BAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAGrB,SAAO;AACT;;;AFhDI;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":[]}
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.0",
3
+ "version": "1.0.1",
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.0",
31
- "@embedpdf/core": "1.0.0"
30
+ "@embedpdf/models": "1.0.1",
31
+ "@embedpdf/core": "1.0.1"
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.0"
37
+ "@embedpdf/core": "1.0.1"
38
38
  },
39
39
  "files": [
40
40
  "dist",