@embedpdf/plugin-interaction-manager 1.0.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.
@@ -0,0 +1,45 @@
1
+ import { JSX, ComponentChildren } from 'preact';
2
+ import { Position } from '@embedpdf/models';
3
+ import * as _embedpdf_plugin_interaction_manager from '@embedpdf/plugin-interaction-manager';
4
+ import { InteractionManagerPlugin, PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';
5
+
6
+ /** @jsxImportSource preact */
7
+
8
+ interface GlobalPointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {
9
+ children: ComponentChildren;
10
+ }
11
+ declare const GlobalPointerProvider: ({ children, ...props }: GlobalPointerProviderProps) => JSX.Element;
12
+
13
+ /** @jsxImportSource preact */
14
+
15
+ interface PagePointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {
16
+ children: ComponentChildren;
17
+ pageIndex: number;
18
+ convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;
19
+ }
20
+ declare const PagePointerProvider: ({ pageIndex, children, convertEventToPoint, ...props }: PagePointerProviderProps) => JSX.Element;
21
+
22
+ declare const useInteractionManager: () => {
23
+ plugin: InteractionManagerPlugin | null;
24
+ isLoading: boolean;
25
+ ready: Promise<void>;
26
+ };
27
+ declare const useInteractionManagerCapability: () => {
28
+ provides: Readonly<_embedpdf_plugin_interaction_manager.InteractionManagerCapability> | null;
29
+ isLoading: boolean;
30
+ ready: Promise<void>;
31
+ };
32
+ declare function useCursor(): {
33
+ setCursor: (token: string, cursor: string, prio?: number) => void;
34
+ removeCursor: (token: string) => void;
35
+ };
36
+ interface UsePointerHandlersOptions {
37
+ modeId?: string;
38
+ pageIndex?: number;
39
+ }
40
+ declare function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions): {
41
+ register: (handlers: PointerEventHandlers) => (() => void) | undefined;
42
+ };
43
+ declare function useIsPageExclusive(): boolean;
44
+
45
+ export { GlobalPointerProvider, PagePointerProvider, useCursor, useInteractionManager, useInteractionManagerCapability, useIsPageExclusive, usePointerHandlers };
@@ -0,0 +1,100 @@
1
+ import {
2
+ createPointerProvider
3
+ } from "../chunk-EJ7FVBFM.js";
4
+
5
+ // src/preact/components/global-pointer-provider.tsx
6
+ import { useEffect as useEffect2, useRef } from "preact/hooks";
7
+
8
+ // src/preact/hooks/use-interaction-manager.ts
9
+ import { useCapability, usePlugin } from "@embedpdf/core/preact";
10
+ import {
11
+ InteractionManagerPlugin
12
+ } from "@embedpdf/plugin-interaction-manager";
13
+ import { useState } from "preact/hooks";
14
+ import { useEffect } from "preact/hooks";
15
+ var useInteractionManager = () => usePlugin(InteractionManagerPlugin.id);
16
+ var useInteractionManagerCapability = () => useCapability(InteractionManagerPlugin.id);
17
+ function useCursor() {
18
+ const { provides } = useInteractionManagerCapability();
19
+ return {
20
+ setCursor: (token, cursor, prio = 0) => {
21
+ provides?.setCursor(token, cursor, prio);
22
+ },
23
+ removeCursor: (token) => {
24
+ provides?.removeCursor(token);
25
+ }
26
+ };
27
+ }
28
+ function usePointerHandlers({ modeId, pageIndex }) {
29
+ const { provides } = useInteractionManagerCapability();
30
+ return {
31
+ register: modeId ? (handlers) => provides?.registerHandlers({ modeId, handlers, pageIndex }) : (handlers) => provides?.registerAlways({
32
+ scope: pageIndex !== void 0 ? { type: "page", pageIndex } : { type: "global" },
33
+ handlers
34
+ })
35
+ };
36
+ }
37
+ function useIsPageExclusive() {
38
+ const { provides: cap } = useInteractionManagerCapability();
39
+ const [isPageExclusive, setIsPageExclusive] = useState(() => {
40
+ const m = cap?.getActiveInteractionMode();
41
+ return m?.scope === "page" && !!m.exclusive;
42
+ });
43
+ useEffect(() => {
44
+ if (!cap) return;
45
+ return cap.onModeChange(() => {
46
+ const mode = cap.getActiveInteractionMode();
47
+ setIsPageExclusive(mode?.scope === "page" && !!mode?.exclusive);
48
+ });
49
+ }, [cap]);
50
+ return isPageExclusive;
51
+ }
52
+
53
+ // src/preact/components/global-pointer-provider.tsx
54
+ import { jsx } from "preact/jsx-runtime";
55
+ var GlobalPointerProvider = ({ children, ...props }) => {
56
+ const ref = useRef(null);
57
+ const { provides: cap } = useInteractionManagerCapability();
58
+ useEffect2(() => {
59
+ if (!cap || !ref.current) return;
60
+ return createPointerProvider(cap, { type: "global" }, ref.current);
61
+ }, [cap]);
62
+ return /* @__PURE__ */ jsx("div", { ref, ...props, children });
63
+ };
64
+
65
+ // src/preact/components/page-pointer-provider.tsx
66
+ import { useEffect as useEffect3, useRef as useRef2 } from "preact/hooks";
67
+ import { jsx as jsx2, jsxs } from "preact/jsx-runtime";
68
+ var PagePointerProvider = ({
69
+ pageIndex,
70
+ children,
71
+ convertEventToPoint,
72
+ ...props
73
+ }) => {
74
+ const ref = useRef2(null);
75
+ const { provides: cap } = useInteractionManagerCapability();
76
+ const isPageExclusive = useIsPageExclusive();
77
+ useEffect3(() => {
78
+ if (!cap || !ref.current) return;
79
+ return createPointerProvider(
80
+ cap,
81
+ { type: "page", pageIndex },
82
+ ref.current,
83
+ convertEventToPoint
84
+ );
85
+ }, [cap, pageIndex, convertEventToPoint]);
86
+ return /* @__PURE__ */ jsxs("div", { ref, ...props, children: [
87
+ children,
88
+ isPageExclusive && /* @__PURE__ */ jsx2("div", { style: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0 } })
89
+ ] });
90
+ };
91
+ export {
92
+ GlobalPointerProvider,
93
+ PagePointerProvider,
94
+ useCursor,
95
+ useInteractionManager,
96
+ useInteractionManagerCapability,
97
+ useIsPageExclusive,
98
+ usePointerHandlers
99
+ };
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/preact/components/global-pointer-provider.tsx","../../src/preact/hooks/use-interaction-manager.ts","../../src/preact/components/page-pointer-provider.tsx"],"sourcesContent":["/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {\n children: ComponentChildren;\n}\n\nexport const GlobalPointerProvider = ({ children, ...props }: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global' }, ref.current);\n }, [cap]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n </div>\n );\n};\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport {\n InteractionManagerPlugin,\n PointerEventHandlers,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState } from 'preact/hooks';\nimport { useEffect } from 'preact/hooks';\n\nexport const useInteractionManager = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useCursor() {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n provides?.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n provides?.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string;\n pageIndex?: number;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions) {\n const { provides } = useInteractionManagerCapability();\n return {\n register: modeId\n ? (handlers: PointerEventHandlers) =>\n provides?.registerHandlers({ modeId, handlers, pageIndex })\n : (handlers: PointerEventHandlers) =>\n provides?.registerAlways({\n scope: pageIndex !== undefined ? { type: 'page', pageIndex } : { type: 'global' },\n handlers,\n }),\n };\n}\n\nexport function useIsPageExclusive() {\n const { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n const m = cap?.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n return cap.onModeChange(() => {\n const mode = cap.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap]);\n\n return isPageExclusive;\n}\n","/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { Position } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {\n children: ComponentChildren;\n pageIndex: number;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n pageIndex,\n children,\n convertEventToPoint,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', pageIndex },\n ref.current,\n convertEventToPoint,\n );\n }, [cap, pageIndex, convertEventToPoint]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }} />\n )}\n </div>\n );\n};\n"],"mappings":";;;;;AAEA,SAAS,aAAAA,YAAW,cAAc;;;ACFlC,SAAS,eAAe,iBAAiB;AACzC;AAAA,EACE;AAAA,OAEK;AACP,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAEnB,IAAM,wBAAwB,MACnC,UAAoC,yBAAyB,EAAE;AAC1D,IAAM,kCAAkC,MAC7C,cAAwC,yBAAyB,EAAE;AAE9D,SAAS,YAAY;AAC1B,QAAM,EAAE,SAAS,IAAI,gCAAgC;AACrD,SAAO;AAAA,IACL,WAAW,CAAC,OAAe,QAAgB,OAAO,MAAM;AACtD,gBAAU,UAAU,OAAO,QAAQ,IAAI;AAAA,IACzC;AAAA,IACA,cAAc,CAAC,UAAkB;AAC/B,gBAAU,aAAa,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAOO,SAAS,mBAAmB,EAAE,QAAQ,UAAU,GAA8B;AACnF,QAAM,EAAE,SAAS,IAAI,gCAAgC;AACrD,SAAO;AAAA,IACL,UAAU,SACN,CAAC,aACC,UAAU,iBAAiB,EAAE,QAAQ,UAAU,UAAU,CAAC,IAC5D,CAAC,aACC,UAAU,eAAe;AAAA,MACvB,OAAO,cAAc,SAAY,EAAE,MAAM,QAAQ,UAAU,IAAI,EAAE,MAAM,SAAS;AAAA,MAChF;AAAA,IACF,CAAC;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB;AACnC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkB,MAAM;AACpE,UAAM,IAAI,KAAK,yBAAyB;AACxC,WAAO,GAAG,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,EACpC,CAAC;AAED,YAAU,MAAM;AACd,QAAI,CAAC,IAAK;AAEV,WAAO,IAAI,aAAa,MAAM;AAC5B,YAAM,OAAO,IAAI,yBAAyB;AAC1C,yBAAmB,MAAM,UAAU,UAAU,CAAC,CAAC,MAAM,SAAS;AAAA,IAChE,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AACT;;;ADxCI;AAXG,IAAM,wBAAwB,CAAC,EAAE,UAAU,GAAG,MAAM,MAAkC;AAC3F,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAO,CAAC,IAAI,QAAS;AAE1B,WAAO,sBAAsB,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,OAAO;AAAA,EACnE,GAAG,CAAC,GAAG,CAAC;AAER,SACE,oBAAC,SAAI,KAAW,GAAG,OAChB,UACH;AAEJ;;;AExBA,SAAS,aAAAC,YAAW,UAAAC,eAAc;AAkC9B,SAGI,OAAAC,MAHJ;AAtBG,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,MAAMC,QAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAC1D,QAAM,kBAAkB,mBAAmB;AAE3C,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAO,CAAC,IAAI,QAAS;AAE1B,WAAO;AAAA,MACL;AAAA,MACA,EAAE,MAAM,QAAQ,UAAU;AAAA,MAC1B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,WAAW,mBAAmB,CAAC;AAExC,SACE,qBAAC,SAAI,KAAW,GAAG,OAChB;AAAA;AAAA,IACA,mBACC,gBAAAF,KAAC,SAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG;AAAA,KAEhF;AAEJ;","names":["useEffect","useEffect","useEffect","useRef","jsx","useRef","useEffect"]}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/react/index.ts
21
+ var react_exports = {};
22
+ __export(react_exports, {
23
+ GlobalPointerProvider: () => GlobalPointerProvider,
24
+ PagePointerProvider: () => PagePointerProvider,
25
+ useCursor: () => useCursor,
26
+ useInteractionManager: () => useInteractionManager,
27
+ useInteractionManagerCapability: () => useInteractionManagerCapability,
28
+ useIsPageExclusive: () => useIsPageExclusive,
29
+ usePointerHandlers: () => usePointerHandlers
30
+ });
31
+ module.exports = __toCommonJS(react_exports);
32
+
33
+ // src/react/hooks/use-interaction-manager.ts
34
+ var import_react = require("@embedpdf/core/react");
35
+ var import_plugin_interaction_manager = require("@embedpdf/plugin-interaction-manager");
36
+ var import_react2 = require("react");
37
+ var useInteractionManager = () => (0, import_react.usePlugin)(import_plugin_interaction_manager.InteractionManagerPlugin.id);
38
+ var useInteractionManagerCapability = () => (0, import_react.useCapability)(import_plugin_interaction_manager.InteractionManagerPlugin.id);
39
+ function useCursor() {
40
+ const { provides } = useInteractionManagerCapability();
41
+ return {
42
+ setCursor: (token, cursor, prio = 0) => {
43
+ provides?.setCursor(token, cursor, prio);
44
+ },
45
+ removeCursor: (token) => {
46
+ provides?.removeCursor(token);
47
+ }
48
+ };
49
+ }
50
+ function usePointerHandlers({ modeId, pageIndex }) {
51
+ const { provides } = useInteractionManagerCapability();
52
+ return {
53
+ register: modeId ? (handlers) => provides?.registerHandlers({ modeId, handlers, pageIndex }) : (handlers) => provides?.registerAlways({
54
+ scope: pageIndex !== void 0 ? { type: "page", pageIndex } : { type: "global" },
55
+ handlers
56
+ })
57
+ };
58
+ }
59
+ function useIsPageExclusive() {
60
+ const { provides: cap } = useInteractionManagerCapability();
61
+ const [isPageExclusive, setIsPageExclusive] = (0, import_react2.useState)(() => {
62
+ const m = cap?.getActiveInteractionMode();
63
+ return m?.scope === "page" && !!m.exclusive;
64
+ });
65
+ (0, import_react2.useEffect)(() => {
66
+ if (!cap) return;
67
+ return cap.onModeChange(() => {
68
+ const mode = cap.getActiveInteractionMode();
69
+ setIsPageExclusive(mode?.scope === "page" && !!mode?.exclusive);
70
+ });
71
+ }, [cap]);
72
+ return isPageExclusive;
73
+ }
74
+
75
+ // src/react/components/global-pointer-provider.tsx
76
+ var import_react3 = require("react");
77
+
78
+ // src/shared/utils.ts
79
+ function createPointerProvider(cap, scope, element, convertEventToPoint) {
80
+ let active = cap.getHandlersForScope(scope);
81
+ const stopMode = cap.onModeChange(() => {
82
+ if (scope.type === "global") {
83
+ const mode = cap.getActiveInteractionMode();
84
+ element.style.cursor = mode?.scope === "global" ? mode.cursor ?? "auto" : "auto";
85
+ }
86
+ active = cap.getHandlersForScope(scope);
87
+ });
88
+ const stopHandler = cap.onHandlerChange(() => {
89
+ active = cap.getHandlersForScope(scope);
90
+ });
91
+ const modeNow = cap.getActiveInteractionMode();
92
+ const cursorNow = cap.getCurrentCursor();
93
+ if (scope.type === "global") {
94
+ element.style.cursor = modeNow?.scope === "global" ? cursorNow : "auto";
95
+ } else {
96
+ element.style.cursor = cursorNow;
97
+ }
98
+ const stopCursor = cap.onCursorChange((c) => {
99
+ if (scope.type === "global") {
100
+ const isGlobalMode = cap.getActiveInteractionMode()?.scope === "global";
101
+ if (!isGlobalMode) return;
102
+ }
103
+ element.style.cursor = c;
104
+ });
105
+ const domEvent = {
106
+ onPointerDown: "pointerdown",
107
+ onPointerUp: "pointerup",
108
+ onPointerMove: "pointermove",
109
+ onPointerEnter: "pointerenter",
110
+ onPointerLeave: "pointerleave",
111
+ onPointerCancel: "pointercancel"
112
+ };
113
+ const listeners = {};
114
+ const toPos = (e, host) => {
115
+ if (convertEventToPoint) return convertEventToPoint(e, host);
116
+ const r = host.getBoundingClientRect();
117
+ return { x: e.clientX - r.left, y: e.clientY - r.top };
118
+ };
119
+ Object.keys(domEvent).forEach((k) => {
120
+ listeners[k] = (evt) => {
121
+ const pe = evt;
122
+ active?.[k]?.(toPos(pe, element), pe);
123
+ };
124
+ element.addEventListener(domEvent[k], listeners[k]);
125
+ });
126
+ return () => {
127
+ Object.keys(domEvent).forEach(
128
+ (k) => element.removeEventListener(domEvent[k], listeners[k])
129
+ );
130
+ stopMode();
131
+ stopCursor();
132
+ stopHandler();
133
+ };
134
+ }
135
+
136
+ // src/react/components/global-pointer-provider.tsx
137
+ var import_jsx_runtime = require("react/jsx-runtime");
138
+ var GlobalPointerProvider = ({ children, ...props }) => {
139
+ const ref = (0, import_react3.useRef)(null);
140
+ const { provides: cap } = useInteractionManagerCapability();
141
+ (0, import_react3.useEffect)(() => {
142
+ if (!cap || !ref.current) return;
143
+ return createPointerProvider(cap, { type: "global" }, ref.current);
144
+ }, [cap]);
145
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref, ...props, children });
146
+ };
147
+
148
+ // src/react/components/page-pointer-provider.tsx
149
+ var import_react4 = require("react");
150
+ var import_jsx_runtime2 = require("react/jsx-runtime");
151
+ var PagePointerProvider = ({
152
+ pageIndex,
153
+ children,
154
+ convertEventToPoint,
155
+ ...props
156
+ }) => {
157
+ const ref = (0, import_react4.useRef)(null);
158
+ const { provides: cap } = useInteractionManagerCapability();
159
+ const isPageExclusive = useIsPageExclusive();
160
+ (0, import_react4.useEffect)(() => {
161
+ if (!cap || !ref.current) return;
162
+ return createPointerProvider(
163
+ cap,
164
+ { type: "page", pageIndex },
165
+ ref.current,
166
+ convertEventToPoint
167
+ );
168
+ }, [cap, pageIndex, convertEventToPoint]);
169
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { ref, ...props, children: [
170
+ children,
171
+ isPageExclusive && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0 } })
172
+ ] });
173
+ };
174
+ // Annotate the CommonJS export names for ESM import in node:
175
+ 0 && (module.exports = {
176
+ GlobalPointerProvider,
177
+ PagePointerProvider,
178
+ useCursor,
179
+ useInteractionManager,
180
+ useInteractionManagerCapability,
181
+ useIsPageExclusive,
182
+ usePointerHandlers
183
+ });
184
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/hooks/use-interaction-manager.ts","../../src/react/components/global-pointer-provider.tsx","../../src/shared/utils.ts","../../src/react/components/page-pointer-provider.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport {\n InteractionManagerPlugin,\n PointerEventHandlers,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from 'react';\n\nexport const useInteractionManager = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useCursor() {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n provides?.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n provides?.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string;\n pageIndex?: number;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions) {\n const { provides } = useInteractionManagerCapability();\n return {\n register: modeId\n ? (handlers: PointerEventHandlers) =>\n provides?.registerHandlers({ modeId, handlers, pageIndex })\n : (handlers: PointerEventHandlers) =>\n provides?.registerAlways({\n scope: pageIndex !== undefined ? { type: 'page', pageIndex } : { type: 'global' },\n handlers,\n }),\n };\n}\n\nexport function useIsPageExclusive() {\n const { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n const m = cap?.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n return cap.onModeChange(() => {\n const mode = cap.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap]);\n\n return isPageExclusive;\n}\n","import { ReactNode, useEffect, useRef } from 'react';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport const GlobalPointerProvider = ({ children, ...props }: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global' }, ref.current);\n }, [cap]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n </div>\n );\n};\n","import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n} from '@embedpdf/plugin-interaction-manager';\n\n/**\n * Hook one DOM element into the interaction-manager.\n * – keeps handlers & cursor in-sync with the current mode\n * – returns a teardown fn for React/Preact effects\n */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n /* ------------------------------------------------------------------ */\n /* active handler set – hot-swapped on every mode change */\n /* ------------------------------------------------------------------ */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n const stopMode = cap.onModeChange(() => {\n if (scope.type === 'global') {\n const mode = cap.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n active = cap.getHandlersForScope(scope);\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ------------------------------------------------------------------ */\n /* cursor */\n /* ------------------------------------------------------------------ */\n const modeNow = cap.getActiveInteractionMode();\n const cursorNow = cap.getCurrentCursor();\n\n /** initial cursor -------------------------------------------------- */\n if (scope.type === 'global') {\n // global wrapper only shows the cursor while a *global* mode is active\n element.style.cursor = modeNow?.scope === 'global' ? cursorNow : 'auto';\n } else {\n // page wrappers always mirror the latest cursor\n element.style.cursor = cursorNow;\n }\n\n const stopCursor = cap.onCursorChange((c) => {\n /** ❖ Propagation rule\n * ─────────────────\n * • global provider updates its cursor *only* while the active\n * mode itself is ‘global’.\n * • page providers always sync (so they show the cursor during\n * a global mode as well). */\n if (scope.type === 'global') {\n const isGlobalMode = cap.getActiveInteractionMode()?.scope === 'global';\n if (!isGlobalMode) return; // active mode is page-scoped → ignore\n }\n element.style.cursor = c;\n });\n\n /* ------------------------------------------------------------------ */\n /* event wiring */\n /* ------------------------------------------------------------------ */\n type K = keyof PointerEventHandlers;\n const domEvent: Record<K, keyof HTMLElementEventMap> = {\n onPointerDown: 'pointerdown',\n onPointerUp: 'pointerup',\n onPointerMove: 'pointermove',\n onPointerEnter: 'pointerenter',\n onPointerLeave: 'pointerleave',\n onPointerCancel: 'pointercancel',\n };\n\n /* one stable EventListener per key -> needed for removeEventListener */\n const listeners: Partial<Record<K, EventListener>> = {};\n\n const toPos = (e: PointerEvent, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n (Object.keys(domEvent) as K[]).forEach((k) => {\n listeners[k] = (evt: Event) => {\n const pe = evt as PointerEvent; // safe – we only attach to pointer*\n active?.[k]?.(toPos(pe, element), pe);\n /* if you need to stop default behaviour when no handler is active:\n * if (!active?.[k]) pe.preventDefault(); */\n };\n element.addEventListener(domEvent[k], listeners[k]!);\n });\n\n /* ------------------------------------------------------------------ */\n /* teardown */\n /* ------------------------------------------------------------------ */\n return () => {\n (Object.keys(domEvent) as K[]).forEach((k) =>\n element.removeEventListener(domEvent[k], listeners[k]!),\n );\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","import { ReactNode, useEffect, useRef } from 'react';\nimport { Position } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n pageIndex: number;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n pageIndex,\n children,\n convertEventToPoint,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', pageIndex },\n ref.current,\n convertEventToPoint,\n );\n }, [cap, pageIndex, convertEventToPoint]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }} />\n )}\n </div>\n );\n};\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime"]}
@@ -0,0 +1,42 @@
1
+ import * as _embedpdf_plugin_interaction_manager from '@embedpdf/plugin-interaction-manager';
2
+ import { InteractionManagerPlugin, PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { ReactNode } from 'react';
5
+ import { Position } from '@embedpdf/models';
6
+
7
+ declare const useInteractionManager: () => {
8
+ plugin: InteractionManagerPlugin | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
12
+ declare const useInteractionManagerCapability: () => {
13
+ provides: Readonly<_embedpdf_plugin_interaction_manager.InteractionManagerCapability> | null;
14
+ isLoading: boolean;
15
+ ready: Promise<void>;
16
+ };
17
+ declare function useCursor(): {
18
+ setCursor: (token: string, cursor: string, prio?: number) => void;
19
+ removeCursor: (token: string) => void;
20
+ };
21
+ interface UsePointerHandlersOptions {
22
+ modeId?: string;
23
+ pageIndex?: number;
24
+ }
25
+ declare function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions): {
26
+ register: (handlers: PointerEventHandlers) => (() => void) | undefined;
27
+ };
28
+ declare function useIsPageExclusive(): boolean;
29
+
30
+ interface GlobalPointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {
31
+ children: ReactNode;
32
+ }
33
+ declare const GlobalPointerProvider: ({ children, ...props }: GlobalPointerProviderProps) => react_jsx_runtime.JSX.Element;
34
+
35
+ interface PagePointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {
36
+ children: ReactNode;
37
+ pageIndex: number;
38
+ convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;
39
+ }
40
+ declare const PagePointerProvider: ({ pageIndex, children, convertEventToPoint, ...props }: PagePointerProviderProps) => react_jsx_runtime.JSX.Element;
41
+
42
+ export { GlobalPointerProvider, PagePointerProvider, useCursor, useInteractionManager, useInteractionManagerCapability, useIsPageExclusive, usePointerHandlers };
@@ -0,0 +1,42 @@
1
+ import * as _embedpdf_plugin_interaction_manager from '@embedpdf/plugin-interaction-manager';
2
+ import { InteractionManagerPlugin, PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { ReactNode } from 'react';
5
+ import { Position } from '@embedpdf/models';
6
+
7
+ declare const useInteractionManager: () => {
8
+ plugin: InteractionManagerPlugin | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
12
+ declare const useInteractionManagerCapability: () => {
13
+ provides: Readonly<_embedpdf_plugin_interaction_manager.InteractionManagerCapability> | null;
14
+ isLoading: boolean;
15
+ ready: Promise<void>;
16
+ };
17
+ declare function useCursor(): {
18
+ setCursor: (token: string, cursor: string, prio?: number) => void;
19
+ removeCursor: (token: string) => void;
20
+ };
21
+ interface UsePointerHandlersOptions {
22
+ modeId?: string;
23
+ pageIndex?: number;
24
+ }
25
+ declare function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions): {
26
+ register: (handlers: PointerEventHandlers) => (() => void) | undefined;
27
+ };
28
+ declare function useIsPageExclusive(): boolean;
29
+
30
+ interface GlobalPointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {
31
+ children: ReactNode;
32
+ }
33
+ declare const GlobalPointerProvider: ({ children, ...props }: GlobalPointerProviderProps) => react_jsx_runtime.JSX.Element;
34
+
35
+ interface PagePointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {
36
+ children: ReactNode;
37
+ pageIndex: number;
38
+ convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;
39
+ }
40
+ declare const PagePointerProvider: ({ pageIndex, children, convertEventToPoint, ...props }: PagePointerProviderProps) => react_jsx_runtime.JSX.Element;
41
+
42
+ export { GlobalPointerProvider, PagePointerProvider, useCursor, useInteractionManager, useInteractionManagerCapability, useIsPageExclusive, usePointerHandlers };
@@ -0,0 +1,97 @@
1
+ import {
2
+ createPointerProvider
3
+ } from "../chunk-EJ7FVBFM.js";
4
+
5
+ // src/react/hooks/use-interaction-manager.ts
6
+ import { useCapability, usePlugin } from "@embedpdf/core/react";
7
+ import {
8
+ InteractionManagerPlugin
9
+ } from "@embedpdf/plugin-interaction-manager";
10
+ import { useState, useEffect } from "react";
11
+ var useInteractionManager = () => usePlugin(InteractionManagerPlugin.id);
12
+ var useInteractionManagerCapability = () => useCapability(InteractionManagerPlugin.id);
13
+ function useCursor() {
14
+ const { provides } = useInteractionManagerCapability();
15
+ return {
16
+ setCursor: (token, cursor, prio = 0) => {
17
+ provides?.setCursor(token, cursor, prio);
18
+ },
19
+ removeCursor: (token) => {
20
+ provides?.removeCursor(token);
21
+ }
22
+ };
23
+ }
24
+ function usePointerHandlers({ modeId, pageIndex }) {
25
+ const { provides } = useInteractionManagerCapability();
26
+ return {
27
+ register: modeId ? (handlers) => provides?.registerHandlers({ modeId, handlers, pageIndex }) : (handlers) => provides?.registerAlways({
28
+ scope: pageIndex !== void 0 ? { type: "page", pageIndex } : { type: "global" },
29
+ handlers
30
+ })
31
+ };
32
+ }
33
+ function useIsPageExclusive() {
34
+ const { provides: cap } = useInteractionManagerCapability();
35
+ const [isPageExclusive, setIsPageExclusive] = useState(() => {
36
+ const m = cap?.getActiveInteractionMode();
37
+ return m?.scope === "page" && !!m.exclusive;
38
+ });
39
+ useEffect(() => {
40
+ if (!cap) return;
41
+ return cap.onModeChange(() => {
42
+ const mode = cap.getActiveInteractionMode();
43
+ setIsPageExclusive(mode?.scope === "page" && !!mode?.exclusive);
44
+ });
45
+ }, [cap]);
46
+ return isPageExclusive;
47
+ }
48
+
49
+ // src/react/components/global-pointer-provider.tsx
50
+ import { useEffect as useEffect2, useRef } from "react";
51
+ import { jsx } from "react/jsx-runtime";
52
+ var GlobalPointerProvider = ({ children, ...props }) => {
53
+ const ref = useRef(null);
54
+ const { provides: cap } = useInteractionManagerCapability();
55
+ useEffect2(() => {
56
+ if (!cap || !ref.current) return;
57
+ return createPointerProvider(cap, { type: "global" }, ref.current);
58
+ }, [cap]);
59
+ return /* @__PURE__ */ jsx("div", { ref, ...props, children });
60
+ };
61
+
62
+ // src/react/components/page-pointer-provider.tsx
63
+ import { useEffect as useEffect3, useRef as useRef2 } from "react";
64
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
65
+ var PagePointerProvider = ({
66
+ pageIndex,
67
+ children,
68
+ convertEventToPoint,
69
+ ...props
70
+ }) => {
71
+ const ref = useRef2(null);
72
+ const { provides: cap } = useInteractionManagerCapability();
73
+ const isPageExclusive = useIsPageExclusive();
74
+ useEffect3(() => {
75
+ if (!cap || !ref.current) return;
76
+ return createPointerProvider(
77
+ cap,
78
+ { type: "page", pageIndex },
79
+ ref.current,
80
+ convertEventToPoint
81
+ );
82
+ }, [cap, pageIndex, convertEventToPoint]);
83
+ return /* @__PURE__ */ jsxs("div", { ref, ...props, children: [
84
+ children,
85
+ isPageExclusive && /* @__PURE__ */ jsx2("div", { style: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0 } })
86
+ ] });
87
+ };
88
+ export {
89
+ GlobalPointerProvider,
90
+ PagePointerProvider,
91
+ useCursor,
92
+ useInteractionManager,
93
+ useInteractionManagerCapability,
94
+ useIsPageExclusive,
95
+ usePointerHandlers
96
+ };
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/hooks/use-interaction-manager.ts","../../src/react/components/global-pointer-provider.tsx","../../src/react/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/react';\nimport {\n InteractionManagerPlugin,\n PointerEventHandlers,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from 'react';\n\nexport const useInteractionManager = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useCursor() {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n provides?.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n provides?.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string;\n pageIndex?: number;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOptions) {\n const { provides } = useInteractionManagerCapability();\n return {\n register: modeId\n ? (handlers: PointerEventHandlers) =>\n provides?.registerHandlers({ modeId, handlers, pageIndex })\n : (handlers: PointerEventHandlers) =>\n provides?.registerAlways({\n scope: pageIndex !== undefined ? { type: 'page', pageIndex } : { type: 'global' },\n handlers,\n }),\n };\n}\n\nexport function useIsPageExclusive() {\n const { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n const m = cap?.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n return cap.onModeChange(() => {\n const mode = cap.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap]);\n\n return isPageExclusive;\n}\n","import { ReactNode, useEffect, useRef } from 'react';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nexport const GlobalPointerProvider = ({ children, ...props }: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global' }, ref.current);\n }, [cap]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n </div>\n );\n};\n","import { ReactNode, useEffect, useRef } from 'react';\nimport { Position } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n pageIndex: number;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n pageIndex,\n children,\n convertEventToPoint,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', pageIndex },\n ref.current,\n convertEventToPoint,\n );\n }, [cap, pageIndex, convertEventToPoint]);\n\n return (\n <div ref={ref} {...props}>\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }} />\n )}\n </div>\n );\n};\n"],"mappings":";;;;;AAAA,SAAS,eAAe,iBAAiB;AACzC;AAAA,EACE;AAAA,OAEK;AACP,SAAS,UAAU,iBAAiB;AAE7B,IAAM,wBAAwB,MACnC,UAAoC,yBAAyB,EAAE;AAC1D,IAAM,kCAAkC,MAC7C,cAAwC,yBAAyB,EAAE;AAE9D,SAAS,YAAY;AAC1B,QAAM,EAAE,SAAS,IAAI,gCAAgC;AACrD,SAAO;AAAA,IACL,WAAW,CAAC,OAAe,QAAgB,OAAO,MAAM;AACtD,gBAAU,UAAU,OAAO,QAAQ,IAAI;AAAA,IACzC;AAAA,IACA,cAAc,CAAC,UAAkB;AAC/B,gBAAU,aAAa,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAOO,SAAS,mBAAmB,EAAE,QAAQ,UAAU,GAA8B;AACnF,QAAM,EAAE,SAAS,IAAI,gCAAgC;AACrD,SAAO;AAAA,IACL,UAAU,SACN,CAAC,aACC,UAAU,iBAAiB,EAAE,QAAQ,UAAU,UAAU,CAAC,IAC5D,CAAC,aACC,UAAU,eAAe;AAAA,MACvB,OAAO,cAAc,SAAY,EAAE,MAAM,QAAQ,UAAU,IAAI,EAAE,MAAM,SAAS;AAAA,MAChF;AAAA,IACF,CAAC;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB;AACnC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkB,MAAM;AACpE,UAAM,IAAI,KAAK,yBAAyB;AACxC,WAAO,GAAG,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,EACpC,CAAC;AAED,YAAU,MAAM;AACd,QAAI,CAAC,IAAK;AAEV,WAAO,IAAI,aAAa,MAAM;AAC5B,YAAM,OAAO,IAAI,yBAAyB;AAC1C,yBAAmB,MAAM,UAAU,UAAU,CAAC,CAAC,MAAM,SAAS;AAAA,IAChE,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AACT;;;AC7DA,SAAoB,aAAAA,YAAW,cAAc;AAoBzC;AAXG,IAAM,wBAAwB,CAAC,EAAE,UAAU,GAAG,MAAM,MAAkC;AAC3F,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAO,CAAC,IAAI,QAAS;AAE1B,WAAO,sBAAsB,KAAK,EAAE,MAAM,SAAS,GAAG,IAAI,OAAO;AAAA,EACnE,GAAG,CAAC,GAAG,CAAC;AAER,SACE,oBAAC,SAAI,KAAW,GAAG,OAChB,UACH;AAEJ;;;ACxBA,SAAoB,aAAAC,YAAW,UAAAC,eAAc;AAkCzC,SAGI,OAAAC,MAHJ;AAtBG,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,MAAMC,QAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAC1D,QAAM,kBAAkB,mBAAmB;AAE3C,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAO,CAAC,IAAI,QAAS;AAE1B,WAAO;AAAA,MACL;AAAA,MACA,EAAE,MAAM,QAAQ,UAAU;AAAA,MAC1B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,WAAW,mBAAmB,CAAC;AAExC,SACE,qBAAC,SAAI,KAAW,GAAG,OAChB;AAAA;AAAA,IACA,mBACC,gBAAAF,KAAC,SAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG;AAAA,KAEhF;AAEJ;","names":["useEffect","useEffect","useEffect","useRef","jsx","useRef","useEffect"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@embedpdf/plugin-interaction-manager",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ },
14
+ "./preact": {
15
+ "types": "./dist/preact/index.d.ts",
16
+ "import": "./dist/preact/index.js",
17
+ "require": "./dist/preact/index.cjs"
18
+ },
19
+ "./react": {
20
+ "types": "./dist/react/index.d.ts",
21
+ "import": "./dist/react/index.js",
22
+ "require": "./dist/react/index.cjs"
23
+ }
24
+ },
25
+ "dependencies": {},
26
+ "devDependencies": {
27
+ "@types/react": "^18.2.0",
28
+ "tsup": "^8.0.0",
29
+ "typescript": "^5.0.0",
30
+ "@embedpdf/core": "1.0.0",
31
+ "@embedpdf/models": "1.0.0"
32
+ },
33
+ "peerDependencies": {
34
+ "react": ">=16.8.0",
35
+ "react-dom": ">=16.8.0",
36
+ "preact": "^10.26.4",
37
+ "@embedpdf/core": "1.0.0"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md"
42
+ ],
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/embedpdf/embed-pdf-viewer",
46
+ "directory": "packages/plugin-interaction-manager"
47
+ },
48
+ "homepage": "https://www.embedpdf.com/docs",
49
+ "bugs": {
50
+ "url": "https://github.com/embedpdf/embed-pdf-viewer/issues"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "scripts": {
56
+ "build": "PROJECT_CWD=$(pwd) pnpm -w p:build",
57
+ "build:watch": "PROJECT_CWD=$(pwd) pnpm -w p:build:watch",
58
+ "clean": "PROJECT_CWD=$(pwd) pnpm -w p:clean",
59
+ "lint": "PROJECT_CWD=$(pwd) pnpm -w p:lint",
60
+ "lint:fix": "PROJECT_CWD=$(pwd) pnpm -w p:lint:fix",
61
+ "typecheck": "PROJECT_CWD=$(pwd) pnpm -w p:typecheck"
62
+ }
63
+ }