{"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  PageActivityChangeEvent,\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  // Per-document page activities: documentId -> Map<topic, pageIndex>\n  private pageActivities = new Map<string, Map<string, number>>();\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  private readonly onPageActivityChange$ = createEmitter<PageActivityChangeEvent>();\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    this.pageActivities.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    // Emit release events for any remaining page activities\n    const topics = this.pageActivities.get(documentId);\n    if (topics) {\n      // Collect unique pages that have topics\n      const activePages = new Set(topics.values());\n      topics.clear();\n      for (const pageIndex of activePages) {\n        this.onPageActivityChange$.emit({ documentId, pageIndex, hasActivity: false });\n      }\n    }\n\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    this.pageActivities.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      // Page activity\n      claimPageActivity: (documentId: string, topic: string, pageIndex: number) =>\n        this.claimPageActivity(documentId, topic, pageIndex),\n      releasePageActivity: (documentId: string, topic: string) =>\n        this.releasePageActivity(documentId, topic),\n      hasPageActivity: (documentId: string, pageIndex: number) =>\n        this.hasPageActivity(documentId, pageIndex),\n\n      // Events\n      onModeChange: this.onModeChange$.on,\n      onCursorChange: this.onCursorChange$.on,\n      onHandlerChange: this.onHandlerChange$.on,\n      onStateChange: this.onStateChange$.on,\n      onPageActivityChange: this.onPageActivityChange$.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      claimPageActivity: (topic: string, pageIndex: number) =>\n        this.claimPageActivity(documentId, topic, pageIndex),\n      releasePageActivity: (topic: string) => this.releasePageActivity(documentId, topic),\n      hasPageActivity: (pageIndex: number) => this.hasPageActivity(documentId, pageIndex),\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      onPageActivityChange: (listener: Listener<{ pageIndex: number; hasActivity: boolean }>) =>\n        this.onPageActivityChange$.on((event) => {\n          if (event.documentId === documentId)\n            listener({ pageIndex: event.pageIndex, hasActivity: event.hasActivity });\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  // Page Activity Management\n  // ─────────────────────────────────────────────────────────\n\n  private claimPageActivity(documentId: string, topic: string, pageIndex: number): void {\n    let topics = this.pageActivities.get(documentId);\n    if (!topics) {\n      topics = new Map();\n      this.pageActivities.set(documentId, topics);\n    }\n\n    const oldPage = topics.get(topic);\n\n    // No-op if already on the same page\n    if (oldPage === pageIndex) return;\n\n    // Set new page\n    topics.set(topic, pageIndex);\n\n    // Release old page if it existed and now has no topics\n    if (oldPage !== undefined && !this.pageHasAnyTopic(documentId, oldPage)) {\n      this.onPageActivityChange$.emit({ documentId, pageIndex: oldPage, hasActivity: false });\n    }\n\n    // Emit for new page if it just gained its first topic\n    if (this.countTopicsOnPage(documentId, pageIndex) === 1) {\n      this.onPageActivityChange$.emit({ documentId, pageIndex, hasActivity: true });\n    }\n  }\n\n  private releasePageActivity(documentId: string, topic: string): void {\n    const topics = this.pageActivities.get(documentId);\n    if (!topics) return;\n\n    const page = topics.get(topic);\n    if (page === undefined) return;\n\n    topics.delete(topic);\n\n    // If page has no more topics, emit\n    if (!this.pageHasAnyTopic(documentId, page)) {\n      this.onPageActivityChange$.emit({ documentId, pageIndex: page, hasActivity: false });\n    }\n  }\n\n  private hasPageActivity(documentId: string, pageIndex: number): boolean {\n    return this.pageHasAnyTopic(documentId, pageIndex);\n  }\n\n  /** Helper: does any topic point to this page? */\n  private pageHasAnyTopic(documentId: string, pageIndex: number): boolean {\n    const topics = this.pageActivities.get(documentId);\n    if (!topics) return false;\n    for (const p of topics.values()) {\n      if (p === pageIndex) return true;\n    }\n    return false;\n  }\n\n  /** Helper: count topics on a page */\n  private countTopicsOnPage(documentId: string, pageIndex: number): number {\n    const topics = this.pageActivities.get(documentId);\n    if (!topics) return 0;\n    let count = 0;\n    for (const p of topics.values()) {\n      if (p === pageIndex) count++;\n    }\n    return count;\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.pageActivities.clear();\n    this.onModeChange$.clear();\n    this.onCursorChange$.clear();\n    this.onHandlerChange$.clear();\n    this.onStateChange$.clear();\n    this.onPageActivityChange$.clear();\n    await super.destroy();\n  }\n}\n","import { EmbedPdfPointerEvent, 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] = (pos: any, evt: EmbedPdfPointerEvent, modeId: string) => {\n      for (const h of list) {\n        // Stop calling handlers if propagation was stopped\n        if (evt.isImmediatePropagationStopped()) break;\n        h[k]?.(pos, evt, modeId);\n      }\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","pageActivities","onModeChange$","createEmitter","onHandlerChange$","onCursorChange$","onStateChange$","createBehaviorEmitter","onPageActivityChange$","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","topics","activePages","values","clear","pageIndex","emit","hasActivity","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","claimPageActivity","topic","releasePageActivity","hasPageActivity","onModeChange","on","onCursorChange","onHandlerChange","onStateChange","onPageActivityChange","listener","event","getDocumentState","getActiveDocumentId","documents","Error","has","previousMode","_a","notifyHandlersInactive","activateMode","emitCursor","notifyHandlersActive","getActiveDocumentIdOrNull","pauseInteraction","resumeInteraction","handlers","modeIds","Array","isArray","cleanupFunctions","bucket","add","push","size","forEach","cleanup","docPageMap","mergeSets","a","b","list","out","k","pos","evt","h","isImmediatePropagationStopped","call","mergeHandlers","claims","top","sort","oldPage","pageHasAnyTopic","countTopicsOnPage","p","count","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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"}