@embedpdf/plugin-viewport 1.0.11 → 1.0.12

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.
Files changed (51) hide show
  1. package/dist/index.cjs +2 -247
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -107
  4. package/dist/index.js +20 -32
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +27 -0
  7. package/dist/lib/index.d.ts +8 -0
  8. package/dist/lib/manifest.d.ts +4 -0
  9. package/dist/lib/reducer.d.ts +5 -0
  10. package/dist/lib/types.d.ts +52 -0
  11. package/dist/lib/viewport-plugin.d.ts +27 -0
  12. package/dist/preact/adapter.d.ts +5 -0
  13. package/dist/preact/core.d.ts +1 -0
  14. package/dist/preact/index.cjs +2 -123
  15. package/dist/preact/index.cjs.map +1 -1
  16. package/dist/preact/index.d.ts +1 -23
  17. package/dist/preact/index.js +9 -15
  18. package/dist/preact/index.js.map +1 -1
  19. package/dist/react/adapter.d.ts +2 -0
  20. package/dist/react/core.d.ts +1 -0
  21. package/dist/react/index.cjs +2 -125
  22. package/dist/react/index.cjs.map +1 -1
  23. package/dist/react/index.d.ts +1 -25
  24. package/dist/react/index.js +6 -14
  25. package/dist/react/index.js.map +1 -1
  26. package/dist/shared-preact/components/index.d.ts +1 -0
  27. package/dist/shared-preact/components/viewport.d.ts +6 -0
  28. package/dist/shared-preact/hooks/index.d.ts +2 -0
  29. package/dist/shared-preact/hooks/use-viewport-ref.d.ts +1 -0
  30. package/dist/shared-preact/hooks/use-viewport.d.ts +11 -0
  31. package/dist/shared-preact/index.d.ts +2 -0
  32. package/dist/shared-react/components/index.d.ts +1 -0
  33. package/dist/shared-react/components/viewport.d.ts +6 -0
  34. package/dist/shared-react/hooks/index.d.ts +2 -0
  35. package/dist/shared-react/hooks/use-viewport-ref.d.ts +1 -0
  36. package/dist/shared-react/hooks/use-viewport.d.ts +11 -0
  37. package/dist/shared-react/index.d.ts +2 -0
  38. package/dist/vue/components/index.d.ts +1 -0
  39. package/dist/vue/components/viewport.vue.d.ts +12 -0
  40. package/dist/vue/hooks/index.d.ts +2 -0
  41. package/dist/vue/hooks/use-viewport-ref.d.ts +1 -0
  42. package/dist/vue/hooks/use-viewport.d.ts +3 -0
  43. package/dist/vue/index.cjs +2 -0
  44. package/dist/vue/index.cjs.map +1 -0
  45. package/dist/vue/index.d.ts +2 -0
  46. package/dist/vue/index.js +89 -0
  47. package/dist/vue/index.js.map +1 -0
  48. package/package.json +21 -12
  49. package/dist/index.d.cts +0 -107
  50. package/dist/preact/index.d.cts +0 -23
  51. package/dist/react/index.d.cts +0 -25
package/dist/index.cjs CHANGED
@@ -1,247 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- VIEWPORT_PLUGIN_ID: () => VIEWPORT_PLUGIN_ID,
24
- ViewportPlugin: () => ViewportPlugin,
25
- ViewportPluginPackage: () => ViewportPluginPackage,
26
- manifest: () => manifest
27
- });
28
- module.exports = __toCommonJS(index_exports);
29
-
30
- // src/lib/manifest.ts
31
- var VIEWPORT_PLUGIN_ID = "viewport";
32
- var manifest = {
33
- id: VIEWPORT_PLUGIN_ID,
34
- name: "Viewport Plugin",
35
- version: "1.0.0",
36
- provides: ["viewport"],
37
- requires: [],
38
- optional: [],
39
- defaultConfig: {
40
- enabled: true,
41
- viewportGap: 10,
42
- scrollEndDelay: 300
43
- }
44
- };
45
-
46
- // src/lib/actions.ts
47
- var SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
48
- var SET_VIEWPORT_SCROLL_METRICS = "SET_VIEWPORT_SCROLL_METRICS";
49
- var SET_VIEWPORT_GAP = "SET_VIEWPORT_GAP";
50
- var SET_SCROLL_ACTIVITY = "SET_SCROLL_ACTIVITY";
51
- function setViewportGap(viewportGap) {
52
- return {
53
- type: SET_VIEWPORT_GAP,
54
- payload: viewportGap
55
- };
56
- }
57
- function setViewportMetrics(viewportMetrics) {
58
- return {
59
- type: SET_VIEWPORT_METRICS,
60
- payload: viewportMetrics
61
- };
62
- }
63
- function setViewportScrollMetrics(scrollMetrics) {
64
- return {
65
- type: SET_VIEWPORT_SCROLL_METRICS,
66
- payload: scrollMetrics
67
- };
68
- }
69
- function setScrollActivity(isScrolling) {
70
- return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };
71
- }
72
-
73
- // src/lib/reducer.ts
74
- var initialState = {
75
- viewportGap: 0,
76
- viewportMetrics: {
77
- width: 0,
78
- height: 0,
79
- scrollTop: 0,
80
- scrollLeft: 0,
81
- clientWidth: 0,
82
- clientHeight: 0,
83
- scrollWidth: 0,
84
- scrollHeight: 0,
85
- relativePosition: {
86
- x: 0,
87
- y: 0
88
- }
89
- },
90
- isScrolling: false
91
- };
92
- var viewportReducer = (state = initialState, action) => {
93
- switch (action.type) {
94
- case SET_VIEWPORT_GAP:
95
- return { ...state, viewportGap: action.payload };
96
- case SET_VIEWPORT_METRICS:
97
- return {
98
- ...state,
99
- viewportMetrics: {
100
- width: action.payload.width,
101
- height: action.payload.height,
102
- scrollTop: action.payload.scrollTop,
103
- scrollLeft: action.payload.scrollLeft,
104
- clientWidth: action.payload.clientWidth,
105
- clientHeight: action.payload.clientHeight,
106
- scrollWidth: action.payload.scrollWidth,
107
- scrollHeight: action.payload.scrollHeight,
108
- relativePosition: {
109
- x: action.payload.scrollWidth <= action.payload.clientWidth ? 0 : action.payload.scrollLeft / (action.payload.scrollWidth - action.payload.clientWidth),
110
- y: action.payload.scrollHeight <= action.payload.clientHeight ? 0 : action.payload.scrollTop / (action.payload.scrollHeight - action.payload.clientHeight)
111
- }
112
- }
113
- };
114
- case SET_VIEWPORT_SCROLL_METRICS:
115
- return {
116
- ...state,
117
- viewportMetrics: {
118
- ...state.viewportMetrics,
119
- scrollTop: action.payload.scrollTop,
120
- scrollLeft: action.payload.scrollLeft
121
- },
122
- isScrolling: true
123
- };
124
- case SET_SCROLL_ACTIVITY:
125
- return { ...state, isScrolling: action.payload };
126
- default:
127
- return state;
128
- }
129
- };
130
-
131
- // src/lib/viewport-plugin.ts
132
- var import_core = require("@embedpdf/core");
133
- var ViewportPlugin = class extends import_core.BasePlugin {
134
- constructor(id, registry, config) {
135
- super(id, registry);
136
- this.id = id;
137
- this.viewportResize$ = (0, import_core.createBehaviorEmitter)();
138
- this.viewportMetrics$ = (0, import_core.createBehaviorEmitter)();
139
- this.scrollMetrics$ = (0, import_core.createBehaviorEmitter)();
140
- this.scrollReq$ = (0, import_core.createEmitter)();
141
- this.scrollActivity$ = (0, import_core.createBehaviorEmitter)();
142
- /* ------------------------------------------------------------------ */
143
- /* “live rect” infrastructure */
144
- /* ------------------------------------------------------------------ */
145
- this.rectProvider = null;
146
- if (config.viewportGap) {
147
- this.dispatch(setViewportGap(config.viewportGap));
148
- }
149
- this.scrollEndDelay = config.scrollEndDelay || 300;
150
- }
151
- buildCapability() {
152
- return {
153
- getViewportGap: () => this.state.viewportGap,
154
- getMetrics: () => this.state.viewportMetrics,
155
- getBoundingRect: () => this.rectProvider?.() ?? {
156
- origin: { x: 0, y: 0 },
157
- size: { width: 0, height: 0 }
158
- },
159
- scrollTo: (pos) => this.scrollTo(pos),
160
- isScrolling: () => this.state.isScrolling,
161
- onScrollChange: this.scrollMetrics$.on,
162
- onViewportChange: this.viewportMetrics$.on,
163
- onViewportResize: this.viewportResize$.on,
164
- onScrollActivity: this.scrollActivity$.on
165
- };
166
- }
167
- setViewportResizeMetrics(viewportMetrics) {
168
- this.dispatch(setViewportMetrics(viewportMetrics));
169
- this.viewportResize$.emit(this.state.viewportMetrics);
170
- }
171
- setViewportScrollMetrics(scrollMetrics) {
172
- if (scrollMetrics.scrollTop !== this.state.viewportMetrics.scrollTop || scrollMetrics.scrollLeft !== this.state.viewportMetrics.scrollLeft) {
173
- this.dispatch(setViewportScrollMetrics(scrollMetrics));
174
- this.bumpScrollActivity();
175
- this.scrollMetrics$.emit({
176
- scrollTop: scrollMetrics.scrollTop,
177
- scrollLeft: scrollMetrics.scrollLeft
178
- });
179
- }
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
- }
190
- scrollTo(pos) {
191
- const { x, y, center, behavior = "auto" } = pos;
192
- if (center) {
193
- const metrics = this.state.viewportMetrics;
194
- const centeredX = x - metrics.clientWidth / 2;
195
- const centeredY = y - metrics.clientHeight / 2;
196
- this.scrollReq$.emit({
197
- x: centeredX,
198
- y: centeredY,
199
- behavior
200
- });
201
- } else {
202
- this.scrollReq$.emit({
203
- x,
204
- y,
205
- behavior
206
- });
207
- }
208
- }
209
- // Subscribe to store changes to notify onViewportChange
210
- onStoreUpdated(prevState, newState) {
211
- if (prevState !== newState) {
212
- this.viewportMetrics$.emit(newState.viewportMetrics);
213
- if (prevState.isScrolling !== newState.isScrolling) {
214
- this.scrollActivity$.emit(newState.isScrolling);
215
- }
216
- }
217
- }
218
- async initialize(_config) {
219
- }
220
- async destroy() {
221
- super.destroy();
222
- this.viewportMetrics$.clear();
223
- this.viewportResize$.clear();
224
- this.scrollMetrics$.clear();
225
- this.scrollReq$.clear();
226
- this.scrollActivity$.clear();
227
- this.rectProvider = null;
228
- if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);
229
- }
230
- };
231
- ViewportPlugin.id = "viewport";
232
-
233
- // src/lib/index.ts
234
- var ViewportPluginPackage = {
235
- manifest,
236
- create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),
237
- reducer: viewportReducer,
238
- initialState
239
- };
240
- // Annotate the CommonJS export names for ESM import in node:
241
- 0 && (module.exports = {
242
- VIEWPORT_PLUGIN_ID,
243
- ViewportPlugin,
244
- ViewportPluginPackage,
245
- manifest
246
- });
247
- //# sourceMappingURL=index.cjs.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@embedpdf/core"),e="viewport",i={id:e,name:"Viewport Plugin",version:"1.0.0",provides:["viewport"],requires:[],optional:[],defaultConfig:{enabled:!0,viewportGap:10,scrollEndDelay:300}},r="SET_VIEWPORT_METRICS",l="SET_VIEWPORT_SCROLL_METRICS",o="SET_VIEWPORT_GAP",s="SET_SCROLL_ACTIVITY";const c={viewportGap:0,viewportMetrics:{width:0,height:0,scrollTop:0,scrollLeft:0,clientWidth:0,clientHeight:0,scrollWidth:0,scrollHeight:0,relativePosition:{x:0,y:0}},isScrolling:!1},a=class extends t.BasePlugin{constructor(e,i,r){var l;super(e,i),this.id=e,this.viewportResize$=t.createBehaviorEmitter(),this.viewportMetrics$=t.createBehaviorEmitter(),this.scrollMetrics$=t.createBehaviorEmitter(),this.scrollReq$=t.createEmitter(),this.scrollActivity$=t.createBehaviorEmitter(),this.rectProvider=null,r.viewportGap&&this.dispatch((l=r.viewportGap,{type:o,payload:l})),this.scrollEndDelay=r.scrollEndDelay||300}buildCapability(){return{getViewportGap:()=>this.state.viewportGap,getMetrics:()=>this.state.viewportMetrics,getBoundingRect:()=>{var t;return(null==(t=this.rectProvider)?void 0:t.call(this))??{origin:{x:0,y:0},size:{width:0,height:0}}},scrollTo:t=>this.scrollTo(t),isScrolling:()=>this.state.isScrolling,onScrollChange:this.scrollMetrics$.on,onViewportChange:this.viewportMetrics$.on,onViewportResize:this.viewportResize$.on,onScrollActivity:this.scrollActivity$.on}}setViewportResizeMetrics(t){this.dispatch(function(t){return{type:r,payload:t}}(t)),this.viewportResize$.emit(this.state.viewportMetrics)}setViewportScrollMetrics(t){t.scrollTop===this.state.viewportMetrics.scrollTop&&t.scrollLeft===this.state.viewportMetrics.scrollLeft||(this.dispatch(function(t){return{type:l,payload:t}}(t)),this.bumpScrollActivity(),this.scrollMetrics$.emit({scrollTop:t.scrollTop,scrollLeft:t.scrollLeft}))}onScrollRequest(t){return this.scrollReq$.on(t)}registerBoundingRectProvider(t){this.rectProvider=t}bumpScrollActivity(){this.debouncedDispatch({type:s,payload:!1},this.scrollEndDelay)}scrollTo(t){const{x:e,y:i,center:r,behavior:l="auto"}=t;if(r){const t=this.state.viewportMetrics,r=e-t.clientWidth/2,o=i-t.clientHeight/2;this.scrollReq$.emit({x:r,y:o,behavior:l})}else this.scrollReq$.emit({x:e,y:i,behavior:l})}onStoreUpdated(t,e){t!==e&&(this.viewportMetrics$.emit(e.viewportMetrics),t.isScrolling!==e.isScrolling&&this.scrollActivity$.emit(e.isScrolling))}async initialize(t){}async destroy(){super.destroy(),this.viewportMetrics$.clear(),this.viewportResize$.clear(),this.scrollMetrics$.clear(),this.scrollReq$.clear(),this.scrollActivity$.clear(),this.rectProvider=null,this.scrollEndTimer&&clearTimeout(this.scrollEndTimer)}};a.id="viewport";let p=a;const h={manifest:i,create:(t,i,r)=>new p(e,t,r),reducer:(t=c,e)=>{switch(e.type){case o:return{...t,viewportGap:e.payload};case r:return{...t,viewportMetrics:{width:e.payload.width,height:e.payload.height,scrollTop:e.payload.scrollTop,scrollLeft:e.payload.scrollLeft,clientWidth:e.payload.clientWidth,clientHeight:e.payload.clientHeight,scrollWidth:e.payload.scrollWidth,scrollHeight:e.payload.scrollHeight,relativePosition:{x:e.payload.scrollWidth<=e.payload.clientWidth?0:e.payload.scrollLeft/(e.payload.scrollWidth-e.payload.clientWidth),y:e.payload.scrollHeight<=e.payload.clientHeight?0:e.payload.scrollTop/(e.payload.scrollHeight-e.payload.clientHeight)}}};case l:return{...t,viewportMetrics:{...t.viewportMetrics,scrollTop:e.payload.scrollTop,scrollLeft:e.payload.scrollLeft},isScrolling:!0};case s:return{...t,isScrolling:e.payload};default:return t}},initialState:c};exports.VIEWPORT_PLUGIN_ID=e,exports.ViewportPlugin=p,exports.ViewportPluginPackage=h,exports.manifest=i;
2
+ //# sourceMappingURL=index.cjs.map
@@ -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 {\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,qBAAqB;AAE3B,IAAM,WAAiD;AAAA,EAC5D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,UAAU;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACF;;;ACdO,IAAM,uBAAuB;AAC7B,IAAM,8BAA8B;AACpC,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AA4B5B,SAAS,eAAe,aAA2C;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,mBACd,iBAC0B;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,yBACd,eACgC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,kBAAkB,aAA+C;AAC/E,SAAO,EAAE,MAAM,qBAAqB,SAAS,YAAY;AAC3D;;;ACnDO,IAAM,eAA8B;AAAA,EACzC,aAAa;AAAA,EACb,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EACA,aAAa;AACf;AAEO,IAAM,kBAA0D,CACrE,QAAQ,cACR,WACG;AACH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,OAAO,OAAO,QAAQ;AAAA,UACtB,QAAQ,OAAO,QAAQ;AAAA,UACvB,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,UAC3B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,kBAAkB;AAAA,YAChB,GACE,OAAO,QAAQ,eAAe,OAAO,QAAQ,cACzC,IACA,OAAO,QAAQ,cACd,OAAO,QAAQ,cAAc,OAAO,QAAQ;AAAA,YACnD,GACE,OAAO,QAAQ,gBAAgB,OAAO,QAAQ,eAC1C,IACA,OAAO,QAAQ,aACd,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,GAAG,MAAM;AAAA,UACT,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,QAC7B;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD;AACE,aAAO;AAAA,EACX;AACF;;;AC9EA,kBAOO;AAoBA,IAAM,iBAAN,cAA6B,uBAKlC;AAAA,EAqBA,YACkB,IAChB,UACA,QACA;AACA,UAAM,IAAI,QAAQ;AAJF;AAnBlB,SAAiB,sBAAkB,mCAAuC;AAC1E,SAAiB,uBAAmB,mCAAuC;AAC3E,SAAiB,qBAAiB,mCAA6C;AAC/E,SAAiB,iBAAa,2BAI3B;AACH,SAAiB,sBAAkB,mCAA+B;AAKlE;AAAA;AAAA;AAAA,SAAQ,eAAoC;AAY1C,QAAI,OAAO,aAAa;AACtB,WAAK,SAAS,eAAe,OAAO,WAAW,CAAC;AAAA,IAClD;AAEA,SAAK,iBAAiB,OAAO,kBAAkB;AAAA,EACjD;AAAA,EAEU,kBAAsC;AAC9C,WAAO;AAAA,MACL,gBAAgB,MAAM,KAAK,MAAM;AAAA,MACjC,YAAY,MAAM,KAAK,MAAM;AAAA,MAC7B,iBAAiB,MACf,KAAK,eAAe,KAAK;AAAA,QACvB,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QACrB,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC9B;AAAA,MACF,UAAU,CAAC,QAAyB,KAAK,SAAS,GAAG;AAAA,MACrD,aAAa,MAAM,KAAK,MAAM;AAAA,MAC9B,gBAAgB,KAAK,eAAe;AAAA,MACpC,kBAAkB,KAAK,iBAAiB;AAAA,MACxC,kBAAkB,KAAK,gBAAgB;AAAA,MACvC,kBAAkB,KAAK,gBAAgB;AAAA,IACzC;AAAA,EACF;AAAA,EAEO,yBAAyB,iBAAuC;AACrE,SAAK,SAAS,mBAAmB,eAAe,CAAC;AACjD,SAAK,gBAAgB,KAAK,KAAK,MAAM,eAAe;AAAA,EACtD;AAAA,EAEO,yBAAyB,eAAsC;AACpE,QACE,cAAc,cAAc,KAAK,MAAM,gBAAgB,aACvD,cAAc,eAAe,KAAK,MAAM,gBAAgB,YACxD;AACA,WAAK,SAAS,yBAAyB,aAAa,CAAC;AACrD,WAAK,mBAAmB;AACxB,WAAK,eAAe,KAAK;AAAA,QACvB,WAAW,cAAc;AAAA,QACzB,YAAY,cAAc;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEO,gBAAgB,UAAqC;AAC1D,WAAO,KAAK,WAAW,GAAG,QAAQ;AAAA,EACpC;AAAA,EAEO,6BAA6B,UAA+B;AACjE,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,kBAAkB,kBAAkB,KAAK,GAAG,KAAK,cAAc;AAAA,EACtE;AAAA,EAEQ,SAAS,KAAsB;AACrC,UAAM,EAAE,GAAG,GAAG,QAAQ,WAAW,OAAO,IAAI;AAE5C,QAAI,QAAQ;AACV,YAAM,UAAU,KAAK,MAAM;AAE3B,YAAM,YAAY,IAAI,QAAQ,cAAc;AAC5C,YAAM,YAAY,IAAI,QAAQ,eAAe;AAE7C,WAAK,WAAW,KAAK;AAAA,QACnB,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,WAAK,WAAW,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGS,eAAe,WAA0B,UAA+B;AAC/E,QAAI,cAAc,UAAU;AAC1B,WAAK,iBAAiB,KAAK,SAAS,eAAe;AACnD,UAAI,UAAU,gBAAgB,SAAS,aAAa;AAClD,aAAK,gBAAgB,KAAK,SAAS,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAA+B;AAAA,EAEhD;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,QAAQ;AAEd,SAAK,iBAAiB,MAAM;AAC5B,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe;AACpB,QAAI,KAAK,eAAgB,cAAa,KAAK,cAAc;AAAA,EAC3D;AACF;AAzIa,eAMK,KAAK;;;ACzBhB,IAAM,wBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,SAAS,WAAW,IAAI,eAAe,oBAAoB,UAAU,MAAM;AAAA,EAC9F,SAAS;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"file":"index.cjs","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"],"names":["VIEWPORT_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","enabled","viewportGap","scrollEndDelay","SET_VIEWPORT_METRICS","SET_VIEWPORT_SCROLL_METRICS","SET_VIEWPORT_GAP","SET_SCROLL_ACTIVITY","initialState","viewportMetrics","width","height","scrollTop","scrollLeft","clientWidth","clientHeight","scrollWidth","scrollHeight","relativePosition","x","y","isScrolling","_ViewportPlugin","BasePlugin","constructor","registry","config","super","this","viewportResize$","createBehaviorEmitter","viewportMetrics$","scrollMetrics$","scrollReq$","createEmitter","scrollActivity$","rectProvider","dispatch","type","payload","buildCapability","getViewportGap","state","getMetrics","getBoundingRect","_a","call","origin","size","scrollTo","pos","onScrollChange","on","onViewportChange","onViewportResize","onScrollActivity","setViewportResizeMetrics","setViewportMetrics","emit","setViewportScrollMetrics","scrollMetrics","bumpScrollActivity","onScrollRequest","listener","registerBoundingRectProvider","provider","debouncedDispatch","center","behavior","metrics","centeredX","centeredY","onStoreUpdated","prevState","newState","initialize","_config","destroy","clear","scrollEndTimer","clearTimeout","ViewportPlugin","ViewportPluginPackage","create","_engine","reducer","action"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,107 +1 @@
1
- import * as _embedpdf_core from '@embedpdf/core';
2
- import { BasePluginConfig, EventHook, Action, BasePlugin, PluginRegistry, Listener, PluginManifest, PluginPackage } from '@embedpdf/core';
3
- import { Rect } from '@embedpdf/models';
4
-
5
- interface ViewportState {
6
- viewportGap: number;
7
- viewportMetrics: ViewportMetrics;
8
- isScrolling: boolean;
9
- }
10
- interface ViewportPluginConfig extends BasePluginConfig {
11
- viewportGap?: number;
12
- scrollEndDelay?: number;
13
- }
14
- interface ViewportInputMetrics {
15
- width: number;
16
- height: number;
17
- scrollTop: number;
18
- scrollLeft: number;
19
- clientWidth: number;
20
- clientHeight: number;
21
- scrollWidth: number;
22
- scrollHeight: number;
23
- }
24
- interface ViewportMetrics extends ViewportInputMetrics {
25
- relativePosition: {
26
- x: number;
27
- y: number;
28
- };
29
- }
30
- interface ViewportScrollMetrics {
31
- scrollTop: number;
32
- scrollLeft: number;
33
- }
34
- interface ScrollControlOptions {
35
- mode: 'debounce' | 'throttle';
36
- wait: number;
37
- }
38
- interface ScrollToPayload {
39
- x: number;
40
- y: number;
41
- behavior?: ScrollBehavior;
42
- center?: boolean;
43
- }
44
- interface ViewportCapability {
45
- getViewportGap: () => number;
46
- getMetrics: () => ViewportMetrics;
47
- scrollTo(position: ScrollToPayload): void;
48
- onViewportChange: EventHook<ViewportMetrics>;
49
- onViewportResize: EventHook<ViewportMetrics>;
50
- onScrollChange: EventHook<ViewportScrollMetrics>;
51
- onScrollActivity: EventHook<boolean>;
52
- isScrolling: () => boolean;
53
- getBoundingRect(): Rect;
54
- }
55
-
56
- declare const SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
57
- declare const SET_VIEWPORT_SCROLL_METRICS = "SET_VIEWPORT_SCROLL_METRICS";
58
- declare const SET_VIEWPORT_GAP = "SET_VIEWPORT_GAP";
59
- declare const SET_SCROLL_ACTIVITY = "SET_SCROLL_ACTIVITY";
60
- interface SetViewportMetricsAction extends Action {
61
- type: typeof SET_VIEWPORT_METRICS;
62
- payload: ViewportInputMetrics;
63
- }
64
- interface SetViewportScrollMetricsAction extends Action {
65
- type: typeof SET_VIEWPORT_SCROLL_METRICS;
66
- payload: ViewportScrollMetrics;
67
- }
68
- interface SetViewportGapAction extends Action {
69
- type: typeof SET_VIEWPORT_GAP;
70
- payload: number;
71
- }
72
- interface SetScrollActivityAction extends Action {
73
- type: typeof SET_SCROLL_ACTIVITY;
74
- payload: boolean;
75
- }
76
- type ViewportAction = SetViewportMetricsAction | SetViewportScrollMetricsAction | SetViewportGapAction | SetScrollActivityAction;
77
-
78
- declare class ViewportPlugin extends BasePlugin<ViewportPluginConfig, ViewportCapability, ViewportState, ViewportAction> {
79
- readonly id: string;
80
- static readonly id: "viewport";
81
- private readonly viewportResize$;
82
- private readonly viewportMetrics$;
83
- private readonly scrollMetrics$;
84
- private readonly scrollReq$;
85
- private readonly scrollActivity$;
86
- private rectProvider;
87
- private scrollEndTimer?;
88
- private readonly scrollEndDelay;
89
- constructor(id: string, registry: PluginRegistry, config: ViewportPluginConfig);
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;
95
- private bumpScrollActivity;
96
- private scrollTo;
97
- onStoreUpdated(prevState: ViewportState, newState: ViewportState): void;
98
- initialize(_config: ViewportPluginConfig): Promise<void>;
99
- destroy(): Promise<void>;
100
- }
101
-
102
- declare const VIEWPORT_PLUGIN_ID = "viewport";
103
- declare const manifest: PluginManifest<ViewportPluginConfig>;
104
-
105
- declare const ViewportPluginPackage: PluginPackage<ViewportPlugin, ViewportPluginConfig, ViewportState, ViewportAction>;
106
-
107
- export { type ScrollControlOptions, type ScrollToPayload, VIEWPORT_PLUGIN_ID, type ViewportCapability, type ViewportInputMetrics, type ViewportMetrics, ViewportPlugin, type ViewportPluginConfig, ViewportPluginPackage, type ViewportScrollMetrics, type ViewportState, manifest };
1
+ export * from './lib';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- // src/lib/manifest.ts
2
- var VIEWPORT_PLUGIN_ID = "viewport";
3
- var manifest = {
1
+ import { BasePlugin, createBehaviorEmitter, createEmitter } from "@embedpdf/core";
2
+ const VIEWPORT_PLUGIN_ID = "viewport";
3
+ const manifest = {
4
4
  id: VIEWPORT_PLUGIN_ID,
5
5
  name: "Viewport Plugin",
6
6
  version: "1.0.0",
@@ -13,12 +13,10 @@ var manifest = {
13
13
  scrollEndDelay: 300
14
14
  }
15
15
  };
16
-
17
- // src/lib/actions.ts
18
- var SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
19
- var SET_VIEWPORT_SCROLL_METRICS = "SET_VIEWPORT_SCROLL_METRICS";
20
- var SET_VIEWPORT_GAP = "SET_VIEWPORT_GAP";
21
- var SET_SCROLL_ACTIVITY = "SET_SCROLL_ACTIVITY";
16
+ const SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
17
+ const SET_VIEWPORT_SCROLL_METRICS = "SET_VIEWPORT_SCROLL_METRICS";
18
+ const SET_VIEWPORT_GAP = "SET_VIEWPORT_GAP";
19
+ const SET_SCROLL_ACTIVITY = "SET_SCROLL_ACTIVITY";
22
20
  function setViewportGap(viewportGap) {
23
21
  return {
24
22
  type: SET_VIEWPORT_GAP,
@@ -40,9 +38,7 @@ function setViewportScrollMetrics(scrollMetrics) {
40
38
  function setScrollActivity(isScrolling) {
41
39
  return { type: SET_SCROLL_ACTIVITY, payload: isScrolling };
42
40
  }
43
-
44
- // src/lib/reducer.ts
45
- var initialState = {
41
+ const initialState = {
46
42
  viewportGap: 0,
47
43
  viewportMetrics: {
48
44
  width: 0,
@@ -60,7 +56,7 @@ var initialState = {
60
56
  },
61
57
  isScrolling: false
62
58
  };
63
- var viewportReducer = (state = initialState, action) => {
59
+ const viewportReducer = (state = initialState, action) => {
64
60
  switch (action.type) {
65
61
  case SET_VIEWPORT_GAP:
66
62
  return { ...state, viewportGap: action.payload };
@@ -98,14 +94,7 @@ var viewportReducer = (state = initialState, action) => {
98
94
  return state;
99
95
  }
100
96
  };
101
-
102
- // src/lib/viewport-plugin.ts
103
- import {
104
- BasePlugin,
105
- createEmitter,
106
- createBehaviorEmitter
107
- } from "@embedpdf/core";
108
- var ViewportPlugin = class extends BasePlugin {
97
+ const _ViewportPlugin = class _ViewportPlugin extends BasePlugin {
109
98
  constructor(id, registry, config) {
110
99
  super(id, registry);
111
100
  this.id = id;
@@ -114,9 +103,6 @@ var ViewportPlugin = class extends BasePlugin {
114
103
  this.scrollMetrics$ = createBehaviorEmitter();
115
104
  this.scrollReq$ = createEmitter();
116
105
  this.scrollActivity$ = createBehaviorEmitter();
117
- /* ------------------------------------------------------------------ */
118
- /* “live rect” infrastructure */
119
- /* ------------------------------------------------------------------ */
120
106
  this.rectProvider = null;
121
107
  if (config.viewportGap) {
122
108
  this.dispatch(setViewportGap(config.viewportGap));
@@ -127,9 +113,12 @@ var ViewportPlugin = class extends BasePlugin {
127
113
  return {
128
114
  getViewportGap: () => this.state.viewportGap,
129
115
  getMetrics: () => this.state.viewportMetrics,
130
- getBoundingRect: () => this.rectProvider?.() ?? {
131
- origin: { x: 0, y: 0 },
132
- size: { width: 0, height: 0 }
116
+ getBoundingRect: () => {
117
+ var _a;
118
+ return ((_a = this.rectProvider) == null ? void 0 : _a.call(this)) ?? {
119
+ origin: { x: 0, y: 0 },
120
+ size: { width: 0, height: 0 }
121
+ };
133
122
  },
134
123
  scrollTo: (pos) => this.scrollTo(pos),
135
124
  isScrolling: () => this.state.isScrolling,
@@ -203,10 +192,9 @@ var ViewportPlugin = class extends BasePlugin {
203
192
  if (this.scrollEndTimer) clearTimeout(this.scrollEndTimer);
204
193
  }
205
194
  };
206
- ViewportPlugin.id = "viewport";
207
-
208
- // src/lib/index.ts
209
- var ViewportPluginPackage = {
195
+ _ViewportPlugin.id = "viewport";
196
+ let ViewportPlugin = _ViewportPlugin;
197
+ const ViewportPluginPackage = {
210
198
  manifest,
211
199
  create: (registry, _engine, config) => new ViewportPlugin(VIEWPORT_PLUGIN_ID, registry, config),
212
200
  reducer: viewportReducer,
@@ -218,4 +206,4 @@ export {
218
206
  ViewportPluginPackage,
219
207
  manifest
220
208
  };
221
- //# sourceMappingURL=index.js.map
209
+ //# sourceMappingURL=index.js.map
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 {\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":";AAIO,IAAM,qBAAqB;AAE3B,IAAM,WAAiD;AAAA,EAC5D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,UAAU;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AACF;;;ACdO,IAAM,uBAAuB;AAC7B,IAAM,8BAA8B;AACpC,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AA4B5B,SAAS,eAAe,aAA2C;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,mBACd,iBAC0B;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,yBACd,eACgC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,kBAAkB,aAA+C;AAC/E,SAAO,EAAE,MAAM,qBAAqB,SAAS,YAAY;AAC3D;;;ACnDO,IAAM,eAA8B;AAAA,EACzC,aAAa;AAAA,EACb,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EACA,aAAa;AACf;AAEO,IAAM,kBAA0D,CACrE,QAAQ,cACR,WACG;AACH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,OAAO,OAAO,QAAQ;AAAA,UACtB,QAAQ,OAAO,QAAQ;AAAA,UACvB,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,UAC3B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,kBAAkB;AAAA,YAChB,GACE,OAAO,QAAQ,eAAe,OAAO,QAAQ,cACzC,IACA,OAAO,QAAQ,cACd,OAAO,QAAQ,cAAc,OAAO,QAAQ;AAAA,YACnD,GACE,OAAO,QAAQ,gBAAgB,OAAO,QAAQ,eAC1C,IACA,OAAO,QAAQ,aACd,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,GAAG,MAAM;AAAA,UACT,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,QAC7B;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD;AACE,aAAO;AAAA,EACX;AACF;;;AC9EA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OAGK;AAoBA,IAAM,iBAAN,cAA6B,WAKlC;AAAA,EAqBA,YACkB,IAChB,UACA,QACA;AACA,UAAM,IAAI,QAAQ;AAJF;AAnBlB,SAAiB,kBAAkB,sBAAuC;AAC1E,SAAiB,mBAAmB,sBAAuC;AAC3E,SAAiB,iBAAiB,sBAA6C;AAC/E,SAAiB,aAAa,cAI3B;AACH,SAAiB,kBAAkB,sBAA+B;AAKlE;AAAA;AAAA;AAAA,SAAQ,eAAoC;AAY1C,QAAI,OAAO,aAAa;AACtB,WAAK,SAAS,eAAe,OAAO,WAAW,CAAC;AAAA,IAClD;AAEA,SAAK,iBAAiB,OAAO,kBAAkB;AAAA,EACjD;AAAA,EAEU,kBAAsC;AAC9C,WAAO;AAAA,MACL,gBAAgB,MAAM,KAAK,MAAM;AAAA,MACjC,YAAY,MAAM,KAAK,MAAM;AAAA,MAC7B,iBAAiB,MACf,KAAK,eAAe,KAAK;AAAA,QACvB,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QACrB,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC9B;AAAA,MACF,UAAU,CAAC,QAAyB,KAAK,SAAS,GAAG;AAAA,MACrD,aAAa,MAAM,KAAK,MAAM;AAAA,MAC9B,gBAAgB,KAAK,eAAe;AAAA,MACpC,kBAAkB,KAAK,iBAAiB;AAAA,MACxC,kBAAkB,KAAK,gBAAgB;AAAA,MACvC,kBAAkB,KAAK,gBAAgB;AAAA,IACzC;AAAA,EACF;AAAA,EAEO,yBAAyB,iBAAuC;AACrE,SAAK,SAAS,mBAAmB,eAAe,CAAC;AACjD,SAAK,gBAAgB,KAAK,KAAK,MAAM,eAAe;AAAA,EACtD;AAAA,EAEO,yBAAyB,eAAsC;AACpE,QACE,cAAc,cAAc,KAAK,MAAM,gBAAgB,aACvD,cAAc,eAAe,KAAK,MAAM,gBAAgB,YACxD;AACA,WAAK,SAAS,yBAAyB,aAAa,CAAC;AACrD,WAAK,mBAAmB;AACxB,WAAK,eAAe,KAAK;AAAA,QACvB,WAAW,cAAc;AAAA,QACzB,YAAY,cAAc;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEO,gBAAgB,UAAqC;AAC1D,WAAO,KAAK,WAAW,GAAG,QAAQ;AAAA,EACpC;AAAA,EAEO,6BAA6B,UAA+B;AACjE,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,kBAAkB,kBAAkB,KAAK,GAAG,KAAK,cAAc;AAAA,EACtE;AAAA,EAEQ,SAAS,KAAsB;AACrC,UAAM,EAAE,GAAG,GAAG,QAAQ,WAAW,OAAO,IAAI;AAE5C,QAAI,QAAQ;AACV,YAAM,UAAU,KAAK,MAAM;AAE3B,YAAM,YAAY,IAAI,QAAQ,cAAc;AAC5C,YAAM,YAAY,IAAI,QAAQ,eAAe;AAE7C,WAAK,WAAW,KAAK;AAAA,QACnB,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,WAAK,WAAW,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGS,eAAe,WAA0B,UAA+B;AAC/E,QAAI,cAAc,UAAU;AAC1B,WAAK,iBAAiB,KAAK,SAAS,eAAe;AACnD,UAAI,UAAU,gBAAgB,SAAS,aAAa;AAClD,aAAK,gBAAgB,KAAK,SAAS,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAA+B;AAAA,EAEhD;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,QAAQ;AAEd,SAAK,iBAAiB,MAAM;AAC5B,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe;AACpB,QAAI,KAAK,eAAgB,cAAa,KAAK,cAAc;AAAA,EAC3D;AACF;AAzIa,eAMK,KAAK;;;ACzBhB,IAAM,wBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,SAAS,WAAW,IAAI,eAAe,oBAAoB,UAAU,MAAM;AAAA,EAC9F,SAAS;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"file":"index.js","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"],"names":[],"mappings":";AAIO,MAAM,qBAAqB;AAE3B,MAAM,WAAiD;AAAA,EAC5D,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,UAAU;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,eAAe;AAAA,IACb,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,EAAA;AAEpB;ACdO,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AACpC,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AA4B5B,SAAS,eAAe,aAA2C;AACjE,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,mBACd,iBAC0B;AACnB,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,yBACd,eACgC;AACzB,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEO,SAAS,kBAAkB,aAA+C;AAC/E,SAAO,EAAE,MAAM,qBAAqB,SAAS,YAAY;AAC3D;ACnDO,MAAM,eAA8B;AAAA,EACzC,aAAa;AAAA,EACb,iBAAiB;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAAA,EAEP;AAAA,EACA,aAAa;AACf;AAEO,MAAM,kBAA0D,CACrE,QAAQ,cACR,WACG;AACH,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,OAAO,OAAO,QAAQ;AAAA,UACtB,QAAQ,OAAO,QAAQ;AAAA,UACvB,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,UAC3B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,aAAa,OAAO,QAAQ;AAAA,UAC5B,cAAc,OAAO,QAAQ;AAAA,UAC7B,kBAAkB;AAAA,YAChB,GACE,OAAO,QAAQ,eAAe,OAAO,QAAQ,cACzC,IACA,OAAO,QAAQ,cACd,OAAO,QAAQ,cAAc,OAAO,QAAQ;AAAA,YACnD,GACE,OAAO,QAAQ,gBAAgB,OAAO,QAAQ,eAC1C,IACA,OAAO,QAAQ,aACd,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,UAAA;AAAA,QACtD;AAAA,MAEJ;AAAA,IACF,KAAK;AACI,aAAA;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB;AAAA,UACf,GAAG,MAAM;AAAA,UACT,WAAW,OAAO,QAAQ;AAAA,UAC1B,YAAY,OAAO,QAAQ;AAAA,QAC7B;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,OAAO,QAAQ;AAAA,IACjD;AACS,aAAA;AAAA,EAAA;AAEb;ACnDO,MAAM,kBAAN,MAAM,wBAAuB,WAKlC;AAAA,EAqBA,YACkB,IAChB,UACA,QACA;AACA,UAAM,IAAI,QAAQ;AAJF,SAAA,KAAA;AAnBlB,SAAiB,kBAAkB,sBAAuC;AAC1E,SAAiB,mBAAmB,sBAAuC;AAC3E,SAAiB,iBAAiB,sBAA6C;AAC/E,SAAiB,aAAa,cAI3B;AACH,SAAiB,kBAAkB,sBAA+B;AAKlE,SAAQ,eAAoC;AAY1C,QAAI,OAAO,aAAa;AACtB,WAAK,SAAS,eAAe,OAAO,WAAW,CAAC;AAAA,IAAA;AAG7C,SAAA,iBAAiB,OAAO,kBAAkB;AAAA,EAAA;AAAA,EAGvC,kBAAsC;AACvC,WAAA;AAAA,MACL,gBAAgB,MAAM,KAAK,MAAM;AAAA,MACjC,YAAY,MAAM,KAAK,MAAM;AAAA,MAC7B,iBAAiB,MAAA;;AACf,2BAAK,iBAAL,kCAAyB;AAAA,UACvB,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,UACrB,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,QAC9B;AAAA;AAAA,MACF,UAAU,CAAC,QAAyB,KAAK,SAAS,GAAG;AAAA,MACrD,aAAa,MAAM,KAAK,MAAM;AAAA,MAC9B,gBAAgB,KAAK,eAAe;AAAA,MACpC,kBAAkB,KAAK,iBAAiB;AAAA,MACxC,kBAAkB,KAAK,gBAAgB;AAAA,MACvC,kBAAkB,KAAK,gBAAgB;AAAA,IACzC;AAAA,EAAA;AAAA,EAGK,yBAAyB,iBAAuC;AAChE,SAAA,SAAS,mBAAmB,eAAe,CAAC;AACjD,SAAK,gBAAgB,KAAK,KAAK,MAAM,eAAe;AAAA,EAAA;AAAA,EAG/C,yBAAyB,eAAsC;AAElE,QAAA,cAAc,cAAc,KAAK,MAAM,gBAAgB,aACvD,cAAc,eAAe,KAAK,MAAM,gBAAgB,YACxD;AACK,WAAA,SAAS,yBAAyB,aAAa,CAAC;AACrD,WAAK,mBAAmB;AACxB,WAAK,eAAe,KAAK;AAAA,QACvB,WAAW,cAAc;AAAA,QACzB,YAAY,cAAc;AAAA,MAAA,CAC3B;AAAA,IAAA;AAAA,EACH;AAAA,EAGK,gBAAgB,UAAqC;AACnD,WAAA,KAAK,WAAW,GAAG,QAAQ;AAAA,EAAA;AAAA,EAG7B,6BAA6B,UAA+B;AACjE,SAAK,eAAe;AAAA,EAAA;AAAA,EAGd,qBAAqB;AAC3B,SAAK,kBAAkB,kBAAkB,KAAK,GAAG,KAAK,cAAc;AAAA,EAAA;AAAA,EAG9D,SAAS,KAAsB;AACrC,UAAM,EAAE,GAAG,GAAG,QAAQ,WAAW,WAAW;AAE5C,QAAI,QAAQ;AACJ,YAAA,UAAU,KAAK,MAAM;AAErB,YAAA,YAAY,IAAI,QAAQ,cAAc;AACtC,YAAA,YAAY,IAAI,QAAQ,eAAe;AAE7C,WAAK,WAAW,KAAK;AAAA,QACnB,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MAAA,CACD;AAAA,IAAA,OACI;AACL,WAAK,WAAW,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA;AAAA,EACH;AAAA;AAAA,EAIO,eAAe,WAA0B,UAA+B;AAC/E,QAAI,cAAc,UAAU;AACrB,WAAA,iBAAiB,KAAK,SAAS,eAAe;AAC/C,UAAA,UAAU,gBAAgB,SAAS,aAAa;AAC7C,aAAA,gBAAgB,KAAK,SAAS,WAAW;AAAA,MAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAGF,MAAM,WAAW,SAA+B;AAAA,EAAA;AAAA,EAIhD,MAAM,UAAyB;AAC7B,UAAM,QAAQ;AAEd,SAAK,iBAAiB,MAAM;AAC5B,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe,MAAM;AAC1B,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,MAAM;AAC3B,SAAK,eAAe;AACpB,QAAI,KAAK,eAA6B,cAAA,KAAK,cAAc;AAAA,EAAA;AAE7D;AAnIE,gBAAgB,KAAK;AANhB,IAAM,iBAAN;ACnBA,MAAM,wBAKT;AAAA,EACF;AAAA,EACA,QAAQ,CAAC,UAAU,SAAS,WAAW,IAAI,eAAe,oBAAoB,UAAU,MAAM;AAAA,EAC9F,SAAS;AAAA,EACT;AACF;"}
@@ -0,0 +1,27 @@
1
+ import { Action } from '@embedpdf/core';
2
+ import { ViewportInputMetrics, ViewportScrollMetrics } from './types';
3
+ export declare const SET_VIEWPORT_METRICS = "SET_VIEWPORT_METRICS";
4
+ export declare const SET_VIEWPORT_SCROLL_METRICS = "SET_VIEWPORT_SCROLL_METRICS";
5
+ export declare const SET_VIEWPORT_GAP = "SET_VIEWPORT_GAP";
6
+ export declare const SET_SCROLL_ACTIVITY = "SET_SCROLL_ACTIVITY";
7
+ export interface SetViewportMetricsAction extends Action {
8
+ type: typeof SET_VIEWPORT_METRICS;
9
+ payload: ViewportInputMetrics;
10
+ }
11
+ export interface SetViewportScrollMetricsAction extends Action {
12
+ type: typeof SET_VIEWPORT_SCROLL_METRICS;
13
+ payload: ViewportScrollMetrics;
14
+ }
15
+ export interface SetViewportGapAction extends Action {
16
+ type: typeof SET_VIEWPORT_GAP;
17
+ payload: number;
18
+ }
19
+ export interface SetScrollActivityAction extends Action {
20
+ type: typeof SET_SCROLL_ACTIVITY;
21
+ payload: boolean;
22
+ }
23
+ export type ViewportAction = SetViewportMetricsAction | SetViewportScrollMetricsAction | SetViewportGapAction | SetScrollActivityAction;
24
+ export declare function setViewportGap(viewportGap: number): SetViewportGapAction;
25
+ export declare function setViewportMetrics(viewportMetrics: ViewportInputMetrics): SetViewportMetricsAction;
26
+ export declare function setViewportScrollMetrics(scrollMetrics: ViewportScrollMetrics): SetViewportScrollMetricsAction;
27
+ export declare function setScrollActivity(isScrolling: boolean): SetScrollActivityAction;
@@ -0,0 +1,8 @@
1
+ import { PluginPackage } from '@embedpdf/core';
2
+ import { ViewportAction } from './actions';
3
+ import { ViewportPluginConfig, ViewportState } from './types';
4
+ import { ViewportPlugin } from './viewport-plugin';
5
+ export declare const ViewportPluginPackage: PluginPackage<ViewportPlugin, ViewportPluginConfig, ViewportState, ViewportAction>;
6
+ export * from './viewport-plugin';
7
+ export * from './types';
8
+ export * from './manifest';
@@ -0,0 +1,4 @@
1
+ import { PluginManifest } from '@embedpdf/core';
2
+ import { ViewportPluginConfig } from './types';
3
+ export declare const VIEWPORT_PLUGIN_ID = "viewport";
4
+ export declare const manifest: PluginManifest<ViewportPluginConfig>;