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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +456 -185
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +61 -36
  6. package/dist/lib/interaction-manager-plugin.d.ts +19 -14
  7. package/dist/lib/reducer.d.ts +2 -1
  8. package/dist/lib/types.d.ts +58 -50
  9. package/dist/preact/index.cjs +1 -1
  10. package/dist/preact/index.cjs.map +1 -1
  11. package/dist/preact/index.js +61 -40
  12. package/dist/preact/index.js.map +1 -1
  13. package/dist/react/index.cjs +1 -1
  14. package/dist/react/index.cjs.map +1 -1
  15. package/dist/react/index.js +61 -40
  16. package/dist/react/index.js.map +1 -1
  17. package/dist/shared/components/global-pointer-provider.d.ts +2 -1
  18. package/dist/shared/components/page-pointer-provider.d.ts +4 -5
  19. package/dist/shared/hooks/use-interaction-manager.d.ts +9 -7
  20. package/dist/shared-preact/components/global-pointer-provider.d.ts +2 -1
  21. package/dist/shared-preact/components/page-pointer-provider.d.ts +4 -5
  22. package/dist/shared-preact/hooks/use-interaction-manager.d.ts +9 -7
  23. package/dist/shared-react/components/global-pointer-provider.d.ts +2 -1
  24. package/dist/shared-react/components/page-pointer-provider.d.ts +4 -5
  25. package/dist/shared-react/hooks/use-interaction-manager.d.ts +9 -7
  26. package/dist/svelte/components/GlobalPointerProvider.svelte.d.ts +1 -0
  27. package/dist/svelte/components/PagePointerProvider.svelte.d.ts +4 -5
  28. package/dist/svelte/hooks/use-interaction-manager.svelte.d.ts +10 -8
  29. package/dist/svelte/index.cjs +1 -1
  30. package/dist/svelte/index.cjs.map +1 -1
  31. package/dist/svelte/index.js +128 -56
  32. package/dist/svelte/index.js.map +1 -1
  33. package/dist/vue/components/global-pointer-provider.vue.d.ts +6 -2
  34. package/dist/vue/components/page-pointer-provider.vue.d.ts +7 -7
  35. package/dist/vue/hooks/use-interaction-manager.d.ts +19 -26
  36. package/dist/vue/index.cjs +1 -1
  37. package/dist/vue/index.cjs.map +1 -1
  38. package/dist/vue/index.js +131 -63
  39. package/dist/vue/index.js.map +1 -1
  40. package/package.json +4 -4
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { InteractionExclusionRules } from './types';\n\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: { mode: string };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: { cursor: string };\n}\n\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport const setExclusionRules = (rules: InteractionExclusionRules): SetExclusionRulesAction => ({\n type: SET_EXCLUSION_RULES,\n payload: { rules },\n});\n\nexport const addExclusionClass = (className: string): AddExclusionClassAction => ({\n type: ADD_EXCLUSION_CLASS,\n payload: { className },\n});\n\nexport const removeExclusionClass = (className: string): RemoveExclusionClassAction => ({\n type: REMOVE_EXCLUSION_CLASS,\n payload: { className },\n});\n\nexport const addExclusionAttribute = (attribute: string): AddExclusionAttributeAction => ({\n type: ADD_EXCLUSION_ATTRIBUTE,\n payload: { attribute },\n});\n\nexport const removeExclusionAttribute = (attribute: string): RemoveExclusionAttributeAction => ({\n type: REMOVE_EXCLUSION_ATTRIBUTE,\n payload: { attribute },\n});\n\nexport const activateMode = (mode: string): ActivateModeAction => ({\n type: ACTIVATE_MODE,\n payload: { mode },\n});\n\nexport const setCursor = (cursor: string): SetCursorAction => ({\n type: SET_CURSOR,\n payload: { cursor },\n});\n\nexport const setDefaultMode = (mode: string): SetDefaultModeAction => ({\n type: SET_DEFAULT_MODE,\n payload: { mode },\n});\n\nexport const pauseInteraction = (): PauseInteractionAction => ({\n type: PAUSE_INTERACTION,\n});\n\nexport const resumeInteraction = (): ResumeInteractionAction => ({\n type: RESUME_INTERACTION,\n});\n\nexport type InteractionManagerAction =\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction;\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 'onMouseDown',\n 'onMouseUp',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseCancel',\n 'onClick',\n 'onDoubleClick',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any, modeId: string) => {\n for (const h of list) h[k]?.(evt, nativeEvt, modeId);\n };\n }\n return out as PointerEventHandlers;\n}\n","import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\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\nconst INITIAL_MODE = 'pointerMode';\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<PointerEventHandlersWithLifecycle>();\n private alwaysPage = new Map<number, Set<PointerEventHandlersWithLifecycle>>();\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, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.setDefaultMode(INITIAL_MODE);\n this.activate(INITIAL_MODE);\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\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 activateDefaultMode: () => this.activate(this.state.defaultMode),\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 pause: () => this.dispatch(pauseInteraction()),\n resume: () => this.dispatch(resumeInteraction()),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.state.paused,\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\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 const previousMode = this.state.activeMode;\n this.cursorClaims.clear(); // prevent cursor leaks\n\n this.notifyHandlersInactive(previousMode);\n\n this.dispatch(activateMode(mode));\n this.emitCursor();\n\n // Call lifecycle hooks for handlers going active\n this.notifyHandlersActive(mode);\n\n this.onModeChange$.emit({ ...this.state, activeMode: mode });\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private notifyHandlersActive(modeId: string) {\n this.alwaysGlobal.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const bucket = this.buckets.get(modeId);\n if (!bucket) return;\n\n // Notify global handlers if mode is global\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n // Notify page handlers if mode is page\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet, pageIndex) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(modeId: string) {\n this.alwaysGlobal.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const bucket = this.buckets.get(modeId);\n if (!bucket) return;\n\n // Notify global handlers if mode is global\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n // Notify page handlers if mode is page\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet, pageIndex) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\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({ modeId, handlers, pageIndex }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n for (const id of modeIds) {\n const bucket = this.buckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n // Create cleanup function for this specific mode\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n // Return a cleanup function that removes handlers from all registered modes\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\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 if (!this.state) return null;\n\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 { 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 exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n ACTIVATE_MODE,\n SET_DEFAULT_MODE,\n InteractionManagerAction,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'pointerMode',\n defaultMode: 'pointerMode',\n cursor: 'auto',\n paused: false,\n exclusionRules: {\n classes: [],\n dataAttributes: [],\n },\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 case PAUSE_INTERACTION:\n return {\n ...state,\n paused: true,\n };\n case RESUME_INTERACTION:\n return {\n ...state,\n paused: false,\n };\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ), // Remove duplicates\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\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, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { InteractionExclusionRules, InteractionDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_INTERACTION_STATE = 'INTERACTION/INIT_STATE';\nexport const CLEANUP_INTERACTION_STATE = 'INTERACTION/CLEANUP_STATE';\n\n// Per-document actions\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_ACTIVE_DOCUMENT = 'INTERACTION/SET_ACTIVE_DOCUMENT';\n\n// Global actions\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\n// Document lifecycle actions\nexport interface InitInteractionStateAction extends Action {\n type: typeof INIT_INTERACTION_STATE;\n payload: {\n documentId: string;\n state: InteractionDocumentState;\n };\n}\n\nexport interface CleanupInteractionStateAction extends Action {\n type: typeof CLEANUP_INTERACTION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: {\n documentId: string;\n mode: string;\n };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: {\n documentId: string;\n cursor: string;\n };\n}\n\n// Global actions\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport type InteractionManagerAction =\n | InitInteractionStateAction\n | CleanupInteractionStateAction\n | SetActiveDocumentAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction;\n\n// Action creators\nexport function initInteractionState(\n documentId: string,\n state: InteractionDocumentState,\n): InitInteractionStateAction {\n return { type: INIT_INTERACTION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupInteractionState(documentId: string): CleanupInteractionStateAction {\n return { type: CLEANUP_INTERACTION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function activateMode(documentId: string, mode: string): ActivateModeAction {\n return { type: ACTIVATE_MODE, payload: { documentId, mode } };\n}\n\nexport function pauseInteraction(documentId: string): PauseInteractionAction {\n return { type: PAUSE_INTERACTION, payload: documentId };\n}\n\nexport function resumeInteraction(documentId: string): ResumeInteractionAction {\n return { type: RESUME_INTERACTION, payload: documentId };\n}\n\nexport function setCursor(documentId: string, cursor: string): SetCursorAction {\n return { type: SET_CURSOR, payload: { documentId, cursor } };\n}\n\nexport function setDefaultMode(mode: string): SetDefaultModeAction {\n return { type: SET_DEFAULT_MODE, payload: { mode } };\n}\n\nexport function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction {\n return { type: SET_EXCLUSION_RULES, payload: { rules } };\n}\n\nexport function addExclusionClass(className: string): AddExclusionClassAction {\n return { type: ADD_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function removeExclusionClass(className: string): RemoveExclusionClassAction {\n return { type: REMOVE_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function addExclusionAttribute(attribute: string): AddExclusionAttributeAction {\n return { type: ADD_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n\nexport function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction {\n return { type: REMOVE_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\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 'onMouseDown',\n 'onMouseUp',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseCancel',\n 'onClick',\n 'onDoubleClick',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any, modeId: string) => {\n for (const h of list) h[k]?.(evt, nativeEvt, modeId);\n };\n }\n return out as PointerEventHandlers;\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n Listener,\n PluginRegistry,\n} from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n ModeChangeEvent,\n CursorChangeEvent,\n StateChangeEvent,\n InteractionDocumentState,\n InteractionManagerScope,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n cleanupInteractionState,\n initInteractionState,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n InteractionManagerAction,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper */\n global: HandlerSet;\n /** handlers that listen on a specific page wrapper */\n page: PageHandlerMap;\n}\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState,\n InteractionManagerAction\n> {\n static readonly id = 'interaction-manager' as const;\n\n // Global mode definitions (shared across documents)\n private modes = new Map<string, InteractionMode>();\n\n // Per-document cursor claims: documentId -> token -> claim\n private cursorClaims = new Map<string, Map<string, CursorClaim>>();\n\n // Per-document handler buckets: documentId -> modeId -> buckets\n private buckets = new Map<string, Map<string, ModeBuckets>>();\n\n // Per-document always-active handlers\n private alwaysGlobal = new Map<string, Set<PointerEventHandlersWithLifecycle>>();\n private alwaysPage = new Map<string, Map<number, Set<PointerEventHandlersWithLifecycle>>>();\n\n // Event emitters\n private readonly onModeChange$ = createEmitter<ModeChangeEvent>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<CursorChangeEvent>();\n private readonly onStateChange$ = createBehaviorEmitter<StateChangeEvent>();\n\n constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n // Register default mode globally\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.dispatch(setDefaultMode(INITIAL_MODE));\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize interaction state for this document\n const docState: InteractionDocumentState = {\n activeMode: this.state.defaultMode,\n cursor: 'auto',\n paused: false,\n };\n\n this.dispatch(initInteractionState(documentId, docState));\n\n // Initialize per-document data structures\n this.cursorClaims.set(documentId, new Map());\n this.buckets.set(documentId, new Map());\n this.alwaysGlobal.set(documentId, new Set());\n this.alwaysPage.set(documentId, new Map());\n\n // Initialize buckets for all registered modes\n const docBuckets = this.buckets.get(documentId)!;\n for (const modeId of this.modes.keys()) {\n docBuckets.set(modeId, { global: new Set(), page: new Map() });\n }\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentOpened',\n `Initialized interaction state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup per-document data structures\n this.cursorClaims.delete(documentId);\n this.buckets.delete(documentId);\n this.alwaysGlobal.delete(documentId);\n this.alwaysPage.delete(documentId);\n\n // Cleanup state\n this.dispatch(cleanupInteractionState(documentId));\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentClosed',\n `Cleaned up interaction state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n // Active document operations\n getActiveMode: () => this.getActiveMode(),\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n activate: (modeId: string) => this.activate(modeId),\n activateDefaultMode: () => this.activateDefaultMode(),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority),\n getCurrentCursor: () => this.getCurrentCursor(),\n removeCursor: (token: string) => this.removeCursor(token),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n pause: () => this.pause(),\n resume: () => this.resume(),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.isPaused(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createInteractionScope(documentId),\n\n // Global management\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\n\n // Events\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createInteractionScope(documentId: string): InteractionManagerScope {\n return {\n getActiveMode: () => this.getActiveMode(documentId),\n getActiveInteractionMode: () => this.getActiveInteractionMode(documentId),\n activate: (modeId: string) => this.activate(modeId, documentId),\n activateDefaultMode: () => this.activateDefaultMode(documentId),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority, documentId),\n getCurrentCursor: () => this.getCurrentCursor(documentId),\n removeCursor: (token: string) => this.removeCursor(token, documentId),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(documentId),\n pause: () => this.pause(documentId),\n resume: () => this.resume(documentId),\n isPaused: () => this.isPaused(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onModeChange: (listener: Listener<string>) =>\n this.onModeChange$.on((event) => {\n if (event.documentId === documentId) listener(event.activeMode);\n }),\n onCursorChange: (listener: Listener<string>) =>\n this.onCursorChange$.on((event) => {\n if (event.documentId === documentId) listener(event.cursor);\n }),\n onStateChange: (listener: Listener<InteractionDocumentState>) =>\n this.onStateChange$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): InteractionDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): InteractionDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Interaction state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private activate(modeId: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentStateOrThrow(id);\n\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] unknown mode '${modeId}'`);\n }\n if (modeId === docState.activeMode) return;\n\n const previousMode = docState.activeMode;\n\n // Clear cursor claims for this document\n this.cursorClaims.get(id)?.clear();\n\n // Notify handlers going inactive\n this.notifyHandlersInactive(id, previousMode);\n\n // Update state\n this.dispatch(activateMode(id, modeId));\n\n // Emit cursor\n this.emitCursor(id);\n\n // Notify handlers going active\n this.notifyHandlersActive(id, modeId);\n\n // Emit mode change event\n this.onModeChange$.emit({\n documentId: id,\n activeMode: modeId,\n previousMode,\n });\n }\n\n private activateDefaultMode(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.activate(this.state.defaultMode, id);\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private getActiveMode(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).activeMode;\n }\n\n private getActiveInteractionMode(documentId?: string): InteractionMode | null {\n const docState = this.getDocumentState(documentId);\n if (!docState) return null;\n return this.modes.get(docState.activeMode) ?? null;\n }\n\n private activeModeIsExclusive(documentId?: string): boolean {\n const mode = this.getActiveInteractionMode(documentId);\n return !!mode?.exclusive;\n }\n\n private pause(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(pauseInteraction(id));\n }\n\n private resume(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(resumeInteraction(id));\n }\n\n private isPaused(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).paused;\n }\n\n // ─────────────────────────────────────────────────────────\n // Mode Management\n // ─────────────────────────────────────────────────────────\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n\n // Add buckets for this mode in all existing documents\n for (const documentId of this.buckets.keys()) {\n const docBuckets = this.buckets.get(documentId)!;\n if (!docBuckets.has(mode.id)) {\n docBuckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Management\n // ─────────────────────────────────────────────────────────\n\n private registerHandlers({\n documentId,\n modeId,\n handlers,\n pageIndex,\n }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) {\n throw new Error(`No buckets found for document: ${documentId}`);\n }\n\n for (const id of modeIds) {\n const bucket = docBuckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n const set = this.alwaysGlobal.get(scope.documentId) ?? new Set();\n set.add(handlers);\n this.alwaysGlobal.set(scope.documentId, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n const docPageMap = this.alwaysPage.get(scope.documentId) ?? new Map();\n const set = docPageMap.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n docPageMap.set(scope.pageIndex, set);\n this.alwaysPage.set(scope.documentId, docPageMap);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const docState = this.getDocumentState(scope.documentId);\n if (!docState) return null;\n\n const mode = this.modes.get(docState.activeMode);\n if (!mode) return null;\n\n const docBuckets = this.buckets.get(scope.documentId);\n if (!docBuckets) return null;\n\n const bucket = docBuckets.get(mode.id);\n if (!bucket) return null;\n\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n if (scope.type === 'global') {\n const alwaysSet = this.alwaysGlobal.get(scope.documentId) ?? new Set<PointerEventHandlers>();\n const modeSpecific =\n mode.scope === 'global' ? bucket.global : new Set<PointerEventHandlers>();\n return mergeSets(alwaysSet, modeSpecific);\n }\n\n const alwaysPageSet =\n this.alwaysPage.get(scope.documentId)?.get(scope.pageIndex) ??\n new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>();\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n // ─────────────────────────────────────────────────────────\n // Cursor Management\n // ─────────────────────────────────────────────────────────\n\n private setCursor(token: string, cursor: string, priority = 0, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.set(token, { cursor, priority });\n this.emitCursor(id);\n }\n\n private removeCursor(token: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.delete(token);\n this.emitCursor(id);\n }\n\n private getCurrentCursor(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).cursor;\n }\n\n private emitCursor(documentId: string) {\n const claims = this.cursorClaims.get(documentId);\n if (!claims) return;\n\n const docState = this.getDocumentState(documentId);\n if (!docState) return;\n\n const top = [...claims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(docState.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== docState.cursor) {\n this.dispatch(setCursor(documentId, top.cursor));\n this.onCursorChange$.emit({\n documentId,\n cursor: top.cursor,\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Lifecycle Notifications\n // ─────────────────────────────────────────────────────────\n\n private notifyHandlersActive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(\n prevState: InteractionManagerState,\n newState: InteractionManagerState,\n ): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc !== newDoc) {\n this.onStateChange$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {\n this.logger.info(\n 'InteractionManagerPlugin',\n 'Initialize',\n 'Interaction Manager Plugin initialized',\n );\n }\n\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n this.onHandlerChange$.clear();\n this.onStateChange$.clear();\n await super.destroy();\n }\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 exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n InteractionManagerAction,\n INIT_INTERACTION_STATE,\n CLEANUP_INTERACTION_STATE,\n SET_ACTIVE_DOCUMENT,\n ACTIVATE_MODE,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_DEFAULT_MODE,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState, InteractionDocumentState } from './types';\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport const initialDocumentState: InteractionDocumentState = {\n activeMode: INITIAL_MODE,\n cursor: 'auto',\n paused: false,\n};\n\nexport const initialState: InteractionManagerState = {\n defaultMode: INITIAL_MODE,\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n documents: {},\n activeDocumentId: null,\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle\n // ─────────────────────────────────────────────────────────\n case INIT_INTERACTION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_INTERACTION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Actions\n // ─────────────────────────────────────────────────────────\n case ACTIVATE_MODE: {\n const { documentId, mode } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activeMode: mode,\n },\n },\n };\n }\n\n case SET_CURSOR: {\n const { documentId, cursor } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n cursor,\n },\n },\n };\n }\n\n case PAUSE_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: true,\n },\n },\n };\n }\n\n case RESUME_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: false,\n },\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Global Actions\n // ─────────────────────────────────────────────────────────\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ),\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\n };\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, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":["INITIAL_MODE","set","_a"],"mappings":"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"}
@@ -1,15 +1,61 @@
1
1
  import { Action } from '@embedpdf/core';
2
- import { InteractionExclusionRules } from './types';
2
+ import { InteractionExclusionRules, InteractionDocumentState } from './types';
3
+ export declare const INIT_INTERACTION_STATE = "INTERACTION/INIT_STATE";
4
+ export declare const CLEANUP_INTERACTION_STATE = "INTERACTION/CLEANUP_STATE";
3
5
  export declare const ACTIVATE_MODE = "INTERACTION/ACTIVATE_MODE";
4
6
  export declare const PAUSE_INTERACTION = "INTERACTION/PAUSE";
5
7
  export declare const RESUME_INTERACTION = "INTERACTION/RESUME";
6
8
  export declare const SET_CURSOR = "INTERACTION/SET_CURSOR";
9
+ export declare const SET_ACTIVE_DOCUMENT = "INTERACTION/SET_ACTIVE_DOCUMENT";
7
10
  export declare const SET_DEFAULT_MODE = "INTERACTION/SET_DEFAULT_MODE";
8
11
  export declare const SET_EXCLUSION_RULES = "INTERACTION/SET_EXCLUSION_RULES";
9
12
  export declare const ADD_EXCLUSION_CLASS = "INTERACTION/ADD_EXCLUSION_CLASS";
10
13
  export declare const REMOVE_EXCLUSION_CLASS = "INTERACTION/REMOVE_EXCLUSION_CLASS";
11
14
  export declare const ADD_EXCLUSION_ATTRIBUTE = "INTERACTION/ADD_EXCLUSION_ATTRIBUTE";
12
15
  export declare const REMOVE_EXCLUSION_ATTRIBUTE = "INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE";
16
+ export interface InitInteractionStateAction extends Action {
17
+ type: typeof INIT_INTERACTION_STATE;
18
+ payload: {
19
+ documentId: string;
20
+ state: InteractionDocumentState;
21
+ };
22
+ }
23
+ export interface CleanupInteractionStateAction extends Action {
24
+ type: typeof CLEANUP_INTERACTION_STATE;
25
+ payload: string;
26
+ }
27
+ export interface SetActiveDocumentAction extends Action {
28
+ type: typeof SET_ACTIVE_DOCUMENT;
29
+ payload: string | null;
30
+ }
31
+ export interface ActivateModeAction extends Action {
32
+ type: typeof ACTIVATE_MODE;
33
+ payload: {
34
+ documentId: string;
35
+ mode: string;
36
+ };
37
+ }
38
+ export interface PauseInteractionAction extends Action {
39
+ type: typeof PAUSE_INTERACTION;
40
+ payload: string;
41
+ }
42
+ export interface ResumeInteractionAction extends Action {
43
+ type: typeof RESUME_INTERACTION;
44
+ payload: string;
45
+ }
46
+ export interface SetCursorAction extends Action {
47
+ type: typeof SET_CURSOR;
48
+ payload: {
49
+ documentId: string;
50
+ cursor: string;
51
+ };
52
+ }
53
+ export interface SetDefaultModeAction extends Action {
54
+ type: typeof SET_DEFAULT_MODE;
55
+ payload: {
56
+ mode: string;
57
+ };
58
+ }
13
59
  export interface SetExclusionRulesAction extends Action {
14
60
  type: typeof SET_EXCLUSION_RULES;
15
61
  payload: {
@@ -40,38 +86,17 @@ export interface RemoveExclusionAttributeAction extends Action {
40
86
  attribute: string;
41
87
  };
42
88
  }
43
- export interface ActivateModeAction extends Action {
44
- type: typeof ACTIVATE_MODE;
45
- payload: {
46
- mode: string;
47
- };
48
- }
49
- export interface PauseInteractionAction extends Action {
50
- type: typeof PAUSE_INTERACTION;
51
- }
52
- export interface ResumeInteractionAction extends Action {
53
- type: typeof RESUME_INTERACTION;
54
- }
55
- export interface SetCursorAction extends Action {
56
- type: typeof SET_CURSOR;
57
- payload: {
58
- cursor: string;
59
- };
60
- }
61
- export interface SetDefaultModeAction extends Action {
62
- type: typeof SET_DEFAULT_MODE;
63
- payload: {
64
- mode: string;
65
- };
66
- }
67
- export declare const setExclusionRules: (rules: InteractionExclusionRules) => SetExclusionRulesAction;
68
- export declare const addExclusionClass: (className: string) => AddExclusionClassAction;
69
- export declare const removeExclusionClass: (className: string) => RemoveExclusionClassAction;
70
- export declare const addExclusionAttribute: (attribute: string) => AddExclusionAttributeAction;
71
- export declare const removeExclusionAttribute: (attribute: string) => RemoveExclusionAttributeAction;
72
- export declare const activateMode: (mode: string) => ActivateModeAction;
73
- export declare const setCursor: (cursor: string) => SetCursorAction;
74
- export declare const setDefaultMode: (mode: string) => SetDefaultModeAction;
75
- export declare const pauseInteraction: () => PauseInteractionAction;
76
- export declare const resumeInteraction: () => ResumeInteractionAction;
77
- export type InteractionManagerAction = SetExclusionRulesAction | AddExclusionClassAction | RemoveExclusionClassAction | AddExclusionAttributeAction | RemoveExclusionAttributeAction | ActivateModeAction | PauseInteractionAction | ResumeInteractionAction | SetCursorAction | SetDefaultModeAction;
89
+ export type InteractionManagerAction = InitInteractionStateAction | CleanupInteractionStateAction | SetActiveDocumentAction | ActivateModeAction | PauseInteractionAction | ResumeInteractionAction | SetCursorAction | SetDefaultModeAction | SetExclusionRulesAction | AddExclusionClassAction | RemoveExclusionClassAction | AddExclusionAttributeAction | RemoveExclusionAttributeAction;
90
+ export declare function initInteractionState(documentId: string, state: InteractionDocumentState): InitInteractionStateAction;
91
+ export declare function cleanupInteractionState(documentId: string): CleanupInteractionStateAction;
92
+ export declare function setActiveDocument(documentId: string | null): SetActiveDocumentAction;
93
+ export declare function activateMode(documentId: string, mode: string): ActivateModeAction;
94
+ export declare function pauseInteraction(documentId: string): PauseInteractionAction;
95
+ export declare function resumeInteraction(documentId: string): ResumeInteractionAction;
96
+ export declare function setCursor(documentId: string, cursor: string): SetCursorAction;
97
+ export declare function setDefaultMode(mode: string): SetDefaultModeAction;
98
+ export declare function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction;
99
+ export declare function addExclusionClass(className: string): AddExclusionClassAction;
100
+ export declare function removeExclusionClass(className: string): RemoveExclusionClassAction;
101
+ export declare function addExclusionAttribute(attribute: string): AddExclusionAttributeAction;
102
+ export declare function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction;
@@ -1,6 +1,7 @@
1
1
  import { BasePlugin, PluginRegistry } from '@embedpdf/core';
2
2
  import { InteractionManagerCapability, InteractionManagerPluginConfig, InteractionManagerState, RegisterAlwaysOptions } from './types';
3
- export declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPluginConfig, InteractionManagerCapability, InteractionManagerState> {
3
+ import { InteractionManagerAction } from './actions';
4
+ export declare class InteractionManagerPlugin extends BasePlugin<InteractionManagerPluginConfig, InteractionManagerCapability, InteractionManagerState, InteractionManagerAction> {
4
5
  static readonly id: "interaction-manager";
5
6
  private modes;
6
7
  private cursorClaims;
@@ -12,28 +13,32 @@ export declare class InteractionManagerPlugin extends BasePlugin<InteractionMana
12
13
  private readonly onCursorChange$;
13
14
  private readonly onStateChange$;
14
15
  constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig);
15
- initialize(_: InteractionManagerPluginConfig): Promise<void>;
16
+ protected onDocumentLoadingStarted(documentId: string): void;
17
+ protected onDocumentClosed(documentId: string): void;
16
18
  protected buildCapability(): InteractionManagerCapability;
19
+ private createInteractionScope;
20
+ private getDocumentState;
21
+ private getDocumentStateOrThrow;
17
22
  private activate;
23
+ private activateDefaultMode;
18
24
  private setDefaultMode;
19
- private notifyHandlersActive;
20
- private notifyHandlersInactive;
25
+ private getActiveMode;
26
+ private getActiveInteractionMode;
27
+ private activeModeIsExclusive;
28
+ private pause;
29
+ private resume;
30
+ private isPaused;
21
31
  private registerMode;
22
- /** ---------- pointer-handler handling ------------ */
23
32
  private registerHandlers;
24
33
  registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void;
25
- /** Returns the *merged* handler set that should be active for the given
26
- * provider (`global` wrapper or a single page wrapper).
27
- * – `alwaysGlobal` / `alwaysPage` are **always** active.
28
- * – Handlers that belong to the current mode are added on top **iff**
29
- * the mode’s own scope matches the provider’s scope. */
30
34
  private getHandlersForScope;
31
- /** ---------- cursor handling --------------------- */
32
35
  private setCursor;
33
36
  private removeCursor;
37
+ private getCurrentCursor;
34
38
  private emitCursor;
35
- onStoreUpdated(_: InteractionManagerState, newState: InteractionManagerState): void;
36
- private activeModeIsExclusive;
37
- private getActiveInteractionMode;
39
+ private notifyHandlersActive;
40
+ private notifyHandlersInactive;
41
+ onStoreUpdated(prevState: InteractionManagerState, newState: InteractionManagerState): void;
42
+ initialize(_: InteractionManagerPluginConfig): Promise<void>;
38
43
  destroy(): Promise<void>;
39
44
  }
@@ -1,5 +1,6 @@
1
1
  import { Reducer } from '@embedpdf/core';
2
2
  import { InteractionManagerAction } from './actions';
3
- import { InteractionManagerState } from './types';
3
+ import { InteractionManagerState, InteractionDocumentState } from './types';
4
+ export declare const initialDocumentState: InteractionDocumentState;
4
5
  export declare const initialState: InteractionManagerState;
5
6
  export declare const reducer: Reducer<InteractionManagerState, InteractionManagerAction>;
@@ -4,17 +4,19 @@ export interface InteractionManagerPluginConfig extends BasePluginConfig {
4
4
  /** Initial exclusion rules */
5
5
  exclusionRules?: InteractionExclusionRules;
6
6
  }
7
- export interface InteractionManagerState {
8
- /** Mode-id that is currently active (e.g. `"default"` or `"annotationCreation"`). */
7
+ export interface InteractionDocumentState {
8
+ /** Mode-id that is currently active for this document */
9
9
  activeMode: string;
10
- /** Cursor that is currently active (e.g. `"auto"` or `"pointer"`). */
10
+ /** Cursor that is currently active for this document */
11
11
  cursor: string;
12
- /** Whether the interaction is paused */
12
+ /** Whether interaction is paused for this document */
13
13
  paused: boolean;
14
- /** Mode-id that is treated as the resolver’s fall-back (“finish → …”). */
14
+ }
15
+ export interface InteractionManagerState {
15
16
  defaultMode: string;
16
- /** Exclusion rules for interaction */
17
17
  exclusionRules: InteractionExclusionRules;
18
+ documents: Record<string, InteractionDocumentState>;
19
+ activeDocumentId: string | null;
18
20
  }
19
21
  export interface InteractionExclusionRules {
20
22
  /** Class names that should be excluded */
@@ -27,13 +29,11 @@ export interface InteractionMode {
27
29
  id: string;
28
30
  /** where the handlers should listen for events */
29
31
  scope: 'global' | 'page';
30
- /** if true the page will receive events through a transparent overlay and no other page‑level
31
- * listener gets invoked until the mode finishes. */
32
+ /** if true the page will receive events through a transparent overlay */
32
33
  exclusive: boolean;
33
- /** baseline cursor while the mode is active (before any handler overrides it). */
34
+ /** baseline cursor while the mode is active */
34
35
  cursor?: string;
35
- /** Set to `false` when this tool wants to disable raw touch events.
36
- * Defaults to `true`. */
36
+ /** Set to `false` when this tool wants to disable raw touch events */
37
37
  wantsRawTouch?: boolean;
38
38
  }
39
39
  export interface EmbedPdfPointerEvent {
@@ -70,80 +70,88 @@ export interface PointerEventHandlersWithLifecycle<T = EmbedPdfPointerEvent> ext
70
70
  }
71
71
  interface GlobalInteractionScope {
72
72
  type: 'global';
73
+ documentId: string;
73
74
  }
74
75
  interface PageInteractionScope {
75
76
  type: 'page';
77
+ documentId: string;
76
78
  pageIndex: number;
77
79
  }
78
80
  export type InteractionScope = GlobalInteractionScope | PageInteractionScope;
79
81
  export interface RegisterHandlersOptions {
80
- /** the mode the handlers belong to */
82
+ /** the document these handlers belong to */
83
+ documentId: string;
84
+ /** the mode the handlers belong to */
81
85
  modeId: string | string[];
82
- /** callbacks */
86
+ /** callbacks */
83
87
  handlers: PointerEventHandlersWithLifecycle;
84
- /** if omitted ⇒ handlers listen on the *global* layer */
88
+ /** if omitted ⇒ handlers listen on the *global* layer */
85
89
  pageIndex?: number;
86
90
  }
87
91
  export interface RegisterAlwaysOptions {
88
92
  scope: InteractionScope;
89
93
  handlers: PointerEventHandlersWithLifecycle;
90
94
  }
91
- export interface InteractionManagerCapability {
92
- /** returns the active mode id */
95
+ export interface ModeChangeEvent {
96
+ documentId: string;
97
+ activeMode: string;
98
+ previousMode: string;
99
+ }
100
+ export interface CursorChangeEvent {
101
+ documentId: string;
102
+ cursor: string;
103
+ }
104
+ export interface StateChangeEvent {
105
+ documentId: string;
106
+ state: InteractionDocumentState;
107
+ }
108
+ export interface InteractionManagerScope {
93
109
  getActiveMode(): string;
94
- /** returns the active interaction mode */
95
110
  getActiveInteractionMode(): InteractionMode | null;
96
- /** programmatically switch to a mode */
97
111
  activate(modeId: string): void;
98
- /** set default mode */
99
112
  activateDefaultMode(): void;
100
- /** register a mode (should be called at start‑up by each plugin/tool). */
101
- registerMode(mode: InteractionMode): void;
102
- /** register pointer handlers that run *only* while the given mode is active. */
103
- registerHandlers(options: RegisterHandlersOptions): () => void;
104
- /** register pointer handlers that run *always* (even if no mode is active). */
105
- registerAlways(options: RegisterAlwaysOptions): () => void;
106
- /** low‑level cursor API. Handlers can claim the cursor with a priority (larger wins). */
107
113
  setCursor(token: string, cursor: string, priority?: number): void;
108
- /** Returns the current cursor */
109
114
  getCurrentCursor(): string;
110
- /** remove a cursor */
111
115
  removeCursor(token: string): void;
112
- /** subscribe to mode changes (so framework layers can raise overlays, etc.) */
113
- onModeChange: EventHook<InteractionManagerState>;
114
- /** subscribe to cursor changes */
116
+ getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null;
117
+ activeModeIsExclusive(): boolean;
118
+ pause(): void;
119
+ resume(): void;
120
+ isPaused(): boolean;
121
+ getState(): InteractionDocumentState;
122
+ onModeChange: EventHook<string>;
115
123
  onCursorChange: EventHook<string>;
116
- /** subscribe to handler changes */
117
- onHandlerChange: EventHook<InteractionManagerState>;
118
- /** subscribe to state changes */
119
- onStateChange: EventHook<InteractionManagerState>;
120
- /** framework helpers -------------------------------------------------------------- */
121
- /** Returns the *merged* handler set for the current mode + given scope.
122
- * Used by the PointerInteractionProvider inside each page / at the root. */
124
+ onStateChange: EventHook<InteractionDocumentState>;
125
+ }
126
+ export interface InteractionManagerCapability {
127
+ getActiveMode(): string;
128
+ getActiveInteractionMode(): InteractionMode | null;
129
+ activate(modeId: string): void;
130
+ activateDefaultMode(): void;
131
+ setCursor(token: string, cursor: string, priority?: number): void;
132
+ getCurrentCursor(): string;
133
+ removeCursor(token: string): void;
123
134
  getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null;
124
- /** Returns whether the current active mode demands an overlay */
125
135
  activeModeIsExclusive(): boolean;
126
- /** Pause the interaction */
127
136
  pause(): void;
128
- /** Resume the interaction */
129
137
  resume(): void;
130
- /** Returns whether the interaction is paused */
131
138
  isPaused(): boolean;
132
- /** Set the default mode */
139
+ getState(): InteractionDocumentState;
140
+ forDocument(documentId: string): InteractionManagerScope;
141
+ registerMode(mode: InteractionMode): void;
142
+ registerHandlers(options: RegisterHandlersOptions): () => void;
143
+ registerAlways(options: RegisterAlwaysOptions): () => void;
133
144
  setDefaultMode(id: string): void;
134
- /** Get the default mode */
135
145
  getDefaultMode(): string;
136
- /** Get current exclusion rules */
137
146
  getExclusionRules(): InteractionExclusionRules;
138
- /** Update exclusion rules */
139
147
  setExclusionRules(rules: InteractionExclusionRules): void;
140
- /** Add a class to exclusion */
141
148
  addExclusionClass(className: string): void;
142
- /** Remove a class from exclusion */
143
149
  removeExclusionClass(className: string): void;
144
- /** Add a data attribute to exclusion */
145
150
  addExclusionAttribute(attribute: string): void;
146
- /** Remove a data attribute from exclusion */
147
151
  removeExclusionAttribute(attribute: string): void;
152
+ onModeChange: EventHook<ModeChangeEvent>;
153
+ onCursorChange: EventHook<CursorChangeEvent>;
154
+ onHandlerChange: EventHook<InteractionManagerState>;
155
+ onStateChange: EventHook<StateChangeEvent>;
148
156
  }
149
157
  export {};
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core/preact"),t=require("@embedpdf/plugin-interaction-manager"),n=require("preact/hooks"),o=require("preact/jsx-runtime"),r=require("@embedpdf/models"),i=()=>e.useCapability(t.InteractionManagerPlugin.id);function l(){const{provides:e}=i(),[t,o]=n.useState((()=>{const t=null==e?void 0:e.getActiveInteractionMode();return"page"===(null==t?void 0:t.scope)&&!!t.exclusive}));return n.useEffect((()=>{if(e)return e.onModeChange((()=>{const t=e.getActiveInteractionMode();o("page"===(null==t?void 0:t.scope)&&!!(null==t?void 0:t.exclusive))}))}),[e]),t}const s={pointerdown:"onPointerDown",pointerup:"onPointerUp",pointermove:"onPointerMove",pointerenter:"onPointerEnter",pointerleave:"onPointerLeave",pointercancel:"onPointerCancel",mousedown:"onMouseDown",mouseup:"onMouseUp",mousemove:"onMouseMove",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mousecancel:"onMouseCancel",click:"onClick",dblclick:"onDoubleClick",touchstart:"onPointerDown",touchend:"onPointerUp",touchmove:"onPointerMove",touchcancel:"onPointerCancel"},c=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],u="undefined"!=typeof PointerEvent?c:[...c,"touchstart","touchend","touchmove","touchcancel"];function a(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function d(e,t,n,o){let r=e.getHandlersForScope(t);const i=()=>{var t;return!1!==(null==(t=e.getActiveInteractionMode())?void 0:t.wantsRawTouch)},l={};let c=i();const d=e=>{u.forEach((t=>{const o=l[t]??(l[t]=P);var r;n.addEventListener(t,o,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))}))},p=()=>{u.forEach((e=>{const t=l[e];t&&n.removeEventListener(e,t)}))};d(c),n.style.touchAction=c?"none":"";const g=e.onModeChange((()=>{if("global"===t.type){const t=e.getActiveInteractionMode();n.style.cursor="global"===(null==t?void 0:t.scope)?t.cursor??"auto":"auto"}r=e.getHandlersForScope(t);const o=i();o!==c&&(p(),d(o),c=o,n.style.touchAction=c?"none":"")})),v=e.onHandlerChange((()=>{r=e.getHandlersForScope(t)})),f=e.getActiveInteractionMode(),h=e.getCurrentCursor();n.style.cursor="global"===t.type&&"global"!==(null==f?void 0:f.scope)?"auto":h;const y=e.onCursorChange((o=>{var r;"global"===t.type&&"global"!==(null==(r=e.getActiveInteractionMode())?void 0:r.scope)||(n.style.cursor=o)})),m=(e,t)=>{if(o)return o(e,t);const n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}};function P(t){var o;if(e.isPaused())return;const i=e.getExclusionRules();if(t.target&&function(e,t){var n,o,r;if(!e)return!1;let i=e;for(;i;){if(null==(n=t.classes)?void 0:n.length)for(const e of t.classes)if(null==(o=i.classList)?void 0:o.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,i))return;const l=s[t.type];if(!l||!(null==r?void 0:r[l]))return;let u,d;if(a(t)&&c&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault(),a(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;u=m(e,n),d={clientX:e.clientX,clientY:e.clientY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,target:t.target,currentTarget:t.currentTarget,setPointerCapture:()=>{},releasePointerCapture:()=>{}}}else{const e=t;u=m(e,n),d={clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,target:e.target,currentTarget:e.currentTarget,setPointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},releasePointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId)}}}null==(o=r[l])||o.call(r,u,d,e.getActiveMode())}return()=>{p(),g(),y(),v()}}exports.GlobalPointerProvider=({children:e,style:t,...r})=>{const l=n.useRef(null),{provides:s}=i();return n.useEffect((()=>{if(s&&l.current)return d(s,{type:"global"},l.current)}),[s]),o.jsx("div",{ref:l,style:{width:"100%",height:"100%",...t},...r,children:e})},exports.PagePointerProvider=({pageIndex:e,children:t,pageWidth:s,pageHeight:c,rotation:u,scale:a,convertEventToPoint:p,style:g,...v})=>{const f=n.useRef(null),{provides:h}=i(),y=l(),m=n.useCallback(((e,t)=>{const n=t.getBoundingClientRect(),o={x:e.clientX-n.left,y:e.clientY-n.top},i=r.transformSize({width:s,height:c},u,1);return r.restorePosition(i,o,u,a)}),[s,c,u,a]);return n.useEffect((()=>{if(h&&f.current)return d(h,{type:"page",pageIndex:e},f.current,p||m)}),[h,e,p,m]),o.jsxs("div",{ref:f,style:{position:"relative",width:s,height:c,...g},...v,children:[t,y&&o.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}})]})},exports.useCursor=function(){const{provides:e}=i();return{setCursor:(t,n,o=0)=>{null==e||e.setCursor(t,n,o)},removeCursor:t=>{null==e||e.removeCursor(t)}}},exports.useInteractionManager=function(){const{provides:e}=i(),[o,r]=n.useState(t.initialState);return n.useEffect((()=>{if(e)return e.onStateChange((e=>{r(e)}))}),[e]),{provides:e,state:o}},exports.useInteractionManagerCapability=i,exports.useInteractionManagerPlugin=()=>e.usePlugin(t.InteractionManagerPlugin.id),exports.useIsPageExclusive=l,exports.usePointerHandlers=function({modeId:e,pageIndex:t}){const{provides:n}=i();return{register:(o,r)=>{const i=(null==r?void 0:r.modeId)??e,l=(null==r?void 0:r.pageIndex)??t;return i?null==n?void 0:n.registerHandlers({modeId:i,handlers:o,pageIndex:l}):null==n?void 0:n.registerAlways({scope:void 0!==l?{type:"page",pageIndex:l}:{type:"global"},handlers:o})}}},Object.keys(t).forEach((e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})}));
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core/preact"),t=require("@embedpdf/plugin-interaction-manager"),n=require("preact/hooks"),o=require("preact/jsx-runtime"),r=require("@embedpdf/models"),i=()=>e.useCapability(t.InteractionManagerPlugin.id);function u(e){const{provides:t}=i(),[o,r]=n.useState(()=>{if(!t)return!1;const n=t.forDocument(e).getActiveInteractionMode();return"page"===(null==n?void 0:n.scope)&&!!n.exclusive});return n.useEffect(()=>{if(!t)return;const n=t.forDocument(e);return n.onModeChange(()=>{const e=n.getActiveInteractionMode();r("page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive))})},[t,e]),o}const c={pointerdown:"onPointerDown",pointerup:"onPointerUp",pointermove:"onPointerMove",pointerenter:"onPointerEnter",pointerleave:"onPointerLeave",pointercancel:"onPointerCancel",mousedown:"onMouseDown",mouseup:"onMouseUp",mousemove:"onMouseMove",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mousecancel:"onMouseCancel",click:"onClick",dblclick:"onDoubleClick",touchstart:"onPointerDown",touchend:"onPointerUp",touchmove:"onPointerMove",touchcancel:"onPointerCancel"},l=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],s="undefined"!=typeof PointerEvent?l:[...l,"touchstart","touchend","touchmove","touchcancel"];function a(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function d(e,t,n,o){const r=e.forDocument(t.documentId);let i=e.getHandlersForScope(t);const u=()=>{var e;return!1!==(null==(e=r.getActiveInteractionMode())?void 0:e.wantsRawTouch)},l={};let d=u();const p=e=>{s.forEach(t=>{const o=l[t]??(l[t]=P);var r;n.addEventListener(t,o,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{s.forEach(e=>{const t=l[e];t&&n.removeEventListener(e,t)})};p(d),n.style.touchAction=d?"none":"";const g=r.onModeChange(()=>{if("global"===t.type){const e=r.getActiveInteractionMode();n.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}i=e.getHandlersForScope(t);const o=u();o!==d&&(v(),p(o),d=o,n.style.touchAction=d?"none":"")}),f=e.onHandlerChange(()=>{i=e.getHandlersForScope(t)}),h=r.getActiveInteractionMode(),m=r.getCurrentCursor();n.style.cursor="global"===t.type&&"global"!==(null==h?void 0:h.scope)?"auto":m;const y=r.onCursorChange(e=>{var o;"global"===t.type&&"global"!==(null==(o=r.getActiveInteractionMode())?void 0:o.scope)||(n.style.cursor=e)}),I=(e,t)=>{if(o)return o(e,t);const n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}};function P(t){var o;if(e.isPaused())return;const u=e.getExclusionRules();if(t.target&&function(e,t){var n,o,r;if(!e)return!1;let i=e;for(;i;){if(null==(n=t.classes)?void 0:n.length)for(const e of t.classes)if(null==(o=i.classList)?void 0:o.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,u))return;const l=c[t.type];if(!l||!(null==i?void 0:i[l]))return;let s,p;if(a(t)&&d&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault(),a(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;s=I(e,n),p={clientX:e.clientX,clientY:e.clientY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,target:t.target,currentTarget:t.currentTarget,setPointerCapture:()=>{},releasePointerCapture:()=>{}}}else{const e=t;s=I(e,n),p={clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,target:e.target,currentTarget:e.currentTarget,setPointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},releasePointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId)}}}null==(o=i[l])||o.call(i,s,p,r.getActiveMode())}return()=>{v(),g(),y(),f()}}exports.GlobalPointerProvider=({children:e,documentId:t,style:r,...u})=>{const c=n.useRef(null),{provides:l}=i();return n.useEffect(()=>{if(l&&c.current)return d(l,{type:"global",documentId:t},c.current)},[l,t]),o.jsx("div",{ref:c,style:{width:"100%",height:"100%",...r},...u,children:e})},exports.PagePointerProvider=({documentId:t,pageIndex:c,children:l,rotation:s,scale:a,convertEventToPoint:p,style:v,...g})=>{var f,h;const m=n.useRef(null),{provides:y}=i(),I=u(t),P=e.useDocumentState(t),b=null==(h=null==(f=null==P?void 0:P.document)?void 0:f.pages)?void 0:h[c],C=(null==b?void 0:b.size)??{width:0,height:0},x=s??(null==P?void 0:P.rotation)??0,M=a??(null==P?void 0:P.scale)??1,E=r.transformSize(C,0,M),w=n.useCallback((e,t)=>{const n=t.getBoundingClientRect(),o={x:e.clientX-n.left,y:e.clientY-n.top},i=r.transformSize({width:E.width,height:E.height},x,1);return r.restorePosition(i,o,x,M)},[C,x,M]);return n.useEffect(()=>{if(y&&m.current)return d(y,{type:"page",documentId:t,pageIndex:c},m.current,p||w)},[y,t,c,p,w]),o.jsxs("div",{ref:m,style:{position:"relative",width:E.width,height:E.height,...v},...g,children:[l,I&&o.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}})]})},exports.useCursor=function(e){const{provides:t}=i();return{setCursor:(n,o,r=0)=>{if(!t)return;t.forDocument(e).setCursor(n,o,r)},removeCursor:n=>{if(!t)return;t.forDocument(e).removeCursor(n)}}},exports.useInteractionManager=function(e){const{provides:o}=i(),[r,u]=n.useState(t.initialDocumentState);return n.useEffect(()=>{if(!o)return;return o.forDocument(e).onStateChange(e=>{u(e)})},[o]),{provides:(null==o?void 0:o.forDocument(e))??null,state:r}},exports.useInteractionManagerCapability=i,exports.useInteractionManagerPlugin=()=>e.usePlugin(t.InteractionManagerPlugin.id),exports.useIsPageExclusive=u,exports.usePointerHandlers=function({modeId:e,pageIndex:t,documentId:n}){const{provides:o}=i();return{register:(r,i)=>{const u=(null==i?void 0:i.modeId)??e,c=(null==i?void 0:i.pageIndex)??t,l=(null==i?void 0:i.documentId)??n;return u?null==o?void 0:o.registerHandlers({modeId:u,handlers:r,pageIndex:c,documentId:l}):null==o?void 0:o.registerAlways({scope:void 0!==c?{type:"page",documentId:l,pageIndex:c}:{type:"global",documentId:l},handlers:r})}}},Object.keys(t).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
2
2
  //# sourceMappingURL=index.cjs.map