@embedpdf/plugin-pan 2.0.0-next.1 → 2.0.0-next.3
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 +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
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=require("@embedpdf/plugin-interaction-manager"),n=require("@embedpdf/plugin-viewport"),a="PAN/INIT_STATE",o="PAN/CLEANUP_STATE",i="PAN/SET_ACTIVE_DOCUMENT",s="PAN/SET_PAN_MODE";function r(e,t){return{type:a,payload:{documentId:e,state:t}}}function d(e){return{type:o,payload:e}}function c(e,t){return{type:s,payload:{documentId:e,isPanMode:t}}}const u=class extends e.BasePlugin{constructor(a,o,i){var s,r,d;super(a,o),this.panMode$=e.createBehaviorEmitter(),this.documentHandlers=new Map,this.config=i,this.interactionManager=null==(s=o.getPlugin(t.InteractionManagerPlugin.id))?void 0:s.provides(),this.viewport=null==(r=o.getPlugin(n.ViewportPlugin.id))?void 0:r.provides(),this.interactionManager&&(this.interactionManager.registerMode({id:"panMode",scope:"global",exclusive:!1,cursor:"grab",wantsRawTouch:!1}),null==(d=this.interactionManager)||d.onModeChange(e=>{const t="panMode"===e.activeMode,n=this.getDocumentState(e.documentId);n&&n.isPanMode!==t&&this.dispatch(c(e.documentId,t))}))}onDocumentLoadingStarted(e){this.dispatch(r(e,{isPanMode:!1})),this.registerPanHandlersForDocument(e),"always"===this.config.defaultMode&&this.makePanDefault(!0),this.logger.debug("PanPlugin","DocumentOpened",`Initialized pan state for document: ${e}`)}onDocumentClosed(e){const t=this.documentHandlers.get(e);t&&(t(),this.documentHandlers.delete(e)),this.dispatch(d(e)),this.logger.debug("PanPlugin","DocumentClosed",`Cleaned up pan state for document: ${e}`)}buildCapability(){return{enablePan:()=>this.enablePan(),disablePan:()=>this.disablePan(),togglePan:()=>this.togglePan(),makePanDefault:e=>this.makePanDefault(e),isPanMode:()=>this.isPanMode(),forDocument:e=>this.createPanScope(e),onPanModeChange:this.panMode$.on}}createPanScope(e){return{enablePan:()=>this.enablePan(e),disablePan:()=>this.disablePan(e),togglePan:()=>this.togglePan(e),isPanMode:()=>this.isPanMode(e),onPanModeChange:t=>this.panMode$.on(n=>{n.documentId===e&&t(n.isPanMode)})}}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(`Pan state not found for document: ${e??"active"}`);return t}enablePan(e){const t=e??this.getActiveDocumentId();this.interactionManager.forDocument(t).activate("panMode")}disablePan(e){const t=e??this.getActiveDocumentId();this.interactionManager.forDocument(t).activateDefaultMode()}togglePan(e){const t=e??this.getActiveDocumentId(),n=this.interactionManager.forDocument(t);"panMode"===n.getActiveMode()?n.activateDefaultMode():n.activate("panMode")}makePanDefault(e=!0){this.interactionManager&&(this.interactionManager.setDefaultMode("panMode"),e&&this.interactionManager.activateDefaultMode())}isPanMode(e){return this.getDocumentStateOrThrow(e).isPanMode}registerPanHandlersForDocument(e){if(!this.interactionManager||!this.viewport)return;let t=null;const n=this.interactionManager.forDocument(e),a=this.viewport.forDocument(e),o={onMouseDown:(e,o)=>{const i=a.getMetrics();t={startX:o.clientX,startY:o.clientY,startLeft:i.scrollLeft,startTop:i.scrollTop},n.setCursor("panMode","grabbing",10)},onMouseMove:(e,n)=>{if(!t)return;const o=n.clientX-t.startX,i=n.clientY-t.startY;a.scrollTo({x:t.startLeft-o,y:t.startTop-i})},onMouseUp:()=>{t&&(t=null,n.removeCursor("panMode"))},onMouseLeave:()=>{t&&(t=null,n.removeCursor("panMode"))},onMouseCancel:()=>{t&&(t=null,n.removeCursor("panMode"))}},i=this.interactionManager.registerHandlers({documentId:e,modeId:"panMode",handlers:o});this.documentHandlers.set(e,i)}onStoreUpdated(e,t){for(const n in t.documents){const a=e.documents[n],o=t.documents[n];(null==a?void 0:a.isPanMode)!==o.isPanMode&&(this.panMode$.emit({documentId:n,isPanMode:o.isPanMode}),this.logger.debug("PanPlugin","PanModeChanged",`Pan mode changed for document ${n}: ${(null==a?void 0:a.isPanMode)??!1} -> ${o.isPanMode}`))}}async initialize(e){this.logger.info("PanPlugin","Initialize","Pan plugin initialized")}async destroy(){this.documentHandlers.forEach(e=>e()),this.documentHandlers.clear(),this.panMode$.clear(),await super.destroy()}};u.id="pan";let l=u;const g="pan",p={id:g,name:"Pan Plugin",version:"1.0.0",provides:["pan"],requires:["interaction-manager","viewport"],optional:[],defaultConfig:{
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t=require("@embedpdf/plugin-interaction-manager"),n=require("@embedpdf/plugin-viewport"),a="PAN/INIT_STATE",o="PAN/CLEANUP_STATE",i="PAN/SET_ACTIVE_DOCUMENT",s="PAN/SET_PAN_MODE";function r(e,t){return{type:a,payload:{documentId:e,state:t}}}function d(e){return{type:o,payload:e}}function c(e,t){return{type:s,payload:{documentId:e,isPanMode:t}}}const u=class extends e.BasePlugin{constructor(a,o,i){var s,r,d;super(a,o),this.panMode$=e.createBehaviorEmitter(),this.documentHandlers=new Map,this.config=i,this.interactionManager=null==(s=o.getPlugin(t.InteractionManagerPlugin.id))?void 0:s.provides(),this.viewport=null==(r=o.getPlugin(n.ViewportPlugin.id))?void 0:r.provides(),this.interactionManager&&(this.interactionManager.registerMode({id:"panMode",scope:"global",exclusive:!1,cursor:"grab",wantsRawTouch:!1}),null==(d=this.interactionManager)||d.onModeChange(e=>{const t="panMode"===e.activeMode,n=this.getDocumentState(e.documentId);n&&n.isPanMode!==t&&this.dispatch(c(e.documentId,t))}))}onDocumentLoadingStarted(e){this.dispatch(r(e,{isPanMode:!1})),this.registerPanHandlersForDocument(e),"always"===this.config.defaultMode&&this.makePanDefault(!0),this.logger.debug("PanPlugin","DocumentOpened",`Initialized pan state for document: ${e}`)}onDocumentClosed(e){const t=this.documentHandlers.get(e);t&&(t(),this.documentHandlers.delete(e)),this.dispatch(d(e)),this.logger.debug("PanPlugin","DocumentClosed",`Cleaned up pan state for document: ${e}`)}buildCapability(){return{enablePan:()=>this.enablePan(),disablePan:()=>this.disablePan(),togglePan:()=>this.togglePan(),makePanDefault:e=>this.makePanDefault(e),isPanMode:()=>this.isPanMode(),forDocument:e=>this.createPanScope(e),onPanModeChange:this.panMode$.on}}createPanScope(e){return{enablePan:()=>this.enablePan(e),disablePan:()=>this.disablePan(e),togglePan:()=>this.togglePan(e),isPanMode:()=>this.isPanMode(e),onPanModeChange:t=>this.panMode$.on(n=>{n.documentId===e&&t(n.isPanMode)})}}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(`Pan state not found for document: ${e??"active"}`);return t}enablePan(e){const t=e??this.getActiveDocumentId();this.interactionManager.forDocument(t).activate("panMode")}disablePan(e){const t=e??this.getActiveDocumentId();this.interactionManager.forDocument(t).activateDefaultMode()}togglePan(e){const t=e??this.getActiveDocumentId(),n=this.interactionManager.forDocument(t);"panMode"===n.getActiveMode()?n.activateDefaultMode():n.activate("panMode")}makePanDefault(e=!0){this.interactionManager&&(this.interactionManager.setDefaultMode("panMode"),e&&this.interactionManager.activateDefaultMode())}isPanMode(e){return this.getDocumentStateOrThrow(e).isPanMode}registerPanHandlersForDocument(e){if(!this.interactionManager||!this.viewport)return;let t=null;const n=this.interactionManager.forDocument(e),a=this.viewport.forDocument(e),o={onMouseDown:(e,o)=>{const i=a.getMetrics();t={startX:o.clientX,startY:o.clientY,startLeft:i.scrollLeft,startTop:i.scrollTop},n.setCursor("panMode","grabbing",10)},onMouseMove:(e,n)=>{if(!t)return;const o=n.clientX-t.startX,i=n.clientY-t.startY;a.scrollTo({x:t.startLeft-o,y:t.startTop-i})},onMouseUp:()=>{t&&(t=null,n.removeCursor("panMode"))},onMouseLeave:()=>{t&&(t=null,n.removeCursor("panMode"))},onMouseCancel:()=>{t&&(t=null,n.removeCursor("panMode"))}},i=this.interactionManager.registerHandlers({documentId:e,modeId:"panMode",handlers:o});this.documentHandlers.set(e,i)}onStoreUpdated(e,t){for(const n in t.documents){const a=e.documents[n],o=t.documents[n];(null==a?void 0:a.isPanMode)!==o.isPanMode&&(this.panMode$.emit({documentId:n,isPanMode:o.isPanMode}),this.logger.debug("PanPlugin","PanModeChanged",`Pan mode changed for document ${n}: ${(null==a?void 0:a.isPanMode)??!1} -> ${o.isPanMode}`))}}async initialize(e){this.logger.info("PanPlugin","Initialize","Pan plugin initialized")}async destroy(){this.documentHandlers.forEach(e=>e()),this.documentHandlers.clear(),this.panMode$.clear(),await super.destroy()}};u.id="pan";let l=u;const g="pan",p={id:g,name:"Pan Plugin",version:"1.0.0",provides:["pan"],requires:["interaction-manager","viewport"],optional:[],defaultConfig:{defaultMode:"mobile"}},P={documents:{},activeDocumentId:null},m=(e=P,t)=>{switch(t.type){case a:{const{documentId:n,state:a}=t.payload;return{...e,documents:{...e.documents,[n]:a},activeDocumentId:e.activeDocumentId??n}}case o:{const n=t.payload,{[n]:a,...o}=e.documents;return{...e,documents:o,activeDocumentId:e.activeDocumentId===n?null:e.activeDocumentId}}case i:return{...e,activeDocumentId:t.payload};case s:{const{documentId:n,isPanMode:a}=t.payload,o=e.documents[n];return o?{...e,documents:{...e.documents,[n]:{...o,isPanMode:a}}}:e}default:return e}},M={manifest:p,create:(e,t)=>new l(g,e,t),reducer:m,initialState:P};exports.CLEANUP_PAN_STATE=o,exports.INIT_PAN_STATE=a,exports.PAN_PLUGIN_ID=g,exports.PanPlugin=l,exports.PanPluginPackage=M,exports.SET_ACTIVE_PAN_DOCUMENT=i,exports.SET_PAN_MODE=s,exports.cleanupPanState=d,exports.initPanState=r,exports.initialDocumentState={isPanMode:!1},exports.initialState=P,exports.manifest=p,exports.panReducer=m,exports.setActivePanDocument=function(e){return{type:i,payload:e}},exports.setPanMode=c;
|
|
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/pan-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { PanDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_PAN_STATE = 'PAN/INIT_STATE';\nexport const CLEANUP_PAN_STATE = 'PAN/CLEANUP_STATE';\nexport const SET_ACTIVE_PAN_DOCUMENT = 'PAN/SET_ACTIVE_DOCUMENT';\n\n// Pan operations\nexport const SET_PAN_MODE = 'PAN/SET_PAN_MODE';\n\n// Document lifecycle actions\nexport interface InitPanStateAction extends Action {\n type: typeof INIT_PAN_STATE;\n payload: {\n documentId: string;\n state: PanDocumentState;\n };\n}\n\nexport interface CleanupPanStateAction extends Action {\n type: typeof CLEANUP_PAN_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActivePanDocumentAction extends Action {\n type: typeof SET_ACTIVE_PAN_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetPanModeAction extends Action {\n type: typeof SET_PAN_MODE;\n payload: {\n documentId: string;\n isPanMode: boolean;\n };\n}\n\nexport type PanAction =\n | InitPanStateAction\n | CleanupPanStateAction\n | SetActivePanDocumentAction\n | SetPanModeAction;\n\n// Action Creators\nexport function initPanState(documentId: string, state: PanDocumentState): InitPanStateAction {\n return { type: INIT_PAN_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupPanState(documentId: string): CleanupPanStateAction {\n return { type: CLEANUP_PAN_STATE, payload: documentId };\n}\n\nexport function setActivePanDocument(documentId: string | null): SetActivePanDocumentAction {\n return { type: SET_ACTIVE_PAN_DOCUMENT, payload: documentId };\n}\n\nexport function setPanMode(documentId: string, isPanMode: boolean): SetPanModeAction {\n return { type: SET_PAN_MODE, payload: { documentId, isPanMode } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nimport {\n PanCapability,\n PanPluginConfig,\n PanScope,\n PanModeChangeEvent,\n PanState,\n PanDocumentState,\n} from './types';\nimport { initPanState, cleanupPanState, setPanMode, PanAction } from './actions';\n\nexport class PanPlugin extends BasePlugin<PanPluginConfig, PanCapability, PanState, PanAction> {\n static readonly id = 'pan' as const;\n\n private readonly panMode$ = createBehaviorEmitter<PanModeChangeEvent>();\n\n private interactionManager: InteractionManagerCapability;\n private viewport: ViewportCapability;\n public config: PanPluginConfig;\n\n // Track handler cleanup functions per document\n private documentHandlers = new Map<string, () => void>();\n\n constructor(id: string, registry: PluginRegistry, config: PanPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.interactionManager = registry\n .getPlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id)\n ?.provides()!;\n this.viewport = registry.getPlugin<ViewportPlugin>(ViewportPlugin.id)?.provides()!;\n\n if (this.interactionManager) {\n // Register pan mode globally (mode definition is global)\n this.interactionManager.registerMode({\n id: 'panMode',\n scope: 'global',\n exclusive: false,\n cursor: 'grab',\n wantsRawTouch: false,\n });\n\n this.interactionManager?.onModeChange((state) => {\n // Track pan mode state changes for this document\n const isPanMode = state.activeMode === 'panMode';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isPanMode !== isPanMode) {\n this.dispatch(setPanMode(state.documentId, isPanMode));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize pan state for this document\n const docState: PanDocumentState = {\n isPanMode: false,\n };\n\n this.dispatch(initPanState(documentId, docState));\n\n // Register pan handlers for this document\n this.registerPanHandlersForDocument(documentId);\n\n // Handle 'always' mode\n if (this.config.defaultMode === 'always') {\n this.makePanDefault(true);\n }\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentOpened',\n `Initialized pan state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup handlers\n const cleanup = this.documentHandlers.get(documentId);\n if (cleanup) {\n cleanup();\n this.documentHandlers.delete(documentId);\n }\n\n // Cleanup state\n this.dispatch(cleanupPanState(documentId));\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentClosed',\n `Cleaned up pan state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): PanCapability {\n return {\n // Active document operations\n enablePan: () => this.enablePan(),\n disablePan: () => this.disablePan(),\n togglePan: () => this.togglePan(),\n makePanDefault: (autoActivate?: boolean) => this.makePanDefault(autoActivate),\n isPanMode: () => this.isPanMode(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createPanScope(documentId),\n\n // Events\n onPanModeChange: this.panMode$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createPanScope(documentId: string): PanScope {\n return {\n enablePan: () => this.enablePan(documentId),\n disablePan: () => this.disablePan(documentId),\n togglePan: () => this.togglePan(documentId),\n isPanMode: () => this.isPanMode(documentId),\n onPanModeChange: (listener: Listener<boolean>) =>\n this.panMode$.on((event) => {\n if (event.documentId === documentId) listener(event.isPanMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): PanDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): PanDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Pan state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private enablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activate('panMode');\n }\n\n private disablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activateDefaultMode();\n }\n\n private togglePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManager.forDocument(id);\n if (scope.getActiveMode() === 'panMode') {\n scope.activateDefaultMode();\n } else {\n scope.activate('panMode');\n }\n }\n\n private makePanDefault(autoActivate: boolean = true): void {\n if (!this.interactionManager) return;\n\n this.interactionManager.setDefaultMode('panMode');\n if (autoActivate) {\n this.interactionManager.activateDefaultMode();\n }\n }\n\n private isPanMode(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).isPanMode;\n }\n\n // ─────────────────────────────────────────────────────────\n // Pan Handlers Registration\n // ─────────────────────────────────────────────────────────\n\n private registerPanHandlersForDocument(documentId: string) {\n if (!this.interactionManager || !this.viewport) return;\n\n let dragState: {\n startX: number;\n startY: number;\n startLeft: number;\n startTop: number;\n } | null = null;\n\n const interactionScope = this.interactionManager.forDocument(documentId);\n const viewportScope = this.viewport.forDocument(documentId);\n\n const handlers = {\n onMouseDown: (_: any, pe: MouseEvent) => {\n const metrics = viewportScope.getMetrics();\n\n dragState = {\n startX: pe.clientX,\n startY: pe.clientY,\n startLeft: metrics.scrollLeft,\n startTop: metrics.scrollTop,\n };\n\n interactionScope.setCursor('panMode', 'grabbing', 10);\n },\n onMouseMove: (_: any, pe: MouseEvent) => {\n if (!dragState) return;\n\n /* delta between current pointer position and where the drag started */\n const dx = pe.clientX - dragState.startX;\n const dy = pe.clientY - dragState.startY;\n\n viewportScope.scrollTo({\n x: dragState.startLeft - dx,\n y: dragState.startTop - dy,\n });\n },\n onMouseUp: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseLeave: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseCancel: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n };\n\n const unregister = this.interactionManager.registerHandlers({\n documentId,\n modeId: 'panMode',\n handlers,\n });\n\n this.documentHandlers.set(documentId, unregister);\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: PanState, newState: PanState): void {\n // Emit pan mode change events 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?.isPanMode !== newDoc.isPanMode) {\n this.panMode$.emit({\n documentId,\n isPanMode: newDoc.isPanMode,\n });\n\n this.logger.debug(\n 'PanPlugin',\n 'PanModeChanged',\n `Pan mode changed for document ${documentId}: ${prevDoc?.isPanMode ?? false} -> ${newDoc.isPanMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: PanPluginConfig): Promise<void> {\n this.logger.info('PanPlugin', 'Initialize', 'Pan plugin initialized');\n }\n\n async destroy(): Promise<void> {\n // Cleanup all document handlers\n this.documentHandlers.forEach((cleanup) => cleanup());\n this.documentHandlers.clear();\n\n this.panMode$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { PanPluginConfig } from './types';\n\nexport const PAN_PLUGIN_ID = 'pan';\n\nexport const manifest: PluginManifest<PanPluginConfig> = {\n id: PAN_PLUGIN_ID,\n name: 'Pan Plugin',\n version: '1.0.0',\n provides: ['pan'],\n requires: ['interaction-manager', 'viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n defaultMode: 'mobile',\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n PanAction,\n INIT_PAN_STATE,\n CLEANUP_PAN_STATE,\n SET_ACTIVE_PAN_DOCUMENT,\n SET_PAN_MODE,\n} from './actions';\nimport { PanState, PanDocumentState } from './types';\n\nexport const initialDocumentState: PanDocumentState = {\n isPanMode: false,\n};\n\nexport const initialState: PanState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const panReducer: Reducer<PanState, PanAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_PAN_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_PAN_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_PAN_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_PAN_MODE: {\n const { documentId, isPanMode } = 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 isPanMode,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { PanPlugin } from './pan-plugin';\nimport { manifest, PAN_PLUGIN_ID } from './manifest';\nimport { PanPluginConfig, PanState } from './types';\nimport { panReducer, initialState } from './reducer';\nimport { PanAction } from './actions';\n\nexport const PanPluginPackage: PluginPackage<PanPlugin, PanPluginConfig, PanState, PanAction> = {\n manifest,\n create: (registry, config) => new PanPlugin(PAN_PLUGIN_ID, registry, config),\n reducer: panReducer,\n initialState,\n};\n\nexport * from './pan-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["INIT_PAN_STATE","CLEANUP_PAN_STATE","SET_ACTIVE_PAN_DOCUMENT","SET_PAN_MODE","initPanState","documentId","state","type","payload","cleanupPanState","setPanMode","isPanMode","_PanPlugin","BasePlugin","constructor","id","registry","config","super","this","panMode$","createBehaviorEmitter","documentHandlers","Map","interactionManager","_a","getPlugin","InteractionManagerPlugin","provides","viewport","_b","ViewportPlugin","registerMode","scope","exclusive","cursor","wantsRawTouch","_c","onModeChange","activeMode","docState","getDocumentState","dispatch","onDocumentLoadingStarted","registerPanHandlersForDocument","defaultMode","makePanDefault","logger","debug","onDocumentClosed","cleanup","get","delete","buildCapability","enablePan","disablePan","togglePan","autoActivate","forDocument","createPanScope","onPanModeChange","on","listener","event","getActiveDocumentId","documents","getDocumentStateOrThrow","Error","activate","activateDefaultMode","getActiveMode","setDefaultMode","dragState","interactionScope","viewportScope","handlers","onMouseDown","_","pe","metrics","getMetrics","startX","clientX","startY","clientY","startLeft","scrollLeft","startTop","scrollTop","setCursor","onMouseMove","dx","dy","scrollTo","x","y","onMouseUp","removeCursor","onMouseLeave","onMouseCancel","unregister","registerHandlers","modeId","set","onStoreUpdated","prevState","newState","prevDoc","newDoc","emit","initialize","info","destroy","forEach","clear","PanPlugin","PAN_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","enabled","initialState","activeDocumentId","panReducer","action","removed","remainingDocs","PanPluginPackage","create","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/pan-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { PanDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_PAN_STATE = 'PAN/INIT_STATE';\nexport const CLEANUP_PAN_STATE = 'PAN/CLEANUP_STATE';\nexport const SET_ACTIVE_PAN_DOCUMENT = 'PAN/SET_ACTIVE_DOCUMENT';\n\n// Pan operations\nexport const SET_PAN_MODE = 'PAN/SET_PAN_MODE';\n\n// Document lifecycle actions\nexport interface InitPanStateAction extends Action {\n type: typeof INIT_PAN_STATE;\n payload: {\n documentId: string;\n state: PanDocumentState;\n };\n}\n\nexport interface CleanupPanStateAction extends Action {\n type: typeof CLEANUP_PAN_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActivePanDocumentAction extends Action {\n type: typeof SET_ACTIVE_PAN_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetPanModeAction extends Action {\n type: typeof SET_PAN_MODE;\n payload: {\n documentId: string;\n isPanMode: boolean;\n };\n}\n\nexport type PanAction =\n | InitPanStateAction\n | CleanupPanStateAction\n | SetActivePanDocumentAction\n | SetPanModeAction;\n\n// Action Creators\nexport function initPanState(documentId: string, state: PanDocumentState): InitPanStateAction {\n return { type: INIT_PAN_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupPanState(documentId: string): CleanupPanStateAction {\n return { type: CLEANUP_PAN_STATE, payload: documentId };\n}\n\nexport function setActivePanDocument(documentId: string | null): SetActivePanDocumentAction {\n return { type: SET_ACTIVE_PAN_DOCUMENT, payload: documentId };\n}\n\nexport function setPanMode(documentId: string, isPanMode: boolean): SetPanModeAction {\n return { type: SET_PAN_MODE, payload: { documentId, isPanMode } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nimport {\n PanCapability,\n PanPluginConfig,\n PanScope,\n PanModeChangeEvent,\n PanState,\n PanDocumentState,\n} from './types';\nimport { initPanState, cleanupPanState, setPanMode, PanAction } from './actions';\n\nexport class PanPlugin extends BasePlugin<PanPluginConfig, PanCapability, PanState, PanAction> {\n static readonly id = 'pan' as const;\n\n private readonly panMode$ = createBehaviorEmitter<PanModeChangeEvent>();\n\n private interactionManager: InteractionManagerCapability;\n private viewport: ViewportCapability;\n public config: PanPluginConfig;\n\n // Track handler cleanup functions per document\n private documentHandlers = new Map<string, () => void>();\n\n constructor(id: string, registry: PluginRegistry, config: PanPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.interactionManager = registry\n .getPlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id)\n ?.provides()!;\n this.viewport = registry.getPlugin<ViewportPlugin>(ViewportPlugin.id)?.provides()!;\n\n if (this.interactionManager) {\n // Register pan mode globally (mode definition is global)\n this.interactionManager.registerMode({\n id: 'panMode',\n scope: 'global',\n exclusive: false,\n cursor: 'grab',\n wantsRawTouch: false,\n });\n\n this.interactionManager?.onModeChange((state) => {\n // Track pan mode state changes for this document\n const isPanMode = state.activeMode === 'panMode';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isPanMode !== isPanMode) {\n this.dispatch(setPanMode(state.documentId, isPanMode));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize pan state for this document\n const docState: PanDocumentState = {\n isPanMode: false,\n };\n\n this.dispatch(initPanState(documentId, docState));\n\n // Register pan handlers for this document\n this.registerPanHandlersForDocument(documentId);\n\n // Handle 'always' mode\n if (this.config.defaultMode === 'always') {\n this.makePanDefault(true);\n }\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentOpened',\n `Initialized pan state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup handlers\n const cleanup = this.documentHandlers.get(documentId);\n if (cleanup) {\n cleanup();\n this.documentHandlers.delete(documentId);\n }\n\n // Cleanup state\n this.dispatch(cleanupPanState(documentId));\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentClosed',\n `Cleaned up pan state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): PanCapability {\n return {\n // Active document operations\n enablePan: () => this.enablePan(),\n disablePan: () => this.disablePan(),\n togglePan: () => this.togglePan(),\n makePanDefault: (autoActivate?: boolean) => this.makePanDefault(autoActivate),\n isPanMode: () => this.isPanMode(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createPanScope(documentId),\n\n // Events\n onPanModeChange: this.panMode$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createPanScope(documentId: string): PanScope {\n return {\n enablePan: () => this.enablePan(documentId),\n disablePan: () => this.disablePan(documentId),\n togglePan: () => this.togglePan(documentId),\n isPanMode: () => this.isPanMode(documentId),\n onPanModeChange: (listener: Listener<boolean>) =>\n this.panMode$.on((event) => {\n if (event.documentId === documentId) listener(event.isPanMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): PanDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): PanDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Pan state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private enablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activate('panMode');\n }\n\n private disablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activateDefaultMode();\n }\n\n private togglePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManager.forDocument(id);\n if (scope.getActiveMode() === 'panMode') {\n scope.activateDefaultMode();\n } else {\n scope.activate('panMode');\n }\n }\n\n private makePanDefault(autoActivate: boolean = true): void {\n if (!this.interactionManager) return;\n\n this.interactionManager.setDefaultMode('panMode');\n if (autoActivate) {\n this.interactionManager.activateDefaultMode();\n }\n }\n\n private isPanMode(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).isPanMode;\n }\n\n // ─────────────────────────────────────────────────────────\n // Pan Handlers Registration\n // ─────────────────────────────────────────────────────────\n\n private registerPanHandlersForDocument(documentId: string) {\n if (!this.interactionManager || !this.viewport) return;\n\n let dragState: {\n startX: number;\n startY: number;\n startLeft: number;\n startTop: number;\n } | null = null;\n\n const interactionScope = this.interactionManager.forDocument(documentId);\n const viewportScope = this.viewport.forDocument(documentId);\n\n const handlers = {\n onMouseDown: (_: any, pe: MouseEvent) => {\n const metrics = viewportScope.getMetrics();\n\n dragState = {\n startX: pe.clientX,\n startY: pe.clientY,\n startLeft: metrics.scrollLeft,\n startTop: metrics.scrollTop,\n };\n\n interactionScope.setCursor('panMode', 'grabbing', 10);\n },\n onMouseMove: (_: any, pe: MouseEvent) => {\n if (!dragState) return;\n\n /* delta between current pointer position and where the drag started */\n const dx = pe.clientX - dragState.startX;\n const dy = pe.clientY - dragState.startY;\n\n viewportScope.scrollTo({\n x: dragState.startLeft - dx,\n y: dragState.startTop - dy,\n });\n },\n onMouseUp: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseLeave: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseCancel: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n };\n\n const unregister = this.interactionManager.registerHandlers({\n documentId,\n modeId: 'panMode',\n handlers,\n });\n\n this.documentHandlers.set(documentId, unregister);\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: PanState, newState: PanState): void {\n // Emit pan mode change events 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?.isPanMode !== newDoc.isPanMode) {\n this.panMode$.emit({\n documentId,\n isPanMode: newDoc.isPanMode,\n });\n\n this.logger.debug(\n 'PanPlugin',\n 'PanModeChanged',\n `Pan mode changed for document ${documentId}: ${prevDoc?.isPanMode ?? false} -> ${newDoc.isPanMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: PanPluginConfig): Promise<void> {\n this.logger.info('PanPlugin', 'Initialize', 'Pan plugin initialized');\n }\n\n async destroy(): Promise<void> {\n // Cleanup all document handlers\n this.documentHandlers.forEach((cleanup) => cleanup());\n this.documentHandlers.clear();\n\n this.panMode$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { PanPluginConfig } from './types';\n\nexport const PAN_PLUGIN_ID = 'pan';\n\nexport const manifest: PluginManifest<PanPluginConfig> = {\n id: PAN_PLUGIN_ID,\n name: 'Pan Plugin',\n version: '1.0.0',\n provides: ['pan'],\n requires: ['interaction-manager', 'viewport'],\n optional: [],\n defaultConfig: {\n defaultMode: 'mobile',\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n PanAction,\n INIT_PAN_STATE,\n CLEANUP_PAN_STATE,\n SET_ACTIVE_PAN_DOCUMENT,\n SET_PAN_MODE,\n} from './actions';\nimport { PanState, PanDocumentState } from './types';\n\nexport const initialDocumentState: PanDocumentState = {\n isPanMode: false,\n};\n\nexport const initialState: PanState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const panReducer: Reducer<PanState, PanAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_PAN_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_PAN_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_PAN_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_PAN_MODE: {\n const { documentId, isPanMode } = 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 isPanMode,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { PanPlugin } from './pan-plugin';\nimport { manifest, PAN_PLUGIN_ID } from './manifest';\nimport { PanPluginConfig, PanState } from './types';\nimport { panReducer, initialState } from './reducer';\nimport { PanAction } from './actions';\n\nexport const PanPluginPackage: PluginPackage<PanPlugin, PanPluginConfig, PanState, PanAction> = {\n manifest,\n create: (registry, config) => new PanPlugin(PAN_PLUGIN_ID, registry, config),\n reducer: panReducer,\n initialState,\n};\n\nexport * from './pan-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":["INIT_PAN_STATE","CLEANUP_PAN_STATE","SET_ACTIVE_PAN_DOCUMENT","SET_PAN_MODE","initPanState","documentId","state","type","payload","cleanupPanState","setPanMode","isPanMode","_PanPlugin","BasePlugin","constructor","id","registry","config","super","this","panMode$","createBehaviorEmitter","documentHandlers","Map","interactionManager","_a","getPlugin","InteractionManagerPlugin","provides","viewport","_b","ViewportPlugin","registerMode","scope","exclusive","cursor","wantsRawTouch","_c","onModeChange","activeMode","docState","getDocumentState","dispatch","onDocumentLoadingStarted","registerPanHandlersForDocument","defaultMode","makePanDefault","logger","debug","onDocumentClosed","cleanup","get","delete","buildCapability","enablePan","disablePan","togglePan","autoActivate","forDocument","createPanScope","onPanModeChange","on","listener","event","getActiveDocumentId","documents","getDocumentStateOrThrow","Error","activate","activateDefaultMode","getActiveMode","setDefaultMode","dragState","interactionScope","viewportScope","handlers","onMouseDown","_","pe","metrics","getMetrics","startX","clientX","startY","clientY","startLeft","scrollLeft","startTop","scrollTop","setCursor","onMouseMove","dx","dy","scrollTo","x","y","onMouseUp","removeCursor","onMouseLeave","onMouseCancel","unregister","registerHandlers","modeId","set","onStoreUpdated","prevState","newState","prevDoc","newDoc","emit","initialize","info","destroy","forEach","clear","PanPlugin","PAN_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","initialState","activeDocumentId","panReducer","action","removed","remainingDocs","PanPluginPackage","create","reducer"],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/pan-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { PanDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_PAN_STATE = 'PAN/INIT_STATE';\nexport const CLEANUP_PAN_STATE = 'PAN/CLEANUP_STATE';\nexport const SET_ACTIVE_PAN_DOCUMENT = 'PAN/SET_ACTIVE_DOCUMENT';\n\n// Pan operations\nexport const SET_PAN_MODE = 'PAN/SET_PAN_MODE';\n\n// Document lifecycle actions\nexport interface InitPanStateAction extends Action {\n type: typeof INIT_PAN_STATE;\n payload: {\n documentId: string;\n state: PanDocumentState;\n };\n}\n\nexport interface CleanupPanStateAction extends Action {\n type: typeof CLEANUP_PAN_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActivePanDocumentAction extends Action {\n type: typeof SET_ACTIVE_PAN_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetPanModeAction extends Action {\n type: typeof SET_PAN_MODE;\n payload: {\n documentId: string;\n isPanMode: boolean;\n };\n}\n\nexport type PanAction =\n | InitPanStateAction\n | CleanupPanStateAction\n | SetActivePanDocumentAction\n | SetPanModeAction;\n\n// Action Creators\nexport function initPanState(documentId: string, state: PanDocumentState): InitPanStateAction {\n return { type: INIT_PAN_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupPanState(documentId: string): CleanupPanStateAction {\n return { type: CLEANUP_PAN_STATE, payload: documentId };\n}\n\nexport function setActivePanDocument(documentId: string | null): SetActivePanDocumentAction {\n return { type: SET_ACTIVE_PAN_DOCUMENT, payload: documentId };\n}\n\nexport function setPanMode(documentId: string, isPanMode: boolean): SetPanModeAction {\n return { type: SET_PAN_MODE, payload: { documentId, isPanMode } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nimport {\n PanCapability,\n PanPluginConfig,\n PanScope,\n PanModeChangeEvent,\n PanState,\n PanDocumentState,\n} from './types';\nimport { initPanState, cleanupPanState, setPanMode, PanAction } from './actions';\n\nexport class PanPlugin extends BasePlugin<PanPluginConfig, PanCapability, PanState, PanAction> {\n static readonly id = 'pan' as const;\n\n private readonly panMode$ = createBehaviorEmitter<PanModeChangeEvent>();\n\n private interactionManager: InteractionManagerCapability;\n private viewport: ViewportCapability;\n public config: PanPluginConfig;\n\n // Track handler cleanup functions per document\n private documentHandlers = new Map<string, () => void>();\n\n constructor(id: string, registry: PluginRegistry, config: PanPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.interactionManager = registry\n .getPlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id)\n ?.provides()!;\n this.viewport = registry.getPlugin<ViewportPlugin>(ViewportPlugin.id)?.provides()!;\n\n if (this.interactionManager) {\n // Register pan mode globally (mode definition is global)\n this.interactionManager.registerMode({\n id: 'panMode',\n scope: 'global',\n exclusive: false,\n cursor: 'grab',\n wantsRawTouch: false,\n });\n\n this.interactionManager?.onModeChange((state) => {\n // Track pan mode state changes for this document\n const isPanMode = state.activeMode === 'panMode';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isPanMode !== isPanMode) {\n this.dispatch(setPanMode(state.documentId, isPanMode));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize pan state for this document\n const docState: PanDocumentState = {\n isPanMode: false,\n };\n\n this.dispatch(initPanState(documentId, docState));\n\n // Register pan handlers for this document\n this.registerPanHandlersForDocument(documentId);\n\n // Handle 'always' mode\n if (this.config.defaultMode === 'always') {\n this.makePanDefault(true);\n }\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentOpened',\n `Initialized pan state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup handlers\n const cleanup = this.documentHandlers.get(documentId);\n if (cleanup) {\n cleanup();\n this.documentHandlers.delete(documentId);\n }\n\n // Cleanup state\n this.dispatch(cleanupPanState(documentId));\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentClosed',\n `Cleaned up pan state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): PanCapability {\n return {\n // Active document operations\n enablePan: () => this.enablePan(),\n disablePan: () => this.disablePan(),\n togglePan: () => this.togglePan(),\n makePanDefault: (autoActivate?: boolean) => this.makePanDefault(autoActivate),\n isPanMode: () => this.isPanMode(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createPanScope(documentId),\n\n // Events\n onPanModeChange: this.panMode$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createPanScope(documentId: string): PanScope {\n return {\n enablePan: () => this.enablePan(documentId),\n disablePan: () => this.disablePan(documentId),\n togglePan: () => this.togglePan(documentId),\n isPanMode: () => this.isPanMode(documentId),\n onPanModeChange: (listener: Listener<boolean>) =>\n this.panMode$.on((event) => {\n if (event.documentId === documentId) listener(event.isPanMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): PanDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): PanDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Pan state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private enablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activate('panMode');\n }\n\n private disablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activateDefaultMode();\n }\n\n private togglePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManager.forDocument(id);\n if (scope.getActiveMode() === 'panMode') {\n scope.activateDefaultMode();\n } else {\n scope.activate('panMode');\n }\n }\n\n private makePanDefault(autoActivate: boolean = true): void {\n if (!this.interactionManager) return;\n\n this.interactionManager.setDefaultMode('panMode');\n if (autoActivate) {\n this.interactionManager.activateDefaultMode();\n }\n }\n\n private isPanMode(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).isPanMode;\n }\n\n // ─────────────────────────────────────────────────────────\n // Pan Handlers Registration\n // ─────────────────────────────────────────────────────────\n\n private registerPanHandlersForDocument(documentId: string) {\n if (!this.interactionManager || !this.viewport) return;\n\n let dragState: {\n startX: number;\n startY: number;\n startLeft: number;\n startTop: number;\n } | null = null;\n\n const interactionScope = this.interactionManager.forDocument(documentId);\n const viewportScope = this.viewport.forDocument(documentId);\n\n const handlers = {\n onMouseDown: (_: any, pe: MouseEvent) => {\n const metrics = viewportScope.getMetrics();\n\n dragState = {\n startX: pe.clientX,\n startY: pe.clientY,\n startLeft: metrics.scrollLeft,\n startTop: metrics.scrollTop,\n };\n\n interactionScope.setCursor('panMode', 'grabbing', 10);\n },\n onMouseMove: (_: any, pe: MouseEvent) => {\n if (!dragState) return;\n\n /* delta between current pointer position and where the drag started */\n const dx = pe.clientX - dragState.startX;\n const dy = pe.clientY - dragState.startY;\n\n viewportScope.scrollTo({\n x: dragState.startLeft - dx,\n y: dragState.startTop - dy,\n });\n },\n onMouseUp: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseLeave: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseCancel: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n };\n\n const unregister = this.interactionManager.registerHandlers({\n documentId,\n modeId: 'panMode',\n handlers,\n });\n\n this.documentHandlers.set(documentId, unregister);\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: PanState, newState: PanState): void {\n // Emit pan mode change events 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?.isPanMode !== newDoc.isPanMode) {\n this.panMode$.emit({\n documentId,\n isPanMode: newDoc.isPanMode,\n });\n\n this.logger.debug(\n 'PanPlugin',\n 'PanModeChanged',\n `Pan mode changed for document ${documentId}: ${prevDoc?.isPanMode ?? false} -> ${newDoc.isPanMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: PanPluginConfig): Promise<void> {\n this.logger.info('PanPlugin', 'Initialize', 'Pan plugin initialized');\n }\n\n async destroy(): Promise<void> {\n // Cleanup all document handlers\n this.documentHandlers.forEach((cleanup) => cleanup());\n this.documentHandlers.clear();\n\n this.panMode$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { PanPluginConfig } from './types';\n\nexport const PAN_PLUGIN_ID = 'pan';\n\nexport const manifest: PluginManifest<PanPluginConfig> = {\n id: PAN_PLUGIN_ID,\n name: 'Pan Plugin',\n version: '1.0.0',\n provides: ['pan'],\n requires: ['interaction-manager', 'viewport'],\n optional: [],\n defaultConfig: {\n enabled: true,\n defaultMode: 'mobile',\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n PanAction,\n INIT_PAN_STATE,\n CLEANUP_PAN_STATE,\n SET_ACTIVE_PAN_DOCUMENT,\n SET_PAN_MODE,\n} from './actions';\nimport { PanState, PanDocumentState } from './types';\n\nexport const initialDocumentState: PanDocumentState = {\n isPanMode: false,\n};\n\nexport const initialState: PanState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const panReducer: Reducer<PanState, PanAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_PAN_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_PAN_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_PAN_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_PAN_MODE: {\n const { documentId, isPanMode } = 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 isPanMode,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { PanPlugin } from './pan-plugin';\nimport { manifest, PAN_PLUGIN_ID } from './manifest';\nimport { PanPluginConfig, PanState } from './types';\nimport { panReducer, initialState } from './reducer';\nimport { PanAction } from './actions';\n\nexport const PanPluginPackage: PluginPackage<PanPlugin, PanPluginConfig, PanState, PanAction> = {\n manifest,\n create: (registry, config) => new PanPlugin(PAN_PLUGIN_ID, registry, config),\n reducer: panReducer,\n initialState,\n};\n\nexport * from './pan-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/actions.ts","../src/lib/pan-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { PanDocumentState } from './types';\n\n// Document lifecycle\nexport const INIT_PAN_STATE = 'PAN/INIT_STATE';\nexport const CLEANUP_PAN_STATE = 'PAN/CLEANUP_STATE';\nexport const SET_ACTIVE_PAN_DOCUMENT = 'PAN/SET_ACTIVE_DOCUMENT';\n\n// Pan operations\nexport const SET_PAN_MODE = 'PAN/SET_PAN_MODE';\n\n// Document lifecycle actions\nexport interface InitPanStateAction extends Action {\n type: typeof INIT_PAN_STATE;\n payload: {\n documentId: string;\n state: PanDocumentState;\n };\n}\n\nexport interface CleanupPanStateAction extends Action {\n type: typeof CLEANUP_PAN_STATE;\n payload: string; // documentId\n}\n\nexport interface SetActivePanDocumentAction extends Action {\n type: typeof SET_ACTIVE_PAN_DOCUMENT;\n payload: string | null; // documentId\n}\n\nexport interface SetPanModeAction extends Action {\n type: typeof SET_PAN_MODE;\n payload: {\n documentId: string;\n isPanMode: boolean;\n };\n}\n\nexport type PanAction =\n | InitPanStateAction\n | CleanupPanStateAction\n | SetActivePanDocumentAction\n | SetPanModeAction;\n\n// Action Creators\nexport function initPanState(documentId: string, state: PanDocumentState): InitPanStateAction {\n return { type: INIT_PAN_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupPanState(documentId: string): CleanupPanStateAction {\n return { type: CLEANUP_PAN_STATE, payload: documentId };\n}\n\nexport function setActivePanDocument(documentId: string | null): SetActivePanDocumentAction {\n return { type: SET_ACTIVE_PAN_DOCUMENT, payload: documentId };\n}\n\nexport function setPanMode(documentId: string, isPanMode: boolean): SetPanModeAction {\n return { type: SET_PAN_MODE, payload: { documentId, isPanMode } };\n}\n","import { BasePlugin, createBehaviorEmitter, Listener, PluginRegistry } from '@embedpdf/core';\nimport {\n InteractionManagerCapability,\n InteractionManagerPlugin,\n} from '@embedpdf/plugin-interaction-manager';\nimport { ViewportCapability, ViewportPlugin } from '@embedpdf/plugin-viewport';\n\nimport {\n PanCapability,\n PanPluginConfig,\n PanScope,\n PanModeChangeEvent,\n PanState,\n PanDocumentState,\n} from './types';\nimport { initPanState, cleanupPanState, setPanMode, PanAction } from './actions';\n\nexport class PanPlugin extends BasePlugin<PanPluginConfig, PanCapability, PanState, PanAction> {\n static readonly id = 'pan' as const;\n\n private readonly panMode$ = createBehaviorEmitter<PanModeChangeEvent>();\n\n private interactionManager: InteractionManagerCapability;\n private viewport: ViewportCapability;\n public config: PanPluginConfig;\n\n // Track handler cleanup functions per document\n private documentHandlers = new Map<string, () => void>();\n\n constructor(id: string, registry: PluginRegistry, config: PanPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n this.interactionManager = registry\n .getPlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id)\n ?.provides()!;\n this.viewport = registry.getPlugin<ViewportPlugin>(ViewportPlugin.id)?.provides()!;\n\n if (this.interactionManager) {\n // Register pan mode globally (mode definition is global)\n this.interactionManager.registerMode({\n id: 'panMode',\n scope: 'global',\n exclusive: false,\n cursor: 'grab',\n wantsRawTouch: false,\n });\n\n this.interactionManager?.onModeChange((state) => {\n // Track pan mode state changes for this document\n const isPanMode = state.activeMode === 'panMode';\n const docState = this.getDocumentState(state.documentId);\n\n // Only dispatch if state actually changed\n if (docState && docState.isPanMode !== isPanMode) {\n this.dispatch(setPanMode(state.documentId, isPanMode));\n }\n });\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Lifecycle Hooks (from BasePlugin)\n // ─────────────────────────────────────────────────────────\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n // Initialize pan state for this document\n const docState: PanDocumentState = {\n isPanMode: false,\n };\n\n this.dispatch(initPanState(documentId, docState));\n\n // Register pan handlers for this document\n this.registerPanHandlersForDocument(documentId);\n\n // Handle 'always' mode\n if (this.config.defaultMode === 'always') {\n this.makePanDefault(true);\n }\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentOpened',\n `Initialized pan state for document: ${documentId}`,\n );\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Cleanup handlers\n const cleanup = this.documentHandlers.get(documentId);\n if (cleanup) {\n cleanup();\n this.documentHandlers.delete(documentId);\n }\n\n // Cleanup state\n this.dispatch(cleanupPanState(documentId));\n\n this.logger.debug(\n 'PanPlugin',\n 'DocumentClosed',\n `Cleaned up pan state for document: ${documentId}`,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Capability\n // ─────────────────────────────────────────────────────────\n\n protected buildCapability(): PanCapability {\n return {\n // Active document operations\n enablePan: () => this.enablePan(),\n disablePan: () => this.disablePan(),\n togglePan: () => this.togglePan(),\n makePanDefault: (autoActivate?: boolean) => this.makePanDefault(autoActivate),\n isPanMode: () => this.isPanMode(),\n\n // Document-scoped operations\n forDocument: (documentId: string) => this.createPanScope(documentId),\n\n // Events\n onPanModeChange: this.panMode$.on,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createPanScope(documentId: string): PanScope {\n return {\n enablePan: () => this.enablePan(documentId),\n disablePan: () => this.disablePan(documentId),\n togglePan: () => this.togglePan(documentId),\n isPanMode: () => this.isPanMode(documentId),\n onPanModeChange: (listener: Listener<boolean>) =>\n this.panMode$.on((event) => {\n if (event.documentId === documentId) listener(event.isPanMode);\n }),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // State Helpers\n // ─────────────────────────────────────────────────────────\n private getDocumentState(documentId?: string): PanDocumentState | null {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? null;\n }\n\n private getDocumentStateOrThrow(documentId?: string): PanDocumentState {\n const state = this.getDocumentState(documentId);\n if (!state) {\n throw new Error(`Pan state not found for document: ${documentId ?? 'active'}`);\n }\n return state;\n }\n\n // ─────────────────────────────────────────────────────────\n // Core Operations\n // ─────────────────────────────────────────────────────────\n\n private enablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activate('panMode');\n }\n\n private disablePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n this.interactionManager.forDocument(id).activateDefaultMode();\n }\n\n private togglePan(documentId?: string): void {\n const id = documentId ?? this.getActiveDocumentId();\n const scope = this.interactionManager.forDocument(id);\n if (scope.getActiveMode() === 'panMode') {\n scope.activateDefaultMode();\n } else {\n scope.activate('panMode');\n }\n }\n\n private makePanDefault(autoActivate: boolean = true): void {\n if (!this.interactionManager) return;\n\n this.interactionManager.setDefaultMode('panMode');\n if (autoActivate) {\n this.interactionManager.activateDefaultMode();\n }\n }\n\n private isPanMode(documentId?: string): boolean {\n return this.getDocumentStateOrThrow(documentId).isPanMode;\n }\n\n // ─────────────────────────────────────────────────────────\n // Pan Handlers Registration\n // ─────────────────────────────────────────────────────────\n\n private registerPanHandlersForDocument(documentId: string) {\n if (!this.interactionManager || !this.viewport) return;\n\n let dragState: {\n startX: number;\n startY: number;\n startLeft: number;\n startTop: number;\n } | null = null;\n\n const interactionScope = this.interactionManager.forDocument(documentId);\n const viewportScope = this.viewport.forDocument(documentId);\n\n const handlers = {\n onMouseDown: (_: any, pe: MouseEvent) => {\n const metrics = viewportScope.getMetrics();\n\n dragState = {\n startX: pe.clientX,\n startY: pe.clientY,\n startLeft: metrics.scrollLeft,\n startTop: metrics.scrollTop,\n };\n\n interactionScope.setCursor('panMode', 'grabbing', 10);\n },\n onMouseMove: (_: any, pe: MouseEvent) => {\n if (!dragState) return;\n\n /* delta between current pointer position and where the drag started */\n const dx = pe.clientX - dragState.startX;\n const dy = pe.clientY - dragState.startY;\n\n viewportScope.scrollTo({\n x: dragState.startLeft - dx,\n y: dragState.startTop - dy,\n });\n },\n onMouseUp: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseLeave: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n onMouseCancel: () => {\n if (!dragState) return;\n\n dragState = null;\n interactionScope.removeCursor('panMode');\n },\n };\n\n const unregister = this.interactionManager.registerHandlers({\n documentId,\n modeId: 'panMode',\n handlers,\n });\n\n this.documentHandlers.set(documentId, unregister);\n }\n\n // ─────────────────────────────────────────────────────────\n // Store Update Handlers\n // ─────────────────────────────────────────────────────────\n\n override onStoreUpdated(prevState: PanState, newState: PanState): void {\n // Emit pan mode change events 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?.isPanMode !== newDoc.isPanMode) {\n this.panMode$.emit({\n documentId,\n isPanMode: newDoc.isPanMode,\n });\n\n this.logger.debug(\n 'PanPlugin',\n 'PanModeChanged',\n `Pan mode changed for document ${documentId}: ${prevDoc?.isPanMode ?? false} -> ${newDoc.isPanMode}`,\n );\n }\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────\n\n async initialize(_: PanPluginConfig): Promise<void> {\n this.logger.info('PanPlugin', 'Initialize', 'Pan plugin initialized');\n }\n\n async destroy(): Promise<void> {\n // Cleanup all document handlers\n this.documentHandlers.forEach((cleanup) => cleanup());\n this.documentHandlers.clear();\n\n this.panMode$.clear();\n await super.destroy();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { PanPluginConfig } from './types';\n\nexport const PAN_PLUGIN_ID = 'pan';\n\nexport const manifest: PluginManifest<PanPluginConfig> = {\n id: PAN_PLUGIN_ID,\n name: 'Pan Plugin',\n version: '1.0.0',\n provides: ['pan'],\n requires: ['interaction-manager', 'viewport'],\n optional: [],\n defaultConfig: {\n defaultMode: 'mobile',\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport {\n PanAction,\n INIT_PAN_STATE,\n CLEANUP_PAN_STATE,\n SET_ACTIVE_PAN_DOCUMENT,\n SET_PAN_MODE,\n} from './actions';\nimport { PanState, PanDocumentState } from './types';\n\nexport const initialDocumentState: PanDocumentState = {\n isPanMode: false,\n};\n\nexport const initialState: PanState = {\n documents: {},\n activeDocumentId: null,\n};\n\nexport const panReducer: Reducer<PanState, PanAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_PAN_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_PAN_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_PAN_DOCUMENT: {\n return {\n ...state,\n activeDocumentId: action.payload,\n };\n }\n\n case SET_PAN_MODE: {\n const { documentId, isPanMode } = 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 isPanMode,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { PanPlugin } from './pan-plugin';\nimport { manifest, PAN_PLUGIN_ID } from './manifest';\nimport { PanPluginConfig, PanState } from './types';\nimport { panReducer, initialState } from './reducer';\nimport { PanAction } from './actions';\n\nexport const PanPluginPackage: PluginPackage<PanPlugin, PanPluginConfig, PanState, PanAction> = {\n manifest,\n create: (registry, config) => new PanPlugin(PAN_PLUGIN_ID, registry, config),\n reducer: panReducer,\n initialState,\n};\n\nexport * from './pan-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './actions';\nexport * from './reducer';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@embedpdf/plugin-pan",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@embedpdf/models": "2.0.0-next.
|
|
37
|
+
"@embedpdf/models": "2.0.0-next.3"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/react": "^18.2.0",
|
|
41
41
|
"typescript": "^5.0.0",
|
|
42
|
-
"@embedpdf/plugin-interaction-manager": "2.0.0-next.
|
|
43
|
-
"@embedpdf/
|
|
44
|
-
"@embedpdf/
|
|
42
|
+
"@embedpdf/plugin-interaction-manager": "2.0.0-next.3",
|
|
43
|
+
"@embedpdf/plugin-viewport": "2.0.0-next.3",
|
|
44
|
+
"@embedpdf/build": "1.1.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": ">=16.8.0",
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"preact": "^10.26.4",
|
|
50
50
|
"vue": ">=3.2.0",
|
|
51
51
|
"svelte": ">=5 <6",
|
|
52
|
-
"@embedpdf/plugin-
|
|
53
|
-
"@embedpdf/
|
|
54
|
-
"@embedpdf/
|
|
52
|
+
"@embedpdf/plugin-viewport": "2.0.0-next.3",
|
|
53
|
+
"@embedpdf/plugin-interaction-manager": "2.0.0-next.3",
|
|
54
|
+
"@embedpdf/core": "2.0.0-next.3"
|
|
55
55
|
},
|
|
56
56
|
"files": [
|
|
57
57
|
"dist",
|