@embedpdf/plugin-interaction-manager 2.2.0 → 2.3.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.js","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["state","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["state","_a"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core/react"),t=require("@embedpdf/plugin-interaction-manager"),n=require("react"),o=require("react/jsx-runtime"),r=require("@embedpdf/models"),i=()=>e.useCapability(t.InteractionManagerPlugin.id);function u(e){const{provides:t}=i(),[o,r]=n.useState(()=>{if(!t)return!1;const n=t.forDocument(e).getActiveInteractionMode();return"page"===(null==n?void 0:n.scope)&&!!n.exclusive});return n.useEffect(()=>{if(!t)return;const n=t.forDocument(e);return n.onModeChange(()=>{const e=n.getActiveInteractionMode();r("page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive))})},[t,e]),o}const c={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"},l=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],s="undefined"!=typeof PointerEvent?l:[...l,"touchstart","touchend","touchmove","touchcancel"];function a(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function d(e,t,n,o){const r=e.forDocument(t.documentId);let i=e.getHandlersForScope(t);const u=()=>{var e;return!1!==(null==(e=r.getActiveInteractionMode())?void 0:e.wantsRawTouch)},l={};let d=u();const p=e=>{s.forEach(t=>{const o=l[t]??(l[t]=P);var r;n.addEventListener(t,o,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{s.forEach(e=>{const t=l[e];t&&n.removeEventListener(e,t)})};p(d),n.style.touchAction=d?"none":"";const g=r.onModeChange(()=>{if("global"===t.type){const e=r.getActiveInteractionMode();n.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}i=e.getHandlersForScope(t);const o=u();o!==d&&(v(),p(o),d=o,n.style.touchAction=d?"none":"")}),f=e.onHandlerChange(()=>{i=e.getHandlersForScope(t)}),h=r.getActiveInteractionMode(),m=r.getCurrentCursor();n.style.cursor="global"===t.type&&"global"!==(null==h?void 0:h.scope)?"auto":m;const y=r.onCursorChange(e=>{var o;"global"===t.type&&"global"!==(null==(o=r.getActiveInteractionMode())?void 0:o.scope)||(n.style.cursor=e)}),I=(e,t)=>{if(o)return o(e,t);const n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}};function P(t){var o;if(e.isPaused())return;const u=e.getExclusionRules();if(t.target&&function(e,t){var n,o,r;if(!e)return!1;let i=e;for(;i;){if(null==(n=t.classes)?void 0:n.length)for(const e of t.classes)if(null==(o=i.classList)?void 0:o.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,u))return;const l=c[t.type];if(!l||!(null==i?void 0:i[l]))return;let s,p;if(a(t)&&d&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault(),a(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;s=I(e,n),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:()=>{}}}else{const e=t;s=I(e,n),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,n;null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},releasePointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId)}}}null==(o=i[l])||o.call(i,s,p,r.getActiveMode())}return()=>{v(),g(),y(),f()}}exports.GlobalPointerProvider=({children:e,documentId:t,style:r,...u})=>{const c=n.useRef(null),{provides:l}=i();return n.useEffect(()=>{if(l&&c.current)return d(l,{type:"global",documentId:t},c.current)},[l,t]),o.jsx("div",{ref:c,style:{width:"100%",height:"100%",...r},...u,children:e})},exports.PagePointerProvider=({documentId:t,pageIndex:c,children:l,rotation:s,scale:a,convertEventToPoint:p,style:v,...g})=>{var f,h;const m=n.useRef(null),{provides:y}=i(),I=u(t),P=e.useDocumentState(t),b=null==(h=null==(f=null==P?void 0:P.document)?void 0:f.pages)?void 0:h[c],C=(null==b?void 0:b.size)??{width:0,height:0},x=s??(null==P?void 0:P.rotation)??0,M=a??(null==P?void 0:P.scale)??1,E=r.transformSize(C,0,M),w=n.useCallback((e,t)=>{const n=t.getBoundingClientRect(),o={x:e.clientX-n.left,y:e.clientY-n.top},i=r.transformSize({width:E.width,height:E.height},x,1);return r.restorePosition(i,o,x,M)},[C,x,M]);return n.useEffect(()=>{if(y&&m.current)return d(y,{type:"page",documentId:t,pageIndex:c},m.current,p||w)},[y,t,c,p,w]),o.jsxs("div",{ref:m,style:{position:"relative",width:E.width,height:E.height,...v},...g,children:[l,I&&o.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}})]})},exports.useCursor=function(e){const{provides:t}=i();return{setCursor:(n,o,r=0)=>{if(!t)return;t.forDocument(e).setCursor(n,o,r)},removeCursor:n=>{if(!t)return;t.forDocument(e).removeCursor(n)}}},exports.useInteractionManager=function(e){const{provides:o}=i(),[r,u]=n.useState(t.initialDocumentState);return n.useEffect(()=>{if(!o)return;return o.forDocument(e).onStateChange(e=>{u(e)})},[o]),{provides:(null==o?void 0:o.forDocument(e))??null,state:r}},exports.useInteractionManagerCapability=i,exports.useInteractionManagerPlugin=()=>e.usePlugin(t.InteractionManagerPlugin.id),exports.useIsPageExclusive=u,exports.usePointerHandlers=function({modeId:e,pageIndex:t,documentId:n}){const{provides:o}=i();return{register:(r,i)=>{const u=(null==i?void 0:i.modeId)??e,c=(null==i?void 0:i.pageIndex)??t,l=(null==i?void 0:i.documentId)??n;return u?null==o?void 0:o.registerHandlers({modeId:u,handlers:r,pageIndex:c,documentId:l}):null==o?void 0:o.registerAlways({scope:void 0!==c?{type:"page",documentId:l,pageIndex:c}:{type:"global",documentId:l},handlers:r})}}},Object.keys(t).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core/react"),t=require("@embedpdf/plugin-interaction-manager"),o=require("react"),n=require("react/jsx-runtime"),r=require("@embedpdf/models"),i=()=>e.useCapability(t.InteractionManagerPlugin.id);function u(e){const{provides:t}=i(),[n,r]=o.useState(()=>{if(!t)return!1;const o=t.forDocument(e).getActiveInteractionMode();return"page"===(null==o?void 0:o.scope)&&!!o.exclusive});return o.useEffect(()=>{if(!t)return;const o=t.forDocument(e);return o.onModeChange(()=>{const e=o.getActiveInteractionMode();r("page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive))})},[t,e]),n}const c={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"},l=["pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointercancel","mousedown","mouseup","mousemove","mouseenter","mouseleave","mousecancel","click","dblclick"],s="undefined"!=typeof PointerEvent?l:[...l,"touchstart","touchend","touchmove","touchcancel"];function a(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function d(e,t,o,n){const r=e.forDocument(t.documentId);let i=e.getHandlersForScope(t);const u=()=>{var e;return!1!==(null==(e=r.getActiveInteractionMode())?void 0:e.wantsRawTouch)},l={};let d=u();const p=e=>{s.forEach(t=>{const n=l[t]??(l[t]=P);var r;o.addEventListener(t,n,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{s.forEach(e=>{const t=l[e];t&&o.removeEventListener(e,t)})};p(d),o.style.touchAction=d?"none":"";const g=r.onModeChange(()=>{if("global"===t.type){const e=r.getActiveInteractionMode();o.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}i=e.getHandlersForScope(t);const n=u();n!==d&&(v(),p(n),d=n,o.style.touchAction=d?"none":"")}),f=e.onHandlerChange(()=>{i=e.getHandlersForScope(t)}),m=r.getActiveInteractionMode(),h=r.getCurrentCursor();o.style.cursor="global"===t.type&&"global"!==(null==m?void 0:m.scope)?"auto":h;const y=r.onCursorChange(e=>{var n;"global"===t.type&&"global"!==(null==(n=r.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 u=e.getExclusionRules();if(t.target&&function(e,t){var o,n,r;if(!e)return!1;let i=e;for(;i;){if(null==(o=t.classes)?void 0:o.length)for(const e of t.classes)if(null==(n=i.classList)?void 0:n.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,u))return;const l=c[t.type];if(!l||!(null==i?void 0:i[l]))return;let s,p;a(t)&&d&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault();let v=!1;if(a(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=i[l])||n.call(i,s,p,r.getActiveMode())}return()=>{v(),g(),y(),f()}}exports.GlobalPointerProvider=({children:e,documentId:t,style:r,...u})=>{const c=o.useRef(null),{provides:l}=i();return o.useEffect(()=>{if(l&&c.current)return d(l,{type:"global",documentId:t},c.current)},[l,t]),n.jsx("div",{ref:c,style:{width:"100%",height:"100%",...r},...u,children:e})},exports.PagePointerProvider=({documentId:t,pageIndex:c,children:l,rotation:s,scale:a,convertEventToPoint:p,style:v,...g})=>{var f,m;const h=o.useRef(null),{provides:y}=i(),I=u(t),P=e.useDocumentState(t),b=null==(m=null==(f=null==P?void 0:P.document)?void 0:f.pages)?void 0:m[c],C=(null==b?void 0:b.size)??{width:0,height:0},x=s??(null==P?void 0:P.rotation)??0,M=a??(null==P?void 0:P.scale)??1,E=r.transformSize(C,0,M),w=o.useCallback((e,t)=>{const o=t.getBoundingClientRect(),n={x:e.clientX-o.left,y:e.clientY-o.top},i=r.transformSize({width:E.width,height:E.height},x,1);return r.restorePosition(i,n,x,M)},[C,x,M]);return o.useEffect(()=>{if(y&&h.current)return d(y,{type:"page",documentId:t,pageIndex:c},h.current,p||w)},[y,t,c,p,w]),n.jsxs("div",{ref:h,style:{position:"relative",width:E.width,height:E.height,...v},...g,children:[l,I&&n.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,zIndex:10}})]})},exports.useCursor=function(e){const{provides:t}=i();return{setCursor:(o,n,r=0)=>{if(!t)return;t.forDocument(e).setCursor(o,n,r)},removeCursor:o=>{if(!t)return;t.forDocument(e).removeCursor(o)}}},exports.useInteractionManager=function(e){const{provides:n}=i(),[r,u]=o.useState(t.initialDocumentState);return o.useEffect(()=>{if(!n)return;return n.forDocument(e).onStateChange(e=>{u(e)})},[n]),{provides:(null==n?void 0:n.forDocument(e))??null,state:r}},exports.useInteractionManagerCapability=i,exports.useInteractionManagerPlugin=()=>e.usePlugin(t.InteractionManagerPlugin.id),exports.useIsPageExclusive=u,exports.usePointerHandlers=function({modeId:e,pageIndex:t,documentId:o}){const{provides:n}=i();return{register:(r,i)=>{const u=(null==i?void 0:i.modeId)??e,c=(null==i?void 0:i.pageIndex)??t,l=(null==i?void 0:i.documentId)??o;return u?null==n?void 0:n.registerHandlers({modeId:u,handlers:r,pageIndex:c,documentId:l}):null==n?void 0:n.registerAlways({scope:void 0!==c?{type:"page",documentId:l,pageIndex:c}:{type:"global",documentId:l},handlers:r})}}},Object.keys(t).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>t[e]})});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["useInteractionManagerCapability","useCapability","InteractionManagerPlugin","id","useIsPageExclusive","documentId","provides","cap","isPageExclusive","setIsPageExclusive","useState","m","forDocument","getActiveInteractionMode","scope","exclusive","useEffect","onModeChange","mode","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","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","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","children","props","ref","useRef","jsx","width","height","pageIndex","rotation","rotationOverride","scale","scaleOverride","documentState","useDocumentState","page","document","pages","naturalPageSize","size","displaySize","transformSize","defaultConvertEventToPoint","useCallback","event","rect","displayPoint","rotatedNaturalSize","restorePosition","jsxs","position","right","bottom","zIndex","setCursor","token","prio","removeCursor","state","setState","initialDocumentState","onStateChange","usePlugin","modeId","register","handlers","options","finalModeId","finalPageIndex","finalDocumentId","registerHandlers","registerAlways"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["useInteractionManagerCapability","useCapability","InteractionManagerPlugin","id","useIsPageExclusive","documentId","provides","cap","isPageExclusive","setIsPageExclusive","useState","m","forDocument","getActiveInteractionMode","scope","exclusive","useEffect","onModeChange","mode","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","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","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","children","props","ref","useRef","jsx","width","height","pageIndex","rotation","rotationOverride","scale","scaleOverride","documentState","useDocumentState","page","document","pages","naturalPageSize","size","displaySize","transformSize","defaultConvertEventToPoint","useCallback","event","rect","displayPoint","rotatedNaturalSize","restorePosition","jsxs","position","right","bottom","zIndex","setCursor","token","prio","removeCursor","state","setState","initialDocumentState","onStateChange","usePlugin","modeId","register","handlers","options","finalModeId","finalPageIndex","finalDocumentId","registerHandlers","registerAlways"],"mappings":"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"}
@@ -209,6 +209,7 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
209
209
  }
210
210
  let pos;
211
211
  let normEvt;
212
+ let propagationStopped = false;
212
213
  if (isTouchEvent(evt)) {
213
214
  const tp = evt.type === "touchend" || evt.type === "touchcancel" ? evt.changedTouches[0] : evt.touches[0];
214
215
  if (!tp) return;
@@ -225,7 +226,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
225
226
  setPointerCapture: () => {
226
227
  },
227
228
  releasePointerCapture: () => {
228
- }
229
+ },
230
+ stopImmediatePropagation: () => {
231
+ propagationStopped = true;
232
+ },
233
+ isImmediatePropagationStopped: () => propagationStopped
229
234
  };
230
235
  } else {
231
236
  const pe = evt;
@@ -246,7 +251,11 @@ function createPointerProvider(cap, scope, element, convertEventToPoint) {
246
251
  releasePointerCapture: () => {
247
252
  var _a2, _b;
248
253
  (_b = (_a2 = pe.target) == null ? void 0 : _a2.releasePointerCapture) == null ? void 0 : _b.call(_a2, pe.pointerId);
249
- }
254
+ },
255
+ stopImmediatePropagation: () => {
256
+ propagationStopped = true;
257
+ },
258
+ isImmediatePropagationStopped: () => propagationStopped
250
259
  };
251
260
  }
252
261
  (_a = active[handlerKey]) == null ? void 0 : _a.call(active, pos, normEvt, capScope.getActiveMode());
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["state","_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-interaction-manager.ts","../../src/shared/utils.ts","../../src/shared/components/global-pointer-provider.tsx","../../src/shared/components/page-pointer-provider.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n initialDocumentState,\n InteractionDocumentState,\n InteractionManagerPlugin,\n PointerEventHandlersWithLifecycle,\n} from '@embedpdf/plugin-interaction-manager';\nimport { useState, useEffect } from '@framework';\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 { provides } = useInteractionManagerCapability();\n const [state, setState] = useState<InteractionDocumentState>(initialDocumentState);\n\n useEffect(() => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n return scope.onStateChange((state) => {\n setState(state);\n });\n }, [provides]);\n\n return {\n provides: provides?.forDocument(documentId) ?? null,\n state,\n };\n}\n\nexport function useCursor(documentId: string) {\n const { provides } = useInteractionManagerCapability();\n return {\n setCursor: (token: string, cursor: string, prio = 0) => {\n if (!provides) return;\n const scope = provides.forDocument(documentId);\n scope.setCursor(token, cursor, prio);\n },\n removeCursor: (token: string) => {\n if (!provides) return;\n const scope = 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 { provides } = useInteractionManagerCapability();\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 ? provides?.registerHandlers({\n modeId: finalModeId,\n handlers,\n pageIndex: finalPageIndex,\n documentId: finalDocumentId,\n })\n : 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 { provides: cap } = useInteractionManagerCapability();\n\n const [isPageExclusive, setIsPageExclusive] = useState<boolean>(() => {\n if (!cap) return false;\n const scope = cap.forDocument(documentId);\n const m = scope.getActiveInteractionMode();\n return m?.scope === 'page' && !!m.exclusive;\n });\n\n useEffect(() => {\n if (!cap) return;\n\n const scope = cap.forDocument(documentId);\n\n return scope.onModeChange(() => {\n const mode = scope.getActiveInteractionMode();\n setIsPageExclusive(mode?.scope === 'page' && !!mode?.exclusive);\n });\n }, [cap, documentId]);\n\n return isPageExclusive;\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","import { ReactNode, useEffect, useRef, HTMLAttributes, CSSProperties } from '@framework';\nimport { createPointerProvider } from '../utils';\nimport { useInteractionManagerCapability } from '../hooks';\n\ninterface GlobalPointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n style?: CSSProperties;\n}\n\nexport const GlobalPointerProvider = ({\n children,\n documentId,\n style,\n ...props\n}: GlobalPointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(cap, { type: 'global', documentId }, ref.current);\n }, [cap, documentId]);\n\n return (\n <div\n ref={ref}\n style={{\n width: '100%',\n height: '100%',\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import {\n ReactNode,\n useEffect,\n useRef,\n useCallback,\n HTMLAttributes,\n CSSProperties,\n} from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Position, restorePosition, Size, transformSize } from '@embedpdf/models';\nimport { createPointerProvider } from '../utils';\n\nimport { useInteractionManagerCapability, useIsPageExclusive } from '../hooks';\n\ninterface PagePointerProviderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n documentId: string;\n pageIndex: number;\n rotation?: number;\n scale?: number;\n style?: CSSProperties;\n convertEventToPoint?: (event: PointerEvent, element: HTMLElement) => Position;\n}\n\nexport const PagePointerProvider = ({\n documentId,\n pageIndex,\n children,\n rotation: rotationOverride,\n scale: scaleOverride,\n convertEventToPoint,\n style,\n ...props\n}: PagePointerProviderProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { provides: cap } = useInteractionManagerCapability();\n const isPageExclusive = useIsPageExclusive(documentId);\n const documentState = useDocumentState(documentId);\n\n // Get page dimensions and transformations from document state\n // Calculate inline - this is cheap and memoization isn't necessary\n const page = documentState?.document?.pages?.[pageIndex];\n const naturalPageSize = page?.size ?? { width: 0, height: 0 };\n const rotation = rotationOverride ?? documentState?.rotation ?? 0;\n const scale = scaleOverride ?? documentState?.scale ?? 1;\n const displaySize = transformSize(naturalPageSize, 0, scale);\n\n // Simplified conversion function\n const defaultConvertEventToPoint = useCallback(\n (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 [naturalPageSize, rotation, scale],\n );\n\n useEffect(() => {\n if (!cap || !ref.current) return;\n\n return createPointerProvider(\n cap,\n { type: 'page', documentId, pageIndex },\n ref.current,\n convertEventToPoint || defaultConvertEventToPoint,\n );\n }, [cap, documentId, pageIndex, convertEventToPoint, defaultConvertEventToPoint]);\n\n return (\n <div\n ref={ref}\n style={{\n position: 'relative',\n width: displaySize.width,\n height: displaySize.height,\n ...style,\n }}\n {...props}\n >\n {children}\n {isPageExclusive && (\n <div style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 10 }} />\n )}\n </div>\n );\n};\n"],"names":["state","_a"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("svelte/internal/disclose-version");const e=require("svelte/internal/client"),t=require("@embedpdf/core/svelte"),n=require("@embedpdf/plugin-interaction-manager"),o=require("@embedpdf/models");function r(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const i=r(e),s=()=>t.useCapability(n.InteractionManagerPlugin.id);function c(e){const t=s();let n=i.state(!1);return i.user_effect(()=>{if(!t.provides)return void i.set(n,!1);const o=t.provides.forDocument(e),r=o.getActiveInteractionMode();return i.set(n,"page"===(null==r?void 0:r.scope)&&!!r.exclusive,!0),o.onModeChange(()=>{const e=o.getActiveInteractionMode();i.set(n,"page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive),!0)})}),{get current(){return i.get(n)}}}const l={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"],a="undefined"!=typeof PointerEvent?u:[...u,"touchstart","touchend","touchmove","touchcancel"];function d(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function p(e,t,n,o){const r=e.forDocument(t.documentId);let i=e.getHandlersForScope(t);const s=()=>{var e;return!1!==(null==(e=r.getActiveInteractionMode())?void 0:e.wantsRawTouch)},c={};let u=s();const p=e=>{a.forEach(t=>{const o=c[t]??(c[t]=I);var r;n.addEventListener(t,o,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{a.forEach(e=>{const t=c[e];t&&n.removeEventListener(e,t)})};p(u),n.style.touchAction=u?"none":"";const g=r.onModeChange(()=>{if("global"===t.type){const e=r.getActiveInteractionMode();n.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}i=e.getHandlersForScope(t);const o=s();o!==u&&(v(),p(o),u=o,n.style.touchAction=u?"none":"")}),f=e.onHandlerChange(()=>{i=e.getHandlersForScope(t)}),h=r.getActiveInteractionMode(),m=r.getCurrentCursor();n.style.cursor="global"===t.type&&"global"!==(null==h?void 0:h.scope)?"auto":m;const y=r.onCursorChange(e=>{var o;"global"===t.type&&"global"!==(null==(o=r.getActiveInteractionMode())?void 0:o.scope)||(n.style.cursor=e)}),b=(e,t)=>{if(o)return o(e,t);const n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}};function I(t){var o;if(e.isPaused())return;const s=e.getExclusionRules();if(t.target&&function(e,t){var n,o,r;if(!e)return!1;let i=e;for(;i;){if(null==(n=t.classes)?void 0:n.length)for(const e of t.classes)if(null==(o=i.classList)?void 0:o.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,s))return;const c=l[t.type];if(!c||!(null==i?void 0:i[c]))return;let a,p;if(d(t)&&u&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault(),d(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;a=b(e,n),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:()=>{}}}else{const e=t;a=b(e,n),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,n;null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},releasePointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId)}}}null==(o=i[c])||o.call(i,a,p,r.getActiveMode())}return()=>{v(),g(),y(),f()}}var v=i.from_html("<div><!></div>");var g=i.from_html("<div></div>"),f=i.from_html("<div><!> <!></div>");exports.GlobalPointerProvider=function(e,t){i.push(t,!0);let n=i.rest_props(t,["$$slots","$$events","$$legacy","documentId","children","class"]),o=i.state(null);const r=s();i.user_effect(()=>{if(r.provides&&i.get(o))return p(r.provides,{type:"global",documentId:t.documentId},i.get(o))});var c=v();i.attribute_effect(c,()=>({class:t.class,...n,[i.STYLE]:{width:"100%",height:"100%"}}));var l=i.child(c);i.snippet(l,()=>t.children),i.reset(c),i.bind_this(c,e=>i.set(o,e),()=>i.get(o)),i.append(e,c),i.pop()},exports.PagePointerProvider=function(e,n){i.push(n,!0);let r=i.rest_props(n,["$$slots","$$events","$$legacy","documentId","pageIndex","children","rotation","scale","convertEventToPoint","class"]),l=i.state(null);const u=s(),a=c(n.documentId),d=t.useDocumentState(()=>n.documentId),v=i.derived(()=>{var e,t,o;return null==(o=null==(t=null==(e=d.current)?void 0:e.document)?void 0:t.pages)?void 0:o[n.pageIndex]}),h=i.derived(()=>{var e;return(null==(e=i.get(v))?void 0:e.size)??{width:0,height:0}}),m=i.derived(()=>{var e;return n.rotation??(null==(e=d.current)?void 0:e.rotation)??0}),y=i.derived(()=>{var e;return n.scale??(null==(e=d.current)?void 0:e.scale)??1}),b=i.derived(()=>o.transformSize(i.get(h),0,i.get(y))),I=i.derived(()=>(e,t)=>{const n=t.getBoundingClientRect(),r={x:e.clientX-n.left,y:e.clientY-n.top},s=o.transformSize({width:i.get(b).width,height:i.get(b).height},i.get(m),1);return o.restorePosition(s,r,i.get(m),i.get(y))});i.user_effect(()=>{if(u.provides&&i.get(l))return p(u.provides,{type:"page",documentId:n.documentId,pageIndex:n.pageIndex},i.get(l),n.convertEventToPoint||i.get(I))});var P=f();i.attribute_effect(P,()=>({class:n.class,...r,[i.STYLE]:{position:"relative",width:`${i.get(b).width}px`,height:`${i.get(b).height}px`}}));var x=i.child(P);i.snippet(x,()=>n.children);var C=i.sibling(x,2),M=e=>{var t=g();i.set_style(t,"",{},{position:"absolute",top:"0",left:"0",right:"0",bottom:"0","z-index":"10"}),i.append(e,t)};i.if(C,e=>{a.current&&e(M)}),i.reset(P),i.bind_this(P,e=>i.set(l,e),()=>i.get(l)),i.append(e,P),i.pop()},exports.useCursor=function(e){const t=s();return{setCursor:(n,o,r=0)=>{if(!t.provides)return;t.provides.forDocument(e).setCursor(n,o,r)},removeCursor:n=>{if(!t.provides)return;t.provides.forDocument(e).removeCursor(n)}}},exports.useInteractionManager=function(e){const t=s();let o=i.state(i.proxy(n.initialDocumentState));const r=i.derived(()=>{var n;return(null==(n=t.provides)?void 0:n.forDocument(e))??null});return i.user_effect(()=>{if(!t.provides)return void i.set(o,n.initialDocumentState,!0);const r=t.provides.forDocument(e);return i.set(o,r.getState(),!0),r.onStateChange(e=>{i.set(o,e,!0)})}),{get state(){return i.get(o)},get provides(){return i.get(r)}}},exports.useInteractionManagerCapability=s,exports.useInteractionManagerPlugin=()=>t.usePlugin(n.InteractionManagerPlugin.id),exports.useIsPageExclusive=c,exports.usePointerHandlers=function({modeId:e,pageIndex:t,documentId:n}){const o=s();return{register:(r,i)=>{var s,c;const l=(null==i?void 0:i.modeId)??e,u=(null==i?void 0:i.pageIndex)??t,a=(null==i?void 0:i.documentId)??n;return l?null==(s=o.provides)?void 0:s.registerHandlers({modeId:l,handlers:r,pageIndex:u,documentId:a}):null==(c=o.provides)?void 0:c.registerAlways({scope:void 0!==u?{type:"page",documentId:a,pageIndex:u}:{type:"global",documentId:a},handlers:r})}}},Object.keys(n).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>n[e]})});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("svelte/internal/disclose-version");const e=require("svelte/internal/client"),t=require("@embedpdf/core/svelte"),n=require("@embedpdf/plugin-interaction-manager"),o=require("@embedpdf/models");function r(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const i=r(e),s=()=>t.useCapability(n.InteractionManagerPlugin.id);function c(e){const t=s();let n=i.state(!1);return i.user_effect(()=>{if(!t.provides)return void i.set(n,!1);const o=t.provides.forDocument(e),r=o.getActiveInteractionMode();return i.set(n,"page"===(null==r?void 0:r.scope)&&!!r.exclusive,!0),o.onModeChange(()=>{const e=o.getActiveInteractionMode();i.set(n,"page"===(null==e?void 0:e.scope)&&!!(null==e?void 0:e.exclusive),!0)})}),{get current(){return i.get(n)}}}const l={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"],a="undefined"!=typeof PointerEvent?u:[...u,"touchstart","touchend","touchmove","touchcancel"];function d(e){return"undefined"!=typeof TouchEvent&&e instanceof TouchEvent}function p(e,t,n,o){const r=e.forDocument(t.documentId);let i=e.getHandlersForScope(t);const s=()=>{var e;return!1!==(null==(e=r.getActiveInteractionMode())?void 0:e.wantsRawTouch)},c={};let u=s();const p=e=>{a.forEach(t=>{const o=c[t]??(c[t]=P);var r;n.addEventListener(t,o,(r=e,t.startsWith("touch")?{passive:!r}:{passive:!1}))})},v=()=>{a.forEach(e=>{const t=c[e];t&&n.removeEventListener(e,t)})};p(u),n.style.touchAction=u?"none":"";const g=r.onModeChange(()=>{if("global"===t.type){const e=r.getActiveInteractionMode();n.style.cursor="global"===(null==e?void 0:e.scope)?e.cursor??"auto":"auto"}i=e.getHandlersForScope(t);const o=s();o!==u&&(v(),p(o),u=o,n.style.touchAction=u?"none":"")}),f=e.onHandlerChange(()=>{i=e.getHandlersForScope(t)}),m=r.getActiveInteractionMode(),h=r.getCurrentCursor();n.style.cursor="global"===t.type&&"global"!==(null==m?void 0:m.scope)?"auto":h;const y=r.onCursorChange(e=>{var o;"global"===t.type&&"global"!==(null==(o=r.getActiveInteractionMode())?void 0:o.scope)||(n.style.cursor=e)}),I=(e,t)=>{if(o)return o(e,t);const n=t.getBoundingClientRect();return{x:e.clientX-n.left,y:e.clientY-n.top}};function P(t){var o;if(e.isPaused())return;const s=e.getExclusionRules();if(t.target&&function(e,t){var n,o,r;if(!e)return!1;let i=e;for(;i;){if(null==(n=t.classes)?void 0:n.length)for(const e of t.classes)if(null==(o=i.classList)?void 0:o.contains(e))return!0;if(null==(r=t.dataAttributes)?void 0:r.length)for(const e of t.dataAttributes)if(i.hasAttribute(e))return!0;i=i.parentElement}return!1}(t.target,s))return;const c=l[t.type];if(!c||!(null==i?void 0:i[c]))return;let a,p;d(t)&&u&&("touchmove"===t.type||"touchcancel"===t.type)&&t.preventDefault();let v=!1;if(d(t)){const e="touchend"===t.type||"touchcancel"===t.type?t.changedTouches[0]:t.touches[0];if(!e)return;a=I(e,n),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;a=I(e,n),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,n;null==(n=null==(t=e.target)?void 0:t.setPointerCapture)||n.call(t,e.pointerId)},releasePointerCapture:()=>{var t,n;null==(n=null==(t=e.target)?void 0:t.releasePointerCapture)||n.call(t,e.pointerId)},stopImmediatePropagation:()=>{v=!0},isImmediatePropagationStopped:()=>v}}null==(o=i[c])||o.call(i,a,p,r.getActiveMode())}return()=>{v(),g(),y(),f()}}var v=i.from_html("<div><!></div>");var g=i.from_html("<div></div>"),f=i.from_html("<div><!> <!></div>");exports.GlobalPointerProvider=function(e,t){i.push(t,!0);let n=i.rest_props(t,["$$slots","$$events","$$legacy","documentId","children","class"]),o=i.state(null);const r=s();i.user_effect(()=>{if(r.provides&&i.get(o))return p(r.provides,{type:"global",documentId:t.documentId},i.get(o))});var c=v();i.attribute_effect(c,()=>({class:t.class,...n,[i.STYLE]:{width:"100%",height:"100%"}}));var l=i.child(c);i.snippet(l,()=>t.children),i.reset(c),i.bind_this(c,e=>i.set(o,e),()=>i.get(o)),i.append(e,c),i.pop()},exports.PagePointerProvider=function(e,n){i.push(n,!0);let r=i.rest_props(n,["$$slots","$$events","$$legacy","documentId","pageIndex","children","rotation","scale","convertEventToPoint","class"]),l=i.state(null);const u=s(),a=c(n.documentId),d=t.useDocumentState(()=>n.documentId),v=i.derived(()=>{var e,t,o;return null==(o=null==(t=null==(e=d.current)?void 0:e.document)?void 0:t.pages)?void 0:o[n.pageIndex]}),m=i.derived(()=>{var e;return(null==(e=i.get(v))?void 0:e.size)??{width:0,height:0}}),h=i.derived(()=>{var e;return n.rotation??(null==(e=d.current)?void 0:e.rotation)??0}),y=i.derived(()=>{var e;return n.scale??(null==(e=d.current)?void 0:e.scale)??1}),I=i.derived(()=>o.transformSize(i.get(m),0,i.get(y))),P=i.derived(()=>(e,t)=>{const n=t.getBoundingClientRect(),r={x:e.clientX-n.left,y:e.clientY-n.top},s=o.transformSize({width:i.get(I).width,height:i.get(I).height},i.get(h),1);return o.restorePosition(s,r,i.get(h),i.get(y))});i.user_effect(()=>{if(u.provides&&i.get(l))return p(u.provides,{type:"page",documentId:n.documentId,pageIndex:n.pageIndex},i.get(l),n.convertEventToPoint||i.get(P))});var b=f();i.attribute_effect(b,()=>({class:n.class,...r,[i.STYLE]:{position:"relative",width:`${i.get(I).width}px`,height:`${i.get(I).height}px`}}));var x=i.child(b);i.snippet(x,()=>n.children);var C=i.sibling(x,2),M=e=>{var t=g();i.set_style(t,"",{},{position:"absolute",top:"0",left:"0",right:"0",bottom:"0","z-index":"10"}),i.append(e,t)};i.if(C,e=>{a.current&&e(M)}),i.reset(b),i.bind_this(b,e=>i.set(l,e),()=>i.get(l)),i.append(e,b),i.pop()},exports.useCursor=function(e){const t=s();return{setCursor:(n,o,r=0)=>{if(!t.provides)return;t.provides.forDocument(e).setCursor(n,o,r)},removeCursor:n=>{if(!t.provides)return;t.provides.forDocument(e).removeCursor(n)}}},exports.useInteractionManager=function(e){const t=s();let o=i.state(i.proxy(n.initialDocumentState));const r=i.derived(()=>{var n;return(null==(n=t.provides)?void 0:n.forDocument(e))??null});return i.user_effect(()=>{if(!t.provides)return void i.set(o,n.initialDocumentState,!0);const r=t.provides.forDocument(e);return i.set(o,r.getState(),!0),r.onStateChange(e=>{i.set(o,e,!0)})}),{get state(){return i.get(o)},get provides(){return i.get(r)}}},exports.useInteractionManagerCapability=s,exports.useInteractionManagerPlugin=()=>t.usePlugin(n.InteractionManagerPlugin.id),exports.useIsPageExclusive=c,exports.usePointerHandlers=function({modeId:e,pageIndex:t,documentId:n}){const o=s();return{register:(r,i)=>{var s,c;const l=(null==i?void 0:i.modeId)??e,u=(null==i?void 0:i.pageIndex)??t,a=(null==i?void 0:i.documentId)??n;return l?null==(s=o.provides)?void 0:s.registerHandlers({modeId:l,handlers:r,pageIndex:u,documentId:a}):null==(c=o.provides)?void 0:c.registerAlways({scope:void 0!==u?{type:"page",documentId:a,pageIndex:u}:{type:"global",documentId:a},handlers:r})}}},Object.keys(n).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>n[e]})});
2
2
  //# sourceMappingURL=index.cjs.map