@embedpdf/plugin-interaction-manager 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/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/INIT_STATE",s="INTERACTION/CLEANUP_STATE",o="INTERACTION/ACTIVATE_MODE",n="INTERACTION/PAUSE",a="INTERACTION/RESUME",r="INTERACTION/SET_CURSOR",i="INTERACTION/SET_DEFAULT_MODE",c="INTERACTION/SET_EXCLUSION_RULES",u="INTERACTION/ADD_EXCLUSION_CLASS",l="INTERACTION/REMOVE_EXCLUSION_CLASS",d="INTERACTION/ADD_EXCLUSION_ATTRIBUTE",h="INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE";function g(e){return{type:i,payload:{mode:e}}}function m(e){return{type:c,payload:{rules:e}}}const p="pointerMode",I=class extends e.BasePlugin{constructor(t,s,o){super(t,s),this.modes=new Map,this.cursorClaims=new Map,this.buckets=new Map,this.alwaysGlobal=new Map,this.alwaysPage=new Map,this.onModeChange$=e.createEmitter(),this.onHandlerChange$=e.createEmitter(),this.onCursorChange$=e.createEmitter(),this.onStateChange$=e.createBehaviorEmitter(),this.registerMode({id:p,scope:"page",exclusive:!1,cursor:"auto"}),this.dispatch(g(p)),o.exclusionRules&&this.dispatch(m(o.exclusionRules))}onDocumentLoadingStarted(e){const s={activeMode:this.state.defaultMode,cursor:"auto",paused:!1};this.dispatch(function(e,s){return{type:t,payload:{documentId:e,state:s}}}(e,s)),this.cursorClaims.set(e,new Map),this.buckets.set(e,new Map),this.alwaysGlobal.set(e,new Set),this.alwaysPage.set(e,new Map);const o=this.buckets.get(e);for(const t of this.modes.keys())o.set(t,{global:new Set,page:new Map});this.logger.debug("InteractionManagerPlugin","DocumentOpened",`Initialized interaction state for document: ${e}`)}onDocumentClosed(e){this.cursorClaims.delete(e),this.buckets.delete(e),this.alwaysGlobal.delete(e),this.alwaysPage.delete(e),this.dispatch(function(e){return{type:s,payload:e}}(e)),this.logger.debug("InteractionManagerPlugin","DocumentClosed",`Cleaned up interaction state for document: ${e}`)}buildCapability(){return{getActiveMode:()=>this.getActiveMode(),getActiveInteractionMode:()=>this.getActiveInteractionMode(),activate:e=>this.activate(e),activateDefaultMode:()=>this.activateDefaultMode(),setCursor:(e,t,s)=>this.setCursor(e,t,s),getCurrentCursor:()=>this.getCurrentCursor(),removeCursor:e=>this.removeCursor(e),getHandlersForScope:e=>this.getHandlersForScope(e),activeModeIsExclusive:()=>this.activeModeIsExclusive(),pause:()=>this.pause(),resume:()=>this.resume(),isPaused:()=>this.registry.isDestroyed()||this.isPaused(),getState:()=>this.getDocumentStateOrThrow(),forDocument:e=>this.createInteractionScope(e),registerMode:e=>this.registerMode(e),registerHandlers:e=>this.registerHandlers(e),registerAlways:e=>this.registerAlways(e),setDefaultMode:e=>this.setDefaultMode(e),getDefaultMode:()=>this.state.defaultMode,getExclusionRules:()=>this.state.exclusionRules,setExclusionRules:e=>this.dispatch(m(e)),addExclusionClass:e=>this.dispatch(function(e){return{type:u,payload:{className:e}}}(e)),removeExclusionClass:e=>this.dispatch(function(e){return{type:l,payload:{className:e}}}(e)),addExclusionAttribute:e=>this.dispatch(function(e){return{type:d,payload:{attribute:e}}}(e)),removeExclusionAttribute:e=>this.dispatch(function(e){return{type:h,payload:{attribute:e}}}(e)),onModeChange:this.onModeChange$.on,onCursorChange:this.onCursorChange$.on,onHandlerChange:this.onHandlerChange$.on,onStateChange:this.onStateChange$.on}}createInteractionScope(e){return{getActiveMode:()=>this.getActiveMode(e),getActiveInteractionMode:()=>this.getActiveInteractionMode(e),activate:t=>this.activate(t,e),activateDefaultMode:()=>this.activateDefaultMode(e),setCursor:(t,s,o)=>this.setCursor(t,s,o,e),getCurrentCursor:()=>this.getCurrentCursor(e),removeCursor:t=>this.removeCursor(t,e),getHandlersForScope:e=>this.getHandlersForScope(e),activeModeIsExclusive:()=>this.activeModeIsExclusive(e),pause:()=>this.pause(e),resume:()=>this.resume(e),isPaused:()=>this.isPaused(e),getState:()=>this.getDocumentStateOrThrow(e),onModeChange:t=>this.onModeChange$.on(s=>{s.documentId===e&&t(s.activeMode)}),onCursorChange:t=>this.onCursorChange$.on(s=>{s.documentId===e&&t(s.cursor)}),onStateChange:t=>this.onStateChange$.on(s=>{s.documentId===e&&t(s.state)})}}getDocumentState(e){const t=e??this.getActiveDocumentId();return this.state.documents[t]??null}getDocumentStateOrThrow(e){const t=this.getDocumentState(e);if(!t)throw new Error(`Interaction state not found for document: ${e??"active"}`);return t}activate(e,t){var s;const n=t??this.getActiveDocumentId(),a=this.getDocumentStateOrThrow(n);if(!this.modes.has(e))throw new Error(`[interaction] unknown mode '${e}'`);if(e===a.activeMode)return;const r=a.activeMode;null==(s=this.cursorClaims.get(n))||s.clear(),this.notifyHandlersInactive(n,r),this.dispatch(function(e,t){return{type:o,payload:{documentId:e,mode:t}}}(n,e)),this.emitCursor(n),this.notifyHandlersActive(n,e),this.onModeChange$.emit({documentId:n,activeMode:e,previousMode:r})}activateDefaultMode(e){const t=e??this.getActiveDocumentId();this.activate(this.state.defaultMode,t)}setDefaultMode(e){if(!this.modes.has(e))throw new Error(`[interaction] cannot set unknown mode '${e}' as default`);this.dispatch(g(e))}getActiveMode(e){return this.getDocumentStateOrThrow(e).activeMode}getActiveInteractionMode(e){const t=this.getDocumentState(e);return t?this.modes.get(t.activeMode)??null:null}activeModeIsExclusive(e){const t=this.getActiveInteractionMode(e);return!!(null==t?void 0:t.exclusive)}pause(e){const t=e??this.getActiveDocumentId();this.dispatch(function(e){return{type:n,payload:e}}(t))}resume(e){const t=e??this.getActiveDocumentId();this.dispatch(function(e){return{type:a,payload:e}}(t))}isPaused(e){return this.getDocumentStateOrThrow(e).paused}registerMode(e){this.modes.set(e.id,e);for(const t of this.buckets.keys()){const s=this.buckets.get(t);s.has(e.id)||s.set(e.id,{global:new Set,page:new Map})}}registerHandlers({documentId:e,modeId:t,handlers:s,pageIndex:o}){const n=Array.isArray(t)?t:[t],a=[],r=this.buckets.get(e);if(!r)throw new Error(`No buckets found for document: ${e}`);for(const i of n){const e=r.get(i);if(!e)throw new Error(`unknown mode '${i}'`);if(null==o)e.global.add(s);else{const t=e.page.get(o)??new Set;t.add(s),e.page.set(o,t)}a.push(()=>{if(null==o)e.global.delete(s);else{const t=e.page.get(o);t&&(t.delete(s),0===t.size&&e.page.delete(o))}})}return this.onHandlerChange$.emit({...this.state}),()=>{a.forEach(e=>e()),this.onHandlerChange$.emit({...this.state})}}registerAlways({scope:e,handlers:t}){if("global"===e.type){const s=this.alwaysGlobal.get(e.documentId)??new Set;return s.add(t),this.alwaysGlobal.set(e.documentId,s),this.onHandlerChange$.emit({...this.state}),()=>{s.delete(t),this.onHandlerChange$.emit({...this.state})}}const s=this.alwaysPage.get(e.documentId)??new Map,o=s.get(e.pageIndex)??new Set;return o.add(t),s.set(e.pageIndex,o),this.alwaysPage.set(e.documentId,s),this.onHandlerChange$.emit({...this.state}),()=>{o.delete(t),this.onHandlerChange$.emit({...this.state})}}getHandlersForScope(e){var t;const s=this.getDocumentState(e.documentId);if(!s)return null;const o=this.modes.get(s.activeMode);if(!o)return null;const n=this.buckets.get(e.documentId);if(!n)return null;const a=n.get(o.id);if(!a)return null;const r=(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 o of t)s[o]=(t,s,n)=>{var a;for(const r of e)null==(a=r[o])||a.call(r,t,s,n)};return s}([...e,...t]):null;if("global"===e.type){return r(this.alwaysGlobal.get(e.documentId)??new Set,"global"===o.scope?a.global:new Set)}return r((null==(t=this.alwaysPage.get(e.documentId))?void 0:t.get(e.pageIndex))??new Set,"page"===o.scope?a.page.get(e.pageIndex)??new Set:new Set)}setCursor(e,t,s=0,o){const n=o??this.getActiveDocumentId(),a=this.cursorClaims.get(n);a&&(a.set(e,{cursor:t,priority:s}),this.emitCursor(n))}removeCursor(e,t){const s=t??this.getActiveDocumentId(),o=this.cursorClaims.get(s);o&&(o.delete(e),this.emitCursor(s))}getCurrentCursor(e){return this.getDocumentStateOrThrow(e).cursor}emitCursor(e){var t;const s=this.cursorClaims.get(e);if(!s)return;const o=this.getDocumentState(e);if(!o)return;const n=[...s.values()].sort((e,t)=>t.priority-e.priority)[0]??{cursor:(null==(t=this.modes.get(o.activeMode))?void 0:t.cursor)??"auto"};n.cursor!==o.cursor&&(this.dispatch(function(e,t){return{type:r,payload:{documentId:e,cursor:t}}}(e,n.cursor)),this.onCursorChange$.emit({documentId:e,cursor:n.cursor}))}notifyHandlersActive(e,t){var s,o;null==(s=this.alwaysGlobal.get(e))||s.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)}),null==(o=this.alwaysPage.get(e))||o.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)})});const n=this.modes.get(t);if(!n)return;const a=this.buckets.get(e);if(!a)return;const r=a.get(t);r&&("global"===n.scope&&r.global.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)}),"page"===n.scope&&r.page.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)})}))}notifyHandlersInactive(e,t){var s,o;null==(s=this.alwaysGlobal.get(e))||s.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)}),null==(o=this.alwaysPage.get(e))||o.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)})});const n=this.modes.get(t);if(!n)return;const a=this.buckets.get(e);if(!a)return;const r=a.get(t);r&&("global"===n.scope&&r.global.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)}),"page"===n.scope&&r.page.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)})}))}onStoreUpdated(e,t){for(const s in t.documents){const o=e.documents[s],n=t.documents[s];o!==n&&this.onStateChange$.emit({documentId:s,state:n})}}async initialize(e){this.logger.info("InteractionManagerPlugin","Initialize","Interaction Manager Plugin initialized")}async destroy(){this.onModeChange$.clear(),this.onCursorChange$.clear(),this.onHandlerChange$.clear(),this.onStateChange$.clear(),await super.destroy()}};I.id="interaction-manager";let v=I;const C="interaction-manager",f={id:C,name:"Interaction Manager Plugin",version:"1.0.0",provides:["interaction-manager"],requires:[],optional:[],defaultConfig:{exclusionRules:{classes:[],dataAttributes:["data-no-interaction"]}}},M="pointerMode",E={activeMode:M,cursor:"auto",paused:!1},y={defaultMode:M,exclusionRules:{classes:[],dataAttributes:["data-no-interaction"]},documents:{},activeDocumentId:null},A=(e=y,g)=>{switch(g.type){case t:{const{documentId:t,state:s}=g.payload;return{...e,documents:{...e.documents,[t]:s},activeDocumentId:e.activeDocumentId??t}}case s:{const t=g.payload,{[t]:s,...o}=e.documents;return{...e,documents:o,activeDocumentId:e.activeDocumentId===t?null:e.activeDocumentId}}case"INTERACTION/SET_ACTIVE_DOCUMENT":return{...e,activeDocumentId:g.payload};case o:{const{documentId:t,mode:s}=g.payload,o=e.documents[t];return o?{...e,documents:{...e.documents,[t]:{...o,activeMode:s}}}:e}case r:{const{documentId:t,cursor:s}=g.payload,o=e.documents[t];return o?{...e,documents:{...e.documents,[t]:{...o,cursor:s}}}:e}case n:{const t=g.payload,s=e.documents[t];return s?{...e,documents:{...e.documents,[t]:{...s,paused:!0}}}:e}case a:{const t=g.payload,s=e.documents[t];return s?{...e,documents:{...e.documents,[t]:{...s,paused:!1}}}:e}case i:return{...e,defaultMode:g.payload.mode};case c:return{...e,exclusionRules:g.payload.rules};case u:return{...e,exclusionRules:{...e.exclusionRules,classes:[...e.exclusionRules.classes||[],g.payload.className].filter((e,t,s)=>s.indexOf(e)===t)}};case l:return{...e,exclusionRules:{...e.exclusionRules,classes:(e.exclusionRules.classes||[]).filter(e=>e!==g.payload.className)}};case d:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:[...e.exclusionRules.dataAttributes||[],g.payload.attribute].filter((e,t,s)=>s.indexOf(e)===t)}};case h:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:(e.exclusionRules.dataAttributes||[]).filter(e=>e!==g.payload.attribute)}};default:return e}},S={manifest:f,create:(e,t)=>new v(C,e,t),reducer:A,initialState:y};exports.INTERACTION_MANAGER_PLUGIN_ID=C,exports.InteractionManagerPlugin=v,exports.InteractionManagerPluginPackage=S,exports.initialDocumentState=E,exports.initialState=y,exports.manifest=f,exports.reducer=A;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t="INTERACTION/INIT_STATE",s="INTERACTION/CLEANUP_STATE",o="INTERACTION/ACTIVATE_MODE",n="INTERACTION/PAUSE",a="INTERACTION/RESUME",r="INTERACTION/SET_CURSOR",i="INTERACTION/SET_DEFAULT_MODE",c="INTERACTION/SET_EXCLUSION_RULES",u="INTERACTION/ADD_EXCLUSION_CLASS",l="INTERACTION/REMOVE_EXCLUSION_CLASS",d="INTERACTION/ADD_EXCLUSION_ATTRIBUTE",h="INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE";function g(e){return{type:i,payload:{mode:e}}}function m(e){return{type:c,payload:{rules:e}}}const p="pointerMode",I=class extends e.BasePlugin{constructor(t,s,o){super(t,s),this.modes=new Map,this.cursorClaims=new Map,this.buckets=new Map,this.alwaysGlobal=new Map,this.alwaysPage=new Map,this.onModeChange$=e.createEmitter(),this.onHandlerChange$=e.createEmitter(),this.onCursorChange$=e.createEmitter(),this.onStateChange$=e.createBehaviorEmitter(),this.registerMode({id:p,scope:"page",exclusive:!1,cursor:"auto"}),this.dispatch(g(p)),o.exclusionRules&&this.dispatch(m(o.exclusionRules))}onDocumentLoadingStarted(e){const s={activeMode:this.state.defaultMode,cursor:"auto",paused:!1};this.dispatch(function(e,s){return{type:t,payload:{documentId:e,state:s}}}(e,s)),this.cursorClaims.set(e,new Map),this.buckets.set(e,new Map),this.alwaysGlobal.set(e,new Set),this.alwaysPage.set(e,new Map);const o=this.buckets.get(e);for(const t of this.modes.keys())o.set(t,{global:new Set,page:new Map});this.logger.debug("InteractionManagerPlugin","DocumentOpened",`Initialized interaction state for document: ${e}`)}onDocumentClosed(e){this.cursorClaims.delete(e),this.buckets.delete(e),this.alwaysGlobal.delete(e),this.alwaysPage.delete(e),this.dispatch(function(e){return{type:s,payload:e}}(e)),this.logger.debug("InteractionManagerPlugin","DocumentClosed",`Cleaned up interaction state for document: ${e}`)}buildCapability(){return{getActiveMode:()=>this.getActiveMode(),getActiveInteractionMode:()=>this.getActiveInteractionMode(),activate:e=>this.activate(e),activateDefaultMode:()=>this.activateDefaultMode(),setCursor:(e,t,s)=>this.setCursor(e,t,s),getCurrentCursor:()=>this.getCurrentCursor(),removeCursor:e=>this.removeCursor(e),getHandlersForScope:e=>this.getHandlersForScope(e),activeModeIsExclusive:()=>this.activeModeIsExclusive(),pause:()=>this.pause(),resume:()=>this.resume(),isPaused:()=>this.registry.isDestroyed()||this.isPaused(),getState:()=>this.getDocumentStateOrThrow(),forDocument:e=>this.createInteractionScope(e),registerMode:e=>this.registerMode(e),registerHandlers:e=>this.registerHandlers(e),registerAlways:e=>this.registerAlways(e),setDefaultMode:e=>this.setDefaultMode(e),getDefaultMode:()=>this.state.defaultMode,getExclusionRules:()=>this.state.exclusionRules,setExclusionRules:e=>this.dispatch(m(e)),addExclusionClass:e=>this.dispatch(function(e){return{type:u,payload:{className:e}}}(e)),removeExclusionClass:e=>this.dispatch(function(e){return{type:l,payload:{className:e}}}(e)),addExclusionAttribute:e=>this.dispatch(function(e){return{type:d,payload:{attribute:e}}}(e)),removeExclusionAttribute:e=>this.dispatch(function(e){return{type:h,payload:{attribute:e}}}(e)),onModeChange:this.onModeChange$.on,onCursorChange:this.onCursorChange$.on,onHandlerChange:this.onHandlerChange$.on,onStateChange:this.onStateChange$.on}}createInteractionScope(e){return{getActiveMode:()=>this.getActiveMode(e),getActiveInteractionMode:()=>this.getActiveInteractionMode(e),activate:t=>this.activate(t,e),activateDefaultMode:()=>this.activateDefaultMode(e),setCursor:(t,s,o)=>this.setCursor(t,s,o,e),getCurrentCursor:()=>this.getCurrentCursor(e),removeCursor:t=>this.removeCursor(t,e),getHandlersForScope:e=>this.getHandlersForScope(e),activeModeIsExclusive:()=>this.activeModeIsExclusive(e),pause:()=>this.pause(e),resume:()=>this.resume(e),isPaused:()=>this.isPaused(e),getState:()=>this.getDocumentStateOrThrow(e),onModeChange:t=>this.onModeChange$.on(s=>{s.documentId===e&&t(s.activeMode)}),onCursorChange:t=>this.onCursorChange$.on(s=>{s.documentId===e&&t(s.cursor)}),onStateChange:t=>this.onStateChange$.on(s=>{s.documentId===e&&t(s.state)})}}getDocumentState(e){const t=e??this.getActiveDocumentId();return this.state.documents[t]??null}getDocumentStateOrThrow(e){const t=this.getDocumentState(e);if(!t)throw new Error(`Interaction state not found for document: ${e??"active"}`);return t}activate(e,t){var s;const n=t??this.getActiveDocumentId(),a=this.getDocumentStateOrThrow(n);if(!this.modes.has(e))throw new Error(`[interaction] unknown mode '${e}'`);if(e===a.activeMode)return;const r=a.activeMode;null==(s=this.cursorClaims.get(n))||s.clear(),this.notifyHandlersInactive(n,r),this.dispatch(function(e,t){return{type:o,payload:{documentId:e,mode:t}}}(n,e)),this.emitCursor(n),this.notifyHandlersActive(n,e),this.onModeChange$.emit({documentId:n,activeMode:e,previousMode:r})}activateDefaultMode(e){const t=e??this.getActiveDocumentIdOrNull();t&&this.activate(this.state.defaultMode,t)}setDefaultMode(e){if(!this.modes.has(e))throw new Error(`[interaction] cannot set unknown mode '${e}' as default`);this.dispatch(g(e))}getActiveMode(e){return this.getDocumentStateOrThrow(e).activeMode}getActiveInteractionMode(e){const t=this.getDocumentState(e);return t?this.modes.get(t.activeMode)??null:null}activeModeIsExclusive(e){const t=this.getActiveInteractionMode(e);return!!(null==t?void 0:t.exclusive)}pause(e){const t=e??this.getActiveDocumentId();this.dispatch(function(e){return{type:n,payload:e}}(t))}resume(e){const t=e??this.getActiveDocumentId();this.dispatch(function(e){return{type:a,payload:e}}(t))}isPaused(e){return this.getDocumentStateOrThrow(e).paused}registerMode(e){this.modes.set(e.id,e);for(const t of this.buckets.keys()){const s=this.buckets.get(t);s.has(e.id)||s.set(e.id,{global:new Set,page:new Map})}}registerHandlers({documentId:e,modeId:t,handlers:s,pageIndex:o}){const n=Array.isArray(t)?t:[t],a=[],r=this.buckets.get(e);if(!r)throw new Error(`No buckets found for document: ${e}`);for(const i of n){const e=r.get(i);if(!e)throw new Error(`unknown mode '${i}'`);if(null==o)e.global.add(s);else{const t=e.page.get(o)??new Set;t.add(s),e.page.set(o,t)}a.push(()=>{if(null==o)e.global.delete(s);else{const t=e.page.get(o);t&&(t.delete(s),0===t.size&&e.page.delete(o))}})}return this.onHandlerChange$.emit({...this.state}),()=>{a.forEach(e=>e()),this.onHandlerChange$.emit({...this.state})}}registerAlways({scope:e,handlers:t}){if("global"===e.type){const s=this.alwaysGlobal.get(e.documentId)??new Set;return s.add(t),this.alwaysGlobal.set(e.documentId,s),this.onHandlerChange$.emit({...this.state}),()=>{s.delete(t),this.onHandlerChange$.emit({...this.state})}}const s=this.alwaysPage.get(e.documentId)??new Map,o=s.get(e.pageIndex)??new Set;return o.add(t),s.set(e.pageIndex,o),this.alwaysPage.set(e.documentId,s),this.onHandlerChange$.emit({...this.state}),()=>{o.delete(t),this.onHandlerChange$.emit({...this.state})}}getHandlersForScope(e){var t;const s=this.getDocumentState(e.documentId);if(!s)return null;const o=this.modes.get(s.activeMode);if(!o)return null;const n=this.buckets.get(e.documentId);if(!n)return null;const a=n.get(o.id);if(!a)return null;const r=(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 o of t)s[o]=(t,s,n)=>{var a;for(const r of e)null==(a=r[o])||a.call(r,t,s,n)};return s}([...e,...t]):null;if("global"===e.type){return r(this.alwaysGlobal.get(e.documentId)??new Set,"global"===o.scope?a.global:new Set)}return r((null==(t=this.alwaysPage.get(e.documentId))?void 0:t.get(e.pageIndex))??new Set,"page"===o.scope?a.page.get(e.pageIndex)??new Set:new Set)}setCursor(e,t,s=0,o){const n=o??this.getActiveDocumentId(),a=this.cursorClaims.get(n);a&&(a.set(e,{cursor:t,priority:s}),this.emitCursor(n))}removeCursor(e,t){const s=t??this.getActiveDocumentId(),o=this.cursorClaims.get(s);o&&(o.delete(e),this.emitCursor(s))}getCurrentCursor(e){return this.getDocumentStateOrThrow(e).cursor}emitCursor(e){var t;const s=this.cursorClaims.get(e);if(!s)return;const o=this.getDocumentState(e);if(!o)return;const n=[...s.values()].sort((e,t)=>t.priority-e.priority)[0]??{cursor:(null==(t=this.modes.get(o.activeMode))?void 0:t.cursor)??"auto"};n.cursor!==o.cursor&&(this.dispatch(function(e,t){return{type:r,payload:{documentId:e,cursor:t}}}(e,n.cursor)),this.onCursorChange$.emit({documentId:e,cursor:n.cursor}))}notifyHandlersActive(e,t){var s,o;null==(s=this.alwaysGlobal.get(e))||s.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)}),null==(o=this.alwaysPage.get(e))||o.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)})});const n=this.modes.get(t);if(!n)return;const a=this.buckets.get(e);if(!a)return;const r=a.get(t);r&&("global"===n.scope&&r.global.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)}),"page"===n.scope&&r.page.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveStart)||s.call(e,t)})}))}notifyHandlersInactive(e,t){var s,o;null==(s=this.alwaysGlobal.get(e))||s.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)}),null==(o=this.alwaysPage.get(e))||o.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)})});const n=this.modes.get(t);if(!n)return;const a=this.buckets.get(e);if(!a)return;const r=a.get(t);r&&("global"===n.scope&&r.global.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)}),"page"===n.scope&&r.page.forEach(e=>{e.forEach(e=>{var s;null==(s=e.onHandlerActiveEnd)||s.call(e,t)})}))}onStoreUpdated(e,t){for(const s in t.documents){const o=e.documents[s],n=t.documents[s];o!==n&&this.onStateChange$.emit({documentId:s,state:n})}}async initialize(e){this.logger.info("InteractionManagerPlugin","Initialize","Interaction Manager Plugin initialized")}async destroy(){this.onModeChange$.clear(),this.onCursorChange$.clear(),this.onHandlerChange$.clear(),this.onStateChange$.clear(),await super.destroy()}};I.id="interaction-manager";let v=I;const C="interaction-manager",f={id:C,name:"Interaction Manager Plugin",version:"1.0.0",provides:["interaction-manager"],requires:[],optional:[],defaultConfig:{exclusionRules:{classes:[],dataAttributes:["data-no-interaction"]}}},M="pointerMode",E={activeMode:M,cursor:"auto",paused:!1},y={defaultMode:M,exclusionRules:{classes:[],dataAttributes:["data-no-interaction"]},documents:{},activeDocumentId:null},A=(e=y,g)=>{switch(g.type){case t:{const{documentId:t,state:s}=g.payload;return{...e,documents:{...e.documents,[t]:s},activeDocumentId:e.activeDocumentId??t}}case s:{const t=g.payload,{[t]:s,...o}=e.documents;return{...e,documents:o,activeDocumentId:e.activeDocumentId===t?null:e.activeDocumentId}}case"INTERACTION/SET_ACTIVE_DOCUMENT":return{...e,activeDocumentId:g.payload};case o:{const{documentId:t,mode:s}=g.payload,o=e.documents[t];return o?{...e,documents:{...e.documents,[t]:{...o,activeMode:s}}}:e}case r:{const{documentId:t,cursor:s}=g.payload,o=e.documents[t];return o?{...e,documents:{...e.documents,[t]:{...o,cursor:s}}}:e}case n:{const t=g.payload,s=e.documents[t];return s?{...e,documents:{...e.documents,[t]:{...s,paused:!0}}}:e}case a:{const t=g.payload,s=e.documents[t];return s?{...e,documents:{...e.documents,[t]:{...s,paused:!1}}}:e}case i:return{...e,defaultMode:g.payload.mode};case c:return{...e,exclusionRules:g.payload.rules};case u:return{...e,exclusionRules:{...e.exclusionRules,classes:[...e.exclusionRules.classes||[],g.payload.className].filter((e,t,s)=>s.indexOf(e)===t)}};case l:return{...e,exclusionRules:{...e.exclusionRules,classes:(e.exclusionRules.classes||[]).filter(e=>e!==g.payload.className)}};case d:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:[...e.exclusionRules.dataAttributes||[],g.payload.attribute].filter((e,t,s)=>s.indexOf(e)===t)}};case h:return{...e,exclusionRules:{...e.exclusionRules,dataAttributes:(e.exclusionRules.dataAttributes||[]).filter(e=>e!==g.payload.attribute)}};default:return e}},S={manifest:f,create:(e,t)=>new v(C,e,t),reducer:A,initialState:y};exports.INTERACTION_MANAGER_PLUGIN_ID=C,exports.InteractionManagerPlugin=v,exports.InteractionManagerPluginPackage=S,exports.initialDocumentState=E,exports.initialState=y,exports.manifest=f,exports.reducer=A;
|
|
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';\nimport { InteractionExclusionRules, InteractionDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_INTERACTION_STATE = 'INTERACTION/INIT_STATE';\nexport const CLEANUP_INTERACTION_STATE = 'INTERACTION/CLEANUP_STATE';\n\n// Per-document actions\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_ACTIVE_DOCUMENT = 'INTERACTION/SET_ACTIVE_DOCUMENT';\n\n// Global actions\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\n// Document lifecycle actions\nexport interface InitInteractionStateAction extends Action {\n type: typeof INIT_INTERACTION_STATE;\n payload: {\n documentId: string;\n state: InteractionDocumentState;\n };\n}\n\nexport interface CleanupInteractionStateAction extends Action {\n type: typeof CLEANUP_INTERACTION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: {\n documentId: string;\n mode: string;\n };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: {\n documentId: string;\n cursor: string;\n };\n}\n\n// Global actions\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport type InteractionManagerAction =\n | InitInteractionStateAction\n | CleanupInteractionStateAction\n | SetActiveDocumentAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction;\n\n// Action creators\nexport function initInteractionState(\n documentId: string,\n state: InteractionDocumentState,\n): InitInteractionStateAction {\n return { type: INIT_INTERACTION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupInteractionState(documentId: string): CleanupInteractionStateAction {\n return { type: CLEANUP_INTERACTION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function activateMode(documentId: string, mode: string): ActivateModeAction {\n return { type: ACTIVATE_MODE, payload: { documentId, mode } };\n}\n\nexport function pauseInteraction(documentId: string): PauseInteractionAction {\n return { type: PAUSE_INTERACTION, payload: documentId };\n}\n\nexport function resumeInteraction(documentId: string): ResumeInteractionAction {\n return { type: RESUME_INTERACTION, payload: documentId };\n}\n\nexport function setCursor(documentId: string, cursor: string): SetCursorAction {\n return { type: SET_CURSOR, payload: { documentId, cursor } };\n}\n\nexport function setDefaultMode(mode: string): SetDefaultModeAction {\n return { type: SET_DEFAULT_MODE, payload: { mode } };\n}\n\nexport function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction {\n return { type: SET_EXCLUSION_RULES, payload: { rules } };\n}\n\nexport function addExclusionClass(className: string): AddExclusionClassAction {\n return { type: ADD_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function removeExclusionClass(className: string): RemoveExclusionClassAction {\n return { type: REMOVE_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function addExclusionAttribute(attribute: string): AddExclusionAttributeAction {\n return { type: ADD_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n\nexport function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction {\n return { type: REMOVE_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n Listener,\n PluginRegistry,\n} from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n ModeChangeEvent,\n CursorChangeEvent,\n StateChangeEvent,\n InteractionDocumentState,\n InteractionManagerScope,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n cleanupInteractionState,\n initInteractionState,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n InteractionManagerAction,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper */\n global: HandlerSet;\n /** handlers that listen on a specific page wrapper */\n page: PageHandlerMap;\n}\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState,\n InteractionManagerAction\n> {\n static readonly id = 'interaction-manager' as const;\n\n // Global mode definitions (shared across documents)\n private modes = new Map<string, InteractionMode>();\n\n // Per-document cursor claims: documentId -> token -> claim\n private cursorClaims = new Map<string, Map<string, CursorClaim>>();\n\n // Per-document handler buckets: documentId -> modeId -> buckets\n private buckets = new Map<string, Map<string, ModeBuckets>>();\n\n // Per-document always-active handlers\n private alwaysGlobal = new Map<string, Set<PointerEventHandlersWithLifecycle>>();\n private alwaysPage = new Map<string, Map<number, Set<PointerEventHandlersWithLifecycle>>>();\n\n // Event emitters\n private readonly onModeChange$ = createEmitter<ModeChangeEvent>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<CursorChangeEvent>();\n private readonly onStateChange$ = createBehaviorEmitter<StateChangeEvent>();\n\n constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n // Register default mode globally\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.dispatch(setDefaultMode(INITIAL_MODE));\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize interaction state for this document\n const docState: InteractionDocumentState = {\n activeMode: this.state.defaultMode,\n cursor: 'auto',\n paused: false,\n };\n\n this.dispatch(initInteractionState(documentId, docState));\n\n // Initialize per-document data structures\n this.cursorClaims.set(documentId, new Map());\n this.buckets.set(documentId, new Map());\n this.alwaysGlobal.set(documentId, new Set());\n this.alwaysPage.set(documentId, new Map());\n\n // Initialize buckets for all registered modes\n const docBuckets = this.buckets.get(documentId)!;\n for (const modeId of this.modes.keys()) {\n docBuckets.set(modeId, { global: new Set(), page: new Map() });\n }\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentOpened',\n `Initialized interaction state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup per-document data structures\n this.cursorClaims.delete(documentId);\n this.buckets.delete(documentId);\n this.alwaysGlobal.delete(documentId);\n this.alwaysPage.delete(documentId);\n\n // Cleanup state\n this.dispatch(cleanupInteractionState(documentId));\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentClosed',\n `Cleaned up interaction state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n // Active document operations\n getActiveMode: () => this.getActiveMode(),\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n activate: (modeId: string) => this.activate(modeId),\n activateDefaultMode: () => this.activateDefaultMode(),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority),\n getCurrentCursor: () => this.getCurrentCursor(),\n removeCursor: (token: string) => this.removeCursor(token),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n pause: () => this.pause(),\n resume: () => this.resume(),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.isPaused(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createInteractionScope(documentId),\n\n // Global management\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\n\n // Events\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createInteractionScope(documentId: string): InteractionManagerScope {\n return {\n getActiveMode: () => this.getActiveMode(documentId),\n getActiveInteractionMode: () => this.getActiveInteractionMode(documentId),\n activate: (modeId: string) => this.activate(modeId, documentId),\n activateDefaultMode: () => this.activateDefaultMode(documentId),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority, documentId),\n getCurrentCursor: () => this.getCurrentCursor(documentId),\n removeCursor: (token: string) => this.removeCursor(token, documentId),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(documentId),\n pause: () => this.pause(documentId),\n resume: () => this.resume(documentId),\n isPaused: () => this.isPaused(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onModeChange: (listener: Listener<string>) =>\n this.onModeChange$.on((event) => {\n if (event.documentId === documentId) listener(event.activeMode);\n }),\n onCursorChange: (listener: Listener<string>) =>\n this.onCursorChange$.on((event) => {\n if (event.documentId === documentId) listener(event.cursor);\n }),\n onStateChange: (listener: Listener<InteractionDocumentState>) =>\n this.onStateChange$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): InteractionDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): InteractionDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Interaction state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private activate(modeId: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentStateOrThrow(id);\n\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] unknown mode '${modeId}'`);\n }\n if (modeId === docState.activeMode) return;\n\n const previousMode = docState.activeMode;\n\n // Clear cursor claims for this document\n this.cursorClaims.get(id)?.clear();\n\n // Notify handlers going inactive\n this.notifyHandlersInactive(id, previousMode);\n\n // Update state\n this.dispatch(activateMode(id, modeId));\n\n // Emit cursor\n this.emitCursor(id);\n\n // Notify handlers going active\n this.notifyHandlersActive(id, modeId);\n\n // Emit mode change event\n this.onModeChange$.emit({\n documentId: id,\n activeMode: modeId,\n previousMode,\n });\n }\n\n private activateDefaultMode(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.activate(this.state.defaultMode, id);\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private getActiveMode(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).activeMode;\n }\n\n private getActiveInteractionMode(documentId?: string): InteractionMode | null {\n const docState = this.getDocumentState(documentId);\n if (!docState) return null;\n return this.modes.get(docState.activeMode) ?? null;\n }\n\n private activeModeIsExclusive(documentId?: string): boolean {\n const mode = this.getActiveInteractionMode(documentId);\n return !!mode?.exclusive;\n }\n\n private pause(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(pauseInteraction(id));\n }\n\n private resume(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(resumeInteraction(id));\n }\n\n private isPaused(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).paused;\n }\n\n // ─────────────────────────────────────────────────────────\n // Mode Management\n // ─────────────────────────────────────────────────────────\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n\n // Add buckets for this mode in all existing documents\n for (const documentId of this.buckets.keys()) {\n const docBuckets = this.buckets.get(documentId)!;\n if (!docBuckets.has(mode.id)) {\n docBuckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Management\n // ─────────────────────────────────────────────────────────\n\n private registerHandlers({\n documentId,\n modeId,\n handlers,\n pageIndex,\n }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) {\n throw new Error(`No buckets found for document: ${documentId}`);\n }\n\n for (const id of modeIds) {\n const bucket = docBuckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n const set = this.alwaysGlobal.get(scope.documentId) ?? new Set();\n set.add(handlers);\n this.alwaysGlobal.set(scope.documentId, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n const docPageMap = this.alwaysPage.get(scope.documentId) ?? new Map();\n const set = docPageMap.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n docPageMap.set(scope.pageIndex, set);\n this.alwaysPage.set(scope.documentId, docPageMap);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const docState = this.getDocumentState(scope.documentId);\n if (!docState) return null;\n\n const mode = this.modes.get(docState.activeMode);\n if (!mode) return null;\n\n const docBuckets = this.buckets.get(scope.documentId);\n if (!docBuckets) return null;\n\n const bucket = docBuckets.get(mode.id);\n if (!bucket) return null;\n\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n if (scope.type === 'global') {\n const alwaysSet = this.alwaysGlobal.get(scope.documentId) ?? new Set<PointerEventHandlers>();\n const modeSpecific =\n mode.scope === 'global' ? bucket.global : new Set<PointerEventHandlers>();\n return mergeSets(alwaysSet, modeSpecific);\n }\n\n const alwaysPageSet =\n this.alwaysPage.get(scope.documentId)?.get(scope.pageIndex) ??\n new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>();\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n // ─────────────────────────────────────────────────────────\n // Cursor Management\n // ─────────────────────────────────────────────────────────\n\n private setCursor(token: string, cursor: string, priority = 0, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.set(token, { cursor, priority });\n this.emitCursor(id);\n }\n\n private removeCursor(token: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.delete(token);\n this.emitCursor(id);\n }\n\n private getCurrentCursor(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).cursor;\n }\n\n private emitCursor(documentId: string) {\n const claims = this.cursorClaims.get(documentId);\n if (!claims) return;\n\n const docState = this.getDocumentState(documentId);\n if (!docState) return;\n\n const top = [...claims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(docState.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== docState.cursor) {\n this.dispatch(setCursor(documentId, top.cursor));\n this.onCursorChange$.emit({\n documentId,\n cursor: top.cursor,\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Lifecycle Notifications\n // ─────────────────────────────────────────────────────────\n\n private notifyHandlersActive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(\n prevState: InteractionManagerState,\n newState: InteractionManagerState,\n ): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc !== newDoc) {\n this.onStateChange$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {\n this.logger.info(\n 'InteractionManagerPlugin',\n 'Initialize',\n 'Interaction Manager Plugin initialized',\n );\n }\n\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n this.onHandlerChange$.clear();\n this.onStateChange$.clear();\n await super.destroy();\n }\n}\n","import { 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 exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n InteractionManagerAction,\n INIT_INTERACTION_STATE,\n CLEANUP_INTERACTION_STATE,\n SET_ACTIVE_DOCUMENT,\n ACTIVATE_MODE,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_DEFAULT_MODE,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState, InteractionDocumentState } from './types';\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport const initialDocumentState: InteractionDocumentState = {\n activeMode: INITIAL_MODE,\n cursor: 'auto',\n paused: false,\n};\n\nexport const initialState: InteractionManagerState = {\n defaultMode: INITIAL_MODE,\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n documents: {},\n activeDocumentId: null,\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle\n // ─────────────────────────────────────────────────────────\n case INIT_INTERACTION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_INTERACTION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Actions\n // ─────────────────────────────────────────────────────────\n case ACTIVATE_MODE: {\n const { documentId, mode } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activeMode: mode,\n },\n },\n };\n }\n\n case SET_CURSOR: {\n const { documentId, cursor } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n cursor,\n },\n },\n };\n }\n\n case PAUSE_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: true,\n },\n },\n };\n }\n\n case RESUME_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: false,\n },\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Global Actions\n // ─────────────────────────────────────────────────────────\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ),\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\n };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":["INIT_INTERACTION_STATE","CLEANUP_INTERACTION_STATE","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","setDefaultMode","mode","type","payload","setExclusionRules","rules","INITIAL_MODE","_InteractionManagerPlugin","BasePlugin","constructor","id","registry","config","super","this","modes","Map","cursorClaims","buckets","alwaysGlobal","alwaysPage","onModeChange$","createEmitter","onHandlerChange$","onCursorChange$","onStateChange$","createBehaviorEmitter","registerMode","scope","exclusive","cursor","dispatch","exclusionRules","onDocumentLoadingStarted","documentId","docState","activeMode","state","defaultMode","paused","initInteractionState","set","Set","docBuckets","get","modeId","keys","global","page","logger","debug","onDocumentClosed","delete","cleanupInteractionState","buildCapability","getActiveMode","getActiveInteractionMode","activate","activateDefaultMode","setCursor","token","priority","getCurrentCursor","removeCursor","getHandlersForScope","activeModeIsExclusive","pause","resume","isPaused","isDestroyed","getState","getDocumentStateOrThrow","forDocument","createInteractionScope","registerHandlers","options","registerAlways","getDefaultMode","getExclusionRules","addExclusionClass","className","removeExclusionClass","addExclusionAttribute","attribute","removeExclusionAttribute","onModeChange","on","onCursorChange","onHandlerChange","onStateChange","listener","event","getDocumentState","getActiveDocumentId","documents","Error","has","previousMode","_a","clear","notifyHandlersInactive","activateMode","emitCursor","notifyHandlersActive","emit","pauseInteraction","resumeInteraction","handlers","pageIndex","modeIds","Array","isArray","cleanupFunctions","bucket","add","push","size","forEach","cleanup","docPageMap","mergeSets","a","b","list","out","k","evt","nativeEvt","h","call","mergeHandlers","claims","top","values","sort","handler","onHandlerActiveStart","_b","handlerSet","onHandlerActiveEnd","onStoreUpdated","prevState","newState","prevDoc","newDoc","initialize","_","info","destroy","InteractionManagerPlugin","INTERACTION_MANAGER_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","classes","dataAttributes","initialDocumentState","initialState","activeDocumentId","reducer","action","removed","remainingDocs","filter","v","i","indexOf","c","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, InteractionDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_INTERACTION_STATE = 'INTERACTION/INIT_STATE';\nexport const CLEANUP_INTERACTION_STATE = 'INTERACTION/CLEANUP_STATE';\n\n// Per-document actions\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_ACTIVE_DOCUMENT = 'INTERACTION/SET_ACTIVE_DOCUMENT';\n\n// Global actions\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\n// Document lifecycle actions\nexport interface InitInteractionStateAction extends Action {\n type: typeof INIT_INTERACTION_STATE;\n payload: {\n documentId: string;\n state: InteractionDocumentState;\n };\n}\n\nexport interface CleanupInteractionStateAction extends Action {\n type: typeof CLEANUP_INTERACTION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: {\n documentId: string;\n mode: string;\n };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: {\n documentId: string;\n cursor: string;\n };\n}\n\n// Global actions\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport type InteractionManagerAction =\n | InitInteractionStateAction\n | CleanupInteractionStateAction\n | SetActiveDocumentAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction;\n\n// Action creators\nexport function initInteractionState(\n documentId: string,\n state: InteractionDocumentState,\n): InitInteractionStateAction {\n return { type: INIT_INTERACTION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupInteractionState(documentId: string): CleanupInteractionStateAction {\n return { type: CLEANUP_INTERACTION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function activateMode(documentId: string, mode: string): ActivateModeAction {\n return { type: ACTIVATE_MODE, payload: { documentId, mode } };\n}\n\nexport function pauseInteraction(documentId: string): PauseInteractionAction {\n return { type: PAUSE_INTERACTION, payload: documentId };\n}\n\nexport function resumeInteraction(documentId: string): ResumeInteractionAction {\n return { type: RESUME_INTERACTION, payload: documentId };\n}\n\nexport function setCursor(documentId: string, cursor: string): SetCursorAction {\n return { type: SET_CURSOR, payload: { documentId, cursor } };\n}\n\nexport function setDefaultMode(mode: string): SetDefaultModeAction {\n return { type: SET_DEFAULT_MODE, payload: { mode } };\n}\n\nexport function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction {\n return { type: SET_EXCLUSION_RULES, payload: { rules } };\n}\n\nexport function addExclusionClass(className: string): AddExclusionClassAction {\n return { type: ADD_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function removeExclusionClass(className: string): RemoveExclusionClassAction {\n return { type: REMOVE_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function addExclusionAttribute(attribute: string): AddExclusionAttributeAction {\n return { type: ADD_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n\nexport function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction {\n return { type: REMOVE_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n Listener,\n PluginRegistry,\n} from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n ModeChangeEvent,\n CursorChangeEvent,\n StateChangeEvent,\n InteractionDocumentState,\n InteractionManagerScope,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n cleanupInteractionState,\n initInteractionState,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n InteractionManagerAction,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper */\n global: HandlerSet;\n /** handlers that listen on a specific page wrapper */\n page: PageHandlerMap;\n}\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState,\n InteractionManagerAction\n> {\n static readonly id = 'interaction-manager' as const;\n\n // Global mode definitions (shared across documents)\n private modes = new Map<string, InteractionMode>();\n\n // Per-document cursor claims: documentId -> token -> claim\n private cursorClaims = new Map<string, Map<string, CursorClaim>>();\n\n // Per-document handler buckets: documentId -> modeId -> buckets\n private buckets = new Map<string, Map<string, ModeBuckets>>();\n\n // Per-document always-active handlers\n private alwaysGlobal = new Map<string, Set<PointerEventHandlersWithLifecycle>>();\n private alwaysPage = new Map<string, Map<number, Set<PointerEventHandlersWithLifecycle>>>();\n\n // Event emitters\n private readonly onModeChange$ = createEmitter<ModeChangeEvent>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<CursorChangeEvent>();\n private readonly onStateChange$ = createBehaviorEmitter<StateChangeEvent>();\n\n constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n // Register default mode globally\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.dispatch(setDefaultMode(INITIAL_MODE));\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize interaction state for this document\n const docState: InteractionDocumentState = {\n activeMode: this.state.defaultMode,\n cursor: 'auto',\n paused: false,\n };\n\n this.dispatch(initInteractionState(documentId, docState));\n\n // Initialize per-document data structures\n this.cursorClaims.set(documentId, new Map());\n this.buckets.set(documentId, new Map());\n this.alwaysGlobal.set(documentId, new Set());\n this.alwaysPage.set(documentId, new Map());\n\n // Initialize buckets for all registered modes\n const docBuckets = this.buckets.get(documentId)!;\n for (const modeId of this.modes.keys()) {\n docBuckets.set(modeId, { global: new Set(), page: new Map() });\n }\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentOpened',\n `Initialized interaction state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup per-document data structures\n this.cursorClaims.delete(documentId);\n this.buckets.delete(documentId);\n this.alwaysGlobal.delete(documentId);\n this.alwaysPage.delete(documentId);\n\n // Cleanup state\n this.dispatch(cleanupInteractionState(documentId));\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentClosed',\n `Cleaned up interaction state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n // Active document operations\n getActiveMode: () => this.getActiveMode(),\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n activate: (modeId: string) => this.activate(modeId),\n activateDefaultMode: () => this.activateDefaultMode(),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority),\n getCurrentCursor: () => this.getCurrentCursor(),\n removeCursor: (token: string) => this.removeCursor(token),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n pause: () => this.pause(),\n resume: () => this.resume(),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.isPaused(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createInteractionScope(documentId),\n\n // Global management\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\n\n // Events\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createInteractionScope(documentId: string): InteractionManagerScope {\n return {\n getActiveMode: () => this.getActiveMode(documentId),\n getActiveInteractionMode: () => this.getActiveInteractionMode(documentId),\n activate: (modeId: string) => this.activate(modeId, documentId),\n activateDefaultMode: () => this.activateDefaultMode(documentId),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority, documentId),\n getCurrentCursor: () => this.getCurrentCursor(documentId),\n removeCursor: (token: string) => this.removeCursor(token, documentId),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(documentId),\n pause: () => this.pause(documentId),\n resume: () => this.resume(documentId),\n isPaused: () => this.isPaused(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onModeChange: (listener: Listener<string>) =>\n this.onModeChange$.on((event) => {\n if (event.documentId === documentId) listener(event.activeMode);\n }),\n onCursorChange: (listener: Listener<string>) =>\n this.onCursorChange$.on((event) => {\n if (event.documentId === documentId) listener(event.cursor);\n }),\n onStateChange: (listener: Listener<InteractionDocumentState>) =>\n this.onStateChange$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): InteractionDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): InteractionDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Interaction state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private activate(modeId: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentStateOrThrow(id);\n\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] unknown mode '${modeId}'`);\n }\n if (modeId === docState.activeMode) return;\n\n const previousMode = docState.activeMode;\n\n // Clear cursor claims for this document\n this.cursorClaims.get(id)?.clear();\n\n // Notify handlers going inactive\n this.notifyHandlersInactive(id, previousMode);\n\n // Update state\n this.dispatch(activateMode(id, modeId));\n\n // Emit cursor\n this.emitCursor(id);\n\n // Notify handlers going active\n this.notifyHandlersActive(id, modeId);\n\n // Emit mode change event\n this.onModeChange$.emit({\n documentId: id,\n activeMode: modeId,\n previousMode,\n });\n }\n\n private activateDefaultMode(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentIdOrNull();\n if (!id) return;\n this.activate(this.state.defaultMode, id);\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private getActiveMode(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).activeMode;\n }\n\n private getActiveInteractionMode(documentId?: string): InteractionMode | null {\n const docState = this.getDocumentState(documentId);\n if (!docState) return null;\n return this.modes.get(docState.activeMode) ?? null;\n }\n\n private activeModeIsExclusive(documentId?: string): boolean {\n const mode = this.getActiveInteractionMode(documentId);\n return !!mode?.exclusive;\n }\n\n private pause(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(pauseInteraction(id));\n }\n\n private resume(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(resumeInteraction(id));\n }\n\n private isPaused(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).paused;\n }\n\n // ─────────────────────────────────────────────────────────\n // Mode Management\n // ─────────────────────────────────────────────────────────\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n\n // Add buckets for this mode in all existing documents\n for (const documentId of this.buckets.keys()) {\n const docBuckets = this.buckets.get(documentId)!;\n if (!docBuckets.has(mode.id)) {\n docBuckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Management\n // ─────────────────────────────────────────────────────────\n\n private registerHandlers({\n documentId,\n modeId,\n handlers,\n pageIndex,\n }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) {\n throw new Error(`No buckets found for document: ${documentId}`);\n }\n\n for (const id of modeIds) {\n const bucket = docBuckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n const set = this.alwaysGlobal.get(scope.documentId) ?? new Set();\n set.add(handlers);\n this.alwaysGlobal.set(scope.documentId, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n const docPageMap = this.alwaysPage.get(scope.documentId) ?? new Map();\n const set = docPageMap.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n docPageMap.set(scope.pageIndex, set);\n this.alwaysPage.set(scope.documentId, docPageMap);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const docState = this.getDocumentState(scope.documentId);\n if (!docState) return null;\n\n const mode = this.modes.get(docState.activeMode);\n if (!mode) return null;\n\n const docBuckets = this.buckets.get(scope.documentId);\n if (!docBuckets) return null;\n\n const bucket = docBuckets.get(mode.id);\n if (!bucket) return null;\n\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n if (scope.type === 'global') {\n const alwaysSet = this.alwaysGlobal.get(scope.documentId) ?? new Set<PointerEventHandlers>();\n const modeSpecific =\n mode.scope === 'global' ? bucket.global : new Set<PointerEventHandlers>();\n return mergeSets(alwaysSet, modeSpecific);\n }\n\n const alwaysPageSet =\n this.alwaysPage.get(scope.documentId)?.get(scope.pageIndex) ??\n new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>();\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n // ─────────────────────────────────────────────────────────\n // Cursor Management\n // ─────────────────────────────────────────────────────────\n\n private setCursor(token: string, cursor: string, priority = 0, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.set(token, { cursor, priority });\n this.emitCursor(id);\n }\n\n private removeCursor(token: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.delete(token);\n this.emitCursor(id);\n }\n\n private getCurrentCursor(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).cursor;\n }\n\n private emitCursor(documentId: string) {\n const claims = this.cursorClaims.get(documentId);\n if (!claims) return;\n\n const docState = this.getDocumentState(documentId);\n if (!docState) return;\n\n const top = [...claims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(docState.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== docState.cursor) {\n this.dispatch(setCursor(documentId, top.cursor));\n this.onCursorChange$.emit({\n documentId,\n cursor: top.cursor,\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Lifecycle Notifications\n // ─────────────────────────────────────────────────────────\n\n private notifyHandlersActive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(\n prevState: InteractionManagerState,\n newState: InteractionManagerState,\n ): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc !== newDoc) {\n this.onStateChange$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {\n this.logger.info(\n 'InteractionManagerPlugin',\n 'Initialize',\n 'Interaction Manager Plugin initialized',\n );\n }\n\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n this.onHandlerChange$.clear();\n this.onStateChange$.clear();\n await super.destroy();\n }\n}\n","import { 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 exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n InteractionManagerAction,\n INIT_INTERACTION_STATE,\n CLEANUP_INTERACTION_STATE,\n SET_ACTIVE_DOCUMENT,\n ACTIVATE_MODE,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_DEFAULT_MODE,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState, InteractionDocumentState } from './types';\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport const initialDocumentState: InteractionDocumentState = {\n activeMode: INITIAL_MODE,\n cursor: 'auto',\n paused: false,\n};\n\nexport const initialState: InteractionManagerState = {\n defaultMode: INITIAL_MODE,\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n documents: {},\n activeDocumentId: null,\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle\n // ─────────────────────────────────────────────────────────\n case INIT_INTERACTION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_INTERACTION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Actions\n // ─────────────────────────────────────────────────────────\n case ACTIVATE_MODE: {\n const { documentId, mode } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activeMode: mode,\n },\n },\n };\n }\n\n case SET_CURSOR: {\n const { documentId, cursor } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n cursor,\n },\n },\n };\n }\n\n case PAUSE_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: true,\n },\n },\n };\n }\n\n case RESUME_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: false,\n },\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Global Actions\n // ─────────────────────────────────────────────────────────\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ),\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\n };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":["INIT_INTERACTION_STATE","CLEANUP_INTERACTION_STATE","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","setDefaultMode","mode","type","payload","setExclusionRules","rules","INITIAL_MODE","_InteractionManagerPlugin","BasePlugin","constructor","id","registry","config","super","this","modes","Map","cursorClaims","buckets","alwaysGlobal","alwaysPage","onModeChange$","createEmitter","onHandlerChange$","onCursorChange$","onStateChange$","createBehaviorEmitter","registerMode","scope","exclusive","cursor","dispatch","exclusionRules","onDocumentLoadingStarted","documentId","docState","activeMode","state","defaultMode","paused","initInteractionState","set","Set","docBuckets","get","modeId","keys","global","page","logger","debug","onDocumentClosed","delete","cleanupInteractionState","buildCapability","getActiveMode","getActiveInteractionMode","activate","activateDefaultMode","setCursor","token","priority","getCurrentCursor","removeCursor","getHandlersForScope","activeModeIsExclusive","pause","resume","isPaused","isDestroyed","getState","getDocumentStateOrThrow","forDocument","createInteractionScope","registerHandlers","options","registerAlways","getDefaultMode","getExclusionRules","addExclusionClass","className","removeExclusionClass","addExclusionAttribute","attribute","removeExclusionAttribute","onModeChange","on","onCursorChange","onHandlerChange","onStateChange","listener","event","getDocumentState","getActiveDocumentId","documents","Error","has","previousMode","_a","clear","notifyHandlersInactive","activateMode","emitCursor","notifyHandlersActive","emit","getActiveDocumentIdOrNull","pauseInteraction","resumeInteraction","handlers","pageIndex","modeIds","Array","isArray","cleanupFunctions","bucket","add","push","size","forEach","cleanup","docPageMap","mergeSets","a","b","list","out","k","evt","nativeEvt","h","call","mergeHandlers","claims","top","values","sort","handler","onHandlerActiveStart","_b","handlerSet","onHandlerActiveEnd","onStoreUpdated","prevState","newState","prevDoc","newDoc","initialize","_","info","destroy","InteractionManagerPlugin","INTERACTION_MANAGER_PLUGIN_ID","manifest","name","version","provides","requires","optional","defaultConfig","classes","dataAttributes","initialDocumentState","initialState","activeDocumentId","reducer","action","removed","remainingDocs","filter","v","i","indexOf","c","InteractionManagerPluginPackage","create"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -242,7 +242,8 @@ const _InteractionManagerPlugin = class _InteractionManagerPlugin extends BasePl
|
|
|
242
242
|
});
|
|
243
243
|
}
|
|
244
244
|
activateDefaultMode(documentId) {
|
|
245
|
-
const id = documentId ?? this.
|
|
245
|
+
const id = documentId ?? this.getActiveDocumentIdOrNull();
|
|
246
|
+
if (!id) return;
|
|
246
247
|
this.activate(this.state.defaultMode, id);
|
|
247
248
|
}
|
|
248
249
|
setDefaultMode(modeId) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { InteractionExclusionRules, InteractionDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_INTERACTION_STATE = 'INTERACTION/INIT_STATE';\nexport const CLEANUP_INTERACTION_STATE = 'INTERACTION/CLEANUP_STATE';\n\n// Per-document actions\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_ACTIVE_DOCUMENT = 'INTERACTION/SET_ACTIVE_DOCUMENT';\n\n// Global actions\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\n// Document lifecycle actions\nexport interface InitInteractionStateAction extends Action {\n type: typeof INIT_INTERACTION_STATE;\n payload: {\n documentId: string;\n state: InteractionDocumentState;\n };\n}\n\nexport interface CleanupInteractionStateAction extends Action {\n type: typeof CLEANUP_INTERACTION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: {\n documentId: string;\n mode: string;\n };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: {\n documentId: string;\n cursor: string;\n };\n}\n\n// Global actions\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport type InteractionManagerAction =\n | InitInteractionStateAction\n | CleanupInteractionStateAction\n | SetActiveDocumentAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction;\n\n// Action creators\nexport function initInteractionState(\n documentId: string,\n state: InteractionDocumentState,\n): InitInteractionStateAction {\n return { type: INIT_INTERACTION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupInteractionState(documentId: string): CleanupInteractionStateAction {\n return { type: CLEANUP_INTERACTION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function activateMode(documentId: string, mode: string): ActivateModeAction {\n return { type: ACTIVATE_MODE, payload: { documentId, mode } };\n}\n\nexport function pauseInteraction(documentId: string): PauseInteractionAction {\n return { type: PAUSE_INTERACTION, payload: documentId };\n}\n\nexport function resumeInteraction(documentId: string): ResumeInteractionAction {\n return { type: RESUME_INTERACTION, payload: documentId };\n}\n\nexport function setCursor(documentId: string, cursor: string): SetCursorAction {\n return { type: SET_CURSOR, payload: { documentId, cursor } };\n}\n\nexport function setDefaultMode(mode: string): SetDefaultModeAction {\n return { type: SET_DEFAULT_MODE, payload: { mode } };\n}\n\nexport function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction {\n return { type: SET_EXCLUSION_RULES, payload: { rules } };\n}\n\nexport function addExclusionClass(className: string): AddExclusionClassAction {\n return { type: ADD_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function removeExclusionClass(className: string): RemoveExclusionClassAction {\n return { type: REMOVE_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function addExclusionAttribute(attribute: string): AddExclusionAttributeAction {\n return { type: ADD_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n\nexport function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction {\n return { type: REMOVE_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseCancel',\n 'onClick',\n 'onDoubleClick',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any, modeId: string) => {\n for (const h of list) h[k]?.(evt, nativeEvt, modeId);\n };\n }\n return out as PointerEventHandlers;\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n Listener,\n PluginRegistry,\n} from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n ModeChangeEvent,\n CursorChangeEvent,\n StateChangeEvent,\n InteractionDocumentState,\n InteractionManagerScope,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n cleanupInteractionState,\n initInteractionState,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n InteractionManagerAction,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper */\n global: HandlerSet;\n /** handlers that listen on a specific page wrapper */\n page: PageHandlerMap;\n}\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState,\n InteractionManagerAction\n> {\n static readonly id = 'interaction-manager' as const;\n\n // Global mode definitions (shared across documents)\n private modes = new Map<string, InteractionMode>();\n\n // Per-document cursor claims: documentId -> token -> claim\n private cursorClaims = new Map<string, Map<string, CursorClaim>>();\n\n // Per-document handler buckets: documentId -> modeId -> buckets\n private buckets = new Map<string, Map<string, ModeBuckets>>();\n\n // Per-document always-active handlers\n private alwaysGlobal = new Map<string, Set<PointerEventHandlersWithLifecycle>>();\n private alwaysPage = new Map<string, Map<number, Set<PointerEventHandlersWithLifecycle>>>();\n\n // Event emitters\n private readonly onModeChange$ = createEmitter<ModeChangeEvent>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<CursorChangeEvent>();\n private readonly onStateChange$ = createBehaviorEmitter<StateChangeEvent>();\n\n constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n // Register default mode globally\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.dispatch(setDefaultMode(INITIAL_MODE));\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize interaction state for this document\n const docState: InteractionDocumentState = {\n activeMode: this.state.defaultMode,\n cursor: 'auto',\n paused: false,\n };\n\n this.dispatch(initInteractionState(documentId, docState));\n\n // Initialize per-document data structures\n this.cursorClaims.set(documentId, new Map());\n this.buckets.set(documentId, new Map());\n this.alwaysGlobal.set(documentId, new Set());\n this.alwaysPage.set(documentId, new Map());\n\n // Initialize buckets for all registered modes\n const docBuckets = this.buckets.get(documentId)!;\n for (const modeId of this.modes.keys()) {\n docBuckets.set(modeId, { global: new Set(), page: new Map() });\n }\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentOpened',\n `Initialized interaction state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup per-document data structures\n this.cursorClaims.delete(documentId);\n this.buckets.delete(documentId);\n this.alwaysGlobal.delete(documentId);\n this.alwaysPage.delete(documentId);\n\n // Cleanup state\n this.dispatch(cleanupInteractionState(documentId));\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentClosed',\n `Cleaned up interaction state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n // Active document operations\n getActiveMode: () => this.getActiveMode(),\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n activate: (modeId: string) => this.activate(modeId),\n activateDefaultMode: () => this.activateDefaultMode(),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority),\n getCurrentCursor: () => this.getCurrentCursor(),\n removeCursor: (token: string) => this.removeCursor(token),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n pause: () => this.pause(),\n resume: () => this.resume(),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.isPaused(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createInteractionScope(documentId),\n\n // Global management\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\n\n // Events\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createInteractionScope(documentId: string): InteractionManagerScope {\n return {\n getActiveMode: () => this.getActiveMode(documentId),\n getActiveInteractionMode: () => this.getActiveInteractionMode(documentId),\n activate: (modeId: string) => this.activate(modeId, documentId),\n activateDefaultMode: () => this.activateDefaultMode(documentId),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority, documentId),\n getCurrentCursor: () => this.getCurrentCursor(documentId),\n removeCursor: (token: string) => this.removeCursor(token, documentId),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(documentId),\n pause: () => this.pause(documentId),\n resume: () => this.resume(documentId),\n isPaused: () => this.isPaused(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onModeChange: (listener: Listener<string>) =>\n this.onModeChange$.on((event) => {\n if (event.documentId === documentId) listener(event.activeMode);\n }),\n onCursorChange: (listener: Listener<string>) =>\n this.onCursorChange$.on((event) => {\n if (event.documentId === documentId) listener(event.cursor);\n }),\n onStateChange: (listener: Listener<InteractionDocumentState>) =>\n this.onStateChange$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): InteractionDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): InteractionDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Interaction state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private activate(modeId: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentStateOrThrow(id);\n\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] unknown mode '${modeId}'`);\n }\n if (modeId === docState.activeMode) return;\n\n const previousMode = docState.activeMode;\n\n // Clear cursor claims for this document\n this.cursorClaims.get(id)?.clear();\n\n // Notify handlers going inactive\n this.notifyHandlersInactive(id, previousMode);\n\n // Update state\n this.dispatch(activateMode(id, modeId));\n\n // Emit cursor\n this.emitCursor(id);\n\n // Notify handlers going active\n this.notifyHandlersActive(id, modeId);\n\n // Emit mode change event\n this.onModeChange$.emit({\n documentId: id,\n activeMode: modeId,\n previousMode,\n });\n }\n\n private activateDefaultMode(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n this.activate(this.state.defaultMode, id);\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private getActiveMode(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).activeMode;\n }\n\n private getActiveInteractionMode(documentId?: string): InteractionMode | null {\n const docState = this.getDocumentState(documentId);\n if (!docState) return null;\n return this.modes.get(docState.activeMode) ?? null;\n }\n\n private activeModeIsExclusive(documentId?: string): boolean {\n const mode = this.getActiveInteractionMode(documentId);\n return !!mode?.exclusive;\n }\n\n private pause(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(pauseInteraction(id));\n }\n\n private resume(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(resumeInteraction(id));\n }\n\n private isPaused(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).paused;\n }\n\n // ─────────────────────────────────────────────────────────\n // Mode Management\n // ─────────────────────────────────────────────────────────\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n\n // Add buckets for this mode in all existing documents\n for (const documentId of this.buckets.keys()) {\n const docBuckets = this.buckets.get(documentId)!;\n if (!docBuckets.has(mode.id)) {\n docBuckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Management\n // ─────────────────────────────────────────────────────────\n\n private registerHandlers({\n documentId,\n modeId,\n handlers,\n pageIndex,\n }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) {\n throw new Error(`No buckets found for document: ${documentId}`);\n }\n\n for (const id of modeIds) {\n const bucket = docBuckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n const set = this.alwaysGlobal.get(scope.documentId) ?? new Set();\n set.add(handlers);\n this.alwaysGlobal.set(scope.documentId, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n const docPageMap = this.alwaysPage.get(scope.documentId) ?? new Map();\n const set = docPageMap.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n docPageMap.set(scope.pageIndex, set);\n this.alwaysPage.set(scope.documentId, docPageMap);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const docState = this.getDocumentState(scope.documentId);\n if (!docState) return null;\n\n const mode = this.modes.get(docState.activeMode);\n if (!mode) return null;\n\n const docBuckets = this.buckets.get(scope.documentId);\n if (!docBuckets) return null;\n\n const bucket = docBuckets.get(mode.id);\n if (!bucket) return null;\n\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n if (scope.type === 'global') {\n const alwaysSet = this.alwaysGlobal.get(scope.documentId) ?? new Set<PointerEventHandlers>();\n const modeSpecific =\n mode.scope === 'global' ? bucket.global : new Set<PointerEventHandlers>();\n return mergeSets(alwaysSet, modeSpecific);\n }\n\n const alwaysPageSet =\n this.alwaysPage.get(scope.documentId)?.get(scope.pageIndex) ??\n new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>();\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n // ─────────────────────────────────────────────────────────\n // Cursor Management\n // ─────────────────────────────────────────────────────────\n\n private setCursor(token: string, cursor: string, priority = 0, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.set(token, { cursor, priority });\n this.emitCursor(id);\n }\n\n private removeCursor(token: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.delete(token);\n this.emitCursor(id);\n }\n\n private getCurrentCursor(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).cursor;\n }\n\n private emitCursor(documentId: string) {\n const claims = this.cursorClaims.get(documentId);\n if (!claims) return;\n\n const docState = this.getDocumentState(documentId);\n if (!docState) return;\n\n const top = [...claims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(docState.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== docState.cursor) {\n this.dispatch(setCursor(documentId, top.cursor));\n this.onCursorChange$.emit({\n documentId,\n cursor: top.cursor,\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Lifecycle Notifications\n // ─────────────────────────────────────────────────────────\n\n private notifyHandlersActive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(\n prevState: InteractionManagerState,\n newState: InteractionManagerState,\n ): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc !== newDoc) {\n this.onStateChange$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {\n this.logger.info(\n 'InteractionManagerPlugin',\n 'Initialize',\n 'Interaction Manager Plugin initialized',\n );\n }\n\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n this.onHandlerChange$.clear();\n this.onStateChange$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n InteractionManagerAction,\n INIT_INTERACTION_STATE,\n CLEANUP_INTERACTION_STATE,\n SET_ACTIVE_DOCUMENT,\n ACTIVATE_MODE,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_DEFAULT_MODE,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState, InteractionDocumentState } from './types';\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport const initialDocumentState: InteractionDocumentState = {\n activeMode: INITIAL_MODE,\n cursor: 'auto',\n paused: false,\n};\n\nexport const initialState: InteractionManagerState = {\n defaultMode: INITIAL_MODE,\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n documents: {},\n activeDocumentId: null,\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle\n // ─────────────────────────────────────────────────────────\n case INIT_INTERACTION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_INTERACTION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Actions\n // ─────────────────────────────────────────────────────────\n case ACTIVATE_MODE: {\n const { documentId, mode } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activeMode: mode,\n },\n },\n };\n }\n\n case SET_CURSOR: {\n const { documentId, cursor } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n cursor,\n },\n },\n };\n }\n\n case PAUSE_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: true,\n },\n },\n };\n }\n\n case RESUME_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: false,\n },\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Global Actions\n // ─────────────────────────────────────────────────────────\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ),\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\n };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":["INITIAL_MODE","set","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/helper.ts","../src/lib/interaction-manager-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { InteractionExclusionRules, InteractionDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_INTERACTION_STATE = 'INTERACTION/INIT_STATE';\nexport const CLEANUP_INTERACTION_STATE = 'INTERACTION/CLEANUP_STATE';\n\n// Per-document actions\nexport const ACTIVATE_MODE = 'INTERACTION/ACTIVATE_MODE';\nexport const PAUSE_INTERACTION = 'INTERACTION/PAUSE';\nexport const RESUME_INTERACTION = 'INTERACTION/RESUME';\nexport const SET_CURSOR = 'INTERACTION/SET_CURSOR';\nexport const SET_ACTIVE_DOCUMENT = 'INTERACTION/SET_ACTIVE_DOCUMENT';\n\n// Global actions\nexport const SET_DEFAULT_MODE = 'INTERACTION/SET_DEFAULT_MODE';\nexport const SET_EXCLUSION_RULES = 'INTERACTION/SET_EXCLUSION_RULES';\nexport const ADD_EXCLUSION_CLASS = 'INTERACTION/ADD_EXCLUSION_CLASS';\nexport const REMOVE_EXCLUSION_CLASS = 'INTERACTION/REMOVE_EXCLUSION_CLASS';\nexport const ADD_EXCLUSION_ATTRIBUTE = 'INTERACTION/ADD_EXCLUSION_ATTRIBUTE';\nexport const REMOVE_EXCLUSION_ATTRIBUTE = 'INTERACTION/REMOVE_EXCLUSION_ATTRIBUTE';\n\n// Document lifecycle actions\nexport interface InitInteractionStateAction extends Action {\n type: typeof INIT_INTERACTION_STATE;\n payload: {\n documentId: string;\n state: InteractionDocumentState;\n };\n}\n\nexport interface CleanupInteractionStateAction extends Action {\n type: typeof CLEANUP_INTERACTION_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActiveDocumentAction extends Action {\n type: typeof SET_ACTIVE_DOCUMENT;\n payload: string | null; // documentId\n}\n\n// Per-document actions\nexport interface ActivateModeAction extends Action {\n type: typeof ACTIVATE_MODE;\n payload: {\n documentId: string;\n mode: string;\n };\n}\n\nexport interface PauseInteractionAction extends Action {\n type: typeof PAUSE_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface ResumeInteractionAction extends Action {\n type: typeof RESUME_INTERACTION;\n payload: string; // documentId\n}\n\nexport interface SetCursorAction extends Action {\n type: typeof SET_CURSOR;\n payload: {\n documentId: string;\n cursor: string;\n };\n}\n\n// Global actions\nexport interface SetDefaultModeAction extends Action {\n type: typeof SET_DEFAULT_MODE;\n payload: { mode: string };\n}\n\nexport interface SetExclusionRulesAction extends Action {\n type: typeof SET_EXCLUSION_RULES;\n payload: { rules: InteractionExclusionRules };\n}\n\nexport interface AddExclusionClassAction extends Action {\n type: typeof ADD_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface RemoveExclusionClassAction extends Action {\n type: typeof REMOVE_EXCLUSION_CLASS;\n payload: { className: string };\n}\n\nexport interface AddExclusionAttributeAction extends Action {\n type: typeof ADD_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport interface RemoveExclusionAttributeAction extends Action {\n type: typeof REMOVE_EXCLUSION_ATTRIBUTE;\n payload: { attribute: string };\n}\n\nexport type InteractionManagerAction =\n | InitInteractionStateAction\n | CleanupInteractionStateAction\n | SetActiveDocumentAction\n | ActivateModeAction\n | PauseInteractionAction\n | ResumeInteractionAction\n | SetCursorAction\n | SetDefaultModeAction\n | SetExclusionRulesAction\n | AddExclusionClassAction\n | RemoveExclusionClassAction\n | AddExclusionAttributeAction\n | RemoveExclusionAttributeAction;\n\n// Action creators\nexport function initInteractionState(\n documentId: string,\n state: InteractionDocumentState,\n): InitInteractionStateAction {\n return { type: INIT_INTERACTION_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupInteractionState(documentId: string): CleanupInteractionStateAction {\n return { type: CLEANUP_INTERACTION_STATE, payload: documentId };\n}\n\nexport function setActiveDocument(documentId: string | null): SetActiveDocumentAction {\n return { type: SET_ACTIVE_DOCUMENT, payload: documentId };\n}\n\nexport function activateMode(documentId: string, mode: string): ActivateModeAction {\n return { type: ACTIVATE_MODE, payload: { documentId, mode } };\n}\n\nexport function pauseInteraction(documentId: string): PauseInteractionAction {\n return { type: PAUSE_INTERACTION, payload: documentId };\n}\n\nexport function resumeInteraction(documentId: string): ResumeInteractionAction {\n return { type: RESUME_INTERACTION, payload: documentId };\n}\n\nexport function setCursor(documentId: string, cursor: string): SetCursorAction {\n return { type: SET_CURSOR, payload: { documentId, cursor } };\n}\n\nexport function setDefaultMode(mode: string): SetDefaultModeAction {\n return { type: SET_DEFAULT_MODE, payload: { mode } };\n}\n\nexport function setExclusionRules(rules: InteractionExclusionRules): SetExclusionRulesAction {\n return { type: SET_EXCLUSION_RULES, payload: { rules } };\n}\n\nexport function addExclusionClass(className: string): AddExclusionClassAction {\n return { type: ADD_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function removeExclusionClass(className: string): RemoveExclusionClassAction {\n return { type: REMOVE_EXCLUSION_CLASS, payload: { className } };\n}\n\nexport function addExclusionAttribute(attribute: string): AddExclusionAttributeAction {\n return { type: ADD_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n\nexport function removeExclusionAttribute(attribute: string): RemoveExclusionAttributeAction {\n return { type: REMOVE_EXCLUSION_ATTRIBUTE, payload: { attribute } };\n}\n","import { PointerEventHandlers } from './types';\n\nexport function mergeHandlers(list: PointerEventHandlers[]): PointerEventHandlers {\n const keys: (keyof PointerEventHandlers)[] = [\n 'onPointerDown',\n 'onPointerUp',\n 'onPointerMove',\n 'onPointerEnter',\n 'onPointerLeave',\n 'onPointerCancel',\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseCancel',\n 'onClick',\n 'onDoubleClick',\n ];\n const out: Partial<PointerEventHandlers> = {};\n for (const k of keys) {\n out[k] = (evt: any, nativeEvt: any, modeId: string) => {\n for (const h of list) h[k]?.(evt, nativeEvt, modeId);\n };\n }\n return out as PointerEventHandlers;\n}\n","import {\n BasePlugin,\n createBehaviorEmitter,\n createEmitter,\n Listener,\n PluginRegistry,\n} from '@embedpdf/core';\n\nimport {\n InteractionExclusionRules,\n InteractionManagerCapability,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionMode,\n InteractionScope,\n PointerEventHandlers,\n PointerEventHandlersWithLifecycle,\n RegisterAlwaysOptions,\n RegisterHandlersOptions,\n ModeChangeEvent,\n CursorChangeEvent,\n StateChangeEvent,\n InteractionDocumentState,\n InteractionManagerScope,\n} from './types';\nimport {\n activateMode,\n addExclusionAttribute,\n addExclusionClass,\n cleanupInteractionState,\n initInteractionState,\n pauseInteraction,\n removeExclusionAttribute,\n removeExclusionClass,\n resumeInteraction,\n setCursor,\n setDefaultMode,\n setExclusionRules,\n InteractionManagerAction,\n} from './actions';\nimport { mergeHandlers } from './helper';\n\ninterface CursorClaim {\n cursor: string;\n priority: number;\n}\n\ntype HandlerSet = Set<PointerEventHandlersWithLifecycle>;\ntype PageHandlerMap = Map<number /*pageIdx*/, HandlerSet>;\n\ninterface ModeBuckets {\n /** handlers that listen on the global wrapper */\n global: HandlerSet;\n /** handlers that listen on a specific page wrapper */\n page: PageHandlerMap;\n}\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport class InteractionManagerPlugin extends BasePlugin<\n InteractionManagerPluginConfig,\n InteractionManagerCapability,\n InteractionManagerState,\n InteractionManagerAction\n> {\n static readonly id = 'interaction-manager' as const;\n\n // Global mode definitions (shared across documents)\n private modes = new Map<string, InteractionMode>();\n\n // Per-document cursor claims: documentId -> token -> claim\n private cursorClaims = new Map<string, Map<string, CursorClaim>>();\n\n // Per-document handler buckets: documentId -> modeId -> buckets\n private buckets = new Map<string, Map<string, ModeBuckets>>();\n\n // Per-document always-active handlers\n private alwaysGlobal = new Map<string, Set<PointerEventHandlersWithLifecycle>>();\n private alwaysPage = new Map<string, Map<number, Set<PointerEventHandlersWithLifecycle>>>();\n\n // Event emitters\n private readonly onModeChange$ = createEmitter<ModeChangeEvent>();\n private readonly onHandlerChange$ = createEmitter<InteractionManagerState>();\n private readonly onCursorChange$ = createEmitter<CursorChangeEvent>();\n private readonly onStateChange$ = createBehaviorEmitter<StateChangeEvent>();\n\n constructor(id: string, registry: PluginRegistry, config: InteractionManagerPluginConfig) {\n super(id, registry);\n\n // Register default mode globally\n this.registerMode({\n id: INITIAL_MODE,\n scope: 'page',\n exclusive: false,\n cursor: 'auto',\n });\n\n this.dispatch(setDefaultMode(INITIAL_MODE));\n if (config.exclusionRules) {\n this.dispatch(setExclusionRules(config.exclusionRules));\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize interaction state for this document\n const docState: InteractionDocumentState = {\n activeMode: this.state.defaultMode,\n cursor: 'auto',\n paused: false,\n };\n\n this.dispatch(initInteractionState(documentId, docState));\n\n // Initialize per-document data structures\n this.cursorClaims.set(documentId, new Map());\n this.buckets.set(documentId, new Map());\n this.alwaysGlobal.set(documentId, new Set());\n this.alwaysPage.set(documentId, new Map());\n\n // Initialize buckets for all registered modes\n const docBuckets = this.buckets.get(documentId)!;\n for (const modeId of this.modes.keys()) {\n docBuckets.set(modeId, { global: new Set(), page: new Map() });\n }\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentOpened',\n `Initialized interaction state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup per-document data structures\n this.cursorClaims.delete(documentId);\n this.buckets.delete(documentId);\n this.alwaysGlobal.delete(documentId);\n this.alwaysPage.delete(documentId);\n\n // Cleanup state\n this.dispatch(cleanupInteractionState(documentId));\n\n this.logger.debug(\n 'InteractionManagerPlugin',\n 'DocumentClosed',\n `Cleaned up interaction state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): InteractionManagerCapability {\n return {\n // Active document operations\n getActiveMode: () => this.getActiveMode(),\n getActiveInteractionMode: () => this.getActiveInteractionMode(),\n activate: (modeId: string) => this.activate(modeId),\n activateDefaultMode: () => this.activateDefaultMode(),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority),\n getCurrentCursor: () => this.getCurrentCursor(),\n removeCursor: (token: string) => this.removeCursor(token),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(),\n pause: () => this.pause(),\n resume: () => this.resume(),\n // Treat a destroyed registry as \"paused\" so late DOM events are ignored during teardown.\n isPaused: () => this.registry.isDestroyed() || this.isPaused(),\n getState: () => this.getDocumentStateOrThrow(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createInteractionScope(documentId),\n\n // Global management\n registerMode: (mode: InteractionMode) => this.registerMode(mode),\n registerHandlers: (options: RegisterHandlersOptions) => this.registerHandlers(options),\n registerAlways: (options: RegisterAlwaysOptions) => this.registerAlways(options),\n setDefaultMode: (id: string) => this.setDefaultMode(id),\n getDefaultMode: () => this.state.defaultMode,\n getExclusionRules: () => this.state.exclusionRules,\n setExclusionRules: (rules: InteractionExclusionRules) =>\n this.dispatch(setExclusionRules(rules)),\n addExclusionClass: (className: string) => this.dispatch(addExclusionClass(className)),\n removeExclusionClass: (className: string) => this.dispatch(removeExclusionClass(className)),\n addExclusionAttribute: (attribute: string) => this.dispatch(addExclusionAttribute(attribute)),\n removeExclusionAttribute: (attribute: string) =>\n this.dispatch(removeExclusionAttribute(attribute)),\n\n // Events\n onModeChange: this.onModeChange$.on,\n onCursorChange: this.onCursorChange$.on,\n onHandlerChange: this.onHandlerChange$.on,\n onStateChange: this.onStateChange$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createInteractionScope(documentId: string): InteractionManagerScope {\n return {\n getActiveMode: () => this.getActiveMode(documentId),\n getActiveInteractionMode: () => this.getActiveInteractionMode(documentId),\n activate: (modeId: string) => this.activate(modeId, documentId),\n activateDefaultMode: () => this.activateDefaultMode(documentId),\n setCursor: (token: string, cursor: string, priority?: number) =>\n this.setCursor(token, cursor, priority, documentId),\n getCurrentCursor: () => this.getCurrentCursor(documentId),\n removeCursor: (token: string) => this.removeCursor(token, documentId),\n getHandlersForScope: (scope: InteractionScope) => this.getHandlersForScope(scope),\n activeModeIsExclusive: () => this.activeModeIsExclusive(documentId),\n pause: () => this.pause(documentId),\n resume: () => this.resume(documentId),\n isPaused: () => this.isPaused(documentId),\n getState: () => this.getDocumentStateOrThrow(documentId),\n onModeChange: (listener: Listener<string>) =>\n this.onModeChange$.on((event) => {\n if (event.documentId === documentId) listener(event.activeMode);\n }),\n onCursorChange: (listener: Listener<string>) =>\n this.onCursorChange$.on((event) => {\n if (event.documentId === documentId) listener(event.cursor);\n }),\n onStateChange: (listener: Listener<InteractionDocumentState>) =>\n this.onStateChange$.on((event) => {\n if (event.documentId === documentId) listener(event.state);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n\n private getDocumentState(documentId?: string): InteractionDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): InteractionDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Interaction state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private activate(modeId: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const docState = this.getDocumentStateOrThrow(id);\n\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] unknown mode '${modeId}'`);\n }\n if (modeId === docState.activeMode) return;\n\n const previousMode = docState.activeMode;\n\n // Clear cursor claims for this document\n this.cursorClaims.get(id)?.clear();\n\n // Notify handlers going inactive\n this.notifyHandlersInactive(id, previousMode);\n\n // Update state\n this.dispatch(activateMode(id, modeId));\n\n // Emit cursor\n this.emitCursor(id);\n\n // Notify handlers going active\n this.notifyHandlersActive(id, modeId);\n\n // Emit mode change event\n this.onModeChange$.emit({\n documentId: id,\n activeMode: modeId,\n previousMode,\n });\n }\n\n private activateDefaultMode(documentId?: string) {\n const id = documentId ?? this.getActiveDocumentIdOrNull();\n if (!id) return;\n this.activate(this.state.defaultMode, id);\n }\n\n private setDefaultMode(modeId: string) {\n if (!this.modes.has(modeId)) {\n throw new Error(`[interaction] cannot set unknown mode '${modeId}' as default`);\n }\n this.dispatch(setDefaultMode(modeId));\n }\n\n private getActiveMode(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).activeMode;\n }\n\n private getActiveInteractionMode(documentId?: string): InteractionMode | null {\n const docState = this.getDocumentState(documentId);\n if (!docState) return null;\n return this.modes.get(docState.activeMode) ?? null;\n }\n\n private activeModeIsExclusive(documentId?: string): boolean {\n const mode = this.getActiveInteractionMode(documentId);\n return !!mode?.exclusive;\n }\n\n private pause(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(pauseInteraction(id));\n }\n\n private resume(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.dispatch(resumeInteraction(id));\n }\n\n private isPaused(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).paused;\n }\n\n // ─────────────────────────────────────────────────────────\n // Mode Management\n // ─────────────────────────────────────────────────────────\n\n private registerMode(mode: InteractionMode) {\n this.modes.set(mode.id, mode);\n\n // Add buckets for this mode in all existing documents\n for (const documentId of this.buckets.keys()) {\n const docBuckets = this.buckets.get(documentId)!;\n if (!docBuckets.has(mode.id)) {\n docBuckets.set(mode.id, { global: new Set(), page: new Map() });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Management\n // ─────────────────────────────────────────────────────────\n\n private registerHandlers({\n documentId,\n modeId,\n handlers,\n pageIndex,\n }: RegisterHandlersOptions): () => void {\n const modeIds = Array.isArray(modeId) ? modeId : [modeId];\n const cleanupFunctions: (() => void)[] = [];\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) {\n throw new Error(`No buckets found for document: ${documentId}`);\n }\n\n for (const id of modeIds) {\n const bucket = docBuckets.get(id);\n if (!bucket) throw new Error(`unknown mode '${id}'`);\n\n if (pageIndex == null) {\n bucket.global.add(handlers);\n } else {\n const set = bucket.page.get(pageIndex) ?? new Set();\n set.add(handlers);\n bucket.page.set(pageIndex, set);\n }\n\n cleanupFunctions.push(() => {\n if (pageIndex == null) {\n bucket.global.delete(handlers);\n } else {\n const set = bucket.page.get(pageIndex);\n if (set) {\n set.delete(handlers);\n if (set.size === 0) {\n bucket.page.delete(pageIndex);\n }\n }\n }\n });\n }\n\n this.onHandlerChange$.emit({ ...this.state });\n\n return () => {\n cleanupFunctions.forEach((cleanup) => cleanup());\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n public registerAlways({ scope, handlers }: RegisterAlwaysOptions): () => void {\n if (scope.type === 'global') {\n const set = this.alwaysGlobal.get(scope.documentId) ?? new Set();\n set.add(handlers);\n this.alwaysGlobal.set(scope.documentId, set);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n const docPageMap = this.alwaysPage.get(scope.documentId) ?? new Map();\n const set = docPageMap.get(scope.pageIndex) ?? new Set();\n set.add(handlers);\n docPageMap.set(scope.pageIndex, set);\n this.alwaysPage.set(scope.documentId, docPageMap);\n this.onHandlerChange$.emit({ ...this.state });\n return () => {\n set.delete(handlers);\n this.onHandlerChange$.emit({ ...this.state });\n };\n }\n\n private getHandlersForScope(scope: InteractionScope): PointerEventHandlers | null {\n const docState = this.getDocumentState(scope.documentId);\n if (!docState) return null;\n\n const mode = this.modes.get(docState.activeMode);\n if (!mode) return null;\n\n const docBuckets = this.buckets.get(scope.documentId);\n if (!docBuckets) return null;\n\n const bucket = docBuckets.get(mode.id);\n if (!bucket) return null;\n\n const mergeSets = (a: HandlerSet, b: HandlerSet) =>\n a.size || b.size ? mergeHandlers([...a, ...b]) : null;\n\n if (scope.type === 'global') {\n const alwaysSet = this.alwaysGlobal.get(scope.documentId) ?? new Set<PointerEventHandlers>();\n const modeSpecific =\n mode.scope === 'global' ? bucket.global : new Set<PointerEventHandlers>();\n return mergeSets(alwaysSet, modeSpecific);\n }\n\n const alwaysPageSet =\n this.alwaysPage.get(scope.documentId)?.get(scope.pageIndex) ??\n new Set<PointerEventHandlers>();\n const modePageSet =\n mode.scope === 'page'\n ? (bucket.page.get(scope.pageIndex) ?? new Set<PointerEventHandlers>())\n : new Set<PointerEventHandlers>();\n\n return mergeSets(alwaysPageSet, modePageSet);\n }\n\n // ─────────────────────────────────────────────────────────\n // Cursor Management\n // ─────────────────────────────────────────────────────────\n\n private setCursor(token: string, cursor: string, priority = 0, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.set(token, { cursor, priority });\n this.emitCursor(id);\n }\n\n private removeCursor(token: string, documentId?: string) {\n const id = documentId ?? this.getActiveDocumentId();\n const claims = this.cursorClaims.get(id);\n if (!claims) return;\n\n claims.delete(token);\n this.emitCursor(id);\n }\n\n private getCurrentCursor(documentId?: string): string {\n return this.getDocumentStateOrThrow(documentId).cursor;\n }\n\n private emitCursor(documentId: string) {\n const claims = this.cursorClaims.get(documentId);\n if (!claims) return;\n\n const docState = this.getDocumentState(documentId);\n if (!docState) return;\n\n const top = [...claims.values()].sort((a, b) => b.priority - a.priority)[0] ?? {\n cursor: this.modes.get(docState.activeMode)?.cursor ?? 'auto',\n };\n\n if (top.cursor !== docState.cursor) {\n this.dispatch(setCursor(documentId, top.cursor));\n this.onCursorChange$.emit({\n documentId,\n cursor: top.cursor,\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Handler Lifecycle Notifications\n // ─────────────────────────────────────────────────────────\n\n private notifyHandlersActive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveStart?.(modeId);\n });\n });\n }\n }\n\n private notifyHandlersInactive(documentId: string, modeId: string) {\n // Notify always-active handlers\n this.alwaysGlobal.get(documentId)?.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n\n this.alwaysPage.get(documentId)?.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n\n const mode = this.modes.get(modeId);\n if (!mode) return;\n\n const docBuckets = this.buckets.get(documentId);\n if (!docBuckets) return;\n\n const bucket = docBuckets.get(modeId);\n if (!bucket) return;\n\n if (mode.scope === 'global') {\n bucket.global.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n }\n\n if (mode.scope === 'page') {\n bucket.page.forEach((handlerSet) => {\n handlerSet.forEach((handler) => {\n handler.onHandlerActiveEnd?.(modeId);\n });\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(\n prevState: InteractionManagerState,\n newState: InteractionManagerState,\n ): void {\n // Emit state changes for each changed document\n for (const documentId in newState.documents) {\n const prevDoc = prevState.documents[documentId];\n const newDoc = newState.documents[documentId];\n\n if (prevDoc !== newDoc) {\n this.onStateChange$.emit({\n documentId,\n state: newDoc,\n });\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: InteractionManagerPluginConfig): Promise<void> {\n this.logger.info(\n 'InteractionManagerPlugin',\n 'Initialize',\n 'Interaction Manager Plugin initialized',\n );\n }\n\n async destroy(): Promise<void> {\n this.onModeChange$.clear();\n this.onCursorChange$.clear();\n this.onHandlerChange$.clear();\n this.onStateChange$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { InteractionManagerPluginConfig } from './types';\n\nexport const INTERACTION_MANAGER_PLUGIN_ID = 'interaction-manager';\n\nexport const manifest: PluginManifest<InteractionManagerPluginConfig> = {\n id: INTERACTION_MANAGER_PLUGIN_ID,\n name: 'Interaction Manager Plugin',\n version: '1.0.0',\n provides: ['interaction-manager'],\n requires: [],\n optional: [],\n defaultConfig: {\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n InteractionManagerAction,\n INIT_INTERACTION_STATE,\n CLEANUP_INTERACTION_STATE,\n SET_ACTIVE_DOCUMENT,\n ACTIVATE_MODE,\n PAUSE_INTERACTION,\n RESUME_INTERACTION,\n SET_CURSOR,\n SET_DEFAULT_MODE,\n SET_EXCLUSION_RULES,\n ADD_EXCLUSION_CLASS,\n REMOVE_EXCLUSION_CLASS,\n ADD_EXCLUSION_ATTRIBUTE,\n REMOVE_EXCLUSION_ATTRIBUTE,\n} from './actions';\nimport { InteractionManagerState, InteractionDocumentState } from './types';\n\nconst INITIAL_MODE = 'pointerMode';\n\nexport const initialDocumentState: InteractionDocumentState = {\n activeMode: INITIAL_MODE,\n cursor: 'auto',\n paused: false,\n};\n\nexport const initialState: InteractionManagerState = {\n defaultMode: INITIAL_MODE,\n exclusionRules: {\n classes: [],\n dataAttributes: ['data-no-interaction'],\n },\n documents: {},\n activeDocumentId: null,\n};\n\nexport const reducer: Reducer<InteractionManagerState, InteractionManagerAction> = (\n state = initialState,\n action,\n) => {\n switch (action.type) {\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle\n // ─────────────────────────────────────────────────────────\n case INIT_INTERACTION_STATE: {\n const { documentId, state: docState } = action.payload;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: docState,\n },\n // Set as active if no active document\n activeDocumentId: state.activeDocumentId ?? documentId,\n };\n }\n\n case CLEANUP_INTERACTION_STATE: {\n const documentId = action.payload;\n const { [documentId]: removed, ...remainingDocs } = state.documents;\n return {\n ...state,\n documents: remainingDocs,\n activeDocumentId: state.activeDocumentId === documentId ? null : state.activeDocumentId,\n };\n }\n\n case SET_ACTIVE_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Per-Document Actions\n // ─────────────────────────────────────────────────────────\n case ACTIVATE_MODE: {\n const { documentId, mode } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n activeMode: mode,\n },\n },\n };\n }\n\n case SET_CURSOR: {\n const { documentId, cursor } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n cursor,\n },\n },\n };\n }\n\n case PAUSE_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: true,\n },\n },\n };\n }\n\n case RESUME_INTERACTION: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n paused: false,\n },\n },\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Global Actions\n // ─────────────────────────────────────────────────────────\n case SET_DEFAULT_MODE:\n return {\n ...state,\n defaultMode: action.payload.mode,\n };\n\n case SET_EXCLUSION_RULES:\n return {\n ...state,\n exclusionRules: action.payload.rules,\n };\n\n case ADD_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: [...(state.exclusionRules.classes || []), action.payload.className].filter(\n (v, i, a) => a.indexOf(v) === i,\n ),\n },\n };\n\n case REMOVE_EXCLUSION_CLASS:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n classes: (state.exclusionRules.classes || []).filter(\n (c) => c !== action.payload.className,\n ),\n },\n };\n\n case ADD_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: [\n ...(state.exclusionRules.dataAttributes || []),\n action.payload.attribute,\n ].filter((v, i, a) => a.indexOf(v) === i),\n },\n };\n\n case REMOVE_EXCLUSION_ATTRIBUTE:\n return {\n ...state,\n exclusionRules: {\n ...state.exclusionRules,\n dataAttributes: (state.exclusionRules.dataAttributes || []).filter(\n (a) => a !== action.payload.attribute,\n ),\n },\n };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { InteractionManagerPlugin } from './interaction-manager-plugin';\nimport { manifest, INTERACTION_MANAGER_PLUGIN_ID } from './manifest';\nimport { InteractionManagerPluginConfig, InteractionManagerState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { InteractionManagerAction } from './actions';\n\nexport const InteractionManagerPluginPackage: PluginPackage<\n InteractionManagerPlugin,\n InteractionManagerPluginConfig,\n InteractionManagerState,\n InteractionManagerAction\n> = {\n manifest,\n create: (registry, config) =>\n new InteractionManagerPlugin(INTERACTION_MANAGER_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n};\n\nexport * from './interaction-manager-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './reducer';\n"],"names":["INITIAL_MODE","set","_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-interaction-manager.svelte.ts","../../src/shared/utils.ts","../../src/svelte/components/GlobalPointerProvider.svelte","../../src/svelte/components/PagePointerProvider.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n state = scope.getState();\n\n return scope.onStateChange((newState) => {\n state = newState;\n });\n });\n\n return {\n get state() {\n return state;\n },\n get provides() {\n return scopedProvides;\n },\n };\n}\n\nexport function useCursor(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: number;\n documentId: string;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n const capability = useInteractionManagerCapability();\n\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: { modeId?: string | string[]; pageIndex?: number; documentId?: string },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = options?.pageIndex ?? pageIndex;\n const finalDocumentId = options?.documentId ?? documentId;\n\n return finalModeId\n ? capability.provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : capability.provides?.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n : { type: 'global', documentId: finalDocumentId },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let isPageExclusive = $state<boolean>(false);\n\n $effect(() => {\n if (!capability.provides) {\n isPageExclusive = false;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n const m = scope.getActiveInteractionMode();\n isPageExclusive = m?.scope === 'page' && !!m.exclusive;\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n isPageExclusive = mode?.scope === 'page' && !!mode?.exclusive;\n });\n });\n\n return {\n get current() {\n return isPageExclusive;\n },\n };\n}\n","import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n const capScope = cap.forDocument(scope.documentId);\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = capScope.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = capScope.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = capScope.getActiveInteractionMode();\n const initialCursor = capScope.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = capScope.onCursorChange((c) => {\n if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { useInteractionManagerCapability } from '../hooks';\n import { createPointerProvider } from '../../shared/utils';\n\n interface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n children: Snippet;\n class?: string;\n }\n\n let {\n documentId,\n children,\n class: propsClass,\n ...restProps\n }: GlobalPointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n const interactionManagerCapability = useInteractionManagerCapability();\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'global', documentId },\n ref,\n );\n });\n</script>\n\n<div bind:this={ref} style:width=\"100%\" style:height=\"100%\" class={propsClass} {...restProps}>\n {@render children()}\n</div>\n","<script lang=\"ts\">\n import { type Position, restorePosition, transformSize } from '@embedpdf/models';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { createPointerProvider } from '../../shared/utils';\n import { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\n interface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n children: Snippet;\n class?: string;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n }\n\n let {\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n class: propsClass,\n ...restProps\n }: PagePointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n\n const interactionManagerCapability = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(() => documentId);\n\n // Get page dimensions and transformations from document state\n const page = $derived(documentState.current?.document?.pages?.[pageIndex]);\n const naturalPageSize = $derived(page?.size ?? { width: 0, height: 0 });\n const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\n const scale = $derived(scaleOverride ?? documentState.current?.scale ?? 1);\n const displaySize = $derived(transformSize(naturalPageSize, 0, scale));\n\n // Default conversion function\n const defaultConvertEventToPoint = $derived.by(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n // Get the rotated natural size (width/height may be swapped, but not scaled)\n const rotatedNaturalSize = transformSize(\n {\n width: displaySize.width,\n height: displaySize.height,\n },\n rotation,\n 1,\n );\n\n return restorePosition(rotatedNaturalSize, displayPoint, rotation, scale);\n };\n });\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'page', documentId, pageIndex },\n ref,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n });\n</script>\n\n<div\n bind:this={ref}\n style:position=\"relative\"\n style:width={`${displaySize.width}px`}\n style:height={`${displaySize.height}px`}\n class={propsClass}\n {...restProps}\n>\n {@render children()}\n {#if isPageExclusive.current}\n <div\n style:position=\"absolute\"\n style:top=\"0\"\n style:left=\"0\"\n style:right=\"0\"\n style:bottom=\"0\"\n style:z-index=\"10\"\n ></div>\n {/if}\n</div>\n"],"names":["useInteractionManagerCapability","useCapability","InteractionManagerPlugin","id","useIsPageExclusive","documentId","capability","isPageExclusive","$","user_effect","provides","set","scope","forDocument","m","getActiveInteractionMode","exclusive","onModeChange","mode","current","domEventMap","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick","touchstart","touchend","touchmove","touchcancel","pointerEventTypes","allEventTypes","PointerEvent","isTouchEvent","evt","TouchEvent","createPointerProvider","cap","element","convertEventToPoint","capScope","active","getHandlersForScope","wantsRawTouchNow","_a","wantsRawTouch","listeners","attachedWithRawTouch","addListeners","raw","forEach","type","fn","handleEvent","addEventListener","startsWith","passive","removeListeners","removeEventListener","style","touchAction","stopMode","cursor","stopHandler","onHandlerChange","initialMode","initialCursor","getCurrentCursor","stopCursor","onCursorChange","c","toPos","e","host","r","getBoundingClientRect","x","clientX","left","y","clientY","top","isPaused","exclusionRules","getExclusionRules","target","rules","classes","length","className","_b","classList","contains","_c","dataAttributes","attr","hasAttribute","parentElement","shouldExcludeElement","handlerKey","pos","normEvt","preventDefault","tp","changedTouches","touches","ctrlKey","shiftKey","altKey","metaKey","currentTarget","setPointerCapture","releasePointerCapture","pe","call","pointerId","getActiveMode","restProps","rest_props","$$props","ref","interactionManagerCapability","get","bind_this","div","$$value","documentState","useDocumentState","page","document","pages","pageIndex","naturalPageSize","derived","size","width","height","rotation","scale","displaySize","transformSize","defaultConvertEventToPoint","event","rect","displayPoint","rotatedNaturalSize","restorePosition","$$render","consequent","setCursor","token","prio","removeCursor","state","initialDocumentState","scopedProvides","getState","onStateChange","newState","usePlugin","modeId","register","handlers","options","finalModeId","finalPageIndex","finalDocumentId","registerHandlers","registerAlways"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-interaction-manager.svelte.ts","../../src/shared/utils.ts","../../src/svelte/components/GlobalPointerProvider.svelte","../../src/svelte/components/PagePointerProvider.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n state = scope.getState();\n\n return scope.onStateChange((newState) => {\n state = newState;\n });\n });\n\n return {\n get state() {\n return state;\n },\n get provides() {\n return scopedProvides;\n },\n };\n}\n\nexport function useCursor(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: number;\n documentId: string;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n const capability = useInteractionManagerCapability();\n\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: { modeId?: string | string[]; pageIndex?: number; documentId?: string },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = options?.pageIndex ?? pageIndex;\n const finalDocumentId = options?.documentId ?? documentId;\n\n return finalModeId\n ? capability.provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : capability.provides?.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n : { type: 'global', documentId: finalDocumentId },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let isPageExclusive = $state<boolean>(false);\n\n $effect(() => {\n if (!capability.provides) {\n isPageExclusive = false;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n const m = scope.getActiveInteractionMode();\n isPageExclusive = m?.scope === 'page' && !!m.exclusive;\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n isPageExclusive = mode?.scope === 'page' && !!mode?.exclusive;\n });\n });\n\n return {\n get current() {\n return isPageExclusive;\n },\n };\n}\n","import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n const capScope = cap.forDocument(scope.documentId);\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = capScope.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = capScope.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = capScope.getActiveInteractionMode();\n const initialCursor = capScope.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = capScope.onCursorChange((c) => {\n if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { useInteractionManagerCapability } from '../hooks';\n import { createPointerProvider } from '../../shared/utils';\n\n interface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n children: Snippet;\n class?: string;\n }\n\n let {\n documentId,\n children,\n class: propsClass,\n ...restProps\n }: GlobalPointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n const interactionManagerCapability = useInteractionManagerCapability();\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'global', documentId },\n ref,\n );\n });\n</script>\n\n<div bind:this={ref} style:width=\"100%\" style:height=\"100%\" class={propsClass} {...restProps}>\n {@render children()}\n</div>\n","<script lang=\"ts\">\n import { type Position, restorePosition, transformSize } from '@embedpdf/models';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { createPointerProvider } from '../../shared/utils';\n import { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\n interface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n children: Snippet;\n class?: string;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n }\n\n let {\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n class: propsClass,\n ...restProps\n }: PagePointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n\n const interactionManagerCapability = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(() => documentId);\n\n // Get page dimensions and transformations from document state\n const page = $derived(documentState.current?.document?.pages?.[pageIndex]);\n const naturalPageSize = $derived(page?.size ?? { width: 0, height: 0 });\n const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\n const scale = $derived(scaleOverride ?? documentState.current?.scale ?? 1);\n const displaySize = $derived(transformSize(naturalPageSize, 0, scale));\n\n // Default conversion function\n const defaultConvertEventToPoint = $derived.by(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n // Get the rotated natural size (width/height may be swapped, but not scaled)\n const rotatedNaturalSize = transformSize(\n {\n width: displaySize.width,\n height: displaySize.height,\n },\n rotation,\n 1,\n );\n\n return restorePosition(rotatedNaturalSize, displayPoint, rotation, scale);\n };\n });\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'page', documentId, pageIndex },\n ref,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n });\n</script>\n\n<div\n bind:this={ref}\n style:position=\"relative\"\n style:width={`${displaySize.width}px`}\n style:height={`${displaySize.height}px`}\n class={propsClass}\n {...restProps}\n>\n {@render children()}\n {#if isPageExclusive.current}\n <div\n style:position=\"absolute\"\n style:top=\"0\"\n style:left=\"0\"\n style:right=\"0\"\n style:bottom=\"0\"\n style:z-index=\"10\"\n ></div>\n {/if}\n</div>\n"],"names":["useInteractionManagerCapability","useCapability","InteractionManagerPlugin","id","useIsPageExclusive","documentId","capability","isPageExclusive","$","state","user_effect","provides","set","scope","forDocument","m","getActiveInteractionMode","exclusive","onModeChange","mode","current","domEventMap","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick","touchstart","touchend","touchmove","touchcancel","pointerEventTypes","allEventTypes","PointerEvent","isTouchEvent","evt","TouchEvent","createPointerProvider","cap","element","convertEventToPoint","capScope","active","getHandlersForScope","wantsRawTouchNow","_a","wantsRawTouch","listeners","attachedWithRawTouch","addListeners","raw","forEach","type","fn","handleEvent","addEventListener","startsWith","passive","removeListeners","removeEventListener","style","touchAction","stopMode","cursor","stopHandler","onHandlerChange","initialMode","initialCursor","getCurrentCursor","stopCursor","onCursorChange","c","toPos","e","host","r","getBoundingClientRect","x","clientX","left","y","clientY","top","isPaused","exclusionRules","getExclusionRules","target","rules","classes","length","className","_b","classList","contains","_c","dataAttributes","attr","hasAttribute","parentElement","shouldExcludeElement","handlerKey","pos","normEvt","preventDefault","tp","changedTouches","touches","ctrlKey","shiftKey","altKey","metaKey","currentTarget","setPointerCapture","releasePointerCapture","pe","call","pointerId","getActiveMode","restProps","rest_props","$$props","ref","interactionManagerCapability","get","div","root","$$value","documentState","useDocumentState","page","document","pages","pageIndex","naturalPageSize","derived","size","width","height","rotation","scale","displaySize","transformSize","defaultConvertEventToPoint","event","rect","displayPoint","rotatedNaturalSize","restorePosition","div_1","root_1","$$render","consequent","setCursor","token","prio","removeCursor","initialDocumentState","scopedProvides","getState","onStateChange","newState","usePlugin","modeId","register","handlers","options","finalModeId","finalPageIndex","finalDocumentId","registerHandlers","registerAlways"],"mappings":"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"}
|
package/dist/svelte/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-interaction-manager.svelte.ts","../../src/shared/utils.ts","../../src/svelte/components/GlobalPointerProvider.svelte","../../src/svelte/components/PagePointerProvider.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n state = scope.getState();\n\n return scope.onStateChange((newState) => {\n state = newState;\n });\n });\n\n return {\n get state() {\n return state;\n },\n get provides() {\n return scopedProvides;\n },\n };\n}\n\nexport function useCursor(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: number;\n documentId: string;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n const capability = useInteractionManagerCapability();\n\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: { modeId?: string | string[]; pageIndex?: number; documentId?: string },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = options?.pageIndex ?? pageIndex;\n const finalDocumentId = options?.documentId ?? documentId;\n\n return finalModeId\n ? capability.provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : capability.provides?.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n : { type: 'global', documentId: finalDocumentId },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let isPageExclusive = $state<boolean>(false);\n\n $effect(() => {\n if (!capability.provides) {\n isPageExclusive = false;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n const m = scope.getActiveInteractionMode();\n isPageExclusive = m?.scope === 'page' && !!m.exclusive;\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n isPageExclusive = mode?.scope === 'page' && !!mode?.exclusive;\n });\n });\n\n return {\n get current() {\n return isPageExclusive;\n },\n };\n}\n","import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n const capScope = cap.forDocument(scope.documentId);\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = capScope.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = capScope.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = capScope.getActiveInteractionMode();\n const initialCursor = capScope.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = capScope.onCursorChange((c) => {\n if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { useInteractionManagerCapability } from '../hooks';\n import { createPointerProvider } from '../../shared/utils';\n\n interface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n children: Snippet;\n class?: string;\n }\n\n let {\n documentId,\n children,\n class: propsClass,\n ...restProps\n }: GlobalPointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n const interactionManagerCapability = useInteractionManagerCapability();\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'global', documentId },\n ref,\n );\n });\n</script>\n\n<div bind:this={ref} style:width=\"100%\" style:height=\"100%\" class={propsClass} {...restProps}>\n {@render children()}\n</div>\n","<script lang=\"ts\">\n import { type Position, restorePosition, transformSize } from '@embedpdf/models';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { createPointerProvider } from '../../shared/utils';\n import { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\n interface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n children: Snippet;\n class?: string;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n }\n\n let {\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n class: propsClass,\n ...restProps\n }: PagePointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n\n const interactionManagerCapability = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(() => documentId);\n\n // Get page dimensions and transformations from document state\n const page = $derived(documentState.current?.document?.pages?.[pageIndex]);\n const naturalPageSize = $derived(page?.size ?? { width: 0, height: 0 });\n const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\n const scale = $derived(scaleOverride ?? documentState.current?.scale ?? 1);\n const displaySize = $derived(transformSize(naturalPageSize, 0, scale));\n\n // Default conversion function\n const defaultConvertEventToPoint = $derived.by(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n // Get the rotated natural size (width/height may be swapped, but not scaled)\n const rotatedNaturalSize = transformSize(\n {\n width: displaySize.width,\n height: displaySize.height,\n },\n rotation,\n 1,\n );\n\n return restorePosition(rotatedNaturalSize, displayPoint, rotation, scale);\n };\n });\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'page', documentId, pageIndex },\n ref,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n });\n</script>\n\n<div\n bind:this={ref}\n style:position=\"relative\"\n style:width={`${displaySize.width}px`}\n style:height={`${displaySize.height}px`}\n class={propsClass}\n {...restProps}\n>\n {@render children()}\n {#if isPageExclusive.current}\n <div\n style:position=\"absolute\"\n style:top=\"0\"\n style:left=\"0\"\n style:right=\"0\"\n style:bottom=\"0\"\n style:z-index=\"10\"\n ></div>\n {/if}\n</div>\n"],"names":["_a"],"mappings":";;;;;;AAQa,MAAA,8BAAA,MACX,UAAoC,yBAAyB,EAAE;AACpD,MAAA,kCAAA,MACX,cAAwC,yBAAyB,EAAE;SAErD,sBAAsB,YAAoB;AAClD,QAAA,aAAa,gCAAA;AAEf,MAAA,wBAAyC,oBAAoB,CAAA;QAG3D;;AAA0B,6BAAW,aAAX,mBAAqB,YAAY,gBAAe;AAAA,GAAI;AAEpF,IAAA,kBAAc;SACP,WAAW,UAAU;AACxB,QAAA,IAAA,OAAQ,sBAAA,IAAA;;IAEV;AAEM,UAAA,QAAQ,WAAW,SAAS,YAAY,UAAU;UAGxD,OAAQ,MAAM,SAAA,GAAA,IAAA;AAEP,WAAA,MAAM,cAAA,CAAe,aAAa;AACvC,QAAA,IAAA,OAAQ,UAAA,IAAA;AAAA,IACV,CAAC;AAAA,EACH,CAAC;;IAGK,IAAA,QAAQ;mBACH,KAAA;AAAA,IACT;AAAA,IACI,IAAA,WAAW;mBACN,cAAA;AAAA,IACT;AAAA;AAEJ;SAEgB,UAAU,YAAoB;AACtC,QAAA,aAAa,gCAAA;;IAGjB,WAAA,CAAY,OAAe,QAAgB,OAAO,MAAM;AACjD,UAAA,CAAA,WAAW,SAAA;AACV,YAAA,QAAQ,WAAW,SAAS,YAAY,UAAU;AACxD,YAAM,UAAU,OAAO,QAAQ,IAAI;AAAA,IACrC;AAAA,IACA,cAAA,CAAe,UAAkB;AAC1B,UAAA,CAAA,WAAW,SAAA;AACV,YAAA,QAAQ,WAAW,SAAS,YAAY,UAAU;AACxD,YAAM,aAAa,KAAK;AAAA,IAC1B;AAAA;AAEJ;AAQgB,SAAA,qBAAqB,QAAQ,WAAW,cAAyC;AACzF,QAAA,aAAa,gCAAA;;IAGjB,UAAA,CACE,UACA,YACG;;AAEG,YAAA,eAAc,mCAAS,WAAU;AACjC,YAAA,kBAAiB,mCAAS,cAAa;AACvC,YAAA,mBAAkB,mCAAS,eAAc;aAExC,eACH,gBAAW,aAAX,mBAAqB,iBAAA;AAAA,QACnB,QAAQ;AAAA,QACR;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,YAEd,gBAAW,aAAX,mBAAqB,eAAA;AAAA,QACnB,OACE,mBAAA;UACM,MAAM;AAAA,UAAQ,YAAY;AAAA,UAAiB,WAAW;AAAA,YACtD,EAAA,MAAM,UAAU,YAAY,gBAAA;AAAA,QACpC;AAAA;IAER;AAAA;AAEJ;SAEgB,mBAAmB,YAAoB;AAC/C,QAAA,aAAa,gCAAA;AAEf,MAAA,0BAAkC,KAAK;AAE3C,IAAA,kBAAc;SACP,WAAW,UAAU;AACxB,QAAA,IAAA,iBAAkB,KAAA;;IAEpB;AAEM,UAAA,QAAQ,WAAW,SAAS,YAAY,UAAU;UAGlD,IAAI,MAAM,yBAAA;UAChB,kBAAkB,uBAAG,WAAU,UAAA,CAAA,CAAY,EAAE,WAAA,IAAA;WAEtC,MAAM,mBAAmB;YACxB,OAAO,MAAM,yBAAA;YACnB,kBAAkB,6BAAM,WAAU,UAAA,CAAA,EAAY,6BAAM,YAAA,IAAA;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;;IAGK,IAAA,UAAU;mBACL,eAAA;AAAA,IACT;AAAA;AAEJ;ACpHA,MAAM,cAAiC;AAAA,EACrC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EAEf,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EAEb,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAGV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAEA,MAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,kBAAkB,CAAC,cAAc,YAAY,aAAa,aAAa;AAC7E,MAAM,cAAc,OAAO,iBAAiB;AAE5C,MAAM,gBAAgB,cAAc,oBAAoB,CAAC,GAAG,mBAAmB,GAAG,eAAe;AAKjG,SAAS,aAAa,WAAmB,eAAiD;AAExF,SAAO,UAAU,WAAW,OAAO,IAAI,EAAE,SAAS,CAAC,cAAA,IAAkB,EAAE,SAAS,MAAA;AAClF;AAEA,SAAS,aAAa,KAA+B;AACnD,SAAO,OAAO,eAAe,eAAe,eAAe;AAC7D;AAMA,SAAS,qBAAqB,SAAyB,OAA2C;;AAChG,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,UAA0B;AAE9B,SAAO,SAAS;AAEd,SAAI,WAAM,YAAN,mBAAe,QAAQ;AACzB,iBAAW,aAAa,MAAM,SAAS;AACrC,aAAI,aAAQ,cAAR,mBAAmB,SAAS,YAAY;AAC1C,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,SAAI,WAAM,mBAAN,mBAAsB,QAAQ;AAChC,iBAAW,QAAQ,MAAM,gBAAgB;AACvC,YAAI,QAAQ,aAAa,IAAI,GAAG;AAC9B,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,cAAU,QAAQ;AAAA,EACpB;AAEA,SAAO;AACT;AAKO,SAAS,sBACd,KACA,OACA,SACA,qBACA;AACA,QAAM,WAAW,IAAI,YAAY,MAAM,UAAU;AAEjD,MAAI,SAAsC,IAAI,oBAAoB,KAAK;AAGvE,QAAM,mBAAmB,MAAA;;AAAM,2BAAS,yBAAA,MAAT,mBAAqC,mBAAkB;AAAA;AAGtF,QAAM,YAAkD,CAAA;AACxD,MAAI,uBAAuB,iBAAA;AAE3B,QAAM,eAAe,CAAC,QAAiB;AACrC,kBAAc,QAAQ,CAAC,SAAS;AAC9B,YAAM,KAAM,sCAAoB;AAChC,cAAQ,iBAAiB,MAAM,IAAI,aAAa,MAAM,GAAG,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,QAAM,kBAAkB,MAAM;AAC5B,kBAAc,QAAQ,CAAC,SAAS;AAC9B,YAAM,KAAK,UAAU,IAAI;AACzB,UAAI,GAAI,SAAQ,oBAAoB,MAAM,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AAGA,eAAa,oBAAoB;AACjC,UAAQ,MAAM,cAAc,uBAAuB,SAAS;AAG5D,QAAM,WAAW,SAAS,aAAa,MAAM;AAE3C,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,OAAO,SAAS,yBAAA;AACtB,cAAQ,MAAM,UAAS,6BAAM,WAAU,WAAY,KAAK,UAAU,SAAU;AAAA,IAC9E;AAEA,aAAS,IAAI,oBAAoB,KAAK;AAGtC,UAAM,MAAM,iBAAA;AACZ,QAAI,QAAQ,sBAAsB;AAChC,sBAAA;AACA,mBAAa,GAAG;AAChB,6BAAuB;AACvB,cAAQ,MAAM,cAAc,uBAAuB,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAM,cAAc,IAAI,gBAAgB,MAAM;AAC5C,aAAS,IAAI,oBAAoB,KAAK;AAAA,EACxC,CAAC;AAGD,QAAM,cAAc,SAAS,yBAAA;AAC7B,QAAM,gBAAgB,SAAS,iBAAA;AAC/B,UAAQ,MAAM,SACZ,MAAM,SAAS,aAAY,2CAAa,WAAU,WAAW,SAAS;AAExE,QAAM,aAAa,SAAS,eAAe,CAAC,MAAM;;AAChD,QAAI,MAAM,SAAS,cAAY,cAAS,yBAAA,MAAT,mBAAqC,WAAU,SAAU;AACxF,YAAQ,MAAM,SAAS;AAAA,EACzB,CAAC;AAGD,QAAM,QAAQ,CAAC,GAAyC,SAAgC;AACtF,QAAI,oBAAqB,QAAO,oBAAoB,GAAmB,IAAI;AAC3E,UAAM,IAAI,KAAK,sBAAA;AACf,WAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,UAAU,EAAE,IAAA;AAAA,EACnD;AAGA,WAAS,YAAY,KAAY;;AAC/B,QAAI,IAAI,WAAY;AAGpB,UAAM,iBAAiB,IAAI,kBAAA;AAC3B,QAAI,IAAI,UAAU,qBAAqB,IAAI,QAAmB,cAAc,GAAG;AAC7E;AAAA,IACF;AAEA,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,CAAC,cAAc,EAAC,iCAAS,aAAa;AAG1C,QACE,aAAa,GAAG,KAChB,yBACC,IAAI,SAAS,eAAe,IAAI,SAAS,gBAC1C;AACA,UAAI,eAAA;AAAA,IACN;AAGA,QAAI;AACJ,QAAI;AAKJ,QAAI,aAAa,GAAG,GAAG;AACrB,YAAM,KACJ,IAAI,SAAS,cAAc,IAAI,SAAS,gBACpC,IAAI,eAAe,CAAC,IACpB,IAAI,QAAQ,CAAC;AACnB,UAAI,CAAC,GAAI;AAET,YAAM,MAAM,IAAI,OAAO;AACvB,gBAAU;AAAA,QACR,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI;AAAA,QACZ,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI;AAAA,QACZ,eAAe,IAAI;AAAA,QACnB,mBAAmB,MAAM;AAAA,QAAC;AAAA,QAC1B,uBAAuB,MAAM;AAAA,QAAC;AAAA,MAAA;AAAA,IAElC,OAAO;AACL,YAAM,KAAK;AACX,YAAM,MAAM,IAAI,OAAO;AACvB,gBAAU;AAAA,QACR,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,SAAS,GAAG;AAAA,QACZ,UAAU,GAAG;AAAA,QACb,QAAQ,GAAG;AAAA,QACX,SAAS,GAAG;AAAA,QACZ,QAAQ,GAAG;AAAA,QACX,eAAe,GAAG;AAAA,QAClB,mBAAmB,MAAM;;AACtB,iBAAAA,MAAA,GAAG,WAAH,gBAAAA,IAA2B,sBAA3B,wBAAAA,KAA+C,GAAG;AAAA,QACrD;AAAA,QACA,uBAAuB,MAAM;;AAC1B,iBAAAA,MAAA,GAAG,WAAH,gBAAAA,IAA2B,0BAA3B,wBAAAA,KAAmD,GAAG;AAAA,QACzD;AAAA,MAAA;AAAA,IAEJ;AAEA,iBAAO,gBAAP,gCAAqB,KAAK,SAAS,SAAS;EAC9C;AAGA,SAAO,MAAM;AACX,oBAAA;AACA,aAAA;AACA,eAAA;AACA,gBAAA;AAAA,EACF;AACF;;kDC1QA;;MAgBO,YAAQ,EAAA,WAAA,SAAA;AAAA;;;;;;;AAGT,MAAA,cAAoC,IAAI;AACtC,QAAA,+BAA+B,gCAA+B;AAEpE,IAAA,YAAO,MAAO;SACP,6BAA6B,YAAQ,CAAA,EAAA,IAAK,GAAG,EAAA;WAE3C,sBACL,6BAA6B,UAAQ,EACnC,MAAM,UAAU,YAAU,QAAA,WAAA,GAAA,EAAA,IAC5B,GAAG,CAAA;AAAA,EAEP,CAAC;;;;OAGgF;AAAA;;;;;AAAnE,IAAA,UAAA,KAAA,CAAA,YAAA,EAAA,IAAA,2BAAA,GAAG,CAAA;;;AAFnB;;;gDC/BA;;MA0BO,YAAQ,EAAA,WAAA,SAAA;AAAA;;;;;;;;;;;AAGT,MAAA,cAAoC,IAAI;AAEtC,QAAA,+BAA+B,gCAA+B;AAC9D,QAAA,kBAAkB,mBAAkB,QAAA,UAAA;AACpC,QAAA,gBAAgB,iBAAgB,MAAA,QAAA,UAAA;AAGhC,QAAA;;AAAgB,2CAAc,YAAd,mBAAuB,aAAvB,mBAAiC,UAAjC,mBAAsC,QAAA;AAAA,GAAA;QACtD,kBAAe,EAAA,QAAA,MAAA;;AAAA,oBAAA,IAAY,IAAI,MAAhB,mBAAkB,SAAI,EAAM,OAAO,GAAG,QAAQ,EAAC;AAAA,GAAA;AAC9D,QAAA;;iCAAwC,mBAAc,YAAd,mBAAuB,aAAY;AAAA,GAAC;AAC5E,QAAA;;8BAAkC,mBAAc,YAAd,mBAAuB,UAAS;AAAA,GAAC;AACnE,QAAA,8BAAuB,cAAa,EAAA,IAAC,eAAe,GAAE,SAAG,KAAK,CAAA,CAAA;AAG9D,QAAA,6BAA0B,EAAA,QAAA,MAAqB;YAC3C,OAAqB,YAAmC;YACxD,OAAO,QAAQ,sBAAqB;AACpC,YAAA,iBACJ,GAAG,MAAM,UAAU,KAAK,MACxB,GAAG,MAAM,UAAU,KAAK,IAAG;AAIvB,YAAA,qBAAqB;AAAA;UAEvB,OAAK,EAAA,IAAE,WAAW,EAAC;AAAA,UACnB,QAAM,EAAA,IAAE,WAAW,EAAC;AAAA;cAEtB,QAAQ;AAAA,QACR;AAAA;AAGK,aAAA,gBAAgB,oBAAoB,cAAY,EAAA,IAAE,QAAQ,SAAE,KAAK,CAAA;AAAA,IAC1E;AAAA,EACF,CAAC;AAED,IAAA,YAAO,MAAO;SACP,6BAA6B,YAAQ,CAAA,EAAA,IAAK,GAAG,EAAA;WAE3C;AAAA,MACL,6BAA6B;AAAA;QAC3B,MAAM;AAAA,QAAQ,YAAU,QAAA;AAAA,QAAE,WAAS,QAAA;AAAA;YACrC,GAAG;AAAA,2CACoB,0BAA0B;AAAA;EAErD,CAAC;;;;OASG;AAAA;;MAHY,OAAA,GAAA,EAAA,IAAA,WAAW,EAAC,KAAK;AAAA,MAChB,QAAA,GAAA,EAAA,IAAA,WAAW,EAAC,MAAM;AAAA;;;;;;;;;;;;;;;;;;;AAK9B,UAAA,gBAAgB,QAAO,UAAA,UAAA;AAAA;;;AARjB,IAAA,UAAA,KAAA,CAAA,YAAA,EAAA,IAAA,2BAAA,GAAG,CAAA;;;AAHhB;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-interaction-manager.svelte.ts","../../src/shared/utils.ts","../../src/svelte/components/GlobalPointerProvider.svelte","../../src/svelte/components/PagePointerProvider.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n state = scope.getState();\n\n return scope.onStateChange((newState) => {\n state = newState;\n });\n });\n\n return {\n get state() {\n return state;\n },\n get provides() {\n return scopedProvides;\n },\n };\n}\n\nexport function useCursor(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\n scope.removeCursor(token);\n },\n };\n}\n\ninterface UsePointerHandlersOptions {\n modeId?: string | string[];\n pageIndex?: number;\n documentId: string;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n const capability = useInteractionManagerCapability();\n\n return {\n register: (\n handlers: PointerEventHandlersWithLifecycle,\n options?: { modeId?: string | string[]; pageIndex?: number; documentId?: string },\n ) => {\n // Use provided options or fall back to hook-level options\n const finalModeId = options?.modeId ?? modeId;\n const finalPageIndex = options?.pageIndex ?? pageIndex;\n const finalDocumentId = options?.documentId ?? documentId;\n\n return finalModeId\n ? capability.provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : capability.provides?.registerAlways({\n scope:\n finalPageIndex !== undefined\n ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n : { type: 'global', documentId: finalDocumentId },\n handlers,\n });\n },\n };\n}\n\nexport function useIsPageExclusive(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let isPageExclusive = $state<boolean>(false);\n\n $effect(() => {\n if (!capability.provides) {\n isPageExclusive = false;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\n\n // Get initial state\n const m = scope.getActiveInteractionMode();\n isPageExclusive = m?.scope === 'page' && !!m.exclusive;\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n isPageExclusive = mode?.scope === 'page' && !!mode?.exclusive;\n });\n });\n\n return {\n get current() {\n return isPageExclusive;\n },\n };\n}\n","import { Position } from '@embedpdf/models';\nimport type {\n InteractionManagerCapability,\n InteractionScope,\n PointerEventHandlers,\n EmbedPdfPointerEvent,\n InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n pointerdown: 'onPointerDown',\n pointerup: 'onPointerUp',\n pointermove: 'onPointerMove',\n pointerenter: 'onPointerEnter',\n pointerleave: 'onPointerLeave',\n pointercancel: 'onPointerCancel',\n\n mousedown: 'onMouseDown',\n mouseup: 'onMouseUp',\n mousemove: 'onMouseMove',\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousecancel: 'onMouseCancel',\n\n click: 'onClick',\n dblclick: 'onDoubleClick',\n\n /* touch → pointer fallback for very old browsers */\n touchstart: 'onPointerDown',\n touchend: 'onPointerUp',\n touchmove: 'onPointerMove',\n touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseenter',\n 'mouseleave',\n 'mousecancel',\n 'click',\n 'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n // Only touch events are toggled; pointer/mouse stay non-passive\n return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n if (!element) return false;\n\n let current: Element | null = element;\n\n while (current) {\n // Check classes\n if (rules.classes?.length) {\n for (const className of rules.classes) {\n if (current.classList?.contains(className)) {\n return true;\n }\n }\n }\n\n // Check data attributes\n if (rules.dataAttributes?.length) {\n for (const attr of rules.dataAttributes) {\n if (current.hasAttribute(attr)) {\n return true;\n }\n }\n }\n\n // Move up the DOM tree\n current = current.parentElement;\n }\n\n return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n cap: InteractionManagerCapability,\n scope: InteractionScope,\n element: HTMLElement,\n convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n const capScope = cap.forDocument(scope.documentId);\n /* ---------- live handler set --------------------------------------------------- */\n let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n /* ---------- dynamic listener (re)attachment ------------------------------------ */\n const listeners: Record<string, (evt: Event) => void> = {};\n let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n const addListeners = (raw: boolean) => {\n allEventTypes.forEach((type) => {\n const fn = (listeners[type] ??= handleEvent);\n element.addEventListener(type, fn, listenerOpts(type, raw));\n });\n };\n const removeListeners = () => {\n allEventTypes.forEach((type) => {\n const fn = listeners[type];\n if (fn) element.removeEventListener(type, fn);\n });\n };\n\n /* attach for the first time */\n addListeners(attachedWithRawTouch);\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n /* ---------- mode & handler change hooks --------------------------------------- */\n const stopMode = capScope.onModeChange(() => {\n /* cursor baseline update for global wrapper */\n if (scope.type === 'global') {\n const mode = capScope.getActiveInteractionMode();\n element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n }\n\n active = cap.getHandlersForScope(scope);\n\n /* re-attach listeners if wantsRawTouch toggled */\n const raw = wantsRawTouchNow();\n if (raw !== attachedWithRawTouch) {\n removeListeners();\n addListeners(raw);\n attachedWithRawTouch = raw;\n element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n }\n });\n\n const stopHandler = cap.onHandlerChange(() => {\n active = cap.getHandlersForScope(scope);\n });\n\n /* ---------- cursor sync -------------------------------------------------------- */\n const initialMode = capScope.getActiveInteractionMode();\n const initialCursor = capScope.getCurrentCursor();\n element.style.cursor =\n scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n const stopCursor = capScope.onCursorChange((c) => {\n if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n element.style.cursor = c;\n });\n\n /* ---------- point conversion --------------------------------------------------- */\n const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n const r = host.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n /* ---------- central event handler --------------------------------------------- */\n function handleEvent(evt: Event) {\n if (cap.isPaused()) return;\n\n // Get exclusion rules from capability and check in framework layer\n const exclusionRules = cap.getExclusionRules();\n if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n return; // Skip processing this event\n }\n\n const handlerKey = domEventMap[evt.type];\n if (!handlerKey || !active?.[handlerKey]) return;\n\n /* preventDefault only when mode really wants raw touch */\n if (\n isTouchEvent(evt) &&\n attachedWithRawTouch &&\n (evt.type === 'touchmove' || evt.type === 'touchcancel')\n ) {\n evt.preventDefault();\n }\n\n // ----- normalise ----------------------------------------------------------------\n let pos!: Position;\n let normEvt!: EmbedPdfPointerEvent & {\n target: EventTarget | null;\n currentTarget: EventTarget | null;\n };\n\n if (isTouchEvent(evt)) {\n const tp =\n evt.type === 'touchend' || evt.type === 'touchcancel'\n ? evt.changedTouches[0]\n : evt.touches[0];\n if (!tp) return;\n\n pos = toPos(tp, element);\n normEvt = {\n clientX: tp.clientX,\n clientY: tp.clientY,\n ctrlKey: evt.ctrlKey,\n shiftKey: evt.shiftKey,\n altKey: evt.altKey,\n metaKey: evt.metaKey,\n target: evt.target,\n currentTarget: evt.currentTarget,\n setPointerCapture: () => {},\n releasePointerCapture: () => {},\n };\n } else {\n const pe = evt as PointerEvent;\n pos = toPos(pe, element);\n normEvt = {\n clientX: pe.clientX,\n clientY: pe.clientY,\n ctrlKey: pe.ctrlKey,\n shiftKey: pe.shiftKey,\n altKey: pe.altKey,\n metaKey: pe.metaKey,\n target: pe.target,\n currentTarget: pe.currentTarget,\n setPointerCapture: () => {\n (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n },\n releasePointerCapture: () => {\n (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n },\n };\n }\n\n active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n }\n\n /* ---------- teardown ----------------------------------------------------------- */\n return () => {\n removeListeners();\n stopMode();\n stopCursor();\n stopHandler();\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { useInteractionManagerCapability } from '../hooks';\n import { createPointerProvider } from '../../shared/utils';\n\n interface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n children: Snippet;\n class?: string;\n }\n\n let {\n documentId,\n children,\n class: propsClass,\n ...restProps\n }: GlobalPointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n const interactionManagerCapability = useInteractionManagerCapability();\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'global', documentId },\n ref,\n );\n });\n</script>\n\n<div bind:this={ref} style:width=\"100%\" style:height=\"100%\" class={propsClass} {...restProps}>\n {@render children()}\n</div>\n","<script lang=\"ts\">\n import { type Position, restorePosition, transformSize } from '@embedpdf/models';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import type { Snippet } from 'svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import { createPointerProvider } from '../../shared/utils';\n import { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\n interface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n children: Snippet;\n class?: string;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n }\n\n let {\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n class: propsClass,\n ...restProps\n }: PagePointerProviderProps = $props();\n\n let ref = $state<HTMLDivElement | null>(null);\n\n const interactionManagerCapability = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(() => documentId);\n\n // Get page dimensions and transformations from document state\n const page = $derived(documentState.current?.document?.pages?.[pageIndex]);\n const naturalPageSize = $derived(page?.size ?? { width: 0, height: 0 });\n const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\n const scale = $derived(scaleOverride ?? documentState.current?.scale ?? 1);\n const displaySize = $derived(transformSize(naturalPageSize, 0, scale));\n\n // Default conversion function\n const defaultConvertEventToPoint = $derived.by(() => {\n return (event: PointerEvent, element: HTMLElement): Position => {\n const rect = element.getBoundingClientRect();\n const displayPoint = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n\n // Get the rotated natural size (width/height may be swapped, but not scaled)\n const rotatedNaturalSize = transformSize(\n {\n width: displaySize.width,\n height: displaySize.height,\n },\n rotation,\n 1,\n );\n\n return restorePosition(rotatedNaturalSize, displayPoint, rotation, scale);\n };\n });\n\n $effect(() => {\n if (!interactionManagerCapability.provides || !ref) return;\n\n return createPointerProvider(\n interactionManagerCapability.provides,\n { type: 'page', documentId, pageIndex },\n ref,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n });\n</script>\n\n<div\n bind:this={ref}\n style:position=\"relative\"\n style:width={`${displaySize.width}px`}\n style:height={`${displaySize.height}px`}\n class={propsClass}\n {...restProps}\n>\n {@render children()}\n {#if isPageExclusive.current}\n <div\n style:position=\"absolute\"\n style:top=\"0\"\n style:left=\"0\"\n style:right=\"0\"\n style:bottom=\"0\"\n style:z-index=\"10\"\n ></div>\n {/if}\n</div>\n"],"names":["_a","root"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/plugin-interaction-manager",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@embedpdf/models": "2.0.
|
|
38
|
+
"@embedpdf/models": "2.0.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/react": "^18.2.0",
|
|
42
42
|
"typescript": "^5.0.0",
|
|
43
|
-
"@embedpdf/
|
|
44
|
-
"@embedpdf/
|
|
43
|
+
"@embedpdf/build": "1.1.0",
|
|
44
|
+
"@embedpdf/core": "2.0.2"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": ">=16.8.0",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"preact": "^10.26.4",
|
|
50
50
|
"vue": ">=3.2.0",
|
|
51
51
|
"svelte": ">=5 <6",
|
|
52
|
-
"@embedpdf/core": "2.0.
|
|
52
|
+
"@embedpdf/core": "2.0.2"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|