@embedpdf/plugin-interaction-manager 1.0.1 → 1.0.2
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 +11 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/preact/index.cjs +83 -16
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.d.cts +14 -4
- package/dist/preact/index.d.ts +14 -4
- package/dist/preact/index.js +78 -11
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +76 -8
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +14 -4
- package/dist/react/index.d.ts +14 -4
- package/dist/react/index.js +77 -9
- package/dist/react/index.js.map +1 -1
- package/package.json +6 -5
package/dist/index.cjs
CHANGED
|
@@ -23,7 +23,9 @@ __export(index_exports, {
|
|
|
23
23
|
INTERACTION_MANAGER_PLUGIN_ID: () => INTERACTION_MANAGER_PLUGIN_ID,
|
|
24
24
|
InteractionManagerPlugin: () => InteractionManagerPlugin,
|
|
25
25
|
InteractionManagerPluginPackage: () => InteractionManagerPluginPackage,
|
|
26
|
-
|
|
26
|
+
initialState: () => initialState,
|
|
27
|
+
manifest: () => manifest,
|
|
28
|
+
reducer: () => reducer
|
|
27
29
|
});
|
|
28
30
|
module.exports = __toCommonJS(index_exports);
|
|
29
31
|
|
|
@@ -73,6 +75,7 @@ var InteractionManagerPlugin = class extends import_core.BasePlugin {
|
|
|
73
75
|
this.onModeChange$ = (0, import_core.createEmitter)();
|
|
74
76
|
this.onHandlerChange$ = (0, import_core.createEmitter)();
|
|
75
77
|
this.onCursorChange$ = (0, import_core.createEmitter)();
|
|
78
|
+
this.onStateChange$ = (0, import_core.createBehaviorEmitter)();
|
|
76
79
|
this.registerMode({
|
|
77
80
|
id: "default",
|
|
78
81
|
scope: "page",
|
|
@@ -88,6 +91,7 @@ var InteractionManagerPlugin = class extends import_core.BasePlugin {
|
|
|
88
91
|
onModeChange: this.onModeChange$.on,
|
|
89
92
|
onCursorChange: this.onCursorChange$.on,
|
|
90
93
|
onHandlerChange: this.onHandlerChange$.on,
|
|
94
|
+
onStateChange: this.onStateChange$.on,
|
|
91
95
|
getActiveMode: () => this.state.activeMode,
|
|
92
96
|
getActiveInteractionMode: () => this.getActiveInteractionMode(),
|
|
93
97
|
finish: () => this.activate("default"),
|
|
@@ -191,6 +195,9 @@ var InteractionManagerPlugin = class extends import_core.BasePlugin {
|
|
|
191
195
|
this.onCursorChange$.emit(top.cursor);
|
|
192
196
|
}
|
|
193
197
|
}
|
|
198
|
+
onStoreUpdated(_, newState) {
|
|
199
|
+
this.onStateChange$.emit(newState);
|
|
200
|
+
}
|
|
194
201
|
activeModeIsExclusive() {
|
|
195
202
|
const mode = this.modes.get(this.state.activeMode);
|
|
196
203
|
return !!mode?.exclusive;
|
|
@@ -255,6 +262,8 @@ var InteractionManagerPluginPackage = {
|
|
|
255
262
|
INTERACTION_MANAGER_PLUGIN_ID,
|
|
256
263
|
InteractionManagerPlugin,
|
|
257
264
|
InteractionManagerPluginPackage,
|
|
258
|
-
|
|
265
|
+
initialState,
|
|
266
|
+
manifest,
|
|
267
|
+
reducer
|
|
259
268
|
});
|
|
260
269
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import { BasePlugin, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport { activateMode, setCursor } from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlers>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper (only once per viewer) */\n global: HandlerSet;\n /** handlers that listen on a *specific* page wrapper */\n page: PageHandlerMap;\n}\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState\n> {\n static readonly id = 'interaction-manager' as const;\n\n private modes = new Map<string, InteractionMode>();\n private cursorClaims = new Map<string, CursorClaim>();\n private buckets = new Map<string, ModeBuckets>();\n\n private alwaysGlobal = new Set<PointerEventHandlers>();\n private alwaysPage = new Map<number, Set<PointerEventHandlers>>();\n\n private readonly onModeChange$ = createEmitter<InteractionManagerState>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<string>();\n\n constructor(id: string, registry: PluginRegistry) {\n super(id, registry);\n\n this.registerMode({\n id: 'default',\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n }\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {}\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n activate: (modeId: string) => this.activate(modeId),\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n getActiveMode: () => this.state.activeMode,\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n finish: () => this.activate('default'),\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setCursor: (token: string, cursor: string, priority = 0) =>\n this.setCursor(token, cursor, priority),\n removeCursor: (token: string) => this.removeCursor(token),\n getCurrentCursor: () => this.state.cursor,\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n };\n }\n\n private activate(mode: string) {\n if (!this.modes.has(mode)) {\n throw new Error(`[interaction] unknown mode '${mode}'`);\n }\n if (mode === this.state.activeMode) return;\n\n this.cursorClaims.clear(); // prevent cursor leaks\n\n this.dispatch(activateMode(mode));\n this.emitCursor();\n this.onModeChange$.emit({ ...this.state, activeMode: mode });\n }\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n if (!this.buckets.has(mode.id)) {\n this.buckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n\n /** ---------- pointer-handler handling ------------ */\n private registerHandlers({\n modeId,\n handlers,\n pageIndex,\n }: {\n modeId: string;\n handlers: PointerEventHandlers;\n pageIndex?: number;\n }): () => void {\n const bucket = this.buckets.get(modeId);\n if (!bucket) throw new Error(`unknown mode '${modeId}'`);\n if (pageIndex == null) {\n bucket.global.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => bucket.global.delete(handlers);\n }\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n this.alwaysGlobal.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => this.alwaysGlobal.delete(handlers);\n }\n const set = this.alwaysPage.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n this.alwaysPage.set(scope.pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n /** Returns the *merged* handler set that should be active for the given\n * provider (`global` wrapper or a single page wrapper).\n * – `alwaysGlobal` / `alwaysPage` are **always** active.\n * – Handlers that belong to the current mode are added on top **iff**\n * the mode’s own scope matches the provider’s scope. */\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const mode = this.modes.get(this.state.activeMode);\n if (!mode) return null;\n\n const bucket = this.buckets.get(mode.id);\n if (!bucket) return null;\n\n /** helper – merge two handler sets into one object (or `null` if both are empty) */\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n /* ───────────────────── GLOBAL PROVIDER ─────────────────────── */\n if (scope.type === 'global') {\n const modeSpecific =\n mode.scope === 'global' // only include mode handlers if the\n ? bucket.global // mode itself is global-scoped\n : new Set<PointerEventHandlers>();\n return mergeSets(this.alwaysGlobal, modeSpecific);\n }\n\n /* ─────────────────────── PAGE PROVIDER ──────────────────────── */\n const alwaysPageSet = this.alwaysPage.get(scope.pageIndex) ?? new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>(); // global-scoped mode → ignore page buckets\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n /** ---------- cursor handling --------------------- */\n private setCursor(token: string, cursor: string, priority = 0) {\n this.cursorClaims.set(token, { cursor, priority });\n this.emitCursor();\n }\n private removeCursor(token: string) {\n this.cursorClaims.delete(token);\n this.emitCursor();\n }\n\n private emitCursor() {\n /* pick highest priority claim, else mode baseline */\n const top = [...this.cursorClaims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(this.state.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== this.state.cursor) {\n this.dispatch(setCursor(top.cursor));\n this.onCursorChange$.emit(top.cursor);\n }\n }\n\n private activeModeIsExclusive(): boolean {\n const mode = this.modes.get(this.state.activeMode);\n return !!mode?.exclusive;\n }\n\n private getActiveInteractionMode(): InteractionMode | null {\n return this.modes.get(this.state.activeMode) ?? null;\n }\n\n // keep emitter clean\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n await super.destroy();\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { InteractionScope } from './types';\n\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\n\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: { mode: string };\n}\n\nexport const activateMode = (mode: string): ActivateModeAction => ({\n type: ACTIVATE_MODE,\n payload: { mode },\n});\n\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: { cursor: string };\n}\nexport const setCursor = (cursor: string): SetCursorAction => ({\n type: SET_CURSOR,\n payload: { cursor },\n});\n\nexport type InteractionManagerAction = ActivateModeAction | SetCursorAction;\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any) => {\n for (const h of list) h[k]?.(evt, nativeEvt);\n };\n }\n return out as PointerEventHandlers;\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { ACTIVATE_MODE, InteractionManagerAction, SET_CURSOR } from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'default',\n cursor: 'auto',\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case ACTIVATE_MODE:\n return {\n ...state,\n activeMode: action.payload.mode,\n };\n case SET_CURSOR:\n return {\n ...state,\n cursor: action.payload.cursor,\n };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport { activateMode, setCursor } from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlers>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper (only once per viewer) */\n global: HandlerSet;\n /** handlers that listen on a *specific* page wrapper */\n page: PageHandlerMap;\n}\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState\n> {\n static readonly id = 'interaction-manager' as const;\n\n private modes = new Map<string, InteractionMode>();\n private cursorClaims = new Map<string, CursorClaim>();\n private buckets = new Map<string, ModeBuckets>();\n\n private alwaysGlobal = new Set<PointerEventHandlers>();\n private alwaysPage = new Map<number, Set<PointerEventHandlers>>();\n\n private readonly onModeChange$ = createEmitter<InteractionManagerState>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<string>();\n private readonly onStateChange$ = createBehaviorEmitter<InteractionManagerState>();\n\n constructor(id: string, registry: PluginRegistry) {\n super(id, registry);\n\n this.registerMode({\n id: 'default',\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n }\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {}\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n activate: (modeId: string) => this.activate(modeId),\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n getActiveMode: () => this.state.activeMode,\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n finish: () => this.activate('default'),\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setCursor: (token: string, cursor: string, priority = 0) =>\n this.setCursor(token, cursor, priority),\n removeCursor: (token: string) => this.removeCursor(token),\n getCurrentCursor: () => this.state.cursor,\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n };\n }\n\n private activate(mode: string) {\n if (!this.modes.has(mode)) {\n throw new Error(`[interaction] unknown mode '${mode}'`);\n }\n if (mode === this.state.activeMode) return;\n\n this.cursorClaims.clear(); // prevent cursor leaks\n\n this.dispatch(activateMode(mode));\n this.emitCursor();\n this.onModeChange$.emit({ ...this.state, activeMode: mode });\n }\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n if (!this.buckets.has(mode.id)) {\n this.buckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n\n /** ---------- pointer-handler handling ------------ */\n private registerHandlers({\n modeId,\n handlers,\n pageIndex,\n }: {\n modeId: string;\n handlers: PointerEventHandlers;\n pageIndex?: number;\n }): () => void {\n const bucket = this.buckets.get(modeId);\n if (!bucket) throw new Error(`unknown mode '${modeId}'`);\n if (pageIndex == null) {\n bucket.global.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => bucket.global.delete(handlers);\n }\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n this.alwaysGlobal.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => this.alwaysGlobal.delete(handlers);\n }\n const set = this.alwaysPage.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n this.alwaysPage.set(scope.pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n /** Returns the *merged* handler set that should be active for the given\n * provider (`global` wrapper or a single page wrapper).\n * – `alwaysGlobal` / `alwaysPage` are **always** active.\n * – Handlers that belong to the current mode are added on top **iff**\n * the mode’s own scope matches the provider’s scope. */\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const mode = this.modes.get(this.state.activeMode);\n if (!mode) return null;\n\n const bucket = this.buckets.get(mode.id);\n if (!bucket) return null;\n\n /** helper – merge two handler sets into one object (or `null` if both are empty) */\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n /* ───────────────────── GLOBAL PROVIDER ─────────────────────── */\n if (scope.type === 'global') {\n const modeSpecific =\n mode.scope === 'global' // only include mode handlers if the\n ? bucket.global // mode itself is global-scoped\n : new Set<PointerEventHandlers>();\n return mergeSets(this.alwaysGlobal, modeSpecific);\n }\n\n /* ─────────────────────── PAGE PROVIDER ──────────────────────── */\n const alwaysPageSet = this.alwaysPage.get(scope.pageIndex) ?? new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>(); // global-scoped mode → ignore page buckets\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n /** ---------- cursor handling --------------------- */\n private setCursor(token: string, cursor: string, priority = 0) {\n this.cursorClaims.set(token, { cursor, priority });\n this.emitCursor();\n }\n private removeCursor(token: string) {\n this.cursorClaims.delete(token);\n this.emitCursor();\n }\n\n private emitCursor() {\n /* pick highest priority claim, else mode baseline */\n const top = [...this.cursorClaims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(this.state.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== this.state.cursor) {\n this.dispatch(setCursor(top.cursor));\n this.onCursorChange$.emit(top.cursor);\n }\n }\n\n override onStoreUpdated(_: InteractionManagerState, newState: InteractionManagerState): void {\n this.onStateChange$.emit(newState);\n }\n\n private activeModeIsExclusive(): boolean {\n const mode = this.modes.get(this.state.activeMode);\n return !!mode?.exclusive;\n }\n\n private getActiveInteractionMode(): InteractionMode | null {\n return this.modes.get(this.state.activeMode) ?? null;\n }\n\n // keep emitter clean\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n await super.destroy();\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { InteractionScope } from './types';\n\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\n\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: { mode: string };\n}\n\nexport const activateMode = (mode: string): ActivateModeAction => ({\n type: ACTIVATE_MODE,\n payload: { mode },\n});\n\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: { cursor: string };\n}\nexport const setCursor = (cursor: string): SetCursorAction => ({\n type: SET_CURSOR,\n payload: { cursor },\n});\n\nexport type InteractionManagerAction = ActivateModeAction | SetCursorAction;\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any) => {\n for (const h of list) h[k]?.(evt, nativeEvt);\n };\n }\n return out as PointerEventHandlers;\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { ACTIVATE_MODE, InteractionManagerAction, SET_CURSOR } from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'default',\n cursor: 'auto',\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case ACTIVATE_MODE:\n return {\n ...state,\n activeMode: action.payload.mode,\n };\n case SET_CURSOR:\n return {\n ...state,\n cursor: action.payload.cursor,\n };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BasePluginConfig, EventHook, BasePlugin, PluginRegistry, Action, PluginManifest, PluginPackage } from '@embedpdf/core';
|
|
1
|
+
import { BasePluginConfig, EventHook, BasePlugin, PluginRegistry, Action, PluginManifest, Reducer, PluginPackage } from '@embedpdf/core';
|
|
2
2
|
import { Position } from '@embedpdf/models';
|
|
3
3
|
|
|
4
4
|
interface InteractionManagerPluginConfig extends BasePluginConfig {
|
|
@@ -83,6 +83,8 @@ interface InteractionManagerCapability {
|
|
|
83
83
|
onCursorChange: EventHook<string>;
|
|
84
84
|
/** subscribe to handler changes */
|
|
85
85
|
onHandlerChange: EventHook<InteractionManagerState>;
|
|
86
|
+
/** subscribe to state changes */
|
|
87
|
+
onStateChange: EventHook<InteractionManagerState>;
|
|
86
88
|
/** framework helpers -------------------------------------------------------------- */
|
|
87
89
|
/** Returns the *merged* handler set for the current mode + given scope.
|
|
88
90
|
* Used by the PointerInteractionProvider inside each page / at the root. */
|
|
@@ -101,6 +103,7 @@ declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPlug
|
|
|
101
103
|
private readonly onModeChange$;
|
|
102
104
|
private readonly onHandlerChange$;
|
|
103
105
|
private readonly onCursorChange$;
|
|
106
|
+
private readonly onStateChange$;
|
|
104
107
|
constructor(id: string, registry: PluginRegistry);
|
|
105
108
|
initialize(_: InteractionManagerPluginConfig): Promise<void>;
|
|
106
109
|
protected buildCapability(): InteractionManagerCapability;
|
|
@@ -119,6 +122,7 @@ declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPlug
|
|
|
119
122
|
private setCursor;
|
|
120
123
|
private removeCursor;
|
|
121
124
|
private emitCursor;
|
|
125
|
+
onStoreUpdated(_: InteractionManagerState, newState: InteractionManagerState): void;
|
|
122
126
|
private activeModeIsExclusive;
|
|
123
127
|
private getActiveInteractionMode;
|
|
124
128
|
destroy(): Promise<void>;
|
|
@@ -143,6 +147,9 @@ type InteractionManagerAction = ActivateModeAction | SetCursorAction;
|
|
|
143
147
|
declare const INTERACTION_MANAGER_PLUGIN_ID = "interaction-manager";
|
|
144
148
|
declare const manifest: PluginManifest<InteractionManagerPluginConfig>;
|
|
145
149
|
|
|
150
|
+
declare const initialState: InteractionManagerState;
|
|
151
|
+
declare const reducer: Reducer<InteractionManagerState, InteractionManagerAction>;
|
|
152
|
+
|
|
146
153
|
declare const InteractionManagerPluginPackage: PluginPackage<InteractionManagerPlugin, InteractionManagerPluginConfig, InteractionManagerState, InteractionManagerAction>;
|
|
147
154
|
|
|
148
|
-
export { type EmbedPdfPointerEvent, INTERACTION_MANAGER_PLUGIN_ID, type InteractionManagerCapability, InteractionManagerPlugin, type InteractionManagerPluginConfig, InteractionManagerPluginPackage, type InteractionManagerState, type InteractionMode, type InteractionScope, type PointerEventHandlers, type RegisterAlwaysOptions, type RegisterHandlersOptions, manifest };
|
|
155
|
+
export { type EmbedPdfPointerEvent, INTERACTION_MANAGER_PLUGIN_ID, type InteractionManagerCapability, InteractionManagerPlugin, type InteractionManagerPluginConfig, InteractionManagerPluginPackage, type InteractionManagerState, type InteractionMode, type InteractionScope, type PointerEventHandlers, type RegisterAlwaysOptions, type RegisterHandlersOptions, initialState, manifest, reducer };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BasePluginConfig, EventHook, BasePlugin, PluginRegistry, Action, PluginManifest, PluginPackage } from '@embedpdf/core';
|
|
1
|
+
import { BasePluginConfig, EventHook, BasePlugin, PluginRegistry, Action, PluginManifest, Reducer, PluginPackage } from '@embedpdf/core';
|
|
2
2
|
import { Position } from '@embedpdf/models';
|
|
3
3
|
|
|
4
4
|
interface InteractionManagerPluginConfig extends BasePluginConfig {
|
|
@@ -83,6 +83,8 @@ interface InteractionManagerCapability {
|
|
|
83
83
|
onCursorChange: EventHook<string>;
|
|
84
84
|
/** subscribe to handler changes */
|
|
85
85
|
onHandlerChange: EventHook<InteractionManagerState>;
|
|
86
|
+
/** subscribe to state changes */
|
|
87
|
+
onStateChange: EventHook<InteractionManagerState>;
|
|
86
88
|
/** framework helpers -------------------------------------------------------------- */
|
|
87
89
|
/** Returns the *merged* handler set for the current mode + given scope.
|
|
88
90
|
* Used by the PointerInteractionProvider inside each page / at the root. */
|
|
@@ -101,6 +103,7 @@ declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPlug
|
|
|
101
103
|
private readonly onModeChange$;
|
|
102
104
|
private readonly onHandlerChange$;
|
|
103
105
|
private readonly onCursorChange$;
|
|
106
|
+
private readonly onStateChange$;
|
|
104
107
|
constructor(id: string, registry: PluginRegistry);
|
|
105
108
|
initialize(_: InteractionManagerPluginConfig): Promise<void>;
|
|
106
109
|
protected buildCapability(): InteractionManagerCapability;
|
|
@@ -119,6 +122,7 @@ declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPlug
|
|
|
119
122
|
private setCursor;
|
|
120
123
|
private removeCursor;
|
|
121
124
|
private emitCursor;
|
|
125
|
+
onStoreUpdated(_: InteractionManagerState, newState: InteractionManagerState): void;
|
|
122
126
|
private activeModeIsExclusive;
|
|
123
127
|
private getActiveInteractionMode;
|
|
124
128
|
destroy(): Promise<void>;
|
|
@@ -143,6 +147,9 @@ type InteractionManagerAction = ActivateModeAction | SetCursorAction;
|
|
|
143
147
|
declare const INTERACTION_MANAGER_PLUGIN_ID = "interaction-manager";
|
|
144
148
|
declare const manifest: PluginManifest<InteractionManagerPluginConfig>;
|
|
145
149
|
|
|
150
|
+
declare const initialState: InteractionManagerState;
|
|
151
|
+
declare const reducer: Reducer<InteractionManagerState, InteractionManagerAction>;
|
|
152
|
+
|
|
146
153
|
declare const InteractionManagerPluginPackage: PluginPackage<InteractionManagerPlugin, InteractionManagerPluginConfig, InteractionManagerState, InteractionManagerAction>;
|
|
147
154
|
|
|
148
|
-
export { type EmbedPdfPointerEvent, INTERACTION_MANAGER_PLUGIN_ID, type InteractionManagerCapability, InteractionManagerPlugin, type InteractionManagerPluginConfig, InteractionManagerPluginPackage, type InteractionManagerState, type InteractionMode, type InteractionScope, type PointerEventHandlers, type RegisterAlwaysOptions, type RegisterHandlersOptions, manifest };
|
|
155
|
+
export { type EmbedPdfPointerEvent, INTERACTION_MANAGER_PLUGIN_ID, type InteractionManagerCapability, InteractionManagerPlugin, type InteractionManagerPluginConfig, InteractionManagerPluginPackage, type InteractionManagerState, type InteractionMode, type InteractionScope, type PointerEventHandlers, type RegisterAlwaysOptions, type RegisterHandlersOptions, initialState, manifest, reducer };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/lib/interaction-manager-plugin.ts
|
|
2
|
-
import { BasePlugin, createEmitter } from "@embedpdf/core";
|
|
2
|
+
import { BasePlugin, createBehaviorEmitter, createEmitter } from "@embedpdf/core";
|
|
3
3
|
|
|
4
4
|
// src/lib/actions.ts
|
|
5
5
|
var ACTIVATE_MODE = "INTERACTION/ACTIVATE_MODE";
|
|
@@ -44,6 +44,7 @@ var InteractionManagerPlugin = class extends BasePlugin {
|
|
|
44
44
|
this.onModeChange$ = createEmitter();
|
|
45
45
|
this.onHandlerChange$ = createEmitter();
|
|
46
46
|
this.onCursorChange$ = createEmitter();
|
|
47
|
+
this.onStateChange$ = createBehaviorEmitter();
|
|
47
48
|
this.registerMode({
|
|
48
49
|
id: "default",
|
|
49
50
|
scope: "page",
|
|
@@ -59,6 +60,7 @@ var InteractionManagerPlugin = class extends BasePlugin {
|
|
|
59
60
|
onModeChange: this.onModeChange$.on,
|
|
60
61
|
onCursorChange: this.onCursorChange$.on,
|
|
61
62
|
onHandlerChange: this.onHandlerChange$.on,
|
|
63
|
+
onStateChange: this.onStateChange$.on,
|
|
62
64
|
getActiveMode: () => this.state.activeMode,
|
|
63
65
|
getActiveInteractionMode: () => this.getActiveInteractionMode(),
|
|
64
66
|
finish: () => this.activate("default"),
|
|
@@ -162,6 +164,9 @@ var InteractionManagerPlugin = class extends BasePlugin {
|
|
|
162
164
|
this.onCursorChange$.emit(top.cursor);
|
|
163
165
|
}
|
|
164
166
|
}
|
|
167
|
+
onStoreUpdated(_, newState) {
|
|
168
|
+
this.onStateChange$.emit(newState);
|
|
169
|
+
}
|
|
165
170
|
activeModeIsExclusive() {
|
|
166
171
|
const mode = this.modes.get(this.state.activeMode);
|
|
167
172
|
return !!mode?.exclusive;
|
|
@@ -225,6 +230,8 @@ export {
|
|
|
225
230
|
INTERACTION_MANAGER_PLUGIN_ID,
|
|
226
231
|
InteractionManagerPlugin,
|
|
227
232
|
InteractionManagerPluginPackage,
|
|
228
|
-
|
|
233
|
+
initialState,
|
|
234
|
+
manifest,
|
|
235
|
+
reducer
|
|
229
236
|
};
|
|
230
237
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/interaction-manager-plugin.ts","../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePlugin, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport { activateMode, setCursor } from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlers>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper (only once per viewer) */\n global: HandlerSet;\n /** handlers that listen on a *specific* page wrapper */\n page: PageHandlerMap;\n}\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState\n> {\n static readonly id = 'interaction-manager' as const;\n\n private modes = new Map<string, InteractionMode>();\n private cursorClaims = new Map<string, CursorClaim>();\n private buckets = new Map<string, ModeBuckets>();\n\n private alwaysGlobal = new Set<PointerEventHandlers>();\n private alwaysPage = new Map<number, Set<PointerEventHandlers>>();\n\n private readonly onModeChange$ = createEmitter<InteractionManagerState>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<string>();\n\n constructor(id: string, registry: PluginRegistry) {\n super(id, registry);\n\n this.registerMode({\n id: 'default',\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n }\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {}\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n activate: (modeId: string) => this.activate(modeId),\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n getActiveMode: () => this.state.activeMode,\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n finish: () => this.activate('default'),\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setCursor: (token: string, cursor: string, priority = 0) =>\n this.setCursor(token, cursor, priority),\n removeCursor: (token: string) => this.removeCursor(token),\n getCurrentCursor: () => this.state.cursor,\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n };\n }\n\n private activate(mode: string) {\n if (!this.modes.has(mode)) {\n throw new Error(`[interaction] unknown mode '${mode}'`);\n }\n if (mode === this.state.activeMode) return;\n\n this.cursorClaims.clear(); // prevent cursor leaks\n\n this.dispatch(activateMode(mode));\n this.emitCursor();\n this.onModeChange$.emit({ ...this.state, activeMode: mode });\n }\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n if (!this.buckets.has(mode.id)) {\n this.buckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n\n /** ---------- pointer-handler handling ------------ */\n private registerHandlers({\n modeId,\n handlers,\n pageIndex,\n }: {\n modeId: string;\n handlers: PointerEventHandlers;\n pageIndex?: number;\n }): () => void {\n const bucket = this.buckets.get(modeId);\n if (!bucket) throw new Error(`unknown mode '${modeId}'`);\n if (pageIndex == null) {\n bucket.global.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => bucket.global.delete(handlers);\n }\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n this.alwaysGlobal.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => this.alwaysGlobal.delete(handlers);\n }\n const set = this.alwaysPage.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n this.alwaysPage.set(scope.pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n /** Returns the *merged* handler set that should be active for the given\n * provider (`global` wrapper or a single page wrapper).\n * – `alwaysGlobal` / `alwaysPage` are **always** active.\n * – Handlers that belong to the current mode are added on top **iff**\n * the mode’s own scope matches the provider’s scope. */\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const mode = this.modes.get(this.state.activeMode);\n if (!mode) return null;\n\n const bucket = this.buckets.get(mode.id);\n if (!bucket) return null;\n\n /** helper – merge two handler sets into one object (or `null` if both are empty) */\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n /* ───────────────────── GLOBAL PROVIDER ─────────────────────── */\n if (scope.type === 'global') {\n const modeSpecific =\n mode.scope === 'global' // only include mode handlers if the\n ? bucket.global // mode itself is global-scoped\n : new Set<PointerEventHandlers>();\n return mergeSets(this.alwaysGlobal, modeSpecific);\n }\n\n /* ─────────────────────── PAGE PROVIDER ──────────────────────── */\n const alwaysPageSet = this.alwaysPage.get(scope.pageIndex) ?? new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>(); // global-scoped mode → ignore page buckets\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n /** ---------- cursor handling --------------------- */\n private setCursor(token: string, cursor: string, priority = 0) {\n this.cursorClaims.set(token, { cursor, priority });\n this.emitCursor();\n }\n private removeCursor(token: string) {\n this.cursorClaims.delete(token);\n this.emitCursor();\n }\n\n private emitCursor() {\n /* pick highest priority claim, else mode baseline */\n const top = [...this.cursorClaims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(this.state.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== this.state.cursor) {\n this.dispatch(setCursor(top.cursor));\n this.onCursorChange$.emit(top.cursor);\n }\n }\n\n private activeModeIsExclusive(): boolean {\n const mode = this.modes.get(this.state.activeMode);\n return !!mode?.exclusive;\n }\n\n private getActiveInteractionMode(): InteractionMode | null {\n return this.modes.get(this.state.activeMode) ?? null;\n }\n\n // keep emitter clean\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n await super.destroy();\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { InteractionScope } from './types';\n\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\n\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: { mode: string };\n}\n\nexport const activateMode = (mode: string): ActivateModeAction => ({\n type: ACTIVATE_MODE,\n payload: { mode },\n});\n\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: { cursor: string };\n}\nexport const setCursor = (cursor: string): SetCursorAction => ({\n type: SET_CURSOR,\n payload: { cursor },\n});\n\nexport type InteractionManagerAction = ActivateModeAction | SetCursorAction;\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any) => {\n for (const h of list) h[k]?.(evt, nativeEvt);\n };\n }\n return out as PointerEventHandlers;\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { ACTIVATE_MODE, InteractionManagerAction, SET_CURSOR } from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'default',\n cursor: 'auto',\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case ACTIVATE_MODE:\n return {\n ...state,\n activeMode: action.payload.mode,\n };\n case SET_CURSOR:\n return {\n ...state,\n cursor: action.payload.cursor,\n };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/interaction-manager-plugin.ts","../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport { activateMode, setCursor } from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlers>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper (only once per viewer) */\n global: HandlerSet;\n /** handlers that listen on a *specific* page wrapper */\n page: PageHandlerMap;\n}\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState\n> {\n static readonly id = 'interaction-manager' as const;\n\n private modes = new Map<string, InteractionMode>();\n private cursorClaims = new Map<string, CursorClaim>();\n private buckets = new Map<string, ModeBuckets>();\n\n private alwaysGlobal = new Set<PointerEventHandlers>();\n private alwaysPage = new Map<number, Set<PointerEventHandlers>>();\n\n private readonly onModeChange$ = createEmitter<InteractionManagerState>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<string>();\n private readonly onStateChange$ = createBehaviorEmitter<InteractionManagerState>();\n\n constructor(id: string, registry: PluginRegistry) {\n super(id, registry);\n\n this.registerMode({\n id: 'default',\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n }\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {}\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n activate: (modeId: string) => this.activate(modeId),\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n getActiveMode: () => this.state.activeMode,\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n finish: () => this.activate('default'),\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setCursor: (token: string, cursor: string, priority = 0) =>\n this.setCursor(token, cursor, priority),\n removeCursor: (token: string) => this.removeCursor(token),\n getCurrentCursor: () => this.state.cursor,\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n };\n }\n\n private activate(mode: string) {\n if (!this.modes.has(mode)) {\n throw new Error(`[interaction] unknown mode '${mode}'`);\n }\n if (mode === this.state.activeMode) return;\n\n this.cursorClaims.clear(); // prevent cursor leaks\n\n this.dispatch(activateMode(mode));\n this.emitCursor();\n this.onModeChange$.emit({ ...this.state, activeMode: mode });\n }\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n if (!this.buckets.has(mode.id)) {\n this.buckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n\n /** ---------- pointer-handler handling ------------ */\n private registerHandlers({\n modeId,\n handlers,\n pageIndex,\n }: {\n modeId: string;\n handlers: PointerEventHandlers;\n pageIndex?: number;\n }): () => void {\n const bucket = this.buckets.get(modeId);\n if (!bucket) throw new Error(`unknown mode '${modeId}'`);\n if (pageIndex == null) {\n bucket.global.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => bucket.global.delete(handlers);\n }\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n this.alwaysGlobal.add(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n return () => this.alwaysGlobal.delete(handlers);\n }\n const set = this.alwaysPage.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n this.alwaysPage.set(scope.pageIndex, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n /** Returns the *merged* handler set that should be active for the given\n * provider (`global` wrapper or a single page wrapper).\n * – `alwaysGlobal` / `alwaysPage` are **always** active.\n * – Handlers that belong to the current mode are added on top **iff**\n * the mode’s own scope matches the provider’s scope. */\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const mode = this.modes.get(this.state.activeMode);\n if (!mode) return null;\n\n const bucket = this.buckets.get(mode.id);\n if (!bucket) return null;\n\n /** helper – merge two handler sets into one object (or `null` if both are empty) */\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n /* ───────────────────── GLOBAL PROVIDER ─────────────────────── */\n if (scope.type === 'global') {\n const modeSpecific =\n mode.scope === 'global' // only include mode handlers if the\n ? bucket.global // mode itself is global-scoped\n : new Set<PointerEventHandlers>();\n return mergeSets(this.alwaysGlobal, modeSpecific);\n }\n\n /* ─────────────────────── PAGE PROVIDER ──────────────────────── */\n const alwaysPageSet = this.alwaysPage.get(scope.pageIndex) ?? new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>(); // global-scoped mode → ignore page buckets\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n /** ---------- cursor handling --------------------- */\n private setCursor(token: string, cursor: string, priority = 0) {\n this.cursorClaims.set(token, { cursor, priority });\n this.emitCursor();\n }\n private removeCursor(token: string) {\n this.cursorClaims.delete(token);\n this.emitCursor();\n }\n\n private emitCursor() {\n /* pick highest priority claim, else mode baseline */\n const top = [...this.cursorClaims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(this.state.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== this.state.cursor) {\n this.dispatch(setCursor(top.cursor));\n this.onCursorChange$.emit(top.cursor);\n }\n }\n\n override onStoreUpdated(_: InteractionManagerState, newState: InteractionManagerState): void {\n this.onStateChange$.emit(newState);\n }\n\n private activeModeIsExclusive(): boolean {\n const mode = this.modes.get(this.state.activeMode);\n return !!mode?.exclusive;\n }\n\n private getActiveInteractionMode(): InteractionMode | null {\n return this.modes.get(this.state.activeMode) ?? null;\n }\n\n // keep emitter clean\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n await super.destroy();\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { InteractionScope } from './types';\n\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\n\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: { mode: string };\n}\n\nexport const activateMode = (mode: string): ActivateModeAction => ({\n type: ACTIVATE_MODE,\n payload: { mode },\n});\n\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: { cursor: string };\n}\nexport const setCursor = (cursor: string): SetCursorAction => ({\n type: SET_CURSOR,\n payload: { cursor },\n});\n\nexport type InteractionManagerAction = ActivateModeAction | SetCursorAction;\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any) => {\n for (const h of list) h[k]?.(evt, nativeEvt);\n };\n }\n return out as PointerEventHandlers;\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { ACTIVATE_MODE, InteractionManagerAction, SET_CURSOR } from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'default',\n cursor: 'auto',\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state,\n action,\n) => {\n switch (action.type) {\n case ACTIVATE_MODE:\n return {\n ...state,\n activeMode: action.payload.mode,\n };\n case SET_CURSOR:\n return {\n ...state,\n cursor: action.payload.cursor,\n };\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"mappings":"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","names":[]}
|
package/dist/preact/index.cjs
CHANGED
|
@@ -23,6 +23,7 @@ __export(preact_exports, {
|
|
|
23
23
|
GlobalPointerProvider: () => GlobalPointerProvider,
|
|
24
24
|
PagePointerProvider: () => PagePointerProvider,
|
|
25
25
|
useCursor: () => useCursor,
|
|
26
|
+
useInteractionManager: () => useInteractionManager,
|
|
26
27
|
useInteractionManagerCapability: () => useInteractionManagerCapability,
|
|
27
28
|
useInteractionManagerPlugin: () => useInteractionManagerPlugin,
|
|
28
29
|
useIsPageExclusive: () => useIsPageExclusive,
|
|
@@ -31,7 +32,7 @@ __export(preact_exports, {
|
|
|
31
32
|
module.exports = __toCommonJS(preact_exports);
|
|
32
33
|
|
|
33
34
|
// src/preact/components/global-pointer-provider.tsx
|
|
34
|
-
var
|
|
35
|
+
var import_hooks2 = require("preact/hooks");
|
|
35
36
|
|
|
36
37
|
// src/shared/utils.ts
|
|
37
38
|
function createPointerProvider(cap, scope, element, convertEventToPoint) {
|
|
@@ -95,9 +96,22 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
|
|
|
95
96
|
var import_preact = require("@embedpdf/core/preact");
|
|
96
97
|
var import_plugin_interaction_manager = require("@embedpdf/plugin-interaction-manager");
|
|
97
98
|
var import_hooks = require("preact/hooks");
|
|
98
|
-
var import_hooks2 = require("preact/hooks");
|
|
99
99
|
var useInteractionManagerPlugin = () => (0, import_preact.usePlugin)(import_plugin_interaction_manager.InteractionManagerPlugin.id);
|
|
100
100
|
var useInteractionManagerCapability = () => (0, import_preact.useCapability)(import_plugin_interaction_manager.InteractionManagerPlugin.id);
|
|
101
|
+
function useInteractionManager() {
|
|
102
|
+
const { provides } = useInteractionManagerCapability();
|
|
103
|
+
const [state, setState] = (0, import_hooks.useState)(import_plugin_interaction_manager.initialState);
|
|
104
|
+
(0, import_hooks.useEffect)(() => {
|
|
105
|
+
if (!provides) return;
|
|
106
|
+
return provides.onStateChange((state2) => {
|
|
107
|
+
setState(state2);
|
|
108
|
+
});
|
|
109
|
+
}, [provides]);
|
|
110
|
+
return {
|
|
111
|
+
provides,
|
|
112
|
+
state
|
|
113
|
+
};
|
|
114
|
+
}
|
|
101
115
|
function useCursor() {
|
|
102
116
|
const { provides } = useInteractionManagerCapability();
|
|
103
117
|
return {
|
|
@@ -124,7 +138,7 @@ function useIsPageExclusive() {
|
|
|
124
138
|
const m = cap?.getActiveInteractionMode();
|
|
125
139
|
return m?.scope === "page" && !!m.exclusive;
|
|
126
140
|
});
|
|
127
|
-
(0,
|
|
141
|
+
(0, import_hooks.useEffect)(() => {
|
|
128
142
|
if (!cap) return;
|
|
129
143
|
return cap.onModeChange(() => {
|
|
130
144
|
const mode = cap.getActiveInteractionMode();
|
|
@@ -136,47 +150,100 @@ function useIsPageExclusive() {
|
|
|
136
150
|
|
|
137
151
|
// src/preact/components/global-pointer-provider.tsx
|
|
138
152
|
var import_jsx_runtime = require("preact/jsx-runtime");
|
|
139
|
-
var GlobalPointerProvider = ({
|
|
140
|
-
|
|
153
|
+
var GlobalPointerProvider = ({
|
|
154
|
+
children,
|
|
155
|
+
style,
|
|
156
|
+
...props
|
|
157
|
+
}) => {
|
|
158
|
+
const ref = (0, import_hooks2.useRef)(null);
|
|
141
159
|
const { provides: cap } = useInteractionManagerCapability();
|
|
142
|
-
(0,
|
|
160
|
+
(0, import_hooks2.useEffect)(() => {
|
|
143
161
|
if (!cap || !ref.current) return;
|
|
144
162
|
return createPointerProvider(cap, { type: "global" }, ref.current);
|
|
145
163
|
}, [cap]);
|
|
146
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
164
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
165
|
+
"div",
|
|
166
|
+
{
|
|
167
|
+
ref,
|
|
168
|
+
style: {
|
|
169
|
+
width: "100%",
|
|
170
|
+
height: "100%",
|
|
171
|
+
...style
|
|
172
|
+
},
|
|
173
|
+
...props,
|
|
174
|
+
children
|
|
175
|
+
}
|
|
176
|
+
);
|
|
147
177
|
};
|
|
148
178
|
|
|
149
179
|
// src/preact/components/page-pointer-provider.tsx
|
|
150
|
-
var
|
|
180
|
+
var import_hooks4 = require("preact/hooks");
|
|
181
|
+
var import_models = require("@embedpdf/models");
|
|
151
182
|
var import_jsx_runtime2 = require("preact/jsx-runtime");
|
|
152
183
|
var PagePointerProvider = ({
|
|
153
184
|
pageIndex,
|
|
154
185
|
children,
|
|
186
|
+
pageWidth,
|
|
187
|
+
pageHeight,
|
|
188
|
+
rotation,
|
|
189
|
+
scale,
|
|
155
190
|
convertEventToPoint,
|
|
191
|
+
style,
|
|
156
192
|
...props
|
|
157
193
|
}) => {
|
|
158
|
-
const ref = (0,
|
|
194
|
+
const ref = (0, import_hooks4.useRef)(null);
|
|
159
195
|
const { provides: cap } = useInteractionManagerCapability();
|
|
160
196
|
const isPageExclusive = useIsPageExclusive();
|
|
161
|
-
(0,
|
|
197
|
+
const defaultConvertEventToPoint = (0, import_hooks4.useCallback)(
|
|
198
|
+
(event, element) => {
|
|
199
|
+
const rect = element.getBoundingClientRect();
|
|
200
|
+
const displayPoint = {
|
|
201
|
+
x: event.clientX - rect.left,
|
|
202
|
+
y: event.clientY - rect.top
|
|
203
|
+
};
|
|
204
|
+
return (0, import_models.restorePosition)(
|
|
205
|
+
{ width: pageWidth, height: pageHeight },
|
|
206
|
+
displayPoint,
|
|
207
|
+
rotation,
|
|
208
|
+
scale
|
|
209
|
+
);
|
|
210
|
+
},
|
|
211
|
+
[pageWidth, pageHeight, rotation, scale]
|
|
212
|
+
);
|
|
213
|
+
(0, import_hooks4.useEffect)(() => {
|
|
162
214
|
if (!cap || !ref.current) return;
|
|
163
215
|
return createPointerProvider(
|
|
164
216
|
cap,
|
|
165
217
|
{ type: "page", pageIndex },
|
|
166
218
|
ref.current,
|
|
167
|
-
convertEventToPoint
|
|
219
|
+
convertEventToPoint || defaultConvertEventToPoint
|
|
168
220
|
);
|
|
169
|
-
}, [cap, pageIndex, convertEventToPoint]);
|
|
170
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
221
|
+
}, [cap, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);
|
|
222
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
223
|
+
"div",
|
|
224
|
+
{
|
|
225
|
+
ref,
|
|
226
|
+
style: {
|
|
227
|
+
position: "absolute",
|
|
228
|
+
inset: 0,
|
|
229
|
+
mixBlendMode: "multiply",
|
|
230
|
+
isolation: "isolate",
|
|
231
|
+
...style
|
|
232
|
+
},
|
|
233
|
+
...props,
|
|
234
|
+
children: [
|
|
235
|
+
children,
|
|
236
|
+
isPageExclusive && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0 } })
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
);
|
|
174
240
|
};
|
|
175
241
|
// Annotate the CommonJS export names for ESM import in node:
|
|
176
242
|
0 && (module.exports = {
|
|
177
243
|
GlobalPointerProvider,
|
|
178
244
|
PagePointerProvider,
|
|
179
245
|
useCursor,
|
|
246
|
+
useInteractionManager,
|
|
180
247
|
useInteractionManagerCapability,
|
|
181
248
|
useInteractionManagerPlugin,
|
|
182
249
|
useIsPageExclusive,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preact/index.ts","../../src/preact/components/global-pointer-provider.tsx","../../src/shared/utils.ts","../../src/preact/hooks/use-interaction-manager.ts","../../src/preact/components/page-pointer-provider.tsx"],"sourcesContent":["export * from './components';\nexport * from './hooks';\n","/** @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 { 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 { 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 useInteractionManagerPlugin = () =>\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,gBAAkC;;;ACU3B,SAAS,sBACd,KACA,OACA,SACA,qBACA;AAIA,MAAI,SAAsC,IAAI,oBAAoB,KAAK;AAEvE,QAAM,WAAW,IAAI,aAAa,MAAM;AACtC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,OAAO,IAAI,yBAAyB;AAC1C,cAAQ,MAAM,SAAS,MAAM,UAAU,WAAY,KAAK,UAAU,SAAU;AAAA,IAC9E;AACA,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAED,QAAM,cAAc,IAAI,gBAAgB,MAAM;AAC5C,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAKD,QAAM,UAAU,IAAI,yBAAyB;AAC7C,QAAM,YAAY,IAAI,iBAAiB;AAGvC,MAAI,MAAM,SAAS,UAAU;AAE3B,YAAQ,MAAM,SAAS,SAAS,UAAU,WAAW,YAAY;AAAA,EACnE,OAAO;AAEL,YAAQ,MAAM,SAAS;AAAA,EACzB;AAEA,QAAM,aAAa,IAAI,eAAe,CAAC,MAAM;AAO3C,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,eAAe,IAAI,yBAAyB,GAAG,UAAU;AAC/D,UAAI,CAAC,aAAc;AAAA,IACrB;AACA,YAAQ,MAAM,SAAS;AAAA,EACzB,CAAC;AAMD,QAAM,WAAiD;AAAA,IACrD,eAAe;AAAA,IACf,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AAGA,QAAM,YAA+C,CAAC;AAEtD,QAAM,QAAQ,CAAC,GAAiB,SAAgC;AAC9D,QAAI,oBAAqB,QAAO,oBAAoB,GAAG,IAAI;AAC3D,UAAM,IAAI,KAAK,sBAAsB;AACrC,WAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,UAAU,EAAE,IAAI;AAAA,EACvD;AAEA,EAAC,OAAO,KAAK,QAAQ,EAAU,QAAQ,CAAC,MAAM;AAC5C,cAAU,CAAC,IAAI,CAAC,QAAe;AAC7B,YAAM,KAAK;AACX,eAAS,CAAC,IAAI,MAAM,IAAI,OAAO,GAAG,EAAE;AAAA,IAGtC;AACA,YAAQ,iBAAiB,SAAS,CAAC,GAAG,UAAU,CAAC,CAAE;AAAA,EACrD,CAAC;AAKD,SAAO,MAAM;AACX,IAAC,OAAO,KAAK,QAAQ,EAAU;AAAA,MAAQ,CAAC,MACtC,QAAQ,oBAAoB,SAAS,CAAC,GAAG,UAAU,CAAC,CAAE;AAAA,IACxD;AACA,aAAS;AACT,eAAW;AACX,gBAAY;AAAA,EACd;AACF;;;AC3GA,oBAAyC;AACzC,wCAGO;AACP,mBAAyB;AACzB,IAAAC,gBAA0B;AAEnB,IAAM,8BAA8B,UACzC,yBAAoC,2DAAyB,EAAE;AAC1D,IAAM,kCAAkC,UAC7C,6BAAwC,2DAAyB,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,QAAI,uBAAkB,MAAM;AACpE,UAAM,IAAI,KAAK,yBAAyB;AACxC,WAAO,GAAG,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,EACpC,CAAC;AAED,+BAAU,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;;;AFxCI;AAXG,IAAM,wBAAwB,CAAC,EAAE,UAAU,GAAG,MAAM,MAAkC;AAC3F,QAAM,UAAM,sBAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,+BAAU,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,4CAAC,SAAI,KAAW,GAAG,OAChB,UACH;AAEJ;;;AGxBA,IAAAC,gBAAkC;AAkC9B,IAAAC,sBAAA;AAtBG,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,UAAM,sBAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAC1D,QAAM,kBAAkB,mBAAmB;AAE3C,+BAAU,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,8CAAC,SAAI,KAAW,GAAG,OAChB;AAAA;AAAA,IACA,mBACC,6CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG;AAAA,KAEhF;AAEJ;","names":["import_hooks","import_hooks","import_hooks","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/preact/index.ts","../../src/preact/components/global-pointer-provider.tsx","../../src/shared/utils.ts","../../src/preact/hooks/use-interaction-manager.ts","../../src/preact/components/page-pointer-provider.tsx"],"sourcesContent":["export * from './components';\nexport * from './hooks';\n","/** @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 style?: JSX.CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n style,\n ...props\n}: 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\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\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 { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport {\n initialState,\n InteractionManagerPlugin,\n InteractionManagerState,\n PointerEventHandlers,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from 'preact/hooks';\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, setState] = useState<InteractionManagerState>(initialState);\n\n useEffect(() => {\n if (!provides) return;\n return provides.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides,\n state,\n };\n}\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 { useCallback, useEffect, useRef } from 'preact/hooks';\nimport { Position, restorePosition } 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 pageWidth: number;\n pageHeight: number;\n rotation: number;\n scale: number;\n style?: JSX.CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n pageIndex,\n children,\n pageWidth,\n pageHeight,\n rotation,\n scale,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive();\n\n const defaultConvertEventToPoint = useCallback(\n (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 return restorePosition(\n { width: pageWidth, height: pageHeight },\n displayPoint,\n rotation,\n scale,\n );\n },\n [pageWidth, pageHeight, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'absolute',\n inset: 0,\n mixBlendMode: 'multiply',\n isolation: 'isolate',\n ...style,\n }}\n {...props}\n >\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAA,gBAAkC;;;ACU3B,SAAS,sBACd,KACA,OACA,SACA,qBACA;AAIA,MAAI,SAAsC,IAAI,oBAAoB,KAAK;AAEvE,QAAM,WAAW,IAAI,aAAa,MAAM;AACtC,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,OAAO,IAAI,yBAAyB;AAC1C,cAAQ,MAAM,SAAS,MAAM,UAAU,WAAY,KAAK,UAAU,SAAU;AAAA,IAC9E;AACA,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAED,QAAM,cAAc,IAAI,gBAAgB,MAAM;AAC5C,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAKD,QAAM,UAAU,IAAI,yBAAyB;AAC7C,QAAM,YAAY,IAAI,iBAAiB;AAGvC,MAAI,MAAM,SAAS,UAAU;AAE3B,YAAQ,MAAM,SAAS,SAAS,UAAU,WAAW,YAAY;AAAA,EACnE,OAAO;AAEL,YAAQ,MAAM,SAAS;AAAA,EACzB;AAEA,QAAM,aAAa,IAAI,eAAe,CAAC,MAAM;AAO3C,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,eAAe,IAAI,yBAAyB,GAAG,UAAU;AAC/D,UAAI,CAAC,aAAc;AAAA,IACrB;AACA,YAAQ,MAAM,SAAS;AAAA,EACzB,CAAC;AAMD,QAAM,WAAiD;AAAA,IACrD,eAAe;AAAA,IACf,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AAGA,QAAM,YAA+C,CAAC;AAEtD,QAAM,QAAQ,CAAC,GAAiB,SAAgC;AAC9D,QAAI,oBAAqB,QAAO,oBAAoB,GAAG,IAAI;AAC3D,UAAM,IAAI,KAAK,sBAAsB;AACrC,WAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,UAAU,EAAE,IAAI;AAAA,EACvD;AAEA,EAAC,OAAO,KAAK,QAAQ,EAAU,QAAQ,CAAC,MAAM;AAC5C,cAAU,CAAC,IAAI,CAAC,QAAe;AAC7B,YAAM,KAAK;AACX,eAAS,CAAC,IAAI,MAAM,IAAI,OAAO,GAAG,EAAE;AAAA,IAGtC;AACA,YAAQ,iBAAiB,SAAS,CAAC,GAAG,UAAU,CAAC,CAAE;AAAA,EACrD,CAAC;AAKD,SAAO,MAAM;AACX,IAAC,OAAO,KAAK,QAAQ,EAAU;AAAA,MAAQ,CAAC,MACtC,QAAQ,oBAAoB,SAAS,CAAC,GAAG,UAAU,CAAC,CAAE;AAAA,IACxD;AACA,aAAS;AACT,eAAW;AACX,gBAAY;AAAA,EACd;AACF;;;AC3GA,oBAAyC;AACzC,wCAKO;AACP,mBAAoC;AAE7B,IAAM,8BAA8B,UACzC,yBAAoC,2DAAyB,EAAE;AAC1D,IAAM,kCAAkC,UAC7C,6BAAwC,2DAAyB,EAAE;AAE9D,SAAS,wBAAwB;AACtC,QAAM,EAAE,SAAS,IAAI,gCAAgC;AACrD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAkC,8CAAY;AAExE,8BAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,WAAO,SAAS,cAAc,CAACC,WAAU;AACvC,eAASA,MAAK;AAAA,IAChB,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,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,QAAI,uBAAkB,MAAM;AACpE,UAAM,IAAI,KAAK,yBAAyB;AACxC,WAAO,GAAG,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,EACpC,CAAC;AAED,8BAAU,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;;;AFrDI;AAfG,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,UAAM,sBAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAE1D,+BAAU,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;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AGrCA,IAAAC,gBAA+C;AAC/C,oBAA0C;AA4DtC,IAAAC,sBAAA;AA5CG,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,UAAM,sBAAuB,IAAI;AACvC,QAAM,EAAE,UAAU,IAAI,IAAI,gCAAgC;AAC1D,QAAM,kBAAkB,mBAAmB;AAE3C,QAAM,iCAA6B;AAAA,IACjC,CAAC,OAAqB,YAAmC;AACvD,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,eAAe;AAAA,QACnB,GAAG,MAAM,UAAU,KAAK;AAAA,QACxB,GAAG,MAAM,UAAU,KAAK;AAAA,MAC1B;AACA,iBAAO;AAAA,QACL,EAAE,OAAO,WAAW,QAAQ,WAAW;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,WAAW,YAAY,UAAU,KAAK;AAAA,EACzC;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,OAAO,CAAC,IAAI,QAAS;AAE1B,WAAO;AAAA,MACL;AAAA,MACA,EAAE,MAAM,QAAQ,UAAU;AAAA,MAC1B,IAAI;AAAA,MACJ,uBAAuB;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,KAAK,WAAW,qBAAqB,0BAA0B,CAAC;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,cAAc;AAAA,QACd,WAAW;AAAA,QACX,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,mBACC,6CAAC,SAAI,OAAO,EAAE,UAAU,YAAY,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG;AAAA;AAAA;AAAA,EAEhF;AAEJ;","names":["import_hooks","state","import_hooks","import_jsx_runtime"]}
|
package/dist/preact/index.d.cts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { JSX, ComponentChildren } from 'preact';
|
|
2
2
|
import { Position } from '@embedpdf/models';
|
|
3
3
|
import * as _embedpdf_plugin_interaction_manager from '@embedpdf/plugin-interaction-manager';
|
|
4
|
-
import { InteractionManagerPlugin, PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';
|
|
4
|
+
import { InteractionManagerPlugin, InteractionManagerState, PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';
|
|
5
5
|
|
|
6
6
|
/** @jsxImportSource preact */
|
|
7
7
|
|
|
8
8
|
interface GlobalPointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
9
9
|
children: ComponentChildren;
|
|
10
|
+
style?: JSX.CSSProperties;
|
|
10
11
|
}
|
|
11
|
-
declare const GlobalPointerProvider: ({ children, ...props }: GlobalPointerProviderProps) => JSX.Element;
|
|
12
|
+
declare const GlobalPointerProvider: ({ children, style, ...props }: GlobalPointerProviderProps) => JSX.Element;
|
|
12
13
|
|
|
13
14
|
/** @jsxImportSource preact */
|
|
14
15
|
|
|
15
16
|
interface PagePointerProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
16
17
|
children: ComponentChildren;
|
|
17
18
|
pageIndex: number;
|
|
19
|
+
pageWidth: number;
|
|
20
|
+
pageHeight: number;
|
|
21
|
+
rotation: number;
|
|
22
|
+
scale: number;
|
|
23
|
+
style?: JSX.CSSProperties;
|
|
18
24
|
convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;
|
|
19
25
|
}
|
|
20
|
-
declare const PagePointerProvider: ({ pageIndex, children, convertEventToPoint, ...props }: PagePointerProviderProps) => JSX.Element;
|
|
26
|
+
declare const PagePointerProvider: ({ pageIndex, children, pageWidth, pageHeight, rotation, scale, convertEventToPoint, style, ...props }: PagePointerProviderProps) => JSX.Element;
|
|
21
27
|
|
|
22
28
|
declare const useInteractionManagerPlugin: () => {
|
|
23
29
|
plugin: InteractionManagerPlugin | null;
|
|
@@ -29,6 +35,10 @@ declare const useInteractionManagerCapability: () => {
|
|
|
29
35
|
isLoading: boolean;
|
|
30
36
|
ready: Promise<void>;
|
|
31
37
|
};
|
|
38
|
+
declare function useInteractionManager(): {
|
|
39
|
+
provides: Readonly<_embedpdf_plugin_interaction_manager.InteractionManagerCapability> | null;
|
|
40
|
+
state: InteractionManagerState;
|
|
41
|
+
};
|
|
32
42
|
declare function useCursor(): {
|
|
33
43
|
setCursor: (token: string, cursor: string, prio?: number) => void;
|
|
34
44
|
removeCursor: (token: string) => void;
|
|
@@ -42,4 +52,4 @@ declare function usePointerHandlers({ modeId, pageIndex }: UsePointerHandlersOpt
|
|
|
42
52
|
};
|
|
43
53
|
declare function useIsPageExclusive(): boolean;
|
|
44
54
|
|
|
45
|
-
export { GlobalPointerProvider, PagePointerProvider, useCursor, useInteractionManagerCapability, useInteractionManagerPlugin, useIsPageExclusive, usePointerHandlers };
|
|
55
|
+
export { GlobalPointerProvider, PagePointerProvider, useCursor, useInteractionManager, useInteractionManagerCapability, useInteractionManagerPlugin, useIsPageExclusive, usePointerHandlers };
|