@embedpdf/plugin-interaction-manager 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +94 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +42 -1
- package/dist/lib/interaction-manager-plugin.d.ts +1 -1
- package/dist/lib/types.d.ts +22 -0
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +31 -1
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +31 -1
- package/dist/react/index.js.map +1 -1
- package/dist/vue/hooks/use-interaction-manager.d.ts +8 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +31 -1
- package/dist/vue/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t="INTERACTION/ACTIVATE_MODE",
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t="INTERACTION/ACTIVATE_MODE",s="INTERACTION/PAUSE",a="INTERACTION/RESUME",o="INTERACTION/SET_CURSOR",i="INTERACTION/SET_DEFAULT_MODE",r="INTERACTION/SET_EXCLUSION_RULES",n="INTERACTION/ADD_EXCLUSION_CLASS",l="INTERACTION/REMOVE_EXCLUSION_CLASS",c="INTERACTION/ADD_EXCLUSION_ATTRIBUTE",u="INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE",d=e=>({type:r,payload:{rules:e}});const h="pointerMode",g=class extends e.BasePlugin{constructor(t,s,a){super(t,s),this.modes=new Map,this.cursorClaims=new Map,this.buckets=new Map,this.alwaysGlobal=new Set,this.alwaysPage=new Map,this.onModeChange$=e.createEmitter(),this.onHandlerChange$=e.createEmitter(),this.onCursorChange$=e.createEmitter(),this.onStateChange$=e.createBehaviorEmitter(),this.registerMode({id:h,scope:"page",exclusive:!1,cursor:"auto"}),this.setDefaultMode(h),this.activate(h),a.exclusionRules&&this.dispatch(d(a.exclusionRules))}async initialize(e){}buildCapability(){return{activate:e=>this.activate(e),onModeChange:this.onModeChange$.on,onCursorChange:this.onCursorChange$.on,onHandlerChange:this.onHandlerChange$.on,onStateChange:this.onStateChange$.on,getActiveMode:()=>this.state.activeMode,getActiveInteractionMode:()=>this.getActiveInteractionMode(),activateDefaultMode:()=>this.activate(this.state.defaultMode),registerMode:e=>this.registerMode(e),registerHandlers:e=>this.registerHandlers(e),registerAlways:e=>this.registerAlways(e),setCursor:(e,t,s=0)=>this.setCursor(e,t,s),removeCursor:e=>this.removeCursor(e),getCurrentCursor:()=>this.state.cursor,getHandlersForScope:e=>this.getHandlersForScope(e),activeModeIsExclusive:()=>this.activeModeIsExclusive(),pause:()=>this.dispatch({type:s}),resume:()=>this.dispatch({type:a}),isPaused:()=>this.state.paused,setDefaultMode:e=>this.setDefaultMode(e),getDefaultMode:()=>this.state.defaultMode,getExclusionRules:()=>this.state.exclusionRules,setExclusionRules:e=>this.dispatch(d(e)),addExclusionClass:e=>this.dispatch((e=>({type:n,payload:{className:e}}))(e)),removeExclusionClass:e=>this.dispatch((e=>({type:l,payload:{className:e}}))(e)),addExclusionAttribute:e=>this.dispatch((e=>({type:c,payload:{attribute:e}}))(e)),removeExclusionAttribute:e=>this.dispatch((e=>({type:u,payload:{attribute:e}}))(e))}}activate(e){if(!this.modes.has(e))throw new Error(`[interaction] unknown mode '${e}'`);if(e===this.state.activeMode)return;const s=this.state.activeMode;this.cursorClaims.clear(),this.notifyHandlersInactive(s),this.dispatch((e=>({type:t,payload:{mode:e}}))(e)),this.emitCursor(),this.notifyHandlersActive(e),this.onModeChange$.emit({...this.state,activeMode:e})}setDefaultMode(e){if(!this.modes.has(e))throw new Error(`[interaction] cannot set unknown mode '${e}' as default`);this.dispatch({type:i,payload:{mode:e}})}notifyHandlersActive(e){this.alwaysGlobal.forEach((t=>{var s;null==(s=t.onHandlerActiveStart)||s.call(t,e)})),this.alwaysPage.forEach((t=>{t.forEach((t=>{var s;null==(s=t.onHandlerActiveStart)||s.call(t,e)}))}));const t=this.modes.get(e);if(!t)return;const s=this.buckets.get(e);s&&("global"===t.scope&&s.global.forEach((t=>{var s;null==(s=t.onHandlerActiveStart)||s.call(t,e)})),"page"===t.scope&&s.page.forEach(((t,s)=>{t.forEach((t=>{var s;null==(s=t.onHandlerActiveStart)||s.call(t,e)}))})))}notifyHandlersInactive(e){this.alwaysGlobal.forEach((t=>{var s;null==(s=t.onHandlerActiveEnd)||s.call(t,e)})),this.alwaysPage.forEach((t=>{t.forEach((t=>{var s;null==(s=t.onHandlerActiveEnd)||s.call(t,e)}))}));const t=this.modes.get(e);if(!t)return;const s=this.buckets.get(e);s&&("global"===t.scope&&s.global.forEach((t=>{var s;null==(s=t.onHandlerActiveEnd)||s.call(t,e)})),"page"===t.scope&&s.page.forEach(((t,s)=>{t.forEach((t=>{var s;null==(s=t.onHandlerActiveEnd)||s.call(t,e)}))})))}registerMode(e){this.modes.set(e.id,e),this.buckets.has(e.id)||this.buckets.set(e.id,{global:new Set,page:new Map})}registerHandlers({modeId:e,handlers:t,pageIndex:s}){const a=Array.isArray(e)?e:[e],o=[];for(const i of a){const e=this.buckets.get(i);if(!e)throw new Error(`unknown mode '${i}'`);if(null==s)e.global.add(t);else{const a=e.page.get(s)??new Set;a.add(t),e.page.set(s,a)}o.push((()=>{if(null==s)e.global.delete(t);else{const a=e.page.get(s);a&&(a.delete(t),0===a.size&&e.page.delete(s))}}))}return this.onHandlerChange$.emit({...this.state}),()=>{o.forEach((e=>e())),this.onHandlerChange$.emit({...this.state})}}registerAlways({scope:e,handlers:t}){if("global"===e.type)return this.alwaysGlobal.add(t),this.onHandlerChange$.emit({...this.state}),()=>this.alwaysGlobal.delete(t);const s=this.alwaysPage.get(e.pageIndex)??new Set;return s.add(t),this.alwaysPage.set(e.pageIndex,s),this.onHandlerChange$.emit({...this.state}),()=>{s.delete(t),this.onHandlerChange$.emit({...this.state})}}getHandlersForScope(e){if(!this.state)return null;const t=this.modes.get(this.state.activeMode);if(!t)return null;const s=this.buckets.get(t.id);if(!s)return null;const a=(e,t)=>e.size||t.size?function(e){const t=["onPointerDown","onPointerUp","onPointerMove","onPointerEnter","onPointerLeave","onPointerCancel","onMouseDown","onMouseUp","onMouseMove","onMouseEnter","onMouseLeave","onMouseCancel","onClick","onDoubleClick"],s={};for(const a of t)s[a]=(t,s,o)=>{var i;for(const r of e)null==(i=r[a])||i.call(r,t,s,o)};return s}([...e,...t]):null;if("global"===e.type){const e="global"===t.scope?s.global:new Set;return a(this.alwaysGlobal,e)}return a(this.alwaysPage.get(e.pageIndex)??new Set,"page"===t.scope?s.page.get(e.pageIndex)??new Set:new Set)}setCursor(e,t,s=0){this.cursorClaims.set(e,{cursor:t,priority:s}),this.emitCursor()}removeCursor(e){this.cursorClaims.delete(e),this.emitCursor()}emitCursor(){var e;const t=[...this.cursorClaims.values()].sort(((e,t)=>t.priority-e.priority))[0]??{cursor:(null==(e=this.modes.get(this.state.activeMode))?void 0:e.cursor)??"auto"};var s;t.cursor!==this.state.cursor&&(this.dispatch((s=t.cursor,{type:o,payload:{cursor:s}})),this.onCursorChange$.emit(t.cursor))}onStoreUpdated(e,t){this.onStateChange$.emit(t)}activeModeIsExclusive(){const e=this.modes.get(this.state.activeMode);return!!(null==e?void 0:e.exclusive)}getActiveInteractionMode(){return this.modes.get(this.state.activeMode)??null}async destroy(){this.onModeChange$.clear(),this.onCursorChange$.clear(),await super.destroy()}};g.id="interaction-manager";let p=g;const C="interaction-manager",E={id:C,name:"Interaction Manager Plugin",version:"1.0.0",provides:["interaction-manager"],requires:[],optional:[],defaultConfig:{enabled:!0,exclusionRules:{classes:[],dataAttributes:["data-no-interaction"]}}},v={activeMode:"pointerMode",defaultMode:"pointerMode",cursor:"auto",paused:!1,exclusionRules:{classes:[],dataAttributes:[]}},M=(e,d)=>{switch(d.type){case t:return{...e,activeMode:d.payload.mode};case o:return{...e,cursor:d.payload.cursor};case s:return{...e,paused:!0};case a:return{...e,paused:!1};case i:return{...e,defaultMode:d.payload.mode};case r:return{...e,exclusionRules:d.payload.rules};case n:return{...e,exclusionRules:{...e.exclusionRules,classes:[...e.exclusionRules.classes||[],d.payload.className].filter(((e,t,s)=>s.indexOf(e)===t))}};case l:return{...e,exclusionRules:{...e.exclusionRules,classes:(e.exclusionRules.classes||[]).filter((e=>e!==d.payload.className))}};case c:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:[...e.exclusionRules.dataAttributes||[],d.payload.attribute].filter(((e,t,s)=>s.indexOf(e)===t))}};case u:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:(e.exclusionRules.dataAttributes||[]).filter((e=>e!==d.payload.attribute))}};default:return e}},f={manifest:E,create:(e,t)=>new p(C,e,t),reducer:M,initialState:v};exports.INTERACTION_MANAGER_PLUGIN_ID=C,exports.InteractionManagerPlugin=p,exports.InteractionManagerPluginPackage=f,exports.initialState=v,exports.manifest=E,exports.reducer=M;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/helper.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\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';\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 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 | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction;\n","import { BasePlugin, createBehaviorEmitter, createEmitter, PluginRegistry } from '@embedpdf/core';\n\nimport {\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 pauseInteraction,\n resumeInteraction,\n setCursor,\n setDefaultMode,\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) {\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 }\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 isPaused: () => this.state.paused,\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\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 { 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 { 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 {\n ACTIVATE_MODE,\n SET_DEFAULT_MODE,\n InteractionManagerAction,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\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};\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 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"],"names":["ACTIVATE_MODE","PAUSE_INTERACTION","RESUME_INTERACTION","SET_CURSOR","SET_DEFAULT_MODE","INITIAL_MODE","_InteractionManagerPlugin","BasePlugin","constructor","id","registry","super","this","modes","Map","cursorClaims","buckets","alwaysGlobal","Set","alwaysPage","onModeChange$","createEmitter","onHandlerChange$","onCursorChange$","onStateChange$","createBehaviorEmitter","registerMode","scope","exclusive","cursor","setDefaultMode","activate","initialize","_","buildCapability","modeId","onModeChange","on","onCursorChange","onHandlerChange","onStateChange","getActiveMode","state","activeMode","getActiveInteractionMode","activateDefaultMode","defaultMode","mode","registerHandlers","options","registerAlways","setCursor","token","priority","removeCursor","getCurrentCursor","getHandlersForScope","activeModeIsExclusive","pause","dispatch","type","resume","isPaused","paused","getDefaultMode","has","Error","previousMode","clear","notifyHandlersInactive","payload","activateMode","emitCursor","notifyHandlersActive","emit","forEach","handler","_a","onHandlerActiveStart","call","handlerSet","get","bucket","global","page","pageIndex","onHandlerActiveEnd","set","handlers","modeIds","Array","isArray","cleanupFunctions","add","push","delete","size","cleanup","mergeSets","a","b","list","keys","out","k","evt","nativeEvt","h","mergeHandlers","modeSpecific","top","values","sort","onStoreUpdated","newState","destroy","InteractionManagerPlugin","INTERACTION_MANAGER_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","enabled","initialState","reducer","action","InteractionManagerPluginPackage","create"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/helper.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 { 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 isPaused: () => 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 { 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 { 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":["ACTIVATE_MODE","PAUSE_INTERACTION","RESUME_INTERACTION","SET_CURSOR","SET_DEFAULT_MODE","SET_EXCLUSION_RULES","ADD_EXCLUSION_CLASS","REMOVE_EXCLUSION_CLASS","ADD_EXCLUSION_ATTRIBUTE","REMOVE_EXCLUSION_ATTRIBUTE","setExclusionRules","rules","type","payload","INITIAL_MODE","_InteractionManagerPlugin","BasePlugin","constructor","id","registry","config","super","this","modes","Map","cursorClaims","buckets","alwaysGlobal","Set","alwaysPage","onModeChange$","createEmitter","onHandlerChange$","onCursorChange$","onStateChange$","createBehaviorEmitter","registerMode","scope","exclusive","cursor","setDefaultMode","activate","exclusionRules","dispatch","initialize","_","buildCapability","modeId","onModeChange","on","onCursorChange","onHandlerChange","onStateChange","getActiveMode","state","activeMode","getActiveInteractionMode","activateDefaultMode","defaultMode","mode","registerHandlers","options","registerAlways","setCursor","token","priority","removeCursor","getCurrentCursor","getHandlersForScope","activeModeIsExclusive","pause","resume","isPaused","paused","getDefaultMode","getExclusionRules","addExclusionClass","className","removeExclusionClass","addExclusionAttribute","attribute","removeExclusionAttribute","has","Error","previousMode","clear","notifyHandlersInactive","activateMode","emitCursor","notifyHandlersActive","emit","forEach","handler","_a","onHandlerActiveStart","call","handlerSet","get","bucket","global","page","pageIndex","onHandlerActiveEnd","set","handlers","modeIds","Array","isArray","cleanupFunctions","add","push","delete","size","cleanup","mergeSets","a","b","list","keys","out","k","evt","nativeEvt","h","mergeHandlers","modeSpecific","top","values","sort","onStoreUpdated","newState","destroy","InteractionManagerPlugin","INTERACTION_MANAGER_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","enabled","classes","dataAttributes","initialState","reducer","action","filter","v","i","indexOf","c","InteractionManagerPluginPackage","create"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,31 @@ const PAUSE_INTERACTION = "INTERACTION/PAUSE";
|
|
|
4
4
|
const RESUME_INTERACTION = "INTERACTION/RESUME";
|
|
5
5
|
const SET_CURSOR = "INTERACTION/SET_CURSOR";
|
|
6
6
|
const SET_DEFAULT_MODE = "INTERACTION/SET_DEFAULT_MODE";
|
|
7
|
+
const SET_EXCLUSION_RULES = "INTERACTION/SET_EXCLUSION_RULES";
|
|
8
|
+
const ADD_EXCLUSION_CLASS = "INTERACTION/ADD_EXCLUSION_CLASS";
|
|
9
|
+
const REMOVE_EXCLUSION_CLASS = "INTERACTION/REMOVE_EXCLUSION_CLASS";
|
|
10
|
+
const ADD_EXCLUSION_ATTRIBUTE = "INTERACTION/ADD_EXCLUSION_ATTRIBUTE";
|
|
11
|
+
const REMOVE_EXCLUSION_ATTRIBUTE = "INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE";
|
|
12
|
+
const setExclusionRules = (rules) => ({
|
|
13
|
+
type: SET_EXCLUSION_RULES,
|
|
14
|
+
payload: { rules }
|
|
15
|
+
});
|
|
16
|
+
const addExclusionClass = (className) => ({
|
|
17
|
+
type: ADD_EXCLUSION_CLASS,
|
|
18
|
+
payload: { className }
|
|
19
|
+
});
|
|
20
|
+
const removeExclusionClass = (className) => ({
|
|
21
|
+
type: REMOVE_EXCLUSION_CLASS,
|
|
22
|
+
payload: { className }
|
|
23
|
+
});
|
|
24
|
+
const addExclusionAttribute = (attribute) => ({
|
|
25
|
+
type: ADD_EXCLUSION_ATTRIBUTE,
|
|
26
|
+
payload: { attribute }
|
|
27
|
+
});
|
|
28
|
+
const removeExclusionAttribute = (attribute) => ({
|
|
29
|
+
type: REMOVE_EXCLUSION_ATTRIBUTE,
|
|
30
|
+
payload: { attribute }
|
|
31
|
+
});
|
|
7
32
|
const activateMode = (mode) => ({
|
|
8
33
|
type: ACTIVATE_MODE,
|
|
9
34
|
payload: { mode }
|
|
@@ -50,7 +75,7 @@ function mergeHandlers(list) {
|
|
|
50
75
|
}
|
|
51
76
|
const INITIAL_MODE = "pointerMode";
|
|
52
77
|
const _InteractionManagerPlugin = class _InteractionManagerPlugin extends BasePlugin {
|
|
53
|
-
constructor(id, registry) {
|
|
78
|
+
constructor(id, registry, config) {
|
|
54
79
|
super(id, registry);
|
|
55
80
|
this.modes = /* @__PURE__ */ new Map();
|
|
56
81
|
this.cursorClaims = /* @__PURE__ */ new Map();
|
|
@@ -69,6 +94,9 @@ const _InteractionManagerPlugin = class _InteractionManagerPlugin extends BasePl
|
|
|
69
94
|
});
|
|
70
95
|
this.setDefaultMode(INITIAL_MODE);
|
|
71
96
|
this.activate(INITIAL_MODE);
|
|
97
|
+
if (config.exclusionRules) {
|
|
98
|
+
this.dispatch(setExclusionRules(config.exclusionRules));
|
|
99
|
+
}
|
|
72
100
|
}
|
|
73
101
|
async initialize(_) {
|
|
74
102
|
}
|
|
@@ -94,7 +122,13 @@ const _InteractionManagerPlugin = class _InteractionManagerPlugin extends BasePl
|
|
|
94
122
|
resume: () => this.dispatch(resumeInteraction()),
|
|
95
123
|
isPaused: () => this.state.paused,
|
|
96
124
|
setDefaultMode: (id) => this.setDefaultMode(id),
|
|
97
|
-
getDefaultMode: () => this.state.defaultMode
|
|
125
|
+
getDefaultMode: () => this.state.defaultMode,
|
|
126
|
+
getExclusionRules: () => this.state.exclusionRules,
|
|
127
|
+
setExclusionRules: (rules) => this.dispatch(setExclusionRules(rules)),
|
|
128
|
+
addExclusionClass: (className) => this.dispatch(addExclusionClass(className)),
|
|
129
|
+
removeExclusionClass: (className) => this.dispatch(removeExclusionClass(className)),
|
|
130
|
+
addExclusionAttribute: (attribute) => this.dispatch(addExclusionAttribute(attribute)),
|
|
131
|
+
removeExclusionAttribute: (attribute) => this.dispatch(removeExclusionAttribute(attribute))
|
|
98
132
|
};
|
|
99
133
|
}
|
|
100
134
|
activate(mode) {
|
|
@@ -298,14 +332,22 @@ const manifest = {
|
|
|
298
332
|
requires: [],
|
|
299
333
|
optional: [],
|
|
300
334
|
defaultConfig: {
|
|
301
|
-
enabled: true
|
|
335
|
+
enabled: true,
|
|
336
|
+
exclusionRules: {
|
|
337
|
+
classes: [],
|
|
338
|
+
dataAttributes: ["data-no-interaction"]
|
|
339
|
+
}
|
|
302
340
|
}
|
|
303
341
|
};
|
|
304
342
|
const initialState = {
|
|
305
343
|
activeMode: "pointerMode",
|
|
306
344
|
defaultMode: "pointerMode",
|
|
307
345
|
cursor: "auto",
|
|
308
|
-
paused: false
|
|
346
|
+
paused: false,
|
|
347
|
+
exclusionRules: {
|
|
348
|
+
classes: [],
|
|
349
|
+
dataAttributes: []
|
|
350
|
+
}
|
|
309
351
|
};
|
|
310
352
|
const reducer = (state, action) => {
|
|
311
353
|
switch (action.type) {
|
|
@@ -334,13 +376,60 @@ const reducer = (state, action) => {
|
|
|
334
376
|
...state,
|
|
335
377
|
defaultMode: action.payload.mode
|
|
336
378
|
};
|
|
379
|
+
case SET_EXCLUSION_RULES:
|
|
380
|
+
return {
|
|
381
|
+
...state,
|
|
382
|
+
exclusionRules: action.payload.rules
|
|
383
|
+
};
|
|
384
|
+
case ADD_EXCLUSION_CLASS:
|
|
385
|
+
return {
|
|
386
|
+
...state,
|
|
387
|
+
exclusionRules: {
|
|
388
|
+
...state.exclusionRules,
|
|
389
|
+
classes: [...state.exclusionRules.classes || [], action.payload.className].filter(
|
|
390
|
+
(v, i, a) => a.indexOf(v) === i
|
|
391
|
+
)
|
|
392
|
+
// Remove duplicates
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
case REMOVE_EXCLUSION_CLASS:
|
|
396
|
+
return {
|
|
397
|
+
...state,
|
|
398
|
+
exclusionRules: {
|
|
399
|
+
...state.exclusionRules,
|
|
400
|
+
classes: (state.exclusionRules.classes || []).filter(
|
|
401
|
+
(c) => c !== action.payload.className
|
|
402
|
+
)
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
case ADD_EXCLUSION_ATTRIBUTE:
|
|
406
|
+
return {
|
|
407
|
+
...state,
|
|
408
|
+
exclusionRules: {
|
|
409
|
+
...state.exclusionRules,
|
|
410
|
+
dataAttributes: [
|
|
411
|
+
...state.exclusionRules.dataAttributes || [],
|
|
412
|
+
action.payload.attribute
|
|
413
|
+
].filter((v, i, a) => a.indexOf(v) === i)
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
case REMOVE_EXCLUSION_ATTRIBUTE:
|
|
417
|
+
return {
|
|
418
|
+
...state,
|
|
419
|
+
exclusionRules: {
|
|
420
|
+
...state.exclusionRules,
|
|
421
|
+
dataAttributes: (state.exclusionRules.dataAttributes || []).filter(
|
|
422
|
+
(a) => a !== action.payload.attribute
|
|
423
|
+
)
|
|
424
|
+
}
|
|
425
|
+
};
|
|
337
426
|
default:
|
|
338
427
|
return state;
|
|
339
428
|
}
|
|
340
429
|
};
|
|
341
430
|
const InteractionManagerPluginPackage = {
|
|
342
431
|
manifest,
|
|
343
|
-
create: (registry) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry),
|
|
432
|
+
create: (registry, config) => new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),
|
|
344
433
|
reducer,
|
|
345
434
|
initialState
|
|
346
435
|
};
|
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';\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';\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 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 | 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 InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n} from './types';\nimport {\n activateMode,\n pauseInteraction,\n resumeInteraction,\n setCursor,\n setDefaultMode,\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) {\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 }\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 isPaused: () => this.state.paused,\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\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 },\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} from './actions';\nimport { InteractionManagerState } from './types';\n\nexport const initialState: InteractionManagerState = {\n activeMode: 'pointerMode',\n defaultMode: 'pointerMode',\n cursor: 'auto',\n paused: false,\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 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"],"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 } 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 isPaused: () => 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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"}
|
package/dist/lib/actions.d.ts
CHANGED
|
@@ -1,9 +1,45 @@
|
|
|
1
1
|
import { Action } from '@embedpdf/core';
|
|
2
|
+
import { InteractionExclusionRules } from './types';
|
|
2
3
|
export declare const ACTIVATE_MODE = "INTERACTION/ACTIVATE_MODE";
|
|
3
4
|
export declare const PAUSE_INTERACTION = "INTERACTION/PAUSE";
|
|
4
5
|
export declare const RESUME_INTERACTION = "INTERACTION/RESUME";
|
|
5
6
|
export declare const SET_CURSOR = "INTERACTION/SET_CURSOR";
|
|
6
7
|
export declare const SET_DEFAULT_MODE = "INTERACTION/SET_DEFAULT_MODE";
|
|
8
|
+
export declare const SET_EXCLUSION_RULES = "INTERACTION/SET_EXCLUSION_RULES";
|
|
9
|
+
export declare const ADD_EXCLUSION_CLASS = "INTERACTION/ADD_EXCLUSION_CLASS";
|
|
10
|
+
export declare const REMOVE_EXCLUSION_CLASS = "INTERACTION/REMOVE_EXCLUSION_CLASS";
|
|
11
|
+
export declare const ADD_EXCLUSION_ATTRIBUTE = "INTERACTION/ADD_EXCLUSION_ATTRIBUTE";
|
|
12
|
+
export declare const REMOVE_EXCLUSION_ATTRIBUTE = "INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE";
|
|
13
|
+
export interface SetExclusionRulesAction extends Action {
|
|
14
|
+
type: typeof SET_EXCLUSION_RULES;
|
|
15
|
+
payload: {
|
|
16
|
+
rules: InteractionExclusionRules;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface AddExclusionClassAction extends Action {
|
|
20
|
+
type: typeof ADD_EXCLUSION_CLASS;
|
|
21
|
+
payload: {
|
|
22
|
+
className: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface RemoveExclusionClassAction extends Action {
|
|
26
|
+
type: typeof REMOVE_EXCLUSION_CLASS;
|
|
27
|
+
payload: {
|
|
28
|
+
className: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface AddExclusionAttributeAction extends Action {
|
|
32
|
+
type: typeof ADD_EXCLUSION_ATTRIBUTE;
|
|
33
|
+
payload: {
|
|
34
|
+
attribute: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface RemoveExclusionAttributeAction extends Action {
|
|
38
|
+
type: typeof REMOVE_EXCLUSION_ATTRIBUTE;
|
|
39
|
+
payload: {
|
|
40
|
+
attribute: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
7
43
|
export interface ActivateModeAction extends Action {
|
|
8
44
|
type: typeof ACTIVATE_MODE;
|
|
9
45
|
payload: {
|
|
@@ -28,9 +64,14 @@ export interface SetDefaultModeAction extends Action {
|
|
|
28
64
|
mode: string;
|
|
29
65
|
};
|
|
30
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;
|
|
31
72
|
export declare const activateMode: (mode: string) => ActivateModeAction;
|
|
32
73
|
export declare const setCursor: (cursor: string) => SetCursorAction;
|
|
33
74
|
export declare const setDefaultMode: (mode: string) => SetDefaultModeAction;
|
|
34
75
|
export declare const pauseInteraction: () => PauseInteractionAction;
|
|
35
76
|
export declare const resumeInteraction: () => ResumeInteractionAction;
|
|
36
|
-
export type InteractionManagerAction = ActivateModeAction | PauseInteractionAction | ResumeInteractionAction | SetCursorAction | SetDefaultModeAction;
|
|
77
|
+
export type InteractionManagerAction = SetExclusionRulesAction | AddExclusionClassAction | RemoveExclusionClassAction | AddExclusionAttributeAction | RemoveExclusionAttributeAction | ActivateModeAction | PauseInteractionAction | ResumeInteractionAction | SetCursorAction | SetDefaultModeAction;
|
|
@@ -11,7 +11,7 @@ export declare class InteractionManagerPlugin extends BasePlugin<InteractionMana
|
|
|
11
11
|
private readonly onHandlerChange$;
|
|
12
12
|
private readonly onCursorChange$;
|
|
13
13
|
private readonly onStateChange$;
|
|
14
|
-
constructor(id: string, registry: PluginRegistry);
|
|
14
|
+
constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig);
|
|
15
15
|
initialize(_: InteractionManagerPluginConfig): Promise<void>;
|
|
16
16
|
protected buildCapability(): InteractionManagerCapability;
|
|
17
17
|
private activate;
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { BasePluginConfig, EventHook } from '@embedpdf/core';
|
|
2
2
|
import { Position } from '@embedpdf/models';
|
|
3
3
|
export interface InteractionManagerPluginConfig extends BasePluginConfig {
|
|
4
|
+
/** Initial exclusion rules */
|
|
5
|
+
exclusionRules?: InteractionExclusionRules;
|
|
4
6
|
}
|
|
5
7
|
export interface InteractionManagerState {
|
|
6
8
|
/** Mode-id that is currently active (e.g. `"default"` or `"annotationCreation"`). */
|
|
@@ -11,6 +13,14 @@ export interface InteractionManagerState {
|
|
|
11
13
|
paused: boolean;
|
|
12
14
|
/** Mode-id that is treated as the resolver’s fall-back (“finish → …”). */
|
|
13
15
|
defaultMode: string;
|
|
16
|
+
/** Exclusion rules for interaction */
|
|
17
|
+
exclusionRules: InteractionExclusionRules;
|
|
18
|
+
}
|
|
19
|
+
export interface InteractionExclusionRules {
|
|
20
|
+
/** Class names that should be excluded */
|
|
21
|
+
classes?: string[];
|
|
22
|
+
/** Data attributes that should be excluded (e.g., 'data-no-interaction') */
|
|
23
|
+
dataAttributes?: string[];
|
|
14
24
|
}
|
|
15
25
|
export interface InteractionMode {
|
|
16
26
|
/** unique id */
|
|
@@ -123,5 +133,17 @@ export interface InteractionManagerCapability {
|
|
|
123
133
|
setDefaultMode(id: string): void;
|
|
124
134
|
/** Get the default mode */
|
|
125
135
|
getDefaultMode(): string;
|
|
136
|
+
/** Get current exclusion rules */
|
|
137
|
+
getExclusionRules(): InteractionExclusionRules;
|
|
138
|
+
/** Update exclusion rules */
|
|
139
|
+
setExclusionRules(rules: InteractionExclusionRules): void;
|
|
140
|
+
/** Add a class to exclusion */
|
|
141
|
+
addExclusionClass(className: string): void;
|
|
142
|
+
/** Remove a class from exclusion */
|
|
143
|
+
removeExclusionClass(className: string): void;
|
|
144
|
+
/** Add a data attribute to exclusion */
|
|
145
|
+
addExclusionAttribute(attribute: string): void;
|
|
146
|
+
/** Remove a data attribute from exclusion */
|
|
147
|
+
removeExclusionAttribute(attribute: string): void;
|
|
126
148
|
}
|
|
127
149
|
export {};
|