{"version":3,"file":"index.cjs","sources":["../../src/shared/utils.ts","../../src/vue/hooks/use-interaction-manager.ts","../../src/vue/components/global-pointer-provider.vue","../../src/vue/components/page-pointer-provider.vue"],"sourcesContent":["import { Position } from '@embedpdf/models';\nimport type {\n  InteractionManagerCapability,\n  InteractionScope,\n  PointerEventHandlers,\n  EmbedPdfPointerEvent,\n  InteractionExclusionRules,\n} from '@embedpdf/plugin-interaction-manager';\n\n/* -------------------------------------------------- */\n/* event → handler key lookup                         */\n/* -------------------------------------------------- */\ntype K = keyof PointerEventHandlers;\nconst domEventMap: Record<string, K> = {\n  pointerdown: 'onPointerDown',\n  pointerup: 'onPointerUp',\n  pointermove: 'onPointerMove',\n  pointerenter: 'onPointerEnter',\n  pointerleave: 'onPointerLeave',\n  pointercancel: 'onPointerCancel',\n\n  mousedown: 'onMouseDown',\n  mouseup: 'onMouseUp',\n  mousemove: 'onMouseMove',\n  mouseenter: 'onMouseEnter',\n  mouseleave: 'onMouseLeave',\n  mousecancel: 'onMouseCancel',\n\n  click: 'onClick',\n  dblclick: 'onDoubleClick',\n\n  /* touch → pointer fallback for very old browsers */\n  touchstart: 'onPointerDown',\n  touchend: 'onPointerUp',\n  touchmove: 'onPointerMove',\n  touchcancel: 'onPointerCancel',\n};\n\nconst pointerEventTypes = [\n  'pointerdown',\n  'pointerup',\n  'pointermove',\n  'pointerenter',\n  'pointerleave',\n  'pointercancel',\n  'mousedown',\n  'mouseup',\n  'mousemove',\n  'mouseenter',\n  'mouseleave',\n  'mousecancel',\n  'click',\n  'dblclick',\n];\n\nconst touchEventTypes = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nconst HAS_POINTER = typeof PointerEvent !== 'undefined';\n// If the browser supports Pointer Events, don't attach legacy touch events to avoid double-dispatch.\nconst allEventTypes = HAS_POINTER ? pointerEventTypes : [...pointerEventTypes, ...touchEventTypes];\n\n/* -------------------------------------------------- */\n/* helper: decide listener options per event type     */\n/* -------------------------------------------------- */\nfunction listenerOpts(eventType: string, wantsRawTouch: boolean): AddEventListenerOptions {\n  // Only touch events are toggled; pointer/mouse stay non-passive\n  return eventType.startsWith('touch') ? { passive: !wantsRawTouch } : { passive: false };\n}\n\nfunction isTouchEvent(evt: Event): evt is TouchEvent {\n  return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent;\n}\n\n/**\n * Check if an element should be excluded based on rules\n * This is in the framework layer, not the plugin\n */\nfunction shouldExcludeElement(element: Element | null, rules: InteractionExclusionRules): boolean {\n  if (!element) return false;\n\n  let current: Element | null = element;\n\n  while (current) {\n    // Check classes\n    if (rules.classes?.length) {\n      for (const className of rules.classes) {\n        if (current.classList?.contains(className)) {\n          return true;\n        }\n      }\n    }\n\n    // Check data attributes\n    if (rules.dataAttributes?.length) {\n      for (const attr of rules.dataAttributes) {\n        if (current.hasAttribute(attr)) {\n          return true;\n        }\n      }\n    }\n\n    // Move up the DOM tree\n    current = current.parentElement;\n  }\n\n  return false;\n}\n\n/* -------------------------------------------------- */\n/* createPointerProvider                              */\n/* -------------------------------------------------- */\nexport function createPointerProvider(\n  cap: InteractionManagerCapability,\n  scope: InteractionScope,\n  element: HTMLElement,\n  convertEventToPoint?: (evt: PointerEvent, host: HTMLElement) => Position,\n) {\n  const capScope = cap.forDocument(scope.documentId);\n  /* ---------- live handler set --------------------------------------------------- */\n  let active: PointerEventHandlers | null = cap.getHandlersForScope(scope);\n\n  /* ---------- helper to compute current wantsRawTouch (defaults to true) --------- */\n  const wantsRawTouchNow = () => capScope.getActiveInteractionMode()?.wantsRawTouch !== false; // default → true\n\n  /* ---------- dynamic listener (re)attachment ------------------------------------ */\n  const listeners: Record<string, (evt: Event) => void> = {};\n  let attachedWithRawTouch = wantsRawTouchNow(); // remember current mode’s wish\n\n  const addListeners = (raw: boolean) => {\n    allEventTypes.forEach((type) => {\n      const fn = (listeners[type] ??= handleEvent);\n      element.addEventListener(type, fn, listenerOpts(type, raw));\n    });\n  };\n  const removeListeners = () => {\n    allEventTypes.forEach((type) => {\n      const fn = listeners[type];\n      if (fn) element.removeEventListener(type, fn);\n    });\n  };\n\n  /* attach for the first time */\n  addListeners(attachedWithRawTouch);\n  element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n\n  /* ---------- mode & handler change hooks --------------------------------------- */\n  const stopMode = capScope.onModeChange(() => {\n    /* cursor baseline update for global wrapper */\n    if (scope.type === 'global') {\n      const mode = capScope.getActiveInteractionMode();\n      element.style.cursor = mode?.scope === 'global' ? (mode.cursor ?? 'auto') : 'auto';\n    }\n\n    active = cap.getHandlersForScope(scope);\n\n    /* re-attach listeners if wantsRawTouch toggled */\n    const raw = wantsRawTouchNow();\n    if (raw !== attachedWithRawTouch) {\n      removeListeners();\n      addListeners(raw);\n      attachedWithRawTouch = raw;\n      element.style.touchAction = attachedWithRawTouch ? 'none' : '';\n    }\n  });\n\n  const stopHandler = cap.onHandlerChange(() => {\n    active = cap.getHandlersForScope(scope);\n  });\n\n  /* ---------- cursor sync -------------------------------------------------------- */\n  const initialMode = capScope.getActiveInteractionMode();\n  const initialCursor = capScope.getCurrentCursor();\n  element.style.cursor =\n    scope.type === 'global' && initialMode?.scope !== 'global' ? 'auto' : initialCursor;\n\n  const stopCursor = capScope.onCursorChange((c) => {\n    if (scope.type === 'global' && capScope.getActiveInteractionMode()?.scope !== 'global') return;\n    element.style.cursor = c;\n  });\n\n  /* ---------- point conversion --------------------------------------------------- */\n  const toPos = (e: { clientX: number; clientY: number }, host: HTMLElement): Position => {\n    if (convertEventToPoint) return convertEventToPoint(e as PointerEvent, host);\n    const r = host.getBoundingClientRect();\n    return { x: e.clientX - r.left, y: e.clientY - r.top };\n  };\n\n  /* ---------- central event handler --------------------------------------------- */\n  function handleEvent(evt: Event) {\n    if (cap.isPaused()) return;\n\n    // Get exclusion rules from capability and check in framework layer\n    const exclusionRules = cap.getExclusionRules();\n    if (evt.target && shouldExcludeElement(evt.target as Element, exclusionRules)) {\n      return; // Skip processing this event\n    }\n\n    const handlerKey = domEventMap[evt.type];\n    if (!handlerKey || !active?.[handlerKey]) return;\n\n    /* preventDefault only when mode really wants raw touch                        */\n    if (\n      isTouchEvent(evt) &&\n      attachedWithRawTouch &&\n      (evt.type === 'touchmove' || evt.type === 'touchcancel')\n    ) {\n      evt.preventDefault();\n    }\n\n    // ----- normalise ----------------------------------------------------------------\n    let pos!: Position;\n    let normEvt!: EmbedPdfPointerEvent & {\n      target: EventTarget | null;\n      currentTarget: EventTarget | null;\n    };\n\n    // Track propagation state for this event\n    let propagationStopped = false;\n\n    if (isTouchEvent(evt)) {\n      const tp =\n        evt.type === 'touchend' || evt.type === 'touchcancel'\n          ? evt.changedTouches[0]\n          : evt.touches[0];\n      if (!tp) return;\n\n      pos = toPos(tp, element);\n      normEvt = {\n        clientX: tp.clientX,\n        clientY: tp.clientY,\n        ctrlKey: evt.ctrlKey,\n        shiftKey: evt.shiftKey,\n        altKey: evt.altKey,\n        metaKey: evt.metaKey,\n        target: evt.target,\n        currentTarget: evt.currentTarget,\n        setPointerCapture: () => {},\n        releasePointerCapture: () => {},\n        stopImmediatePropagation: () => {\n          propagationStopped = true;\n        },\n        isImmediatePropagationStopped: () => propagationStopped,\n      };\n    } else {\n      const pe = evt as PointerEvent;\n      pos = toPos(pe, element);\n      normEvt = {\n        clientX: pe.clientX,\n        clientY: pe.clientY,\n        ctrlKey: pe.ctrlKey,\n        shiftKey: pe.shiftKey,\n        altKey: pe.altKey,\n        metaKey: pe.metaKey,\n        target: pe.target,\n        currentTarget: pe.currentTarget,\n        setPointerCapture: () => {\n          (pe.target as HTMLElement)?.setPointerCapture?.(pe.pointerId);\n        },\n        releasePointerCapture: () => {\n          (pe.target as HTMLElement)?.releasePointerCapture?.(pe.pointerId);\n        },\n        stopImmediatePropagation: () => {\n          propagationStopped = true;\n        },\n        isImmediatePropagationStopped: () => propagationStopped,\n      };\n    }\n\n    active[handlerKey]?.(pos, normEvt, capScope.getActiveMode());\n  }\n\n  /* ---------- teardown ----------------------------------------------------------- */\n  return () => {\n    removeListeners();\n    stopMode();\n    stopCursor();\n    stopHandler();\n  };\n}\n","import { ref, watch, computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n  initialDocumentState,\n  InteractionDocumentState,\n  InteractionManagerPlugin,\n  PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\n\nexport const useInteractionManagerPlugin = () =>\n  usePlugin<InteractionManagerPlugin>(InteractionManagerPlugin.id);\nexport const useInteractionManagerCapability = () =>\n  useCapability<InteractionManagerPlugin>(InteractionManagerPlugin.id);\n\nexport function useInteractionManager(documentId: MaybeRefOrGetter<string>) {\n  const { provides } = useInteractionManagerCapability();\n  const state = ref<InteractionDocumentState>(initialDocumentState);\n\n  watch(\n    [provides, () => toValue(documentId)],\n    ([providesValue, docId], _, onCleanup) => {\n      if (!providesValue) {\n        state.value = initialDocumentState;\n        return;\n      }\n\n      const scope = providesValue.forDocument(docId);\n\n      // Get initial state\n      state.value = scope.getState();\n\n      const unsubscribe = scope.onStateChange((newState) => {\n        state.value = newState;\n      });\n\n      onCleanup(unsubscribe);\n    },\n    { immediate: true },\n  );\n\n  return {\n    provides: computed(() => {\n      const docId = toValue(documentId);\n      return provides.value?.forDocument(docId) ?? null;\n    }),\n    state,\n  };\n}\n\nexport function useCursor(documentId: MaybeRefOrGetter<string>) {\n  const { provides } = useInteractionManagerCapability();\n\n  return {\n    setCursor: (token: string, cursor: string, prio = 0) => {\n      const providesValue = provides.value;\n      if (!providesValue) return;\n      const docId = toValue(documentId);\n      const scope = providesValue.forDocument(docId);\n      scope.setCursor(token, cursor, prio);\n    },\n    removeCursor: (token: string) => {\n      const providesValue = provides.value;\n      if (!providesValue) return;\n      const docId = toValue(documentId);\n      const scope = providesValue.forDocument(docId);\n      scope.removeCursor(token);\n    },\n  };\n}\n\ninterface UsePointerHandlersOptions {\n  modeId?: string | string[];\n  pageIndex?: MaybeRefOrGetter<number>;\n  documentId: MaybeRefOrGetter<string>;\n}\n\nexport function usePointerHandlers({ modeId, pageIndex, documentId }: UsePointerHandlersOptions) {\n  const { provides } = useInteractionManagerCapability();\n\n  return {\n    register: (\n      handlers: PointerEventHandlersWithLifecycle,\n      options?: {\n        modeId?: string | string[];\n        pageIndex?: number;\n        documentId?: MaybeRefOrGetter<string>;\n      },\n    ) => {\n      // Use provided options or fall back to hook-level options\n      const finalModeId = options?.modeId ?? modeId;\n      const finalPageIndex = toValue(options?.pageIndex ?? pageIndex);\n      const finalDocumentId = toValue(options?.documentId ?? documentId);\n      const providesValue = provides.value;\n\n      return finalModeId\n        ? providesValue?.registerHandlers({\n            modeId: finalModeId,\n            handlers,\n            pageIndex: finalPageIndex,\n            documentId: finalDocumentId,\n          })\n        : providesValue?.registerAlways({\n            scope:\n              finalPageIndex !== undefined\n                ? { type: 'page', documentId: finalDocumentId, pageIndex: finalPageIndex }\n                : { type: 'global', documentId: finalDocumentId },\n            handlers,\n          });\n    },\n  };\n}\n\nexport function useIsPageExclusive(documentId: MaybeRefOrGetter<string>) {\n  const { provides: cap } = useInteractionManagerCapability();\n  const isPageExclusive = ref<boolean>(false);\n\n  watch(\n    [cap, () => toValue(documentId)],\n    ([capValue, docId], _, onCleanup) => {\n      if (!capValue) {\n        isPageExclusive.value = false;\n        return;\n      }\n\n      const scope = capValue.forDocument(docId);\n\n      // Get initial state\n      const m = scope.getActiveInteractionMode();\n      isPageExclusive.value = m?.scope === 'page' && !!m.exclusive;\n\n      const unsubscribe = scope.onModeChange(() => {\n        const mode = scope.getActiveInteractionMode();\n        isPageExclusive.value = mode?.scope === 'page' && !!mode?.exclusive;\n      });\n\n      onCleanup(unsubscribe);\n    },\n    { immediate: true },\n  );\n\n  return isPageExclusive;\n}\n","<script setup lang=\"ts\">\nimport { ref, watchEffect } from 'vue';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface Props {\n  documentId: string;\n}\n\nconst props = defineProps<Props>();\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\n\n// watchEffect automatically handles setup and teardown when capability or element is ready\nwatchEffect((onCleanup) => {\n  if (cap.value && divRef.value) {\n    const cleanup = createPointerProvider(\n      cap.value,\n      { type: 'global', documentId: props.documentId },\n      divRef.value,\n    );\n    onCleanup(cleanup);\n  }\n});\n</script>\n\n<template>\n  <div\n    ref=\"divRef\"\n    :style=\"{\n      width: '100%',\n      height: '100%',\n    }\"\n  >\n    <slot />\n  </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, toValue } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Position, restorePosition, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../../shared/utils';\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps {\n  documentId: string;\n  pageIndex: number;\n  rotation?: number;\n  scale?: number;\n  convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nconst props = defineProps<PagePointerProviderProps>();\n\nconst divRef = ref<HTMLDivElement | null>(null);\nconst { provides: cap } = useInteractionManagerCapability();\nconst isPageExclusive = useIsPageExclusive(() => props.documentId);\nconst documentState = useDocumentState(() => props.documentId);\n// Get page dimensions and transformations from document state\n// Calculate inline - this is cheap and memoization isn't necessary\nconst page = computed(() => documentState.value?.document?.pages?.[props.pageIndex]);\nconst naturalPageSize = computed(() => page.value?.size ?? { width: 0, height: 0 });\n// If override is provided, use it directly (consistent with other layer components)\n// Otherwise, combine page intrinsic rotation with document rotation\nconst pageRotation = computed(() => page.value?.rotation ?? 0);\nconst rotation = computed(() => {\n  if (props.rotation !== undefined) return props.rotation;\n  const docRotation = documentState.value?.rotation ?? 0;\n  return (pageRotation.value + docRotation) % 4;\n});\nconst scale = computed(() => props.scale ?? documentState.value?.scale ?? 1);\nconst displaySize = computed(() => transformSize(naturalPageSize.value, 0, scale.value));\n\n// Simplified conversion function\nconst defaultConvertEventToPoint = computed(() => {\n  return (event: PointerEvent, element: HTMLElement): Position => {\n    const rect = element.getBoundingClientRect();\n    const displayPoint = {\n      x: event.clientX - rect.left,\n      y: event.clientY - rect.top,\n    };\n\n    // Get the rotated natural size (width/height may be swapped, but not scaled)\n    const rotatedNaturalSize = transformSize(\n      {\n        width: displaySize.value.width,\n        height: displaySize.value.height,\n      },\n      rotation.value,\n      1,\n    );\n\n    return restorePosition(rotatedNaturalSize, displayPoint, rotation.value, scale.value);\n  };\n});\n\nwatch(\n  [\n    cap,\n    () => toValue(props.documentId),\n    () => props.pageIndex,\n    () => props.convertEventToPoint,\n    defaultConvertEventToPoint,\n  ],\n  ([capValue, docId, pageIdx, customConvert, defaultConvert], _, onCleanup) => {\n    if (!capValue || !divRef.value) return;\n\n    const cleanup = createPointerProvider(\n      capValue,\n      { type: 'page', documentId: docId, pageIndex: pageIdx },\n      divRef.value,\n      customConvert || defaultConvert,\n    );\n\n    onCleanup(cleanup);\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <div\n    ref=\"divRef\"\n    :style=\"{\n      position: 'relative',\n      width: displaySize.width + 'px',\n      height: displaySize.height + 'px',\n    }\"\n    v-bind=\"$attrs\"\n  >\n    <slot />\n    <div\n      v-if=\"isPageExclusive\"\n      :style=\"{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }\"\n    />\n  </div>\n</template>\n"],"names":["domEventMap","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick","touchstart","touchend","touchmove","touchcancel","pointerEventTypes","allEventTypes","PointerEvent","isTouchEvent","evt","TouchEvent","createPointerProvider","cap","scope","element","convertEventToPoint","capScope","forDocument","documentId","active","getHandlersForScope","wantsRawTouchNow","_a","getActiveInteractionMode","wantsRawTouch","listeners","attachedWithRawTouch","addListeners","raw","forEach","type","fn","handleEvent","addEventListener","startsWith","passive","removeListeners","removeEventListener","style","touchAction","stopMode","onModeChange","mode","cursor","stopHandler","onHandlerChange","initialMode","initialCursor","getCurrentCursor","stopCursor","onCursorChange","c","toPos","e","host","r","getBoundingClientRect","x","clientX","left","y","clientY","top","isPaused","exclusionRules","getExclusionRules","target","rules","current","classes","length","className","_b","classList","contains","_c","dataAttributes","attr","hasAttribute","parentElement","shouldExcludeElement","handlerKey","pos","normEvt","preventDefault","propagationStopped","tp","changedTouches","touches","ctrlKey","shiftKey","altKey","metaKey","currentTarget","setPointerCapture","releasePointerCapture","stopImmediatePropagation","isImmediatePropagationStopped","pe","call","pointerId","getActiveMode","useInteractionManagerCapability","useCapability","InteractionManagerPlugin","id","useIsPageExclusive","provides","isPageExclusive","ref","watch","toValue","capValue","docId","_","onCleanup","value","m","exclusive","immediate","props","__props","divRef","watchEffect","_createElementBlock","_renderSlot","_ctx","$slots","documentState","useDocumentState","page","computed","document","pages","pageIndex","naturalPageSize","size","width","height","pageRotation","rotation","docRotation","scale","displaySize","transformSize","defaultConvertEventToPoint","event","rect","displayPoint","rotatedNaturalSize","restorePosition","pageIdx","customConvert","defaultConvert","_openBlock","_mergeProps","$attrs","_unref","_hoisted_1","setCursor","token","prio","providesValue","removeCursor","state","initialDocumentState","getState","onStateChange","newState","usePlugin","modeId","register","handlers","options","finalModeId","finalPageIndex","finalDocumentId","registerHandlers","registerAlways"],"mappings":"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"}