@embedpdf/plugin-interaction-manager 1.5.0 → 2.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +456 -185
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +61 -36
  6. package/dist/lib/interaction-manager-plugin.d.ts +19 -14
  7. package/dist/lib/reducer.d.ts +2 -1
  8. package/dist/lib/types.d.ts +58 -50
  9. package/dist/preact/index.cjs +1 -1
  10. package/dist/preact/index.cjs.map +1 -1
  11. package/dist/preact/index.js +61 -40
  12. package/dist/preact/index.js.map +1 -1
  13. package/dist/react/index.cjs +1 -1
  14. package/dist/react/index.cjs.map +1 -1
  15. package/dist/react/index.js +61 -40
  16. package/dist/react/index.js.map +1 -1
  17. package/dist/shared/components/global-pointer-provider.d.ts +2 -1
  18. package/dist/shared/components/page-pointer-provider.d.ts +4 -5
  19. package/dist/shared/hooks/use-interaction-manager.d.ts +9 -7
  20. package/dist/shared-preact/components/global-pointer-provider.d.ts +2 -1
  21. package/dist/shared-preact/components/page-pointer-provider.d.ts +4 -5
  22. package/dist/shared-preact/hooks/use-interaction-manager.d.ts +9 -7
  23. package/dist/shared-react/components/global-pointer-provider.d.ts +2 -1
  24. package/dist/shared-react/components/page-pointer-provider.d.ts +4 -5
  25. package/dist/shared-react/hooks/use-interaction-manager.d.ts +9 -7
  26. package/dist/svelte/components/GlobalPointerProvider.svelte.d.ts +1 -0
  27. package/dist/svelte/components/PagePointerProvider.svelte.d.ts +4 -5
  28. package/dist/svelte/hooks/use-interaction-manager.svelte.d.ts +10 -8
  29. package/dist/svelte/index.cjs +1 -1
  30. package/dist/svelte/index.cjs.map +1 -1
  31. package/dist/svelte/index.js +128 -56
  32. package/dist/svelte/index.js.map +1 -1
  33. package/dist/vue/components/global-pointer-provider.vue.d.ts +6 -2
  34. package/dist/vue/components/page-pointer-provider.vue.d.ts +7 -7
  35. package/dist/vue/hooks/use-interaction-manager.d.ts +19 -26
  36. package/dist/vue/index.cjs +1 -1
  37. package/dist/vue/index.cjs.map +1 -1
  38. package/dist/vue/index.js +131 -63
  39. package/dist/vue/index.js.map +1 -1
  40. package/package.json +4 -4
package/dist/vue/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { ref, watchEffect, readonly, defineComponent, createElementBlock, openBlock, renderSlot, computed, normalizeStyle, createCommentVNode, unref } from "vue";
2
- import { useCapability, usePlugin } from "@embedpdf/core/vue";
3
- import { InteractionManagerPlugin, initialState } from "@embedpdf/plugin-interaction-manager";
1
+ import { ref, watch, toValue, computed, defineComponent, watchEffect, createElementBlock, openBlock, renderSlot, mergeProps, createCommentVNode, unref } from "vue";
2
+ import { useCapability, usePlugin, useDocumentState } from "@embedpdf/core/vue";
3
+ import { InteractionManagerPlugin, initialDocumentState } from "@embedpdf/plugin-interaction-manager";
4
4
  export * from "@embedpdf/plugin-interaction-manager";
5
5
  import { transformSize, restorePosition } from "@embedpdf/models";
6
6
  const domEventMap = {
@@ -73,10 +73,11 @@ function shouldExcludeElement(element, rules) {
73
73
  return false;
74
74
  }
75
75
  function createPointerProvider(cap, scope, element, convertEventToPoint) {
76
+ const capScope = cap.forDocument(scope.documentId);
76
77
  let active = cap.getHandlersForScope(scope);
77
78
  const wantsRawTouchNow = () => {
78
79
  var _a;
79
- return ((_a = cap.getActiveInteractionMode()) == null ? void 0 : _a.wantsRawTouch) !== false;
80
+ return ((_a = capScope.getActiveInteractionMode()) == null ? void 0 : _a.wantsRawTouch) !== false;
80
81
  };
81
82
  const listeners = {};
82
83
  let attachedWithRawTouch = wantsRawTouchNow();
@@ -94,9 +95,9 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
94
95
  };
95
96
  addListeners(attachedWithRawTouch);
96
97
  element.style.touchAction = attachedWithRawTouch ? "none" : "";
97
- const stopMode = cap.onModeChange(() => {
98
+ const stopMode = capScope.onModeChange(() => {
98
99
  if (scope.type === "global") {
99
- const mode = cap.getActiveInteractionMode();
100
+ const mode = capScope.getActiveInteractionMode();
100
101
  element.style.cursor = (mode == null ? void 0 : mode.scope) === "global" ? mode.cursor ?? "auto" : "auto";
101
102
  }
102
103
  active = cap.getHandlersForScope(scope);
@@ -111,12 +112,12 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
111
112
  const stopHandler = cap.onHandlerChange(() => {
112
113
  active = cap.getHandlersForScope(scope);
113
114
  });
114
- const initialMode = cap.getActiveInteractionMode();
115
- const initialCursor = cap.getCurrentCursor();
115
+ const initialMode = capScope.getActiveInteractionMode();
116
+ const initialCursor = capScope.getCurrentCursor();
116
117
  element.style.cursor = scope.type === "global" && (initialMode == null ? void 0 : initialMode.scope) !== "global" ? "auto" : initialCursor;
117
- const stopCursor = cap.onCursorChange((c) => {
118
+ const stopCursor = capScope.onCursorChange((c) => {
118
119
  var _a;
119
- if (scope.type === "global" && ((_a = cap.getActiveInteractionMode()) == null ? void 0 : _a.scope) !== "global") return;
120
+ if (scope.type === "global" && ((_a = capScope.getActiveInteractionMode()) == null ? void 0 : _a.scope) !== "global") return;
120
121
  element.style.cursor = c;
121
122
  });
122
123
  const toPos = (e, host) => {
@@ -178,7 +179,7 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
178
179
  }
179
180
  };
180
181
  }
181
- (_a = active[handlerKey]) == null ? void 0 : _a.call(active, pos, normEvt, cap.getActiveMode());
182
+ (_a = active[handlerKey]) == null ? void 0 : _a.call(active, pos, normEvt, capScope.getActiveMode());
182
183
  }
183
184
  return () => {
184
185
  removeListeners();
@@ -189,78 +190,112 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
189
190
  }
190
191
  const useInteractionManagerPlugin = () => usePlugin(InteractionManagerPlugin.id);
191
192
  const useInteractionManagerCapability = () => useCapability(InteractionManagerPlugin.id);
192
- function useInteractionManager() {
193
+ function useInteractionManager(documentId) {
193
194
  const { provides } = useInteractionManagerCapability();
194
- const state = ref(initialState);
195
- watchEffect((onCleanup) => {
196
- if (provides.value) {
197
- const unsubscribe = provides.value.onStateChange((newState) => {
195
+ const state = ref(initialDocumentState);
196
+ watch(
197
+ [provides, () => toValue(documentId)],
198
+ ([providesValue, docId], _, onCleanup) => {
199
+ if (!providesValue) {
200
+ state.value = initialDocumentState;
201
+ return;
202
+ }
203
+ const scope = providesValue.forDocument(docId);
204
+ state.value = scope.getState();
205
+ const unsubscribe = scope.onStateChange((newState) => {
198
206
  state.value = newState;
199
207
  });
200
208
  onCleanup(unsubscribe);
201
- }
202
- });
209
+ },
210
+ { immediate: true }
211
+ );
203
212
  return {
204
- provides,
205
- state: readonly(state)
213
+ provides: computed(() => {
214
+ var _a;
215
+ const docId = toValue(documentId);
216
+ return ((_a = provides.value) == null ? void 0 : _a.forDocument(docId)) ?? null;
217
+ }),
218
+ state
206
219
  };
207
220
  }
208
- function useCursor() {
221
+ function useCursor(documentId) {
209
222
  const { provides } = useInteractionManagerCapability();
210
223
  return {
211
224
  setCursor: (token, cursor, prio = 0) => {
212
- var _a;
213
- (_a = provides.value) == null ? void 0 : _a.setCursor(token, cursor, prio);
225
+ const providesValue = provides.value;
226
+ if (!providesValue) return;
227
+ const docId = toValue(documentId);
228
+ const scope = providesValue.forDocument(docId);
229
+ scope.setCursor(token, cursor, prio);
214
230
  },
215
231
  removeCursor: (token) => {
216
- var _a;
217
- (_a = provides.value) == null ? void 0 : _a.removeCursor(token);
232
+ const providesValue = provides.value;
233
+ if (!providesValue) return;
234
+ const docId = toValue(documentId);
235
+ const scope = providesValue.forDocument(docId);
236
+ scope.removeCursor(token);
218
237
  }
219
238
  };
220
239
  }
221
- function usePointerHandlers({ modeId, pageIndex }) {
240
+ function usePointerHandlers({ modeId, pageIndex, documentId }) {
222
241
  const { provides } = useInteractionManagerCapability();
223
242
  return {
224
243
  register: (handlers, options) => {
225
244
  const finalModeId = (options == null ? void 0 : options.modeId) ?? modeId;
226
- const finalPageIndex = (options == null ? void 0 : options.pageIndex) ?? pageIndex;
227
- if (!provides.value) return;
228
- return finalModeId ? provides.value.registerHandlers({
245
+ const finalPageIndex = toValue((options == null ? void 0 : options.pageIndex) ?? pageIndex);
246
+ const finalDocumentId = toValue((options == null ? void 0 : options.documentId) ?? documentId);
247
+ const providesValue = provides.value;
248
+ return finalModeId ? providesValue == null ? void 0 : providesValue.registerHandlers({
229
249
  modeId: finalModeId,
230
250
  handlers,
231
- pageIndex: finalPageIndex
232
- }) : provides.value.registerAlways({
233
- scope: finalPageIndex !== void 0 ? { type: "page", pageIndex: finalPageIndex } : { type: "global" },
251
+ pageIndex: finalPageIndex,
252
+ documentId: finalDocumentId
253
+ }) : providesValue == null ? void 0 : providesValue.registerAlways({
254
+ scope: finalPageIndex !== void 0 ? { type: "page", documentId: finalDocumentId, pageIndex: finalPageIndex } : { type: "global", documentId: finalDocumentId },
234
255
  handlers
235
256
  });
236
257
  }
237
258
  };
238
259
  }
239
- function useIsPageExclusive() {
260
+ function useIsPageExclusive(documentId) {
240
261
  const { provides: cap } = useInteractionManagerCapability();
241
262
  const isPageExclusive = ref(false);
242
- watchEffect((onCleanup) => {
243
- if (cap.value) {
244
- const mode = cap.value.getActiveInteractionMode();
245
- isPageExclusive.value = (mode == null ? void 0 : mode.scope) === "page" && !!(mode == null ? void 0 : mode.exclusive);
246
- const unsubscribe = cap.value.onModeChange(() => {
247
- if (!cap.value) return;
248
- const newMode = cap.value.getActiveInteractionMode();
249
- isPageExclusive.value = (newMode == null ? void 0 : newMode.scope) === "page" && !!(newMode == null ? void 0 : newMode.exclusive);
263
+ watch(
264
+ [cap, () => toValue(documentId)],
265
+ ([capValue, docId], _, onCleanup) => {
266
+ if (!capValue) {
267
+ isPageExclusive.value = false;
268
+ return;
269
+ }
270
+ const scope = capValue.forDocument(docId);
271
+ const m = scope.getActiveInteractionMode();
272
+ isPageExclusive.value = (m == null ? void 0 : m.scope) === "page" && !!m.exclusive;
273
+ const unsubscribe = scope.onModeChange(() => {
274
+ const mode = scope.getActiveInteractionMode();
275
+ isPageExclusive.value = (mode == null ? void 0 : mode.scope) === "page" && !!(mode == null ? void 0 : mode.exclusive);
250
276
  });
251
277
  onCleanup(unsubscribe);
252
- }
253
- });
254
- return readonly(isPageExclusive);
278
+ },
279
+ { immediate: true }
280
+ );
281
+ return isPageExclusive;
255
282
  }
256
283
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
257
284
  __name: "global-pointer-provider",
285
+ props: {
286
+ documentId: {}
287
+ },
258
288
  setup(__props) {
289
+ const props = __props;
259
290
  const divRef = ref(null);
260
291
  const { provides: cap } = useInteractionManagerCapability();
261
292
  watchEffect((onCleanup) => {
262
293
  if (cap.value && divRef.value) {
263
- const cleanup = createPointerProvider(cap.value, { type: "global" }, divRef.value);
294
+ const cleanup = createPointerProvider(
295
+ cap.value,
296
+ { type: "global", documentId: props.documentId },
297
+ divRef.value
298
+ );
264
299
  onCleanup(cleanup);
265
300
  }
266
301
  });
@@ -285,9 +320,8 @@ const _hoisted_1 = {
285
320
  const _sfc_main = /* @__PURE__ */ defineComponent({
286
321
  __name: "page-pointer-provider",
287
322
  props: {
323
+ documentId: {},
288
324
  pageIndex: {},
289
- pageWidth: {},
290
- pageHeight: {},
291
325
  rotation: {},
292
326
  scale: {},
293
327
  convertEventToPoint: { type: Function }
@@ -296,7 +330,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
296
330
  const props = __props;
297
331
  const divRef = ref(null);
298
332
  const { provides: cap } = useInteractionManagerCapability();
299
- const isPageExclusive = useIsPageExclusive();
333
+ const isPageExclusive = useIsPageExclusive(() => props.documentId);
334
+ const documentState = useDocumentState(() => props.documentId);
335
+ const page = computed(() => {
336
+ var _a, _b, _c;
337
+ return (_c = (_b = (_a = documentState.value) == null ? void 0 : _a.document) == null ? void 0 : _b.pages) == null ? void 0 : _c[props.pageIndex];
338
+ });
339
+ const naturalPageSize = computed(() => {
340
+ var _a;
341
+ return ((_a = page.value) == null ? void 0 : _a.size) ?? { width: 0, height: 0 };
342
+ });
343
+ const rotation = computed(() => {
344
+ var _a;
345
+ return props.rotation ?? ((_a = documentState.value) == null ? void 0 : _a.rotation) ?? 0;
346
+ });
347
+ const scale = computed(() => {
348
+ var _a;
349
+ return props.scale ?? ((_a = documentState.value) == null ? void 0 : _a.scale) ?? 1;
350
+ });
351
+ const displaySize = computed(() => transformSize(naturalPageSize.value, 0, scale.value));
300
352
  const defaultConvertEventToPoint = computed(() => {
301
353
  return (event, element) => {
302
354
  const rect = element.getBoundingClientRect();
@@ -304,34 +356,50 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
304
356
  x: event.clientX - rect.left,
305
357
  y: event.clientY - rect.top
306
358
  };
307
- const displaySize = transformSize(
308
- { width: props.pageWidth, height: props.pageHeight },
309
- props.rotation,
359
+ const rotatedNaturalSize = transformSize(
360
+ {
361
+ width: displaySize.value.width,
362
+ height: displaySize.value.height
363
+ },
364
+ rotation.value,
310
365
  1
311
366
  );
312
- return restorePosition(displaySize, displayPoint, props.rotation, props.scale);
367
+ return restorePosition(rotatedNaturalSize, displayPoint, rotation.value, scale.value);
313
368
  };
314
369
  });
315
- watchEffect((onCleanup) => {
316
- if (cap.value && divRef.value) {
370
+ watch(
371
+ [
372
+ cap,
373
+ () => toValue(props.documentId),
374
+ () => props.pageIndex,
375
+ () => props.convertEventToPoint,
376
+ defaultConvertEventToPoint
377
+ ],
378
+ ([capValue, docId, pageIdx, customConvert, defaultConvert], _, onCleanup) => {
379
+ if (!capValue || !divRef.value) return;
317
380
  const cleanup = createPointerProvider(
318
- cap.value,
319
- { type: "page", pageIndex: props.pageIndex },
381
+ capValue,
382
+ { type: "page", documentId: docId, pageIndex: pageIdx },
320
383
  divRef.value,
321
- props.convertEventToPoint || defaultConvertEventToPoint.value
384
+ customConvert || defaultConvert
322
385
  );
323
386
  onCleanup(cleanup);
324
- }
325
- });
387
+ },
388
+ { immediate: true }
389
+ );
326
390
  return (_ctx, _cache) => {
327
- return openBlock(), createElementBlock("div", {
391
+ return openBlock(), createElementBlock("div", mergeProps({
328
392
  ref_key: "divRef",
329
393
  ref: divRef,
330
- style: normalizeStyle({ position: "relative", width: _ctx.pageWidth + "px", height: _ctx.pageHeight + "px" })
331
- }, [
394
+ style: {
395
+ position: "relative",
396
+ width: displaySize.value.width + "px",
397
+ height: displaySize.value.height + "px"
398
+ }
399
+ }, _ctx.$attrs), [
332
400
  renderSlot(_ctx.$slots, "default"),
333
401
  unref(isPageExclusive) ? (openBlock(), createElementBlock("div", _hoisted_1)) : createCommentVNode("", true)
334
- ], 4);
402
+ ], 16);
335
403
  };
336
404
  }
337
405
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/shared/utils.ts","../../src/vue/hooks/use-interaction-manager.ts","../../src/vue/components/global-pointer-provider.vue","../../src/vue/components/page-pointer-provider.vue"],"sourcesContent":["import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => cap.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = cap.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = cap.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = cap.getActiveInteractionMode();\n const initialCursor = cap.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = cap.onCursorChange((c) => {\n if (scope.type === 'global' && cap.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, cap.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","import { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n initialState,\n InteractionManagerPlugin,\n InteractionManagerState,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { ref, watchEffect, readonly } from 'vue';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager() {\n const { provides } = useInteractionManagerCapability();\n const state = ref<InteractionManagerState>(initialState);\n\n watchEffect((onCleanup) => {\n if (provides.value) {\n // onStateChange is a BehaviorEmitter, so it emits the current state upon subscription\n const unsubscribe = provides.value.onStateChange((newState) => {\n state.value = newState;\n });\n onCleanup(unsubscribe);\n }\n });\n\n return {\n provides,\n state: readonly(state),\n };\n}\n\nexport function useCursor() {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n provides.value?.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n provides.value?.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: number;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions) {\n const { provides } = useInteractionManagerCapability();\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: { modeId?: string | string[]; pageIndex?: number },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = options?.pageIndex ?? pageIndex;\n\n if (!provides.value) return;\n\n return finalModeId\n ? provides.value.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n })\n : provides.value.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', pageIndex: finalPageIndex }\n : { type: 'global' },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive() {\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = ref<boolean>(false);\n\n watchEffect((onCleanup) => {\n if (cap.value) {\n const mode = cap.value.getActiveInteractionMode();\n isPageExclusive.value = mode?.scope === 'page' && !!mode?.exclusive;\n\n const unsubscribe = cap.value.onModeChange(() => {\n if (!cap.value) return;\n const newMode = cap.value.getActiveInteractionMode();\n isPageExclusive.value = newMode?.scope === 'page' && !!newMode?.exclusive;\n });\n onCleanup(unsubscribe);\n }\n });\n\n return readonly(isPageExclusive);\n}\n","<script setup lang=\"ts\">\nimport { ref, watchEffect } from 'vue';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\n\n// watchEffect automatically handles setup and teardown when capability or element is ready\nwatchEffect((onCleanup) => {\n if (cap.value && divRef.value) {\n const cleanup = createPointerProvider(cap.value, { type: 'global' }, divRef.value);\n onCleanup(cleanup);\n }\n});\n</script>\n\n<template>\n <div\n ref=\"divRef\"\n :style=\"{\n width: '100%',\n height: '100%',\n }\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface Props {\n pageIndex: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n scale: number;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nconst props = defineProps<Props>();\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\nconst isPageExclusive = useIsPageExclusive();\n\nconst defaultConvertEventToPoint = computed(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n const displaySize: Size = transformSize(\n { width: props.pageWidth, height: props.pageHeight },\n props.rotation,\n 1,\n );\n\n return restorePosition(displaySize, displayPoint, props.rotation, props.scale);\n };\n});\n\nwatchEffect((onCleanup) => {\n if (cap.value && divRef.value) {\n const cleanup = createPointerProvider(\n cap.value,\n { type: 'page', pageIndex: props.pageIndex },\n divRef.value,\n props.convertEventToPoint || defaultConvertEventToPoint.value,\n );\n onCleanup(cleanup);\n }\n});\n</script>\n\n<template>\n <div\n ref=\"divRef\"\n :style=\"{ position: 'relative', width: pageWidth + 'px', height: pageHeight + 'px' }\"\n >\n <slot />\n <div\n v-if=\"isPageExclusive\"\n :style=\"{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }\"\n />\n </div>\n</template>\n"],"names":["_a","_createElementBlock","_renderSlot","_normalizeStyle","pageWidth","pageHeight","_unref","_openBlock"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/utils.ts","../../src/vue/hooks/use-interaction-manager.ts","../../src/vue/components/global-pointer-provider.vue","../../src/vue/components/page-pointer-provider.vue"],"sourcesContent":["import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n const capScope = cap.forDocument(scope.documentId);\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = capScope.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = capScope.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = capScope.getActiveInteractionMode();\n const initialCursor = capScope.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = capScope.onCursorChange((c) => {\n if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","import { ref, watch, computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: MaybeRefOrGetter<string>) {\n const { provides } = useInteractionManagerCapability();\n const state = ref<InteractionDocumentState>(initialDocumentState);\n\n watch(\n [provides, () => toValue(documentId)],\n ([providesValue, docId], _, onCleanup) => {\n if (!providesValue) {\n state.value = initialDocumentState;\n return;\n }\n\n const scope = providesValue.forDocument(docId);\n\n // Get initial state\n state.value = scope.getState();\n\n const unsubscribe = scope.onStateChange((newState) => {\n state.value = newState;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n );\n\n return {\n provides: computed(() => {\n const docId = toValue(documentId);\n return provides.value?.forDocument(docId) ?? null;\n }),\n state,\n };\n}\n\nexport function useCursor(documentId: MaybeRefOrGetter<string>) {\n const { provides } = useInteractionManagerCapability();\n\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n const providesValue = provides.value;\n if (!providesValue) return;\n const docId = toValue(documentId);\n const scope = providesValue.forDocument(docId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n const providesValue = provides.value;\n if (!providesValue) return;\n const docId = toValue(documentId);\n const scope = providesValue.forDocument(docId);\n scope.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: MaybeRefOrGetter<number>;\n documentId: MaybeRefOrGetter<string>;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n const { provides } = useInteractionManagerCapability();\n\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: {\n modeId?: string | string[];\n pageIndex?: number;\n documentId?: MaybeRefOrGetter<string>;\n },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = toValue(options?.pageIndex ?? pageIndex);\n const finalDocumentId = toValue(options?.documentId ?? documentId);\n const providesValue = provides.value;\n\n return finalModeId\n ? providesValue?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : providesValue?.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n : { type: 'global', documentId: finalDocumentId },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive(documentId: MaybeRefOrGetter<string>) {\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = ref<boolean>(false);\n\n watch(\n [cap, () => toValue(documentId)],\n ([capValue, docId], _, onCleanup) => {\n if (!capValue) {\n isPageExclusive.value = false;\n return;\n }\n\n const scope = capValue.forDocument(docId);\n\n // Get initial state\n const m = scope.getActiveInteractionMode();\n isPageExclusive.value = m?.scope === 'page' && !!m.exclusive;\n\n const unsubscribe = scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n isPageExclusive.value = mode?.scope === 'page' && !!mode?.exclusive;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n );\n\n return isPageExclusive;\n}\n","<script setup lang=\"ts\">\nimport { ref, watchEffect } from 'vue';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface Props {\n documentId: string;\n}\n\nconst props = defineProps<Props>();\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\n\n// watchEffect automatically handles setup and teardown when capability or element is ready\nwatchEffect((onCleanup) => {\n if (cap.value && divRef.value) {\n const cleanup = createPointerProvider(\n cap.value,\n { type: 'global', documentId: props.documentId },\n divRef.value,\n );\n onCleanup(cleanup);\n }\n});\n</script>\n\n<template>\n <div\n ref=\"divRef\"\n :style=\"{\n width: '100%',\n height: '100%',\n }\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, toValue } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Position, restorePosition, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps {\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nconst props = defineProps<PagePointerProviderProps>();\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\nconst isPageExclusive = useIsPageExclusive(() => props.documentId);\nconst documentState = useDocumentState(() => props.documentId);\n// Get page dimensions and transformations from document state\n// Calculate inline - this is cheap and memoization isn't necessary\nconst page = computed(() => documentState.value?.document?.pages?.[props.pageIndex]);\nconst naturalPageSize = computed(() => page.value?.size ?? { width: 0, height: 0 });\nconst rotation = computed(() => props.rotation ?? documentState.value?.rotation ?? 0);\nconst scale = computed(() => props.scale ?? documentState.value?.scale ?? 1);\nconst displaySize = computed(() => transformSize(naturalPageSize.value, 0, scale.value));\n\n// Simplified conversion function\nconst defaultConvertEventToPoint = computed(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n // Get the rotated natural size (width/height may be swapped, but not scaled)\n const rotatedNaturalSize = transformSize(\n {\n width: displaySize.value.width,\n height: displaySize.value.height,\n },\n rotation.value,\n 1,\n );\n\n return restorePosition(rotatedNaturalSize, displayPoint, rotation.value, scale.value);\n };\n});\n\nwatch(\n [\n cap,\n () => toValue(props.documentId),\n () => props.pageIndex,\n () => props.convertEventToPoint,\n defaultConvertEventToPoint,\n ],\n ([capValue, docId, pageIdx, customConvert, defaultConvert], _, onCleanup) => {\n if (!capValue || !divRef.value) return;\n\n const cleanup = createPointerProvider(\n capValue,\n { type: 'page', documentId: docId, pageIndex: pageIdx },\n divRef.value,\n customConvert || defaultConvert,\n );\n\n onCleanup(cleanup);\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <div\n ref=\"divRef\"\n :style=\"{\n position: 'relative',\n width: displaySize.width + 'px',\n height: displaySize.height + 'px',\n }\"\n v-bind=\"$attrs\"\n >\n <slot />\n <div\n v-if=\"isPageExclusive\"\n :style=\"{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }\"\n />\n </div>\n</template>\n"],"names":["_a","_createElementBlock","_renderSlot","_openBlock","_mergeProps","$attrs","_unref"],"mappings":";;;;;AAaA,MAAM,cAAiC;AAAA,EACrC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EAEf,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAGV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAEA,MAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,kBAAkB,CAAC,cAAc,YAAY,aAAa,aAAa;AAC7E,MAAM,cAAc,OAAO,iBAAiB;AAE5C,MAAM,gBAAgB,cAAc,oBAAoB,CAAC,GAAG,mBAAmB,GAAG,eAAe;AAKjG,SAAS,aAAa,WAAmB,eAAiD;AAExF,SAAO,UAAU,WAAW,OAAO,IAAI,EAAE,SAAS,CAAC,cAAA,IAAkB,EAAE,SAAS,MAAA;AAClF;AAEA,SAAS,aAAa,KAA+B;AACnD,SAAO,OAAO,eAAe,eAAe,eAAe;AAC7D;AAMA,SAAS,qBAAqB,SAAyB,OAA2C;;AAChG,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,UAA0B;AAE9B,SAAO,SAAS;AAEd,SAAI,WAAM,YAAN,mBAAe,QAAQ;AACzB,iBAAW,aAAa,MAAM,SAAS;AACrC,aAAI,aAAQ,cAAR,mBAAmB,SAAS,YAAY;AAC1C,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,SAAI,WAAM,mBAAN,mBAAsB,QAAQ;AAChC,iBAAW,QAAQ,MAAM,gBAAgB;AACvC,YAAI,QAAQ,aAAa,IAAI,GAAG;AAC9B,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO;AACT;AAKO,SAAS,sBACd,KACA,OACA,SACA,qBACA;AACA,QAAM,WAAW,IAAI,YAAY,MAAM,UAAU;AAEjD,MAAI,SAAsC,IAAI,oBAAoB,KAAK;AAGvE,QAAM,mBAAmB,MAAA;;AAAM,2BAAS,yBAAA,MAAT,mBAAqC,mBAAkB;AAAA;AAGtF,QAAM,YAAkD,CAAA;AACxD,MAAI,uBAAuB,iBAAA;AAE3B,QAAM,eAAe,CAAC,QAAiB;AACrC,kBAAc,QAAQ,CAAC,SAAS;AAC9B,YAAM,KAAM,sCAAoB;AAChC,cAAQ,iBAAiB,MAAM,IAAI,aAAa,MAAM,GAAG,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,QAAM,kBAAkB,MAAM;AAC5B,kBAAc,QAAQ,CAAC,SAAS;AAC9B,YAAM,KAAK,UAAU,IAAI;AACzB,UAAI,GAAI,SAAQ,oBAAoB,MAAM,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AAGA,eAAa,oBAAoB;AACjC,UAAQ,MAAM,cAAc,uBAAuB,SAAS;AAG5D,QAAM,WAAW,SAAS,aAAa,MAAM;AAE3C,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,OAAO,SAAS,yBAAA;AACtB,cAAQ,MAAM,UAAS,6BAAM,WAAU,WAAY,KAAK,UAAU,SAAU;AAAA,IAC9E;AAEA,aAAS,IAAI,oBAAoB,KAAK;AAGtC,UAAM,MAAM,iBAAA;AACZ,QAAI,QAAQ,sBAAsB;AAChC,sBAAA;AACA,mBAAa,GAAG;AAChB,6BAAuB;AACvB,cAAQ,MAAM,cAAc,uBAAuB,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAM,cAAc,IAAI,gBAAgB,MAAM;AAC5C,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAGD,QAAM,cAAc,SAAS,yBAAA;AAC7B,QAAM,gBAAgB,SAAS,iBAAA;AAC/B,UAAQ,MAAM,SACZ,MAAM,SAAS,aAAY,2CAAa,WAAU,WAAW,SAAS;AAExE,QAAM,aAAa,SAAS,eAAe,CAAC,MAAM;;AAChD,QAAI,MAAM,SAAS,cAAY,cAAS,yBAAA,MAAT,mBAAqC,WAAU,SAAU;AACxF,YAAQ,MAAM,SAAS;AAAA,EACzB,CAAC;AAGD,QAAM,QAAQ,CAAC,GAAyC,SAAgC;AACtF,QAAI,oBAAqB,QAAO,oBAAoB,GAAmB,IAAI;AAC3E,UAAM,IAAI,KAAK,sBAAA;AACf,WAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,UAAU,EAAE,IAAA;AAAA,EACnD;AAGA,WAAS,YAAY,KAAY;;AAC/B,QAAI,IAAI,WAAY;AAGpB,UAAM,iBAAiB,IAAI,kBAAA;AAC3B,QAAI,IAAI,UAAU,qBAAqB,IAAI,QAAmB,cAAc,GAAG;AAC7E;AAAA,IACF;AAEA,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,CAAC,cAAc,EAAC,iCAAS,aAAa;AAG1C,QACE,aAAa,GAAG,KAChB,yBACC,IAAI,SAAS,eAAe,IAAI,SAAS,gBAC1C;AACA,UAAI,eAAA;AAAA,IACN;AAGA,QAAI;AACJ,QAAI;AAKJ,QAAI,aAAa,GAAG,GAAG;AACrB,YAAM,KACJ,IAAI,SAAS,cAAc,IAAI,SAAS,gBACpC,IAAI,eAAe,CAAC,IACpB,IAAI,QAAQ,CAAC;AACnB,UAAI,CAAC,GAAI;AAET,YAAM,MAAM,IAAI,OAAO;AACvB,gBAAU;AAAA,QACR,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI;AAAA,QACZ,eAAe,IAAI;AAAA,QACnB,mBAAmB,MAAM;AAAA,QAAC;AAAA,QAC1B,uBAAuB,MAAM;AAAA,QAAC;AAAA,MAAA;AAAA,IAElC,OAAO;AACL,YAAM,KAAK;AACX,YAAM,MAAM,IAAI,OAAO;AACvB,gBAAU;AAAA,QACR,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,UAAU,GAAG;AAAA,QACb,QAAQ,GAAG;AAAA,QACX,SAAS,GAAG;AAAA,QACZ,QAAQ,GAAG;AAAA,QACX,eAAe,GAAG;AAAA,QAClB,mBAAmB,MAAM;;AACtB,iBAAAA,MAAA,GAAG,WAAH,gBAAAA,IAA2B,sBAA3B,wBAAAA,KAA+C,GAAG;AAAA,QACrD;AAAA,QACA,uBAAuB,MAAM;;AAC1B,iBAAAA,MAAA,GAAG,WAAH,gBAAAA,IAA2B,0BAA3B,wBAAAA,KAAmD,GAAG;AAAA,QACzD;AAAA,MAAA;AAAA,IAEJ;AAEA,iBAAO,gBAAP,gCAAqB,KAAK,SAAS,SAAS;EAC9C;AAGA,SAAO,MAAM;AACX,oBAAA;AACA,aAAA;AACA,eAAA;AACA,gBAAA;AAAA,EACF;AACF;ACjQO,MAAM,8BAA8B,MACzC,UAAoC,yBAAyB,EAAE;AAC1D,MAAM,kCAAkC,MAC7C,cAAwC,yBAAyB,EAAE;AAE9D,SAAS,sBAAsB,YAAsC;AAC1E,QAAM,EAAE,SAAA,IAAa,gCAAA;AACrB,QAAM,QAAQ,IAA8B,oBAAoB;AAEhE;AAAA,IACE,CAAC,UAAU,MAAM,QAAQ,UAAU,CAAC;AAAA,IACpC,CAAC,CAAC,eAAe,KAAK,GAAG,GAAG,cAAc;AACxC,UAAI,CAAC,eAAe;AAClB,cAAM,QAAQ;AACd;AAAA,MACF;AAEA,YAAM,QAAQ,cAAc,YAAY,KAAK;AAG7C,YAAM,QAAQ,MAAM,SAAA;AAEpB,YAAM,cAAc,MAAM,cAAc,CAAC,aAAa;AACpD,cAAM,QAAQ;AAAA,MAChB,CAAC;AAED,gBAAU,WAAW;AAAA,IACvB;AAAA,IACA,EAAE,WAAW,KAAA;AAAA,EAAK;AAGpB,SAAO;AAAA,IACL,UAAU,SAAS,MAAM;;AACvB,YAAM,QAAQ,QAAQ,UAAU;AAChC,eAAO,cAAS,UAAT,mBAAgB,YAAY,WAAU;AAAA,IAC/C,CAAC;AAAA,IACD;AAAA,EAAA;AAEJ;AAEO,SAAS,UAAU,YAAsC;AAC9D,QAAM,EAAE,SAAA,IAAa,gCAAA;AAErB,SAAO;AAAA,IACL,WAAW,CAAC,OAAe,QAAgB,OAAO,MAAM;AACtD,YAAM,gBAAgB,SAAS;AAC/B,UAAI,CAAC,cAAe;AACpB,YAAM,QAAQ,QAAQ,UAAU;AAChC,YAAM,QAAQ,cAAc,YAAY,KAAK;AAC7C,YAAM,UAAU,OAAO,QAAQ,IAAI;AAAA,IACrC;AAAA,IACA,cAAc,CAAC,UAAkB;AAC/B,YAAM,gBAAgB,SAAS;AAC/B,UAAI,CAAC,cAAe;AACpB,YAAM,QAAQ,QAAQ,UAAU;AAChC,YAAM,QAAQ,cAAc,YAAY,KAAK;AAC7C,YAAM,aAAa,KAAK;AAAA,IAC1B;AAAA,EAAA;AAEJ;AAQO,SAAS,mBAAmB,EAAE,QAAQ,WAAW,cAAyC;AAC/F,QAAM,EAAE,SAAA,IAAa,gCAAA;AAErB,SAAO;AAAA,IACL,UAAU,CACR,UACA,YAKG;AAEH,YAAM,eAAc,mCAAS,WAAU;AACvC,YAAM,iBAAiB,SAAQ,mCAAS,cAAa,SAAS;AAC9D,YAAM,kBAAkB,SAAQ,mCAAS,eAAc,UAAU;AACjE,YAAM,gBAAgB,SAAS;AAE/B,aAAO,cACH,+CAAe,iBAAiB;AAAA,QAC9B,QAAQ;AAAA,QACR;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,MAAA,KAEd,+CAAe,eAAe;AAAA,QAC5B,OACE,mBAAmB,SACf,EAAE,MAAM,QAAQ,YAAY,iBAAiB,WAAW,mBACxD,EAAE,MAAM,UAAU,YAAY,gBAAA;AAAA,QACpC;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAEJ;AAEO,SAAS,mBAAmB,YAAsC;AACvE,QAAM,EAAE,UAAU,IAAA,IAAQ,gCAAA;AAC1B,QAAM,kBAAkB,IAAa,KAAK;AAE1C;AAAA,IACE,CAAC,KAAK,MAAM,QAAQ,UAAU,CAAC;AAAA,IAC/B,CAAC,CAAC,UAAU,KAAK,GAAG,GAAG,cAAc;AACnC,UAAI,CAAC,UAAU;AACb,wBAAgB,QAAQ;AACxB;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,YAAY,KAAK;AAGxC,YAAM,IAAI,MAAM,yBAAA;AAChB,sBAAgB,SAAQ,uBAAG,WAAU,UAAU,CAAC,CAAC,EAAE;AAEnD,YAAM,cAAc,MAAM,aAAa,MAAM;AAC3C,cAAM,OAAO,MAAM,yBAAA;AACnB,wBAAgB,SAAQ,6BAAM,WAAU,UAAU,CAAC,EAAC,6BAAM;AAAA,MAC5D,CAAC;AAED,gBAAU,WAAW;AAAA,IACvB;AAAA,IACA,EAAE,WAAW,KAAA;AAAA,EAAK;AAGpB,SAAO;AACT;;;;;;;ACpIA,UAAM,QAAQ;AAEd,UAAM,SAAS,IAA2B,IAAI;AAC9C,UAAM,EAAE,UAAU,IAAA,IAAQ,gCAAA;AAG1B,gBAAY,CAAC,cAAc;AACzB,UAAI,IAAI,SAAS,OAAO,OAAO;AAC7B,cAAM,UAAU;AAAA,UACd,IAAI;AAAA,UACJ,EAAE,MAAM,UAAU,YAAY,MAAM,WAAA;AAAA,UACpC,OAAO;AAAA,QAAA;AAET,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF,CAAC;;0BAICC,mBAQM,OAAA;AAAA,iBAPA;AAAA,QAAJ,KAAI;AAAA,QACH,OAAO;AAAA;;;MAGP;QAEDC,WAAQ,KAAA,QAAA,SAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;;ACpBZ,UAAM,QAAQ;AAEd,UAAM,SAAS,IAA2B,IAAI;AAC9C,UAAM,EAAE,UAAU,IAAA,IAAQ,gCAAA;AAC1B,UAAM,kBAAkB,mBAAmB,MAAM,MAAM,UAAU;AACjE,UAAM,gBAAgB,iBAAiB,MAAM,MAAM,UAAU;AAG7D,UAAM,OAAO,SAAS,MAAA;;AAAM,6CAAc,UAAd,mBAAqB,aAArB,mBAA+B,UAA/B,mBAAuC,MAAM;AAAA,KAAU;AACnF,UAAM,kBAAkB,SAAS,MAAA;;AAAM,yBAAK,UAAL,mBAAY,SAAQ,EAAE,OAAO,GAAG,QAAQ,EAAA;AAAA,KAAG;AAClF,UAAM,WAAW,SAAS;;AAAM,mBAAM,cAAY,mBAAc,UAAd,mBAAqB,aAAY;AAAA,KAAC;AACpF,UAAM,QAAQ,SAAS;;AAAM,mBAAM,WAAS,mBAAc,UAAd,mBAAqB,UAAS;AAAA,KAAC;AAC3E,UAAM,cAAc,SAAS,MAAM,cAAc,gBAAgB,OAAO,GAAG,MAAM,KAAK,CAAC;AAGvF,UAAM,6BAA6B,SAAS,MAAM;AAChD,aAAO,CAAC,OAAqB,YAAmC;AAC9D,cAAM,OAAO,QAAQ,sBAAA;AACrB,cAAM,eAAe;AAAA,UACnB,GAAG,MAAM,UAAU,KAAK;AAAA,UACxB,GAAG,MAAM,UAAU,KAAK;AAAA,QAAA;AAI1B,cAAM,qBAAqB;AAAA,UACzB;AAAA,YACE,OAAO,YAAY,MAAM;AAAA,YACzB,QAAQ,YAAY,MAAM;AAAA,UAAA;AAAA,UAE5B,SAAS;AAAA,UACT;AAAA,QAAA;AAGF,eAAO,gBAAgB,oBAAoB,cAAc,SAAS,OAAO,MAAM,KAAK;AAAA,MACtF;AAAA,IACF,CAAC;AAED;AAAA,MACE;AAAA,QACE;AAAA,QACA,MAAM,QAAQ,MAAM,UAAU;AAAA,QAC9B,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ;AAAA,MAAA;AAAA,MAEF,CAAC,CAAC,UAAU,OAAO,SAAS,eAAe,cAAc,GAAG,GAAG,cAAc;AAC3E,YAAI,CAAC,YAAY,CAAC,OAAO,MAAO;AAEhC,cAAM,UAAU;AAAA,UACd;AAAA,UACA,EAAE,MAAM,QAAQ,YAAY,OAAO,WAAW,QAAA;AAAA,UAC9C,OAAO;AAAA,UACP,iBAAiB;AAAA,QAAA;AAGnB,kBAAU,OAAO;AAAA,MACnB;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;AAKlB,aAAAC,UAAA,GAAAF,mBAcM,OAdNG,WAcM;AAAA,iBAbA;AAAA,QAAJ,KAAI;AAAA,QACH,OAAK;AAAA;UAA6C,OAAA,YAAA,MAAY,QAAK;AAAA,UAAuB,QAAA,YAAA,MAAY,SAAM;AAAA,QAAA;AAAA,SAKrGC,KAAAA,MAAM,GAAA;AAAA,QAEdH,WAAQ,KAAA,QAAA,SAAA;AAAA,QAEAI,MAAA,eAAA,KADRH,aAAAF,mBAGE,OAHF,UAGE;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-interaction-manager",
3
- "version": "1.5.0",
3
+ "version": "2.0.0-next.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -35,12 +35,12 @@
35
35
  }
36
36
  },
37
37
  "dependencies": {
38
- "@embedpdf/models": "1.5.0"
38
+ "@embedpdf/models": "2.0.0-next.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/react": "^18.2.0",
42
42
  "typescript": "^5.0.0",
43
- "@embedpdf/core": "1.5.0",
43
+ "@embedpdf/core": "2.0.0-next.0",
44
44
  "@embedpdf/build": "1.1.0"
45
45
  },
46
46
  "peerDependencies": {
@@ -49,7 +49,7 @@
49
49
  "preact": "^10.26.4",
50
50
  "vue": ">=3.2.0",
51
51
  "svelte": ">=5 <6",
52
- "@embedpdf/core": "1.5.0"
52
+ "@embedpdf/core": "2.0.0-next.0"
53
53
  },
54
54
  "files": [
55
55
  "dist",