{"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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"}