@embedpdf/plugin-interaction-manager 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"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(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\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(documentId: 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(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\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 // Use provided options or fall back to hook-level options\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(documentId: 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(documentId);\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 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 };\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 };\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 const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\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","documentId","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","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","tp","changedTouches","touches","ctrlKey","shiftKey","altKey","metaKey","currentTarget","setPointerCapture","releasePointerCapture","pe","call","pointerId","getActiveMode","restProps","rest_props","$$props","ref","interactionManagerCapability","get","div","root","$$value","documentState","useDocumentState","page","document","pages","pageIndex","naturalPageSize","derived","size","width","height","rotation","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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"}
1
+ {"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(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\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(documentId: 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(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\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 // Use provided options or fall back to hook-level options\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(documentId: 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(documentId);\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 const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\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","documentId","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","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","$$props","ref","interactionManagerCapability","get","div","root","$$value","documentState","useDocumentState","page","document","pages","pageIndex","naturalPageSize","derived","size","width","height","rotation","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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"}
@@ -230,6 +230,7 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
230
230
  }
231
231
  let pos;
232
232
  let normEvt;
233
+ let propagationStopped = false;
233
234
  if (isTouchEvent(evt)) {
234
235
  const tp = evt.type === "touchend" || evt.type === "touchcancel" ? evt.changedTouches[0] : evt.touches[0];
235
236
  if (!tp) return;
@@ -246,7 +247,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
246
247
  setPointerCapture: () => {
247
248
  },
248
249
  releasePointerCapture: () => {
249
- }
250
+ },
251
+ stopImmediatePropagation: () => {
252
+ propagationStopped = true;
253
+ },
254
+ isImmediatePropagationStopped: () => propagationStopped
250
255
  };
251
256
  } else {
252
257
  const pe = evt;
@@ -267,7 +272,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
267
272
  releasePointerCapture: () => {
268
273
  var _a2, _b;
269
274
  (_b = (_a2 = pe.target) == null ? void 0 : _a2.releasePointerCapture) == null ? void 0 : _b.call(_a2, pe.pointerId);
270
- }
275
+ },
276
+ stopImmediatePropagation: () => {
277
+ propagationStopped = true;
278
+ },
279
+ isImmediatePropagationStopped: () => propagationStopped
271
280
  };
272
281
  }
273
282
  (_a = active[handlerKey]) == null ? void 0 : _a.call(active, pos, normEvt, capScope.getActiveMode());
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","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(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\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(documentId: 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(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\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 // Use provided options or fall back to hook-level options\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(documentId: 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(documentId);\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 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 };\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 };\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 const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\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":["_a","root"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","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(documentId: string) {\n const capability = useInteractionManagerCapability();\n\n let state = $state<InteractionDocumentState>(initialDocumentState);\n\n // Derived scoped capability for the specific document\n const scopedProvides = $derived(capability.provides?.forDocument(documentId) ?? null);\n\n $effect(() => {\n if (!capability.provides) {\n state = initialDocumentState;\n return;\n }\n\n const scope = capability.provides.forDocument(documentId);\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(documentId: 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(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!capability.provides) return;\n const scope = capability.provides.forDocument(documentId);\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 // Use provided options or fall back to hook-level options\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(documentId: 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(documentId);\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 const rotation = $derived(rotationOverride ?? documentState.current?.rotation ?? 0);\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":["_a","root"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("@embedpdf/core/vue"),o=require("@embedpdf/plugin-interaction-manager"),n=require("@embedpdf/models"),r={pointerdown:"onPointerDown",pointerup:"onPointerUp",pointermove:"onPointerMove",pointerenter:"onPointerEnter",pointerleave:"onPointerLeave",pointercancel:"onPointerCancel",mousedown:"onMouseDown",mouseup:"onMouseUp",mousemove:"onMouseMove",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mousecancel:"onMouseCancel",click:"onClick",dblclick:"onDoubleClick",touchstart:"onPointerDown",touchend:"onPointerUp",touchmove:"onPointerMove",touchcancel:"onPointerCancel"},u=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],l="undefined"!=typeof PointerEvent?u:[...u,"touchstart","touchend","touchmove","touchcancel"];function i(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function a(e,t,o,n){const u=e.forDocument(t.documentId);let a=e.getHandlersForScope(t);const c=()=>{var e;return!1!==(null==(e=u.getActiveInteractionMode())?void 0:e.wantsRawTouch)},s={};let d=c();const v=e=>{l.forEach(t=>{const n=s[t]??(s[t]=P);var r;o.addEventListener(t,n,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},p=()=>{l.forEach(e=>{const t=s[e];t&&o.removeEventListener(e,t)})};v(d),o.style.touchAction=d?"none":"";const g=u.onModeChange(()=>{if("global"===t.type){const e=u.getActiveInteractionMode();o.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}a=e.getHandlersForScope(t);const n=c();n!==d&&(p(),v(n),d=n,o.style.touchAction=d?"none":"")}),m=e.onHandlerChange(()=>{a=e.getHandlersForScope(t)}),f=u.getActiveInteractionMode(),h=u.getCurrentCursor();o.style.cursor="global"===t.type&&"global"!==(null==f?void 0:f.scope)?"auto":h;const y=u.onCursorChange(e=>{var n;"global"===t.type&&"global"!==(null==(n=u.getActiveInteractionMode())?void 0:n.scope)||(o.style.cursor=e)}),I=(e,t)=>{if(n)return n(e,t);const o=t.getBoundingClientRect();return{x:e.clientX-o.left,y:e.clientY-o.top}};function P(t){var n;if(e.isPaused())return;const l=e.getExclusionRules();if(t.target&&function(e,t){var o,n,r;if(!e)return!1;let u=e;for(;u;){if(null==(o=t.classes)?void 0:o.length)for(const e of t.classes)if(null==(n=u.classList)?void 0:n.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(u.hasAttribute(e))return!0;u=u.parentElement}return!1}(t.target,l))return;const c=r[t.type];if(!c||!(null==a?void 0:a[c]))return;let s,v;if(i(t)&&d&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault(),i(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;s=I(e,o),v={clientX:e.clientX,clientY:e.clientY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,target:t.target,currentTarget:t.currentTarget,setPointerCapture:()=>{},releasePointerCapture:()=>{}}}else{const e=t;s=I(e,o),v={clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,target:e.target,currentTarget:e.currentTarget,setPointerCapture:()=>{var t,o;null==(o=null==(t=e.target)?void 0:t.setPointerCapture)||o.call(t,e.pointerId)},releasePointerCapture:()=>{var t,o;null==(o=null==(t=e.target)?void 0:t.releasePointerCapture)||o.call(t,e.pointerId)}}}null==(n=a[c])||n.call(a,s,v,u.getActiveMode())}return()=>{p(),g(),y(),m()}}const c=()=>t.useCapability(o.InteractionManagerPlugin.id);function s(t){const{provides:o}=c(),n=e.ref(!1);return e.watch([o,()=>e.toValue(t)],([e,t],o,r)=>{if(!e)return void(n.value=!1);const u=e.forDocument(t),l=u.getActiveInteractionMode();n.value="page"===(null==l?void 0:l.scope)&&!!l.exclusive;r(u.onModeChange(()=>{const e=u.getActiveInteractionMode();n.value="page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive)}))},{immediate:!0}),n}const d=e.defineComponent({__name:"global-pointer-provider",props:{documentId:{}},setup(t){const o=t,n=e.ref(null),{provides:r}=c();return e.watchEffect(e=>{if(r.value&&n.value){e(a(r.value,{type:"global",documentId:o.documentId},n.value))}}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"divRef",ref:n,style:{width:"100%",height:"100%"}},[e.renderSlot(t.$slots,"default")],512))}}),v={key:0,style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}},p=e.defineComponent({__name:"page-pointer-provider",props:{documentId:{},pageIndex:{},rotation:{},scale:{},convertEventToPoint:{type:Function}},setup(o){const r=o,u=e.ref(null),{provides:l}=c(),i=s(()=>r.documentId),d=t.useDocumentState(()=>r.documentId),p=e.computed(()=>{var e,t,o;return null==(o=null==(t=null==(e=d.value)?void 0:e.document)?void 0:t.pages)?void 0:o[r.pageIndex]}),g=e.computed(()=>{var e;return(null==(e=p.value)?void 0:e.size)??{width:0,height:0}}),m=e.computed(()=>{var e;return r.rotation??(null==(e=d.value)?void 0:e.rotation)??0}),f=e.computed(()=>{var e;return r.scale??(null==(e=d.value)?void 0:e.scale)??1}),h=e.computed(()=>n.transformSize(g.value,0,f.value)),y=e.computed(()=>(e,t)=>{const o=t.getBoundingClientRect(),r={x:e.clientX-o.left,y:e.clientY-o.top},u=n.transformSize({width:h.value.width,height:h.value.height},m.value,1);return n.restorePosition(u,r,m.value,f.value)});return e.watch([l,()=>e.toValue(r.documentId),()=>r.pageIndex,()=>r.convertEventToPoint,y],([e,t,o,n,r],l,i)=>{if(!e||!u.value)return;i(a(e,{type:"page",documentId:t,pageIndex:o},u.value,n||r))},{immediate:!0}),(t,o)=>(e.openBlock(),e.createElementBlock("div",e.mergeProps({ref_key:"divRef",ref:u,style:{position:"relative",width:h.value.width+"px",height:h.value.height+"px"}},t.$attrs),[e.renderSlot(t.$slots,"default"),e.unref(i)?(e.openBlock(),e.createElementBlock("div",v)):e.createCommentVNode("",!0)],16))}});exports.GlobalPointerProvider=d,exports.PagePointerProvider=p,exports.useCursor=function(t){const{provides:o}=c();return{setCursor:(n,r,u=0)=>{const l=o.value;if(!l)return;const i=e.toValue(t);l.forDocument(i).setCursor(n,r,u)},removeCursor:n=>{const r=o.value;if(!r)return;const u=e.toValue(t);r.forDocument(u).removeCursor(n)}}},exports.useInteractionManager=function(t){const{provides:n}=c(),r=e.ref(o.initialDocumentState);return e.watch([n,()=>e.toValue(t)],([e,t],n,u)=>{if(!e)return void(r.value=o.initialDocumentState);const l=e.forDocument(t);r.value=l.getState();u(l.onStateChange(e=>{r.value=e}))},{immediate:!0}),{provides:e.computed(()=>{var o;const r=e.toValue(t);return(null==(o=n.value)?void 0:o.forDocument(r))??null}),state:r}},exports.useInteractionManagerCapability=c,exports.useInteractionManagerPlugin=()=>t.usePlugin(o.InteractionManagerPlugin.id),exports.useIsPageExclusive=s,exports.usePointerHandlers=function({modeId:t,pageIndex:o,documentId:n}){const{provides:r}=c();return{register:(u,l)=>{const i=(null==l?void 0:l.modeId)??t,a=e.toValue((null==l?void 0:l.pageIndex)??o),c=e.toValue((null==l?void 0:l.documentId)??n),s=r.value;return i?null==s?void 0:s.registerHandlers({modeId:i,handlers:u,pageIndex:a,documentId:c}):null==s?void 0:s.registerAlways({scope:void 0!==a?{type:"page",documentId:c,pageIndex:a}:{type:"global",documentId:c},handlers:u})}}},Object.keys(o).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>o[e]})});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("@embedpdf/core/vue"),o=require("@embedpdf/plugin-interaction-manager"),n=require("@embedpdf/models"),r={pointerdown:"onPointerDown",pointerup:"onPointerUp",pointermove:"onPointerMove",pointerenter:"onPointerEnter",pointerleave:"onPointerLeave",pointercancel:"onPointerCancel",mousedown:"onMouseDown",mouseup:"onMouseUp",mousemove:"onMouseMove",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave",mousecancel:"onMouseCancel",click:"onClick",dblclick:"onDoubleClick",touchstart:"onPointerDown",touchend:"onPointerUp",touchmove:"onPointerMove",touchcancel:"onPointerCancel"},u=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],l="undefined"!=typeof PointerEvent?u:[...u,"touchstart","touchend","touchmove","touchcancel"];function i(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function a(e,t,o,n){const u=e.forDocument(t.documentId);let a=e.getHandlersForScope(t);const c=()=>{var e;return!1!==(null==(e=u.getActiveInteractionMode())?void 0:e.wantsRawTouch)},s={};let d=c();const p=e=>{l.forEach(t=>{const n=s[t]??(s[t]=P);var r;o.addEventListener(t,n,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{l.forEach(e=>{const t=s[e];t&&o.removeEventListener(e,t)})};p(d),o.style.touchAction=d?"none":"";const m=u.onModeChange(()=>{if("global"===t.type){const e=u.getActiveInteractionMode();o.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}a=e.getHandlersForScope(t);const n=c();n!==d&&(v(),p(n),d=n,o.style.touchAction=d?"none":"")}),g=e.onHandlerChange(()=>{a=e.getHandlersForScope(t)}),f=u.getActiveInteractionMode(),h=u.getCurrentCursor();o.style.cursor="global"===t.type&&"global"!==(null==f?void 0:f.scope)?"auto":h;const y=u.onCursorChange(e=>{var n;"global"===t.type&&"global"!==(null==(n=u.getActiveInteractionMode())?void 0:n.scope)||(o.style.cursor=e)}),I=(e,t)=>{if(n)return n(e,t);const o=t.getBoundingClientRect();return{x:e.clientX-o.left,y:e.clientY-o.top}};function P(t){var n;if(e.isPaused())return;const l=e.getExclusionRules();if(t.target&&function(e,t){var o,n,r;if(!e)return!1;let u=e;for(;u;){if(null==(o=t.classes)?void 0:o.length)for(const e of t.classes)if(null==(n=u.classList)?void 0:n.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(u.hasAttribute(e))return!0;u=u.parentElement}return!1}(t.target,l))return;const c=r[t.type];if(!c||!(null==a?void 0:a[c]))return;let s,p;i(t)&&d&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault();let v=!1;if(i(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;s=I(e,o),p={clientX:e.clientX,clientY:e.clientY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,target:t.target,currentTarget:t.currentTarget,setPointerCapture:()=>{},releasePointerCapture:()=>{},stopImmediatePropagation:()=>{v=!0},isImmediatePropagationStopped:()=>v}}else{const e=t;s=I(e,o),p={clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,target:e.target,currentTarget:e.currentTarget,setPointerCapture:()=>{var t,o;null==(o=null==(t=e.target)?void 0:t.setPointerCapture)||o.call(t,e.pointerId)},releasePointerCapture:()=>{var t,o;null==(o=null==(t=e.target)?void 0:t.releasePointerCapture)||o.call(t,e.pointerId)},stopImmediatePropagation:()=>{v=!0},isImmediatePropagationStopped:()=>v}}null==(n=a[c])||n.call(a,s,p,u.getActiveMode())}return()=>{v(),m(),y(),g()}}const c=()=>t.useCapability(o.InteractionManagerPlugin.id);function s(t){const{provides:o}=c(),n=e.ref(!1);return e.watch([o,()=>e.toValue(t)],([e,t],o,r)=>{if(!e)return void(n.value=!1);const u=e.forDocument(t),l=u.getActiveInteractionMode();n.value="page"===(null==l?void 0:l.scope)&&!!l.exclusive;r(u.onModeChange(()=>{const e=u.getActiveInteractionMode();n.value="page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive)}))},{immediate:!0}),n}const d=e.defineComponent({__name:"global-pointer-provider",props:{documentId:{}},setup(t){const o=t,n=e.ref(null),{provides:r}=c();return e.watchEffect(e=>{if(r.value&&n.value){e(a(r.value,{type:"global",documentId:o.documentId},n.value))}}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"divRef",ref:n,style:{width:"100%",height:"100%"}},[e.renderSlot(t.$slots,"default")],512))}}),p={key:0,style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}},v=e.defineComponent({__name:"page-pointer-provider",props:{documentId:{},pageIndex:{},rotation:{},scale:{},convertEventToPoint:{type:Function}},setup(o){const r=o,u=e.ref(null),{provides:l}=c(),i=s(()=>r.documentId),d=t.useDocumentState(()=>r.documentId),v=e.computed(()=>{var e,t,o;return null==(o=null==(t=null==(e=d.value)?void 0:e.document)?void 0:t.pages)?void 0:o[r.pageIndex]}),m=e.computed(()=>{var e;return(null==(e=v.value)?void 0:e.size)??{width:0,height:0}}),g=e.computed(()=>{var e;return r.rotation??(null==(e=d.value)?void 0:e.rotation)??0}),f=e.computed(()=>{var e;return r.scale??(null==(e=d.value)?void 0:e.scale)??1}),h=e.computed(()=>n.transformSize(m.value,0,f.value)),y=e.computed(()=>(e,t)=>{const o=t.getBoundingClientRect(),r={x:e.clientX-o.left,y:e.clientY-o.top},u=n.transformSize({width:h.value.width,height:h.value.height},g.value,1);return n.restorePosition(u,r,g.value,f.value)});return e.watch([l,()=>e.toValue(r.documentId),()=>r.pageIndex,()=>r.convertEventToPoint,y],([e,t,o,n,r],l,i)=>{if(!e||!u.value)return;i(a(e,{type:"page",documentId:t,pageIndex:o},u.value,n||r))},{immediate:!0}),(t,o)=>(e.openBlock(),e.createElementBlock("div",e.mergeProps({ref_key:"divRef",ref:u,style:{position:"relative",width:h.value.width+"px",height:h.value.height+"px"}},t.$attrs),[e.renderSlot(t.$slots,"default"),e.unref(i)?(e.openBlock(),e.createElementBlock("div",p)):e.createCommentVNode("",!0)],16))}});exports.GlobalPointerProvider=d,exports.PagePointerProvider=v,exports.useCursor=function(t){const{provides:o}=c();return{setCursor:(n,r,u=0)=>{const l=o.value;if(!l)return;const i=e.toValue(t);l.forDocument(i).setCursor(n,r,u)},removeCursor:n=>{const r=o.value;if(!r)return;const u=e.toValue(t);r.forDocument(u).removeCursor(n)}}},exports.useInteractionManager=function(t){const{provides:n}=c(),r=e.ref(o.initialDocumentState);return e.watch([n,()=>e.toValue(t)],([e,t],n,u)=>{if(!e)return void(r.value=o.initialDocumentState);const l=e.forDocument(t);r.value=l.getState();u(l.onStateChange(e=>{r.value=e}))},{immediate:!0}),{provides:e.computed(()=>{var o;const r=e.toValue(t);return(null==(o=n.value)?void 0:o.forDocument(r))??null}),state:r}},exports.useInteractionManagerCapability=c,exports.useInteractionManagerPlugin=()=>t.usePlugin(o.InteractionManagerPlugin.id),exports.useIsPageExclusive=s,exports.usePointerHandlers=function({modeId:t,pageIndex:o,documentId:n}){const{provides:r}=c();return{register:(u,l)=>{const i=(null==l?void 0:l.modeId)??t,a=e.toValue((null==l?void 0:l.pageIndex)??o),c=e.toValue((null==l?void 0:l.documentId)??n),s=r.value;return i?null==s?void 0:s.registerHandlers({modeId:i,handlers:u,pageIndex:a,documentId:c}):null==s?void 0:s.registerAlways({scope:void 0!==a?{type:"page",documentId:c,pageIndex:a}:{type:"global",documentId:c},handlers:u})}}},Object.keys(o).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>o[e]})});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"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 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 };\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 };\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 });\nconst rotation = computed(() => props.rotation ?? documentState.value?.rotation ?? 0);\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","tp","changedTouches","touches","ctrlKey","shiftKey","altKey","metaKey","currentTarget","setPointerCapture","releasePointerCapture","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","rotation","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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"}
1
+ {"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 });\nconst rotation = computed(() => props.rotation ?? documentState.value?.rotation ?? 0);\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","rotation","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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"}
package/dist/vue/index.js CHANGED
@@ -139,6 +139,7 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
139
139
  }
140
140
  let pos;
141
141
  let normEvt;
142
+ let propagationStopped = false;
142
143
  if (isTouchEvent(evt)) {
143
144
  const tp = evt.type === "touchend" || evt.type === "touchcancel" ? evt.changedTouches[0] : evt.touches[0];
144
145
  if (!tp) return;
@@ -155,7 +156,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
155
156
  setPointerCapture: () => {
156
157
  },
157
158
  releasePointerCapture: () => {
158
- }
159
+ },
160
+ stopImmediatePropagation: () => {
161
+ propagationStopped = true;
162
+ },
163
+ isImmediatePropagationStopped: () => propagationStopped
159
164
  };
160
165
  } else {
161
166
  const pe = evt;
@@ -176,7 +181,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
176
181
  releasePointerCapture: () => {
177
182
  var _a2, _b;
178
183
  (_b = (_a2 = pe.target) == null ? void 0 : _a2.releasePointerCapture) == null ? void 0 : _b.call(_a2, pe.pointerId);
179
- }
184
+ },
185
+ stopImmediatePropagation: () => {
186
+ propagationStopped = true;
187
+ },
188
+ isImmediatePropagationStopped: () => propagationStopped
180
189
  };
181
190
  }
182
191
  (_a = active[handlerKey]) == null ? void 0 : _a.call(active, pos, normEvt, capScope.getActiveMode());