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