@embedpdf/plugin-interaction-manager 1.4.1 → 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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +456 -185
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +61 -36
- package/dist/lib/interaction-manager-plugin.d.ts +19 -14
- package/dist/lib/reducer.d.ts +2 -1
- package/dist/lib/types.d.ts +58 -50
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +61 -40
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +61 -40
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/global-pointer-provider.d.ts +2 -1
- package/dist/shared/components/page-pointer-provider.d.ts +4 -5
- package/dist/shared/hooks/use-interaction-manager.d.ts +9 -7
- package/dist/shared-preact/components/global-pointer-provider.d.ts +2 -1
- package/dist/shared-preact/components/page-pointer-provider.d.ts +4 -5
- package/dist/shared-preact/hooks/use-interaction-manager.d.ts +9 -7
- package/dist/shared-react/components/global-pointer-provider.d.ts +2 -1
- package/dist/shared-react/components/page-pointer-provider.d.ts +4 -5
- package/dist/shared-react/hooks/use-interaction-manager.d.ts +9 -7
- package/dist/svelte/components/GlobalPointerProvider.svelte.d.ts +1 -0
- package/dist/svelte/components/PagePointerProvider.svelte.d.ts +4 -5
- package/dist/svelte/hooks/use-interaction-manager.svelte.d.ts +10 -8
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +128 -56
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/global-pointer-provider.vue.d.ts +6 -2
- package/dist/vue/components/page-pointer-provider.vue.d.ts +7 -7
- package/dist/vue/hooks/use-interaction-manager.d.ts +19 -26
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +131 -63
- package/dist/vue/index.js.map +1 -1
- package/package.json +5 -5
package/dist/vue/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ref,
|
|
2
|
-
import { useCapability, usePlugin } from "@embedpdf/core/vue";
|
|
3
|
-
import { InteractionManagerPlugin,
|
|
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 =
|
|
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 =
|
|
98
|
+
const stopMode = capScope.onModeChange(() => {
|
|
98
99
|
if (scope.type === "global") {
|
|
99
|
-
const mode =
|
|
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 =
|
|
115
|
-
const initialCursor =
|
|
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 =
|
|
118
|
+
const stopCursor = capScope.onCursorChange((c) => {
|
|
118
119
|
var _a;
|
|
119
|
-
if (scope.type === "global" && ((_a =
|
|
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,
|
|
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(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
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
|
-
|
|
213
|
-
(
|
|
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
|
-
|
|
217
|
-
(
|
|
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
|
-
|
|
228
|
-
|
|
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
|
-
|
|
233
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
308
|
-
{
|
|
309
|
-
|
|
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(
|
|
367
|
+
return restorePosition(rotatedNaturalSize, displayPoint, rotation.value, scale.value);
|
|
313
368
|
};
|
|
314
369
|
});
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
319
|
-
{ type: "page",
|
|
381
|
+
capValue,
|
|
382
|
+
{ type: "page", documentId: docId, pageIndex: pageIdx },
|
|
320
383
|
divRef.value,
|
|
321
|
-
|
|
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:
|
|
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
|
-
],
|
|
402
|
+
], 16);
|
|
335
403
|
};
|
|
336
404
|
}
|
|
337
405
|
});
|
package/dist/vue/index.js.map
CHANGED
|
@@ -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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/plugin-interaction-manager",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-next.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@embedpdf/models": "
|
|
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/
|
|
44
|
-
"@embedpdf/
|
|
43
|
+
"@embedpdf/core": "2.0.0-next.0",
|
|
44
|
+
"@embedpdf/build": "1.1.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": ">=16.8.0",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"preact": "^10.26.4",
|
|
50
50
|
"vue": ">=3.2.0",
|
|
51
51
|
"svelte": ">=5 <6",
|
|
52
|
-
"@embedpdf/core": "
|
|
52
|
+
"@embedpdf/core": "2.0.0-next.0"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|