@embedpdf/plugin-annotation 2.3.0 → 2.4.1
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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +40 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +2 -1
- package/dist/lib/annotation-plugin.d.ts +1 -0
- package/dist/lib/helpers.d.ts +2 -1
- package/dist/lib/tools/types.d.ts +22 -10
- package/dist/lib/types.d.ts +13 -0
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +326 -50
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +325 -49
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/annotation-container.d.ts +6 -2
- package/dist/shared/components/annotation-layer.d.ts +4 -2
- package/dist/shared/components/annotations.d.ts +3 -1
- package/dist/shared/components/types.d.ts +43 -1
- package/dist/shared/context/index.d.ts +1 -0
- package/dist/shared/context/renderer-registry.d.ts +21 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared-preact/components/annotation-container.d.ts +6 -2
- package/dist/shared-preact/components/annotation-layer.d.ts +4 -2
- package/dist/shared-preact/components/annotations.d.ts +3 -1
- package/dist/shared-preact/components/types.d.ts +43 -1
- package/dist/shared-preact/context/index.d.ts +1 -0
- package/dist/shared-preact/context/renderer-registry.d.ts +21 -0
- package/dist/shared-preact/index.d.ts +2 -0
- package/dist/shared-react/components/annotation-container.d.ts +6 -2
- package/dist/shared-react/components/annotation-layer.d.ts +4 -2
- package/dist/shared-react/components/annotations.d.ts +3 -1
- package/dist/shared-react/components/types.d.ts +43 -1
- package/dist/shared-react/context/index.d.ts +1 -0
- package/dist/shared-react/context/renderer-registry.d.ts +21 -0
- package/dist/shared-react/index.d.ts +2 -0
- package/dist/svelte/components/AnnotationLayer.svelte.d.ts +3 -0
- package/dist/svelte/components/Annotations.svelte.d.ts +3 -0
- package/dist/svelte/components/RendererRegistryProvider.svelte.d.ts +7 -0
- package/dist/svelte/components/index.d.ts +1 -0
- package/dist/svelte/context/index.d.ts +2 -0
- package/dist/svelte/context/renderer-registry.svelte.d.ts +20 -0
- package/dist/svelte/context/types.d.ts +33 -0
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.d.ts +2 -0
- package/dist/svelte/index.js +412 -241
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/annotation-container.vue.d.ts +1 -1
- package/dist/vue/components/annotation-layer.vue.d.ts +3 -0
- package/dist/vue/components/annotations/free-text.vue.d.ts +1 -1
- package/dist/vue/components/annotations/stamp.vue.d.ts +1 -1
- package/dist/vue/components/annotations.vue.d.ts +94 -60
- package/dist/vue/components/group-selection-box.vue.d.ts +1 -1
- package/dist/vue/components/index.d.ts +1 -0
- package/dist/vue/components/preview-renderer.vue.d.ts +1 -1
- package/dist/vue/components/renderer-registry-provider.vue.d.ts +13 -0
- package/dist/vue/context/index.d.ts +2 -0
- package/dist/vue/context/renderer-registry.d.ts +26 -0
- package/dist/vue/context/types.d.ts +33 -0
- package/dist/vue/hooks/use-annotation.d.ts +5 -5
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.ts +3 -1
- package/dist/vue/index.js +245 -120
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/types.d.ts +1 -1
- package/package.json +10 -10
package/dist/vue/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/vue/hooks/use-annotation.ts","../../src/vue/components/annotation-container.vue","../../src/vue/components/group-selection-box.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/annotations/free-text.vue","../../src/vue/components/annotations/ink.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/annotations/link.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/render-annotation.vue","../../src/vue/components/annotations/stamp.vue","../../src/vue/components/text-markup/highlight.vue","../../src/vue/components/text-markup/squiggly.vue","../../src/vue/components/text-markup/strikeout.vue","../../src/vue/components/text-markup/underline.vue","../../src/vue/components/annotations.vue","../../src/vue/components/text-markup.vue","../../src/vue/components/preview-renderer.vue","../../src/vue/components/annotation-paint-layer.vue","../../src/vue/components/annotation-layer.vue"],"sourcesContent":["import { ref, watch, computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n\n/**\n * Hook for annotation state for a specific document\n * @param documentId Document ID (can be ref, computed, getter, or plain value)\n */\nexport const useAnnotation = (documentId: MaybeRefOrGetter<string>) => {\n const { provides } = useAnnotationCapability();\n const state = ref<AnnotationDocumentState>(\n provides?.value?.forDocument(toValue(documentId))?.getState() ?? initialDocumentState(),\n );\n\n watch(\n [provides, () => toValue(documentId)],\n ([providesValue, docId], _, onCleanup) => {\n if (providesValue && docId) {\n const scope = providesValue.forDocument(docId);\n state.value = scope.getState();\n\n const unsubscribe = scope.onStateChange((newState) => {\n state.value = newState;\n });\n onCleanup(unsubscribe);\n }\n },\n { immediate: true },\n );\n\n return {\n state,\n provides: computed(() => provides.value?.forDocument(toValue(documentId)) ?? null),\n };\n};\n","<template>\n <div data-no-interaction :style=\"{ display: 'contents' }\">\n <div\n v-bind=\"{ ...(effectiveIsDraggable && isSelected ? dragProps : {}), ...doubleProps }\"\n :style=\"mergedContainerStyle\"\n >\n <slot :annotation=\"currentObject\"></slot>\n\n <!-- Resize handles - only when single-selected -->\n <template v-if=\"isSelected && effectiveIsResizable\">\n <template v-for=\"{ key, style, ...handle } in resize\" :key=\"key\">\n <slot\n v-if=\"slots['resize-handle']\"\n name=\"resize-handle\"\n v-bind=\"{ key, style, ...handle, backgroundColor: HANDLE_COLOR }\"\n >\n <!-- Fallback content if slot is provided but empty -->\n <div v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </template>\n </template>\n\n <!-- Vertex handles - only when single-selected -->\n <template\n v-if=\"\n isSelected && permissions.canModifyAnnotations && !isMultiSelected && vertices.length > 0\n \"\n >\n <template v-for=\"{ key, style, ...vertex } in vertices\" :key=\"key\">\n <slot\n v-if=\"slots['vertex-handle']\"\n name=\"vertex-handle\"\n v-bind=\"{ key, style, ...vertex, backgroundColor: VERTEX_COLOR }\"\n >\n <!-- Fallback content if slot is provided but empty -->\n <div v-bind=\"vertex\" :style=\"[style, { backgroundColor: VERTEX_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"vertex\" :style=\"[style, { backgroundColor: VERTEX_COLOR }]\" />\n </template>\n </template>\n </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot - hide when multi-selected -->\n <CounterRotate v-if=\"shouldShowMenu\" :rect=\"menuRect\" :rotation=\"rotation\">\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"selectionMenu\" :is=\"renderSelectionMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"selection-menu\"\n :context=\"menuContext\"\n :selected=\"isSelected\"\n :rect=\"rect\"\n :placement=\"menuPlacement\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </div>\n</template>\n\n<script lang=\"ts\">\n// Disable attribute inheritance so style doesn't fall through to root element\nexport default {\n inheritAttrs: false,\n};\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends PdfAnnotationObject\">\nimport { ref, computed, watch, watchEffect, useSlots, toRaw, shallowRef, VNode } from 'vue';\nimport { PdfAnnotationObject, Rect } from '@embedpdf/models';\nimport {\n CounterRotate,\n MenuWrapperProps,\n SelectionMenuPlacement,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/vue';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useDocumentPermissions } from '@embedpdf/core/vue';\nimport { VertexConfig } from '../../shared/types';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../hooks';\nimport { AnnotationSelectionContext, AnnotationSelectionMenuRenderFn } from '../types';\n\nconst props = withDefaults(\n defineProps<{\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n isSelected: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: PointerEvent | MouseEvent) => void;\n onSelect: (event: TouchEvent | MouseEvent) => void;\n zIndex?: number;\n selectionOutlineColor?: string;\n style?: Record<string, string | number>;\n }>(),\n {\n lockAspectRatio: false,\n isMultiSelected: false,\n outlineOffset: 1,\n zIndex: 1,\n selectionOutlineColor: '#007ACC',\n },\n);\n\nconst HANDLE_COLOR = '#007ACC';\nconst VERTEX_COLOR = '#007ACC';\nconst HANDLE_SIZE = 12;\nconst VERTEX_SIZE = 12;\n\nconst preview = shallowRef<Partial<T>>(toRaw(props.trackedAnnotation.object));\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst permissions = useDocumentPermissions(props.documentId);\nconst gestureBaseRef = ref<T | null>(null);\nconst gestureBaseRectRef = shallowRef<Rect | null>(null);\n\n// When multi-selected, disable individual drag/resize - GroupSelectionBox handles it\nconst effectiveIsDraggable = computed(\n () => permissions.value.canModifyAnnotations && props.isDraggable && !props.isMultiSelected,\n);\nconst effectiveIsResizable = computed(\n () => permissions.value.canModifyAnnotations && props.isResizable && !props.isMultiSelected,\n);\n\n// Wrap onDoubleClick to respect permissions - check at call time\nconst guardedOnDoubleClick = props.onDoubleClick\n ? (e: PointerEvent | MouseEvent) => {\n if (permissions.value.canModifyAnnotations) {\n props.onDoubleClick?.(e);\n }\n }\n : undefined;\n\n// Get scoped API for this document (similar to React's useMemo)\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\nconst currentObject = computed<T>(\n () => ({ ...toRaw(props.trackedAnnotation.object), ...toRaw(preview.value) }) as T,\n);\n\n// Determine if we should show the outline\n// When multi-selected, don't show individual outlines - GroupSelectionBox shows the group outline\nconst showOutline = computed(() => props.isSelected && !props.isMultiSelected);\n\n// --- Selection Menu Logic ---\n\n// Check if we should show any menu at all - hide when multi-selected\nconst shouldShowMenu = computed(() => {\n return (\n props.isSelected && !props.isMultiSelected && (props.selectionMenu || slots['selection-menu'])\n );\n});\n\n// Computed rect for menu positioning\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: currentObject.value.rect.origin.x * props.scale,\n y: currentObject.value.rect.origin.y * props.scale,\n },\n size: {\n width: currentObject.value.rect.size.width * props.scale,\n height: currentObject.value.rect.size.height * props.scale,\n },\n}));\n\n// Build the context object for selection menu\nconst menuContext = computed<AnnotationSelectionContext>(() => ({\n type: 'annotation',\n annotation: props.trackedAnnotation,\n pageIndex: props.pageIndex,\n}));\n\n// Placement hints\nconst menuPlacement = computed<SelectionMenuPlacement>(() => ({\n suggestTop: false, // Could calculate based on position in viewport\n spaceAbove: 0,\n spaceBelow: 0,\n}));\n\n// Render via function (for schema-driven approach)\nconst renderSelectionMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.selectionMenu) return null;\n\n return props.selectionMenu({\n rect,\n menuWrapperProps,\n selected: props.isSelected,\n placement: menuPlacement.value,\n context: menuContext.value,\n });\n};\n\nconst elementSnapshot = computed(() => {\n const obj = toRaw(currentObject.value);\n return obj.rect; // plain-ish; composable will normalize fully\n});\n\nconst verticesSnapshot = computed(() => {\n const obj = toRaw(currentObject.value);\n return props.vertexConfig?.extractVertices(obj) ?? [];\n});\n\nconst constraintsSnapshot = computed(() => ({\n minWidth: 10,\n minHeight: 10,\n boundingBox: {\n width: props.pageWidth,\n height: props.pageHeight,\n },\n}));\n\nconst { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: verticesSnapshot,\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\n pageRotation: computed(() => props.rotation),\n scale: computed(() => props.scale),\n // Disable interaction handles when multi-selected\n enabled: computed(() => props.isSelected && !props.isMultiSelected),\n onUpdate: (event) => {\n if (!event.transformData?.type || props.isMultiSelected) return;\n\n const plugin = annotationPlugin.value;\n if (!plugin) return;\n\n const { type, changes, metadata } = event.transformData;\n const id = props.trackedAnnotation.object.id;\n const pageSize = { width: props.pageWidth, height: props.pageHeight };\n\n // Gesture start - initialize plugin drag/resize\n if (event.state === 'start') {\n gestureBaseRectRef.value = props.trackedAnnotation.object.rect;\n gestureBaseRef.value = currentObject.value; // For vertex edit\n\n if (type === 'move') {\n plugin.startDrag(props.documentId, { annotationIds: [id], pageSize });\n } else if (type === 'resize') {\n plugin.startResize(props.documentId, {\n annotationIds: [id],\n pageSize,\n resizeHandle: metadata?.handle ?? 'se',\n });\n }\n }\n\n // Gesture update - call plugin, preview comes from subscription\n if (changes.rect && gestureBaseRectRef.value) {\n if (type === 'move') {\n const delta = {\n x: changes.rect.origin.x - gestureBaseRectRef.value.origin.x,\n y: changes.rect.origin.y - gestureBaseRectRef.value.origin.y,\n };\n plugin.updateDrag(props.documentId, delta);\n } else if (type === 'resize') {\n plugin.updateResize(props.documentId, changes.rect);\n }\n }\n\n // Vertex edit - handle directly (no attached link handling needed)\n if (type === 'vertex-edit' && changes.vertices && props.vertexConfig) {\n const base = gestureBaseRef.value ?? currentObject.value;\n const vertexChanges = props.vertexConfig.transformAnnotation(toRaw(base), changes.vertices);\n const patched = annotationCapability.value?.transformAnnotation<T>(base, {\n type,\n changes: vertexChanges as Partial<T>,\n metadata,\n });\n if (patched) {\n preview.value = { ...toRaw(preview.value), ...patched };\n if (event.state === 'end') {\n annotationProvides.value?.updateAnnotation(props.pageIndex, id, patched);\n }\n }\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureBaseRectRef.value = null;\n gestureBaseRef.value = null;\n if (type === 'move') plugin.commitDrag(props.documentId);\n else if (type === 'resize') plugin.commitResize(props.documentId);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: props.outlineOffset,\n offsetMode: 'outside',\n includeSides: !props.lockAspectRatio,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: props.zIndex + 2,\n },\n includeVertices: !!props.vertexConfig,\n});\n\nconst doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n// Sync preview with tracked annotation when it changes\nwatch(\n () => props.trackedAnnotation.object,\n (newObject) => {\n preview.value = newObject;\n },\n { deep: true },\n);\n\n// Subscribe to unified drag/resize changes - plugin sends pre-computed patches!\n// ALL preview updates come through here (primary, attached links, multi-select)\nwatchEffect((onCleanup) => {\n const plugin = annotationPlugin.value;\n if (!plugin) return;\n\n const id = props.trackedAnnotation.object.id;\n\n const handleEvent = (event: {\n documentId: string;\n type: string;\n previewPatches?: Record<string, any>;\n }) => {\n if (event.documentId !== props.documentId) return;\n const patch = event.previewPatches?.[id];\n if (event.type === 'update' && patch) {\n preview.value = { ...toRaw(preview.value), ...patch } as T;\n } else if (event.type === 'cancel') {\n preview.value = props.trackedAnnotation.object;\n }\n };\n\n const unsubs = [plugin.onDragChange(handleEvent), plugin.onResizeChange(handleEvent)];\n\n onCleanup(() => unsubs.forEach((u) => u()));\n});\n\nconst containerStyle = computed(() => ({\n position: 'absolute' as 'absolute',\n left: `${currentObject.value.rect.origin.x * props.scale}px`,\n top: `${currentObject.value.rect.origin.y * props.scale}px`,\n width: `${currentObject.value.rect.size.width * props.scale}px`,\n height: `${currentObject.value.rect.size.height * props.scale}px`,\n outline: showOutline.value ? `1px solid ${props.selectionOutlineColor}` : 'none',\n outlineOffset: showOutline.value ? `${props.outlineOffset}px` : '0px',\n pointerEvents: props.isSelected && !props.isMultiSelected ? 'auto' : ('none' as 'auto' | 'none'),\n touchAction: 'none',\n cursor: props.isSelected && effectiveIsDraggable.value ? 'move' : 'default',\n zIndex: props.zIndex,\n}));\n\n// Merge container style with passed style prop (for mixBlendMode, etc.)\nconst mergedContainerStyle = computed(() => ({\n ...containerStyle.value,\n ...(props.style ?? {}),\n}));\n\n// Add useSlots to access slot information\nconst slots = useSlots();\n</script>\n","<template>\n <div v-if=\"selectedAnnotations.length >= 2\" data-group-selection-box data-no-interaction>\n <!-- Group box - draggable only if isDraggable is true -->\n <div\n v-bind=\"isDraggable ? dragProps : {}\"\n :style=\"boxStyle\"\n @pointerdown=\"!isDraggable ? $event.stopPropagation() : undefined\"\n >\n <!-- Resize handles -->\n <template v-if=\"isResizable\">\n <template v-for=\"{ key, style, ...handle } in resize\" :key=\"key\">\n <slot\n v-if=\"slots['resize-handle']\"\n name=\"resize-handle\"\n v-bind=\"{ key, style, ...handle, backgroundColor: HANDLE_COLOR }\"\n >\n <div v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </template>\n </template>\n </div>\n\n <!-- Group selection menu -->\n <CounterRotate v-if=\"shouldShowMenu\" :rect=\"menuRect\" :rotation=\"rotation\">\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"groupSelectionMenu\" :is=\"renderGroupMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"group-selection-menu\"\n :context=\"menuContext\"\n :selected=\"true\"\n :rect=\"rect\"\n :placement=\"menuPlacement\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, useSlots, VNode, shallowRef, watch } from 'vue';\nimport { Rect, boundingRectOrEmpty } from '@embedpdf/models';\nimport {\n CounterRotate,\n MenuWrapperProps,\n SelectionMenuPlacement,\n useInteractionHandles,\n} from '@embedpdf/utils/vue';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationPlugin } from '../hooks';\nimport {\n GroupSelectionContext,\n GroupSelectionMenuProps,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n} from '../types';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n /** All selected annotations on this page */\n selectedAnnotations: TrackedAnnotation[];\n /** Whether the group is draggable (all annotations must be group-draggable) */\n isDraggable: boolean;\n /** Whether the group is resizable (all annotations must be group-resizable) */\n isResizable: boolean;\n /** Resize handle UI customization */\n resizeUI?: ResizeHandleUI;\n /** Selection outline color */\n selectionOutlineColor?: string;\n /** Outline offset */\n outlineOffset?: number;\n /** Z-index for the group box */\n zIndex?: number;\n /** Group selection menu render function */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n }>(),\n {\n selectionOutlineColor: '#007ACC',\n outlineOffset: 2,\n zIndex: 100,\n },\n);\n\nconst slots = useSlots();\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst gestureBase = shallowRef<Rect | null>(null);\nconst isDraggingRef = ref(false);\nconst isResizingRef = ref(false);\n\nconst HANDLE_COLOR = computed(() => props.resizeUI?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUI?.size ?? 12);\n\n// Compute the group bounding box from all selected annotations\nconst groupBox = computed(() => {\n const rects = props.selectedAnnotations.map((ta) => ta.object.rect);\n return boundingRectOrEmpty(rects);\n});\n\n// Preview state for the group box during drag/resize\nconst previewGroupBox = shallowRef<Rect>(groupBox.value);\n\n// Watch for groupBox changes and sync previewGroupBox when not dragging/resizing\n// Use watchEffect equivalent via computed with side effects won't work, need explicit watch\nwatch(\n () => groupBox.value,\n (newGroupBox) => {\n if (!isDraggingRef.value && !isResizingRef.value) {\n previewGroupBox.value = newGroupBox;\n }\n },\n { immediate: true },\n);\n\n// Box styling\nconst boxStyle = computed(() => ({\n position: 'absolute' as 'absolute',\n left: `${previewGroupBox.value.origin.x * props.scale}px`,\n top: `${previewGroupBox.value.origin.y * props.scale}px`,\n width: `${previewGroupBox.value.size.width * props.scale}px`,\n height: `${previewGroupBox.value.size.height * props.scale}px`,\n outline: `2px dashed ${props.selectionOutlineColor}`,\n outlineOffset: `${props.outlineOffset - 1}px`,\n cursor: props.isDraggable ? 'move' : 'default',\n touchAction: 'none',\n zIndex: props.zIndex,\n}));\n\n// Menu rect for counter-rotate component\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: previewGroupBox.value.origin.x * props.scale,\n y: previewGroupBox.value.origin.y * props.scale,\n },\n size: {\n width: previewGroupBox.value.size.width * props.scale,\n height: previewGroupBox.value.size.height * props.scale,\n },\n}));\n\n// Menu context\nconst menuContext = computed<GroupSelectionContext>(() => ({\n type: 'group',\n annotations: props.selectedAnnotations,\n pageIndex: props.pageIndex,\n}));\n\n// Placement hints\nconst menuPlacement = computed<SelectionMenuPlacement>(() => ({\n suggestTop: false,\n}));\n\n// Check if we should show menu\nconst shouldShowMenu = computed(() => {\n return props.groupSelectionMenu || slots['group-selection-menu'];\n});\n\n// Render menu via function\nconst renderGroupMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.groupSelectionMenu) return null;\n\n return props.groupSelectionMenu({\n rect,\n menuWrapperProps,\n selected: true,\n placement: menuPlacement.value,\n context: menuContext.value,\n });\n};\n\n// Element snapshot for interaction handles\nconst elementSnapshot = computed(() => previewGroupBox.value);\n\n// Constraints\nconst constraintsSnapshot = computed(() => ({\n minWidth: 20,\n minHeight: 20,\n boundingBox: {\n width: props.pageWidth,\n height: props.pageHeight,\n },\n}));\n\n// Use interaction handles for both drag and resize\nconst { dragProps, resize } = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: computed(() => []),\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => false),\n pageRotation: computed(() => props.rotation),\n scale: computed(() => props.scale),\n enabled: computed(() => true),\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n if (!annotationPlugin.value) return;\n\n const plugin = annotationPlugin.value;\n const transformType = event.transformData.type;\n const isMove = transformType === 'move';\n const isResize = transformType === 'resize';\n\n // Skip drag operations if group is not draggable\n if (isMove && !props.isDraggable) return;\n\n if (event.state === 'start') {\n gestureBase.value = groupBox.value;\n\n if (isMove) {\n isDraggingRef.value = true;\n // Use unified drag API - plugin handles attached links automatically\n plugin.startDrag(props.documentId, {\n annotationIds: props.selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: props.pageWidth, height: props.pageHeight },\n });\n } else if (isResize) {\n isResizingRef.value = true;\n // Use unified resize API - plugin handles attached links automatically\n plugin.startResize(props.documentId, {\n annotationIds: props.selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: props.pageWidth, height: props.pageHeight },\n resizeHandle: event.transformData.metadata?.handle ?? 'se',\n });\n }\n }\n\n const base = gestureBase.value ?? groupBox.value;\n\n if (isMove && event.transformData.changes.rect) {\n // Calculate delta from original position\n const newRect = event.transformData.changes.rect;\n const rawDelta = {\n x: newRect.origin.x - base.origin.x,\n y: newRect.origin.y - base.origin.y,\n };\n\n // Plugin clamps delta and emits events (attached links receive updates too)\n const clampedDelta = plugin.updateDrag(props.documentId, rawDelta);\n\n // Update preview group box with clamped delta\n previewGroupBox.value = {\n ...base,\n origin: {\n x: base.origin.x + clampedDelta.x,\n y: base.origin.y + clampedDelta.y,\n },\n };\n } else if (isResize && event.transformData.changes.rect) {\n const newGroupBox = event.transformData.changes.rect;\n\n // Plugin computes rects for all participants and emits events\n plugin.updateResize(props.documentId, newGroupBox);\n\n // Update preview\n previewGroupBox.value = newGroupBox;\n }\n\n if (event.state === 'end') {\n gestureBase.value = null;\n\n if (isMove && isDraggingRef.value) {\n isDraggingRef.value = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitDrag(props.documentId);\n } else if (isResize && isResizingRef.value) {\n isResizingRef.value = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitResize(props.documentId);\n }\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE.value,\n spacing: props.outlineOffset,\n offsetMode: 'outside',\n includeSides: true,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: props.zIndex,\n },\n includeVertices: false,\n});\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${geometry.width} ${geometry.height}`\"\n >\n <ellipse\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n :fill=\"color\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\ninterface CircleProps {\n isSelected: boolean;\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n}\n\nconst props = withDefaults(defineProps<CircleProps>(), {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n});\n\nconst geometry = computed(() => {\n const outerW = props.rect.size.width;\n const outerH = props.rect.size.height;\n const innerW = Math.max(outerW - props.strokeWidth, 0);\n const innerH = Math.max(outerH - props.strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n cx: props.strokeWidth / 2 + innerW / 2,\n cy: props.strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n});\n\nconst svgWidth = computed(() => geometry.value.width * props.scale);\nconst svgHeight = computed(() => geometry.value.height * props.scale);\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n width: `${annotation.object.rect.size.width * scale}px`,\n height: `${annotation.object.rect.size.height * scale}px`,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n >\n <span\n ref=\"editorRef\"\n @blur=\"handleBlur\"\n tabindex=\"0\"\n :style=\"editorStyle\"\n :contenteditable=\"isEditing\"\n >{{ annotation.object.contents }}</span\n >\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, onMounted } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = defineProps<{\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n}>();\n\nconst editorRef = ref<HTMLSpanElement | null>(null);\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst isIOS = ref(false);\n\nonMounted(() => {\n try {\n const nav = navigator as any;\n isIOS.value =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n } catch {\n isIOS.value = false;\n }\n});\n\nwatch(\n () => props.isEditing,\n (editing) => {\n if (editing && editorRef.value) {\n const editor = editorRef.value;\n editor.focus();\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n },\n);\n\nconst handleBlur = () => {\n if (!annotationProvides.value || !editorRef.value) return;\n annotationProvides.value.updateAnnotation(props.pageIndex, props.annotation.object.id, {\n contents: editorRef.value.innerText,\n });\n};\n\nconst editorStyle = computed(() => {\n const { object: anno } = props.annotation;\n const computedFontPx = anno.fontSize * props.scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS.value && props.isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return {\n color: anno.fontColor,\n fontSize: `${adjustedFontPx}px`,\n fontFamily: standardFontCss(anno.fontFamily),\n textAlign: textAlignmentToCss(anno.textAlign),\n flexDirection: 'column' as 'column',\n justifyContent:\n anno.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : anno.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: anno.color ?? anno.backgroundColor,\n opacity: anno.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: props.isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n };\n});\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n v-for=\"(d, i) in paths\"\n :key=\"i\"\n :d=\"d\"\n fill=\"none\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n /** Stroke color */\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n inkList: PdfInkListObject[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 1,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#000000');\n\nconst paths = computed(() => {\n return props.inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n const lx = x - props.rect.origin.x;\n const ly = y - props.rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + `${lx} ${ly} `;\n });\n return d.trim();\n });\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :stroke=\"strokeColor\"\n :style=\"getEndingStyle(endings.start)\"\n :fill=\"endings.start.filled ? color : 'none'\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :stroke=\"strokeColor\"\n :style=\"getEndingStyle(endings.end)\"\n :fill=\"endings.end.filled ? color : 'none'\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst props = withDefaults(\n defineProps<{\n color?: string;\n opacity?: number;\n strokeWidth: number;\n strokeColor?: string;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n linePoints: LinePoints;\n lineEndings?: LineEndings;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n isSelected: boolean;\n }>(),\n {\n color: 'transparent',\n opacity: 1,\n strokeColor: '#000000',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n);\n\nconst localLine = computed(() => ({\n x1: props.linePoints.start.x - props.rect.origin.x,\n y1: props.linePoints.start.y - props.rect.origin.y,\n x2: props.linePoints.end.x - props.rect.origin.x,\n y2: props.linePoints.end.y - props.rect.origin.y,\n}));\n\nconst endings = computed(() => {\n const { x1, y1, x2, y2 } = localLine.value;\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(\n props.lineEndings?.start,\n props.strokeWidth,\n angle + Math.PI,\n x1,\n y1,\n ),\n end: patching.createEnding(props.lineEndings?.end, props.strokeWidth, angle, x2, y2),\n };\n});\n\nconst getEndingStyle = (ending: patching.SvgEnding) => ({\n cursor: props.isSelected ? 'move' : 'pointer',\n strokeWidth: props.strokeWidth,\n strokeLinecap: 'butt' as 'butt',\n pointerEvents: (props.isSelected ? 'none' : ending.filled ? 'visible' : 'visibleStroke') as\n | 'none'\n | 'visible'\n | 'visibleStroke',\n ...(props.strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: props.strokeDashArray?.join(','),\n }),\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${svgWidth}px`,\n height: `${svgHeight}px`,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${width} ${height}`\"\n >\n <!-- Invisible hit area for the entire link region -->\n <!-- IRT links are not directly clickable - interaction goes through parent -->\n <rect\n :x=\"0\"\n :y=\"0\"\n :width=\"width\"\n :height=\"height\"\n fill=\"transparent\"\n @pointerdown=\"hasIRT ? undefined : onClick\"\n @touchstart=\"hasIRT ? undefined : onClick\"\n :style=\"{\n cursor: hitAreaCursor,\n pointerEvents: hitAreaPointerEvents,\n }\"\n />\n\n <!-- Underline style: line at bottom of rect -->\n <line\n v-if=\"isUnderline\"\n :x1=\"1\"\n :y1=\"height - 1\"\n :x2=\"width - 1\"\n :y2=\"height - 1\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth\"\n :stroke-dasharray=\"dashArray\"\n style=\"pointer-events: none\"\n />\n\n <!-- Solid/Dashed style: rectangle border -->\n <rect\n v-else\n :x=\"strokeWidth / 2\"\n :y=\"strokeWidth / 2\"\n :width=\"Math.max(width - strokeWidth, 0)\"\n :height=\"Math.max(height - strokeWidth, 0)\"\n fill=\"transparent\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth\"\n :stroke-dasharray=\"dashArray\"\n style=\"pointer-events: none\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour – defaults to blue when omitted */\n strokeColor?: string;\n /** Stroke width in PDF units */\n strokeWidth?: number;\n /** Stroke type – defaults to underline when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – for dashed style */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent | TouchEvent) => void;\n /** Whether this link has an IRT (In Reply To) reference - disables direct interaction */\n hasIRT?: boolean;\n }>(),\n {\n strokeColor: '#0000FF',\n strokeWidth: 2,\n strokeStyle: PdfAnnotationBorderStyle.UNDERLINE,\n hasIRT: false,\n },\n);\n\nconst width = computed(() => props.rect.size.width);\nconst height = computed(() => props.rect.size.height);\nconst svgWidth = computed(() => width.value * props.scale);\nconst svgHeight = computed(() => height.value * props.scale);\n\n// Calculate dash array for SVG\nconst dashArray = computed(() => {\n if (props.strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n return props.strokeDashArray?.join(',') ?? `${props.strokeWidth * 3},${props.strokeWidth}`;\n }\n return undefined;\n});\n\n// For underline style, render a line at the bottom\n// For solid/dashed, render a rectangle border\nconst isUnderline = computed(() => props.strokeStyle === PdfAnnotationBorderStyle.UNDERLINE);\n\nconst hitAreaCursor = computed(() =>\n props.hasIRT ? 'default' : props.isSelected ? 'move' : 'pointer',\n);\nconst hitAreaPointerEvents = computed(() =>\n props.hasIRT ? 'none' : props.isSelected ? 'none' : 'visible',\n);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n :d=\"pathData\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :opacity=\"opacity\"\n :style=\"{\n fill: currentVertex ? 'none' : color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n <path\n v-if=\"isPreviewing && localPts.length > 1\"\n :d=\"`M ${localPts[localPts.length - 1].x} ${\n localPts[localPts.length - 1].y\n } L ${localPts[0].x} ${localPts[0].y}`\"\n fill=\"none\"\n :style=\"{\n stroke: strokeColor,\n strokeWidth,\n strokeDasharray: '4,4',\n opacity: 0.7,\n }\"\n />\n <rect\n v-if=\"isPreviewing && localPts.length >= 2\"\n :x=\"localPts[0].x - handleSize / scale / 2\"\n :y=\"localPts[0].y - handleSize / scale / 2\"\n :width=\"handleSize / scale\"\n :height=\"handleSize / scale\"\n :fill=\"strokeColor\"\n :opacity=\"0.4\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth / 2\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n currentVertex?: Position;\n handleSize?: number;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n handleSize: 14,\n },\n);\n\nconst allPoints = computed(() =>\n props.currentVertex ? [...props.vertices, props.currentVertex] : props.vertices,\n);\n\nconst localPts = computed(() =>\n allPoints.value.map(({ x, y }) => ({\n x: x - props.rect.origin.x,\n y: y - props.rect.origin.y,\n })),\n);\n\nconst pathData = computed(() => {\n if (!localPts.value.length) return '';\n const [first, ...rest] = localPts.value;\n const isPreview = !!props.currentVertex;\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n});\n\nconst isPreviewing = computed(() => props.currentVertex && props.vertices.length > 0);\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n :d=\"pathData\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :opacity=\"opacity\"\n :style=\"{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"getEndingStyle(endings.start)\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n :stroke=\"strokeColor\"\n :fill=\"endings.end.filled ? color : 'none'\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"getEndingStyle(endings.end)\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst props = withDefaults(\n defineProps<{\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n lineEndings?: LineEndings;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n },\n);\n\nconst localPts = computed(() =>\n props.vertices.map(({ x, y }) => ({\n x: x - props.rect.origin.x,\n y: y - props.rect.origin.y,\n })),\n);\n\nconst pathData = computed(() => {\n if (localPts.value.length === 0) return '';\n const [first, ...rest] = localPts.value;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('')).trim();\n});\n\nconst endings = computed(() => {\n if (localPts.value.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts.value[0], localPts.value[1]);\n const endRad = toAngle(\n localPts.value[localPts.value.length - 2],\n localPts.value[localPts.value.length - 1],\n );\n\n return {\n start: patching.createEnding(\n props.lineEndings?.start,\n props.strokeWidth,\n startRad + Math.PI,\n localPts.value[0].x,\n localPts.value[0].y,\n ),\n end: patching.createEnding(\n props.lineEndings?.end,\n props.strokeWidth,\n endRad,\n localPts.value[localPts.value.length - 1].x,\n localPts.value[localPts.value.length - 1].y,\n ),\n };\n});\n\nconst getEndingStyle = (ending: patching.SvgEnding) => ({\n cursor: props.isSelected ? 'move' : 'pointer',\n strokeWidth: props.strokeWidth,\n pointerEvents: (props.isSelected ? 'none' : ending.filled ? 'visible' : 'visibleStroke') as\n | 'none'\n | 'visible'\n | 'visibleStroke',\n strokeLinecap: 'butt' as 'butt',\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${geometry.width + strokeWidth} ${geometry.height + strokeWidth}`\"\n >\n <rect\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n :fill=\"color\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n);\n\nconst geometry = computed(() => {\n const outerW = props.rect.size.width;\n const outerH = props.rect.size.height;\n const innerW = Math.max(outerW - props.strokeWidth, 0);\n const innerH = Math.max(outerH - props.strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: props.strokeWidth / 2,\n y: props.strokeWidth / 2,\n };\n});\n\nconst svgWidth = computed(() => (geometry.value.width + props.strokeWidth) * props.scale);\nconst svgHeight = computed(() => (geometry.value.height + props.strokeWidth) * props.scale);\n</script>\n","<template>\n <img\n v-if=\"imageUrl\"\n :src=\"imageUrl\"\n @load=\"handleImageLoad\"\n :style=\"{\n width: '100%',\n height: '100%',\n display: 'block',\n ...style,\n }\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onUnmounted, CSSProperties, computed } from 'vue';\nimport { ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { deepToRaw } from '@embedpdf/utils/vue';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n style?: CSSProperties;\n }>(),\n {\n scaleFactor: 1,\n },\n);\n\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst imageUrl = ref<string | null>(null);\nconst urlRef = ref<string | null>(null);\nconst currentTask = ref<any>(null);\n\n// Extract primitive values to avoid unnecessary re-renders\nconst annotationId = computed(() => props.annotation.id);\nconst rectWidth = computed(() => props.annotation.rect.size.width);\nconst rectHeight = computed(() => props.annotation.rect.size.height);\n\nwatch(\n () => [\n props.pageIndex,\n props.scaleFactor,\n props.documentId,\n annotationId.value,\n rectWidth.value,\n rectHeight.value,\n annotationProvides.value,\n ],\n (_, __, onCleanup) => {\n if (annotationProvides.value) {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n\n const task = annotationProvides.value.forDocument(props.documentId).renderAnnotation({\n pageIndex: props.pageIndex,\n annotation: deepToRaw(props.annotation),\n options: {\n scaleFactor: props.scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n\n currentTask.value = task;\n\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n imageUrl.value = url;\n urlRef.value = url;\n }, ignore);\n\n onCleanup(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n });\n }\n },\n { immediate: true },\n);\n\nonUnmounted(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n if (currentTask.value) {\n currentTask.value.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task on unmount',\n });\n }\n});\n\nconst handleImageLoad = () => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n};\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: 'pointer',\n }\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n >\n <RenderAnnotation\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :annotation=\"{ ...annotation.object, id: annotation.object.id }\"\n :scaleFactor=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport RenderAnnotation from '../render-annotation.vue';\n\ndefineProps<{\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: PointerEvent | TouchEvent) => void;\n}>();\n</script>\n","<template>\n <div\n v-for=\"(b, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? b.origin.x - rect.origin.x : b.origin.x) * scale}px`,\n top: `${(rect ? b.origin.y - rect.origin.y : b.origin.y) * scale}px`,\n width: `${b.size.width * scale}px`,\n height: `${b.size.height * scale}px`,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n }\"\n ></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: `${amplitude * 2}px`,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst amplitude = computed(() => 2 * props.scale);\nconst period = computed(() => 6 * props.scale);\n\nconst svgDataUri = computed(() => {\n const amp = amplitude.value;\n const per = period.value;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${per}\" height=\"${\n amp * 2\n }\" viewBox=\"0 0 ${per} ${amp * 2}\">\n <path d=\"M0 ${amp} Q ${per / 4} 0 ${per / 2} ${amp} T ${per} ${amp}\"\n fill=\"none\" stroke=\"${resolvedColor.value}\" stroke-width=\"${amp}\" stroke-linecap=\"round\"/>\n </svg>`;\n return `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n});\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: `${thickness}px`,\n background: resolvedColor,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: `${thickness}px`,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <template v-for=\"annotation in annotations\" :key=\"annotation.object.id\">\n <!-- Ink -->\n <AnnotationContainer\n v-if=\"isInk(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Ink\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Square -->\n <AnnotationContainer\n v-else-if=\"isSquare(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Square\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Circle -->\n <AnnotationContainer\n v-else-if=\"isCircle(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Circle\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Line -->\n <AnnotationContainer\n v-else-if=\"isLine(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Line\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Polyline -->\n <AnnotationContainer\n v-else-if=\"isPolyline(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Polyline\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Polygon -->\n <AnnotationContainer\n v-else-if=\"isPolygon(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Polygon\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- FreeText -->\n <AnnotationContainer\n v-else-if=\"isFreeText(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :onDoubleClick=\"(e) => handleDoubleClick(e, annotation.object.id)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.FreeText\n :isSelected=\"isSelected(annotation)\"\n :isEditing=\"editingId === annotation.object.id\"\n :annotation=\"{ ...annotation, object: currentObject }\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Stamp -->\n <AnnotationContainer\n v-else-if=\"isStamp(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default>\n <AnnoComponents.Stamp\n :documentId=\"documentId\"\n :isSelected=\"isSelected(annotation)\"\n :annotation=\"annotation\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Text Markup: Underline, StrikeOut, Squiggly, Highlight -->\n <AnnotationContainer\n v-else-if=\"isUnderline(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Underline\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isStrikeout(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Strikeout\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isSquiggly(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Squiggly\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isHighlight(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Highlight\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Link -->\n <AnnotationContainer\n v-else-if=\"isLink(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isMultiSelected=\"isMultiSelected\"\n :isDraggable=\"false\"\n :isResizable=\"false\"\n :lockAspectRatio=\"false\"\n :onSelect=\"(e) => handleLinkClick(e, annotation)\"\n :selectionMenu=\"\n annotation.object.inReplyToId ? undefined : isMultiSelected ? undefined : selectionMenu\n \"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Link\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent | TouchEvent) => handleLinkClick(e, annotation)\"\n :hasIRT=\"!!annotation.object.inReplyToId\"\n />\n </template>\n <template\n #selection-menu=\"slotProps\"\n v-if=\"!isMultiSelected && !annotation.object.inReplyToId\"\n >\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n </template>\n\n <!-- Group Selection Box (shown when multiple annotations are selected on this page) -->\n <GroupSelectionBox\n v-if=\"allSelectedOnSamePage && selectedAnnotationsOnPage.length >= 2\"\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :rotation=\"rotation\"\n :pageWidth=\"pageWidth\"\n :pageHeight=\"pageHeight\"\n :selectedAnnotations=\"selectedAnnotationsOnPage\"\n :isDraggable=\"areAllSelectedDraggable\"\n :isResizable=\"areAllSelectedResizable\"\n :resizeUI=\"resizeUI\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n >\n <template #group-selection-menu=\"slotProps\">\n <slot name=\"group-selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n </GroupSelectionBox>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { blendModeToCss, PdfBlendMode, Position } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n isCircle,\n isFreeText,\n isHighlight,\n isInk,\n isLine,\n isLink,\n isPolygon,\n isPolyline,\n isSquare,\n isSquiggly,\n isStamp,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n} from '@embedpdf/plugin-annotation';\nimport type { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/vue';\nimport type { EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/vue';\nimport { useAnnotationCapability } from '../hooks';\nimport AnnotationContainer from './annotation-container.vue';\nimport GroupSelectionBox from './group-selection-box.vue';\nimport * as AnnoComponents from './annotations';\nimport * as TextMarkupComponents from './text-markup';\nimport { VertexConfig } from '../../shared/types';\nimport {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n} from '../types';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Render function for group selection menu (schema-driven approach) */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n}>();\n\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { provides: selectionProvides } = useSelectionCapability();\nconst annotations = ref<TrackedAnnotation[]>([]);\nconst allSelectedIds = ref<string[]>([]);\nconst { register } = usePointerHandlers({\n documentId: () => props.documentId,\n pageIndex: props.pageIndex,\n});\nconst editingId = ref<string | null>(null);\n\n// Get scoped API for this document\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\n// Check if multiple annotations are selected\nconst isMultiSelected = computed(() => allSelectedIds.value.length > 1);\n\nwatchEffect((onCleanup) => {\n if (annotationProvides.value) {\n // Initialize with current state immediately (like React)\n const currentState = annotationProvides.value.getState();\n annotations.value = getAnnotationsByPageIndex(currentState, props.pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(currentState);\n\n // Then subscribe to changes\n const off = annotationProvides.value.onStateChange((state) => {\n annotations.value = getAnnotationsByPageIndex(state, props.pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(state);\n });\n onCleanup(off);\n }\n});\n\nconst handlePointerDown = (_pos: Position, pe: EmbedPdfPointerEvent<PointerEvent>) => {\n if (pe.target === pe.currentTarget && annotationProvides.value) {\n annotationProvides.value.deselectAnnotation();\n editingId.value = null;\n }\n};\n\nconst handleClick = (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides.value && selectionProvides.value) {\n selectionProvides.value.clear();\n\n // Check for modifier key (Cmd on Mac, Ctrl on Windows/Linux)\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n // Toggle selection: add or remove from current selection\n annotationProvides.value.toggleSelection(props.pageIndex, annotation.object.id);\n } else {\n // Exclusive select: clear and select only this one\n annotationProvides.value.selectAnnotation(props.pageIndex, annotation.object.id);\n }\n\n if (annotation.object.id !== editingId.value) {\n editingId.value = null;\n }\n }\n};\n\n// Special handler for link annotations - if IRT exists, select the parent\nconst handleLinkClick = (\n e: MouseEvent | TouchEvent,\n annotation: TrackedAnnotation<PdfLinkAnnoObject>,\n) => {\n e.stopPropagation();\n if (!annotationProvides.value || !selectionProvides.value) return;\n\n selectionProvides.value.clear();\n\n // If link has IRT, select the parent annotation instead\n if (annotation.object.inReplyToId) {\n const parentId = annotation.object.inReplyToId;\n const parent = annotations.value.find((a) => a.object.id === parentId);\n if (parent) {\n annotationProvides.value.selectAnnotation(parent.object.pageIndex, parentId);\n return;\n }\n }\n\n // Standalone link - select it directly\n annotationProvides.value.selectAnnotation(props.pageIndex, annotation.object.id);\n};\n\nconst handleDoubleClick = (_e: MouseEvent | PointerEvent, id: string) => {\n if (isFreeText(annotations.value.find((a) => a.object.id === id)!)) {\n editingId.value = id;\n }\n};\n\nwatchEffect((onCleanup) => {\n if (annotationProvides.value) {\n const unregister = register({ onPointerDown: handlePointerDown });\n if (unregister) {\n onCleanup(unregister);\n }\n }\n});\n\n// Check if an annotation is selected\nconst isSelected = (annotation: TrackedAnnotation) =>\n allSelectedIds.value.includes(annotation.object.id);\n\n// Get selected annotations that are on THIS page (for group selection box)\nconst selectedAnnotationsOnPage = computed(() =>\n annotations.value.filter((anno) => allSelectedIds.value.includes(anno.object.id)),\n);\n\n// Check if all selected annotations on this page are draggable in group context\nconst areAllSelectedDraggable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupDraggable ?? tool?.interaction.isDraggable ?? true;\n });\n});\n\n// Check if all selected annotations on this page are resizable in group context\nconst areAllSelectedResizable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupResizable ?? tool?.interaction.isResizable ?? true;\n });\n});\n\n// Check if all selected annotations are on the same page (this page)\nconst allSelectedOnSamePage = computed(() => {\n if (!annotationProvides.value) return false;\n // Early return if not enough selections (also creates reactive dependency on allSelectedIds)\n if (allSelectedIds.value.length < 2) return false;\n const allSelected = annotationProvides.value.getSelectedAnnotations();\n // All selected must be on this page\n return allSelected.every((ta) => ta.object.pageIndex === props.pageIndex);\n});\n\n// --- Component Logic ---\nconst getTool = (annotation: TrackedAnnotation) =>\n annotationProvides.value?.findToolForAnnotation(annotation.object);\n\nconst isDraggable = (anno: TrackedAnnotation) => {\n if (isFreeText(anno) && editingId.value === anno.object.id) return false;\n if (isMultiSelected.value) return false;\n return getTool(anno)?.interaction.isDraggable ?? false;\n};\nconst isResizable = (anno: TrackedAnnotation) => {\n if (isMultiSelected.value) return false;\n return getTool(anno)?.interaction.isResizable ?? false;\n};\nconst lockAspectRatio = (anno: TrackedAnnotation) =>\n getTool(anno)?.interaction.lockAspectRatio ?? false;\n\n// Should show individual selection UI (not when multi-selected)\nconst showIndividualSelection = (anno: TrackedAnnotation) =>\n isSelected(anno) && !isMultiSelected.value;\n\n// Props to pass to AnnotationContainer (excluding selectionMenu which is handled explicitly)\nconst containerProps = computed(() => {\n const { selectionMenu: _sm, groupSelectionMenu: _gsm, ...rest } = props;\n return rest;\n});\n\nconst getVertexConfig = (annotation: TrackedAnnotation): VertexConfig<any> | undefined => {\n if (isLine(annotation)) {\n return {\n extractVertices: (anno) => [anno.linePoints.start, anno.linePoints.end],\n transformAnnotation: (anno, vertices) => ({\n ...anno,\n linePoints: { start: vertices[0], end: vertices[1] },\n }),\n };\n }\n if (isPolyline(annotation) || isPolygon(annotation)) {\n return {\n extractVertices: (anno) => anno.vertices,\n transformAnnotation: (anno, vertices) => ({ ...anno, vertices }),\n };\n }\n return undefined;\n};\n</script>\n","<template>\n <div\n v-if=\"boundingRect && activeTool\"\n :style=\"{\n mixBlendMode: blendMode,\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }\"\n >\n <Highlight\n v-if=\"activeTool.defaults.type === PdfAnnotationSubtype.HIGHLIGHT\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Underline\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.UNDERLINE\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Strikeout\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.STRIKEOUT\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Squiggly\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.SQUIGGLY\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onUnmounted, watchEffect, computed } from 'vue';\nimport { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/vue';\nimport { useAnnotationCapability } from '../hooks';\nimport Highlight from './text-markup/highlight.vue';\nimport Underline from './text-markup/underline.vue';\nimport Strikeout from './text-markup/strikeout.vue';\nimport Squiggly from './text-markup/squiggly.vue';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n}>();\n\nconst { provides: selectionProvides } = useSelectionCapability();\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst rects = ref<Rect[]>([]);\nconst boundingRect = ref<Rect | null>(null);\nconst activeTool = ref<AnnotationTool | null>(null);\n\nwatchEffect((onCleanup) => {\n const unsubscribers: (() => void)[] = [];\n\n if (selectionProvides.value) {\n const scoped = selectionProvides.value.forDocument(props.documentId);\n const off = scoped.onSelectionChange(() => {\n rects.value = scoped.getHighlightRectsForPage(props.pageIndex);\n boundingRect.value = scoped.getBoundingRectForPage(props.pageIndex);\n });\n unsubscribers.push(off);\n }\n\n if (annotationProvides.value) {\n const scoped = annotationProvides.value.forDocument(props.documentId);\n // Initialize with current active tool\n activeTool.value = scoped.getActiveTool();\n\n const off = scoped.onActiveToolChange((event) => (activeTool.value = event));\n unsubscribers.push(off);\n }\n\n onCleanup(() => {\n unsubscribers.forEach((unsub) => unsub());\n });\n});\n\nconst blendMode = computed(() => {\n if (!activeTool.value) return blendModeToCss(PdfBlendMode.Normal);\n const defaultMode =\n activeTool.value.defaults.type === PdfAnnotationSubtype.HIGHLIGHT\n ? PdfBlendMode.Multiply\n : PdfBlendMode.Normal;\n return blendModeToCss(activeTool.value.defaults.blendMode ?? defaultMode);\n});\n</script>\n","<template>\n <div :style=\"style\">\n <Circle\n v-if=\"preview.type === PdfAnnotationSubtype.CIRCLE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Square\n v-else-if=\"preview.type === PdfAnnotationSubtype.SQUARE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Polygon\n v-else-if=\"preview.type === PdfAnnotationSubtype.POLYGON\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Polyline\n v-else-if=\"preview.type === PdfAnnotationSubtype.POLYLINE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Line\n v-else-if=\"preview.type === PdfAnnotationSubtype.LINE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Ink\n v-else-if=\"preview.type === PdfAnnotationSubtype.INK\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <div\n v-else-if=\"preview.type === PdfAnnotationSubtype.FREETEXT\"\n :style=\"{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, CSSProperties } from 'vue';\nimport { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Circle, Square, Polygon, Polyline, Line, Ink } from './annotations';\n\nconst props = defineProps<{\n preview: AnyPreviewState;\n scale: number;\n}>();\n\nconst style = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${props.preview.bounds.origin.x * props.scale}px`,\n top: `${props.preview.bounds.origin.y * props.scale}px`,\n width: `${props.preview.bounds.size.width * props.scale}px`,\n height: `${props.preview.bounds.size.height * props.scale}px`,\n pointerEvents: 'none',\n zIndex: 10,\n}));\n</script>\n","<template>\n <input ref=\"fileInputRef\" type=\"file\" style=\"display: none\" />\n <canvas ref=\"canvasRef\" style=\"display: none\"></canvas>\n <PreviewRenderer\n v-for=\"[toolId, preview] in previews.entries()\"\n :key=\"toolId\"\n :preview=\"preview\"\n :scale=\"scale\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport PreviewRenderer from './preview-renderer.vue';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n}>();\n\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst previews = ref<Map<string, AnyPreviewState>>(new Map());\nconst fileInputRef = ref<HTMLInputElement | null>(null);\nconst canvasRef = ref<HTMLCanvasElement | null>(null);\n\nconst services = computed<HandlerServices>(() => ({\n requestFile: ({ accept, onFile }) => {\n const input = fileInputRef.value;\n if (!input) return;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef.value;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1);\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n}));\n\nlet unregister: (() => void) | undefined;\n\nwatchEffect((onCleanup) => {\n if (annotationPlugin.value) {\n unregister = annotationPlugin.value.registerPageHandlers(\n props.documentId,\n props.pageIndex,\n props.scale,\n {\n services: services.value,\n onPreview: (toolId, state) => {\n const next = new Map(previews.value);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n previews.value = next;\n },\n },\n );\n }\n\n onCleanup(() => {\n unregister?.();\n });\n});\n</script>\n","<template>\n <div>\n <Annotations\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"actualScale\"\n :rotation=\"actualRotation\"\n :pageWidth=\"pageWidth\"\n :pageHeight=\"pageHeight\"\n :resizeUI=\"resizeUI\"\n :vertexUI=\"vertexUI\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionMenu=\"selectionMenu\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n >\n <!-- Forward slots for manual customization (only used if selectionMenu prop not provided) -->\n <template #selection-menu=\"slotProps\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\"></slot>\n </template>\n <template #group-selection-menu=\"slotProps\">\n <slot name=\"group-selection-menu\" v-bind=\"slotProps\"></slot>\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\"></slot>\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\"></slot>\n </template>\n </Annotations>\n <TextMarkup :documentId=\"documentId\" :pageIndex=\"pageIndex\" :scale=\"actualScale\" />\n <AnnotationPaintLayer :documentId=\"documentId\" :pageIndex=\"pageIndex\" :scale=\"actualScale\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Rotation } from '@embedpdf/models';\nimport Annotations from './annotations.vue';\nimport TextMarkup from './text-markup.vue';\nimport AnnotationPaintLayer from './annotation-paint-layer.vue';\nimport {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n} from '../types';\n\nconst props = defineProps<{\n /** The ID of the document that this layer displays annotations for */\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: number;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize selection menu */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Customize group selection menu */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n}>();\n\nconst documentState = useDocumentState(() => props.documentId);\nconst page = computed(() => documentState.value?.document?.pages?.[props.pageIndex]);\nconst pageWidth = computed(() => page.value?.size?.width ?? 0);\nconst pageHeight = computed(() => page.value?.size?.height ?? 0);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nconst actualRotation = computed(() => {\n if (props.rotation !== undefined) return props.rotation;\n return documentState.value?.rotation ?? Rotation.Degree0;\n});\n</script>\n"],"names":["useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","inheritAttrs","props","__props","HANDLE_COLOR","VERTEX_COLOR","preview","shallowRef","toRaw","trackedAnnotation","object","provides","annotationCapability","plugin","annotationPlugin","permissions","useDocumentPermissions","documentId","gestureBaseRef","ref","gestureBaseRectRef","effectiveIsDraggable","computed","value","canModifyAnnotations","isDraggable","isMultiSelected","effectiveIsResizable","isResizable","guardedOnDoubleClick","onDoubleClick","e","_a","call","annotationProvides","forDocument","currentObject","showOutline","isSelected","shouldShowMenu","selectionMenu","slots","menuRect","origin","x","rect","scale","y","size","width","height","menuContext","type","annotation","pageIndex","menuPlacement","suggestTop","spaceAbove","spaceBelow","renderSelectionMenu","menuWrapperProps","selected","placement","context","elementSnapshot","verticesSnapshot","obj","vertexConfig","extractVertices","constraintsSnapshot","minWidth","minHeight","boundingBox","pageWidth","pageHeight","dragProps","vertices","resize","useInteractionHandles","controller","element","constraints","maintainAspectRatio","lockAspectRatio","pageRotation","rotation","enabled","onUpdate","event","transformData","changes","metadata","pageSize","state","startDrag","annotationIds","startResize","resizeHandle","handle","delta","updateDrag","updateResize","base","vertexChanges","transformAnnotation","patched","_b","_c","updateAnnotation","commitDrag","commitResize","resizeUI","handleSize","spacing","outlineOffset","offsetMode","includeSides","zIndex","vertexUI","vertexSize","includeVertices","doubleProps","useDoublePressProps","watch","newObject","deep","watchEffect","onCleanup","handleEvent","patch","previewPatches","unsubs","onDragChange","onResizeChange","forEach","u","containerStyle","position","left","top","outline","selectionOutlineColor","pointerEvents","touchAction","cursor","mergedContainerStyle","style","useSlots","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_mergeProps","_unref","_renderSlot","_ctx","$slots","_Fragment","key","backgroundColor","ref_for","length","vertex","_createBlock","CounterRotate","default","_withCtx","_resolveDynamicComponent","gestureBase","isDraggingRef","isResizingRef","color","HANDLE_SIZE","groupBox","rects","selectedAnnotations","map","ta","boundingRectOrEmpty","previewGroupBox","newGroupBox","immediate","boxStyle","annotations","groupSelectionMenu","renderGroupMenu","transformType","isMove","isResize","newRect","rawDelta","clampedDelta","onPointerdown","$event","stopPropagation","geometry","outerW","outerH","innerW","Math","max","strokeWidth","innerH","cx","cy","rx","ry","svgWidth","svgHeight","_normalizeStyle","viewBox","fill","opacity","_cache","onClick","args","onTouchstart","stroke","strokeColor","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","editorRef","isIOS","onMounted","nav","navigator","test","userAgent","platform","maxTouchPoints","isEditing","editing","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","handleBlur","contents","innerText","editorStyle","anno","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","overflow","transform","transformOrigin","onBlur","tabindex","contenteditable","resolvedColor","paths","inkList","points","d","i","lx","ly","trim","_renderList","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","getEndingStyle","ending","strokeLinecap","filled","dashArray","isUnderline","UNDERLINE","hitAreaCursor","hasIRT","hitAreaPointerEvents","allPoints","currentVertex","localPts","pathData","first","rest","isPreview","p","isPreviewing","toAngle","a","b","startRad","endRad","imageUrl","urlRef","currentTask","annotationId","rectWidth","rectHeight","scaleFactor","_","__","URL","revokeObjectURL","task","renderAnnotation","deepToRaw","options","dpr","devicePixelRatio","wait","blob","url","createObjectURL","ignore","abort","code","PdfErrorCode","Cancelled","message","onUnmounted","handleImageLoad","src","onLoad","_createVNode","RenderAnnotation","segmentRects","amplitude","period","svgDataUri","amp","per","svg","encodeURIComponent","r","backgroundSize","thickness","selectionProvides","useSelectionCapability","allSelectedIds","register","usePointerHandlers","editingId","currentState","getState","getAnnotationsByPageIndex","getSelectedAnnotationIds","onStateChange","handlePointerDown","_pos","pe","target","currentTarget","deselectAnnotation","handleClick","clear","metaKey","ctrlKey","toggleSelection","selectAnnotation","handleLinkClick","inReplyToId","parentId","parent","find","unregister","onPointerDown","includes","selectedAnnotationsOnPage","filter","areAllSelectedDraggable","every","tool","findToolForAnnotation","interaction","isGroupDraggable","areAllSelectedResizable","isGroupResizable","allSelectedOnSamePage","getSelectedAnnotations","getTool","isFreeText","showIndividualSelection","containerProps","_sm","_gsm","getVertexConfig","isLine","isPolyline","isPolygon","isInk","AnnotationContainer","onSelect","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","_createSlots","AnnoComponents.Ink","slotProps","fn","isSquare","AnnoComponents.Square","isCircle","AnnoComponents.Circle","AnnoComponents.Line","AnnoComponents.Polyline","AnnoComponents.Polygon","handleDoubleClick","AnnoComponents.FreeText","isStamp","AnnoComponents.Stamp","TextMarkupComponents.Underline","isStrikeout","TextMarkupComponents.Strikeout","isSquiggly","TextMarkupComponents.Squiggly","isHighlight","Multiply","TextMarkupComponents.Highlight","isLink","AnnoComponents.Link","GroupSelectionBox","boundingRect","activeTool","unsubscribers","scoped","off","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","push","getActiveTool","onActiveToolChange","unsub","defaultMode","defaults","PdfAnnotationSubtype","HIGHLIGHT","Highlight","Underline","STRIKEOUT","Strikeout","SQUIGGLY","Squiggly","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","previews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","entries","PreviewRenderer","documentState","useDocumentState","page","pages","actualScale","actualRotation","Rotation","Degree0","Annotations","TextMarkup","AnnotationPaintLayer","toValue","initialDocumentState","providesValue","docId","scope","newState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/vue/hooks/use-annotation.ts","../../src/vue/components/annotation-container.vue","../../src/vue/components/group-selection-box.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/annotations/free-text.vue","../../src/vue/components/annotations/ink.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/annotations/link.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/render-annotation.vue","../../src/vue/components/annotations/stamp.vue","../../src/vue/components/text-markup/highlight.vue","../../src/vue/components/text-markup/squiggly.vue","../../src/vue/components/text-markup/strikeout.vue","../../src/vue/components/text-markup/underline.vue","../../src/vue/components/annotations.vue","../../src/vue/components/text-markup.vue","../../src/vue/components/preview-renderer.vue","../../src/vue/components/annotation-paint-layer.vue","../../src/vue/context/renderer-registry.ts","../../src/vue/components/annotation-layer.vue","../../src/vue/components/renderer-registry-provider.vue","../../src/vue/index.ts"],"sourcesContent":["import { ref, watch, computed, toValue, type MaybeRefOrGetter } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n\n/**\n * Hook for annotation state for a specific document\n * @param documentId Document ID (can be ref, computed, getter, or plain value)\n */\nexport const useAnnotation = (documentId: MaybeRefOrGetter<string>) => {\n const { provides } = useAnnotationCapability();\n const state = ref<AnnotationDocumentState>(\n provides?.value?.forDocument(toValue(documentId))?.getState() ?? initialDocumentState(),\n );\n\n watch(\n [provides, () => toValue(documentId)],\n ([providesValue, docId], _, onCleanup) => {\n if (providesValue && docId) {\n const scope = providesValue.forDocument(docId);\n state.value = scope.getState();\n\n const unsubscribe = scope.onStateChange((newState) => {\n state.value = newState;\n });\n onCleanup(unsubscribe);\n }\n },\n { immediate: true },\n );\n\n return {\n state,\n provides: computed(() => provides.value?.forDocument(toValue(documentId)) ?? null),\n };\n};\n","<template>\n <div data-no-interaction :style=\"{ display: 'contents' }\">\n <div\n v-bind=\"{ ...(effectiveIsDraggable && isSelected ? dragProps : {}), ...doubleProps }\"\n :style=\"mergedContainerStyle\"\n >\n <slot :annotation=\"currentObject\"></slot>\n\n <!-- Resize handles - only when single-selected -->\n <template v-if=\"isSelected && effectiveIsResizable\">\n <template v-for=\"{ key, style, ...handle } in resize\" :key=\"key\">\n <slot\n v-if=\"slots['resize-handle']\"\n name=\"resize-handle\"\n v-bind=\"{ key, style, ...handle, backgroundColor: HANDLE_COLOR }\"\n >\n <!-- Fallback content if slot is provided but empty -->\n <div v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </template>\n </template>\n\n <!-- Vertex handles - only when single-selected -->\n <template\n v-if=\"\n isSelected && permissions.canModifyAnnotations && !isMultiSelected && vertices.length > 0\n \"\n >\n <template v-for=\"{ key, style, ...vertex } in vertices\" :key=\"key\">\n <slot\n v-if=\"slots['vertex-handle']\"\n name=\"vertex-handle\"\n v-bind=\"{ key, style, ...vertex, backgroundColor: VERTEX_COLOR }\"\n >\n <!-- Fallback content if slot is provided but empty -->\n <div v-bind=\"vertex\" :style=\"[style, { backgroundColor: VERTEX_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"vertex\" :style=\"[style, { backgroundColor: VERTEX_COLOR }]\" />\n </template>\n </template>\n </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot - hide when multi-selected -->\n <CounterRotate v-if=\"shouldShowMenu\" :rect=\"menuRect\" :rotation=\"rotation\">\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"selectionMenu\" :is=\"renderSelectionMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"selection-menu\"\n :context=\"menuContext\"\n :selected=\"isSelected\"\n :rect=\"rect\"\n :placement=\"menuPlacement\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </div>\n</template>\n\n<script lang=\"ts\">\n// Disable attribute inheritance so style doesn't fall through to root element\nexport default {\n inheritAttrs: false,\n};\n</script>\n\n<script setup lang=\"ts\" generic=\"T extends PdfAnnotationObject\">\nimport { ref, computed, watchEffect, useSlots, toRaw, shallowRef, VNode } from 'vue';\nimport { PdfAnnotationObject, Rect } from '@embedpdf/models';\nimport {\n CounterRotate,\n MenuWrapperProps,\n SelectionMenuPlacement,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/vue';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useDocumentPermissions } from '@embedpdf/core/vue';\nimport { VertexConfig } from '../../shared/types';\nimport { useAnnotationCapability, useAnnotationPlugin } from '../hooks';\nimport { AnnotationSelectionContext, AnnotationSelectionMenuRenderFn } from '../types';\n\nconst props = withDefaults(\n defineProps<{\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n isSelected: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: PointerEvent | MouseEvent) => void;\n onSelect: (event: TouchEvent | MouseEvent) => void;\n zIndex?: number;\n selectionOutlineColor?: string;\n style?: Record<string, string | number>;\n }>(),\n {\n lockAspectRatio: false,\n isMultiSelected: false,\n outlineOffset: 1,\n zIndex: 1,\n selectionOutlineColor: '#007ACC',\n },\n);\n\nconst HANDLE_COLOR = '#007ACC';\nconst VERTEX_COLOR = '#007ACC';\nconst HANDLE_SIZE = 12;\nconst VERTEX_SIZE = 12;\n\nconst preview = shallowRef<Partial<T>>(toRaw(props.trackedAnnotation.object));\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst permissions = useDocumentPermissions(props.documentId);\nconst gestureBaseRef = ref<T | null>(null);\nconst gestureBaseRectRef = shallowRef<Rect | null>(null);\n\n// When multi-selected, disable individual drag/resize - GroupSelectionBox handles it\nconst effectiveIsDraggable = computed(\n () => permissions.value.canModifyAnnotations && props.isDraggable && !props.isMultiSelected,\n);\nconst effectiveIsResizable = computed(\n () => permissions.value.canModifyAnnotations && props.isResizable && !props.isMultiSelected,\n);\n\n// Wrap onDoubleClick to respect permissions - check at call time\nconst guardedOnDoubleClick = props.onDoubleClick\n ? (e: PointerEvent | MouseEvent) => {\n if (permissions.value.canModifyAnnotations) {\n props.onDoubleClick?.(e);\n }\n }\n : undefined;\n\n// Get scoped API for this document (similar to React's useMemo)\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\nconst currentObject = computed<T>(\n () => ({ ...toRaw(props.trackedAnnotation.object), ...toRaw(preview.value) }) as T,\n);\n\n// Determine if we should show the outline\n// When multi-selected, don't show individual outlines - GroupSelectionBox shows the group outline\nconst showOutline = computed(() => props.isSelected && !props.isMultiSelected);\n\n// --- Selection Menu Logic ---\n\n// Check if we should show any menu at all - hide when multi-selected\nconst shouldShowMenu = computed(() => {\n return (\n props.isSelected && !props.isMultiSelected && (props.selectionMenu || slots['selection-menu'])\n );\n});\n\n// Computed rect for menu positioning\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: currentObject.value.rect.origin.x * props.scale,\n y: currentObject.value.rect.origin.y * props.scale,\n },\n size: {\n width: currentObject.value.rect.size.width * props.scale,\n height: currentObject.value.rect.size.height * props.scale,\n },\n}));\n\n// Build the context object for selection menu\nconst menuContext = computed<AnnotationSelectionContext>(() => ({\n type: 'annotation',\n annotation: props.trackedAnnotation,\n pageIndex: props.pageIndex,\n}));\n\n// Placement hints\nconst menuPlacement = computed<SelectionMenuPlacement>(() => ({\n suggestTop: false, // Could calculate based on position in viewport\n spaceAbove: 0,\n spaceBelow: 0,\n}));\n\n// Render via function (for schema-driven approach)\nconst renderSelectionMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.selectionMenu) return null;\n\n return props.selectionMenu({\n rect,\n menuWrapperProps,\n selected: props.isSelected,\n placement: menuPlacement.value,\n context: menuContext.value,\n });\n};\n\nconst elementSnapshot = computed(() => {\n const obj = toRaw(currentObject.value);\n return obj.rect; // plain-ish; composable will normalize fully\n});\n\nconst verticesSnapshot = computed(() => {\n const obj = toRaw(currentObject.value);\n return props.vertexConfig?.extractVertices(obj) ?? [];\n});\n\nconst constraintsSnapshot = computed(() => ({\n minWidth: 10,\n minHeight: 10,\n boundingBox: {\n width: props.pageWidth,\n height: props.pageHeight,\n },\n}));\n\nconst { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: verticesSnapshot,\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\n pageRotation: computed(() => props.rotation),\n scale: computed(() => props.scale),\n // Disable interaction handles when multi-selected\n enabled: computed(() => props.isSelected && !props.isMultiSelected),\n onUpdate: (event) => {\n if (!event.transformData?.type || props.isMultiSelected) return;\n\n const plugin = annotationPlugin.value;\n if (!plugin) return;\n\n const { type, changes, metadata } = event.transformData;\n const id = props.trackedAnnotation.object.id;\n const pageSize = { width: props.pageWidth, height: props.pageHeight };\n\n // Gesture start - initialize plugin drag/resize\n if (event.state === 'start') {\n gestureBaseRectRef.value = props.trackedAnnotation.object.rect;\n gestureBaseRef.value = currentObject.value; // For vertex edit\n\n if (type === 'move') {\n plugin.startDrag(props.documentId, { annotationIds: [id], pageSize });\n } else if (type === 'resize') {\n plugin.startResize(props.documentId, {\n annotationIds: [id],\n pageSize,\n resizeHandle: metadata?.handle ?? 'se',\n });\n }\n }\n\n // Gesture update - call plugin, preview comes from subscription\n if (changes.rect && gestureBaseRectRef.value) {\n if (type === 'move') {\n const delta = {\n x: changes.rect.origin.x - gestureBaseRectRef.value.origin.x,\n y: changes.rect.origin.y - gestureBaseRectRef.value.origin.y,\n };\n plugin.updateDrag(props.documentId, delta);\n } else if (type === 'resize') {\n plugin.updateResize(props.documentId, changes.rect);\n }\n }\n\n // Vertex edit - handle directly (no attached link handling needed)\n if (type === 'vertex-edit' && changes.vertices && props.vertexConfig) {\n const base = gestureBaseRef.value ?? currentObject.value;\n const vertexChanges = props.vertexConfig.transformAnnotation(toRaw(base), changes.vertices);\n const patched = annotationCapability.value?.transformAnnotation<T>(base, {\n type,\n changes: vertexChanges as Partial<T>,\n metadata,\n });\n if (patched) {\n preview.value = { ...toRaw(preview.value), ...patched };\n if (event.state === 'end') {\n annotationProvides.value?.updateAnnotation(props.pageIndex, id, patched);\n }\n }\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureBaseRectRef.value = null;\n gestureBaseRef.value = null;\n if (type === 'move') plugin.commitDrag(props.documentId);\n else if (type === 'resize') plugin.commitResize(props.documentId);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: props.outlineOffset,\n offsetMode: 'outside',\n includeSides: !props.lockAspectRatio,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: props.zIndex + 2,\n },\n includeVertices: !!props.vertexConfig,\n});\n\nconst doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n// Sync preview with tracked annotation when it changes\nwatchEffect(() => {\n if (props.trackedAnnotation.object) {\n preview.value = props.trackedAnnotation.object;\n }\n});\n\n// Subscribe to unified drag/resize changes - plugin sends pre-computed patches!\n// ALL preview updates come through here (primary, attached links, multi-select)\nwatchEffect((onCleanup) => {\n const plugin = annotationPlugin.value;\n if (!plugin) return;\n\n const id = props.trackedAnnotation.object.id;\n\n const handleEvent = (event: {\n documentId: string;\n type: string;\n previewPatches?: Record<string, any>;\n }) => {\n if (event.documentId !== props.documentId) return;\n const patch = event.previewPatches?.[id];\n if (event.type === 'update' && patch) {\n preview.value = { ...toRaw(preview.value), ...patch } as T;\n } else if (event.type === 'cancel') {\n preview.value = props.trackedAnnotation.object;\n }\n };\n\n const unsubs = [plugin.onDragChange(handleEvent), plugin.onResizeChange(handleEvent)];\n\n onCleanup(() => unsubs.forEach((u) => u()));\n});\n\nconst containerStyle = computed(() => ({\n position: 'absolute' as 'absolute',\n left: `${currentObject.value.rect.origin.x * props.scale}px`,\n top: `${currentObject.value.rect.origin.y * props.scale}px`,\n width: `${currentObject.value.rect.size.width * props.scale}px`,\n height: `${currentObject.value.rect.size.height * props.scale}px`,\n outline: showOutline.value ? `1px solid ${props.selectionOutlineColor}` : 'none',\n outlineOffset: showOutline.value ? `${props.outlineOffset}px` : '0px',\n pointerEvents: props.isSelected && !props.isMultiSelected ? 'auto' : ('none' as 'auto' | 'none'),\n touchAction: 'none',\n cursor: props.isSelected && effectiveIsDraggable.value ? 'move' : 'default',\n zIndex: props.zIndex,\n}));\n\n// Merge container style with passed style prop (for mixBlendMode, etc.)\nconst mergedContainerStyle = computed(() => ({\n ...containerStyle.value,\n ...(props.style ?? {}),\n}));\n\n// Add useSlots to access slot information\nconst slots = useSlots();\n</script>\n","<template>\n <div v-if=\"selectedAnnotations.length >= 2\" data-group-selection-box data-no-interaction>\n <!-- Group box - draggable only if effectiveIsDraggable is true -->\n <div\n v-bind=\"effectiveIsDraggable ? dragProps : {}\"\n :style=\"boxStyle\"\n @pointerdown=\"!effectiveIsDraggable ? $event.stopPropagation() : undefined\"\n >\n <!-- Resize handles -->\n <template v-if=\"effectiveIsResizable\">\n <template v-for=\"{ key, style, ...handle } in resize\" :key=\"key\">\n <slot\n v-if=\"slots['resize-handle']\"\n name=\"resize-handle\"\n v-bind=\"{ key, style, ...handle, backgroundColor: HANDLE_COLOR }\"\n >\n <div v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </slot>\n <div v-else v-bind=\"handle\" :style=\"[style, { backgroundColor: HANDLE_COLOR }]\" />\n </template>\n </template>\n </div>\n\n <!-- Group selection menu -->\n <CounterRotate v-if=\"shouldShowMenu\" :rect=\"menuRect\" :rotation=\"rotation\">\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"groupSelectionMenu\" :is=\"renderGroupMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"group-selection-menu\"\n :context=\"menuContext\"\n :selected=\"true\"\n :rect=\"rect\"\n :placement=\"menuPlacement\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, useSlots, VNode, shallowRef, watch } from 'vue';\nimport { Rect, boundingRectOrEmpty } from '@embedpdf/models';\nimport {\n CounterRotate,\n MenuWrapperProps,\n SelectionMenuPlacement,\n useInteractionHandles,\n} from '@embedpdf/utils/vue';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useDocumentPermissions } from '@embedpdf/core/vue';\nimport { useAnnotationPlugin } from '../hooks';\nimport {\n GroupSelectionContext,\n GroupSelectionMenuProps,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n} from '../types';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n /** All selected annotations on this page */\n selectedAnnotations: TrackedAnnotation[];\n /** Whether the group is draggable (all annotations must be group-draggable) */\n isDraggable: boolean;\n /** Whether the group is resizable (all annotations must be group-resizable) */\n isResizable: boolean;\n /** Resize handle UI customization */\n resizeUI?: ResizeHandleUI;\n /** Selection outline color */\n selectionOutlineColor?: string;\n /** Outline offset */\n outlineOffset?: number;\n /** Z-index for the group box */\n zIndex?: number;\n /** Group selection menu render function */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n }>(),\n {\n selectionOutlineColor: '#007ACC',\n outlineOffset: 2,\n zIndex: 100,\n },\n);\n\nconst slots = useSlots();\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst permissions = useDocumentPermissions(() => props.documentId);\nconst gestureBase = shallowRef<Rect | null>(null);\nconst isDraggingRef = ref(false);\nconst isResizingRef = ref(false);\n\n// Check permissions before allowing drag/resize\nconst effectiveIsDraggable = computed(\n () => permissions.value.canModifyAnnotations && props.isDraggable,\n);\nconst effectiveIsResizable = computed(\n () => permissions.value.canModifyAnnotations && props.isResizable,\n);\n\nconst HANDLE_COLOR = computed(() => props.resizeUI?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUI?.size ?? 12);\n\n// Compute the group bounding box from all selected annotations\nconst groupBox = computed(() => {\n const rects = props.selectedAnnotations.map((ta) => ta.object.rect);\n return boundingRectOrEmpty(rects);\n});\n\n// Preview state for the group box during drag/resize\nconst previewGroupBox = shallowRef<Rect>(groupBox.value);\n\n// Watch for groupBox changes and sync previewGroupBox when not dragging/resizing\n// Use watchEffect equivalent via computed with side effects won't work, need explicit watch\nwatch(\n () => groupBox.value,\n (newGroupBox) => {\n if (!isDraggingRef.value && !isResizingRef.value) {\n previewGroupBox.value = newGroupBox;\n }\n },\n { immediate: true },\n);\n\n// Box styling\nconst boxStyle = computed(() => ({\n position: 'absolute' as 'absolute',\n left: `${previewGroupBox.value.origin.x * props.scale}px`,\n top: `${previewGroupBox.value.origin.y * props.scale}px`,\n width: `${previewGroupBox.value.size.width * props.scale}px`,\n height: `${previewGroupBox.value.size.height * props.scale}px`,\n outline: `2px dashed ${props.selectionOutlineColor}`,\n outlineOffset: `${props.outlineOffset - 1}px`,\n cursor: effectiveIsDraggable.value ? 'move' : 'default',\n touchAction: 'none',\n zIndex: props.zIndex,\n}));\n\n// Menu rect for counter-rotate component\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: previewGroupBox.value.origin.x * props.scale,\n y: previewGroupBox.value.origin.y * props.scale,\n },\n size: {\n width: previewGroupBox.value.size.width * props.scale,\n height: previewGroupBox.value.size.height * props.scale,\n },\n}));\n\n// Menu context\nconst menuContext = computed<GroupSelectionContext>(() => ({\n type: 'group',\n annotations: props.selectedAnnotations,\n pageIndex: props.pageIndex,\n}));\n\n// Placement hints\nconst menuPlacement = computed<SelectionMenuPlacement>(() => ({\n suggestTop: false,\n}));\n\n// Check if we should show menu\nconst shouldShowMenu = computed(() => {\n return props.groupSelectionMenu || slots['group-selection-menu'];\n});\n\n// Render menu via function\nconst renderGroupMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.groupSelectionMenu) return null;\n\n return props.groupSelectionMenu({\n rect,\n menuWrapperProps,\n selected: true,\n placement: menuPlacement.value,\n context: menuContext.value,\n });\n};\n\n// Element snapshot for interaction handles\nconst elementSnapshot = computed(() => previewGroupBox.value);\n\n// Constraints\nconst constraintsSnapshot = computed(() => ({\n minWidth: 20,\n minHeight: 20,\n boundingBox: {\n width: props.pageWidth,\n height: props.pageHeight,\n },\n}));\n\n// Use interaction handles for both drag and resize\nconst { dragProps, resize } = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: computed(() => []),\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => false),\n pageRotation: computed(() => props.rotation),\n scale: computed(() => props.scale),\n enabled: computed(() => true),\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n if (!annotationPlugin.value) return;\n\n const plugin = annotationPlugin.value;\n const transformType = event.transformData.type;\n const isMove = transformType === 'move';\n const isResize = transformType === 'resize';\n\n // Skip drag operations if group is not draggable\n if (isMove && !effectiveIsDraggable.value) return;\n\n if (event.state === 'start') {\n gestureBase.value = groupBox.value;\n\n if (isMove) {\n isDraggingRef.value = true;\n // Use unified drag API - plugin handles attached links automatically\n plugin.startDrag(props.documentId, {\n annotationIds: props.selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: props.pageWidth, height: props.pageHeight },\n });\n } else if (isResize) {\n isResizingRef.value = true;\n // Use unified resize API - plugin handles attached links automatically\n plugin.startResize(props.documentId, {\n annotationIds: props.selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: props.pageWidth, height: props.pageHeight },\n resizeHandle: event.transformData.metadata?.handle ?? 'se',\n });\n }\n }\n\n const base = gestureBase.value ?? groupBox.value;\n\n if (isMove && event.transformData.changes.rect) {\n // Calculate delta from original position\n const newRect = event.transformData.changes.rect;\n const rawDelta = {\n x: newRect.origin.x - base.origin.x,\n y: newRect.origin.y - base.origin.y,\n };\n\n // Plugin clamps delta and emits events (attached links receive updates too)\n const clampedDelta = plugin.updateDrag(props.documentId, rawDelta);\n\n // Update preview group box with clamped delta\n previewGroupBox.value = {\n ...base,\n origin: {\n x: base.origin.x + clampedDelta.x,\n y: base.origin.y + clampedDelta.y,\n },\n };\n } else if (isResize && event.transformData.changes.rect) {\n const newGroupBox = event.transformData.changes.rect;\n\n // Plugin computes rects for all participants and emits events\n plugin.updateResize(props.documentId, newGroupBox);\n\n // Update preview\n previewGroupBox.value = newGroupBox;\n }\n\n if (event.state === 'end') {\n gestureBase.value = null;\n\n if (isMove && isDraggingRef.value) {\n isDraggingRef.value = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitDrag(props.documentId);\n } else if (isResize && isResizingRef.value) {\n isResizingRef.value = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitResize(props.documentId);\n }\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE.value,\n spacing: props.outlineOffset,\n offsetMode: 'outside',\n includeSides: true,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: props.zIndex,\n },\n includeVertices: false,\n});\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${geometry.width} ${geometry.height}`\"\n >\n <ellipse\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n :fill=\"color\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\ninterface CircleProps {\n isSelected: boolean;\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n}\n\nconst props = withDefaults(defineProps<CircleProps>(), {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n});\n\nconst geometry = computed(() => {\n const outerW = props.rect.size.width;\n const outerH = props.rect.size.height;\n const innerW = Math.max(outerW - props.strokeWidth, 0);\n const innerH = Math.max(outerH - props.strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n cx: props.strokeWidth / 2 + innerW / 2,\n cy: props.strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n});\n\nconst svgWidth = computed(() => geometry.value.width * props.scale);\nconst svgHeight = computed(() => geometry.value.height * props.scale);\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n width: `${annotation.object.rect.size.width * scale}px`,\n height: `${annotation.object.rect.size.height * scale}px`,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n >\n <span\n ref=\"editorRef\"\n @blur=\"handleBlur\"\n tabindex=\"0\"\n :style=\"editorStyle\"\n :contenteditable=\"isEditing\"\n >{{ annotation.object.contents }}</span\n >\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, onMounted } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = defineProps<{\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n}>();\n\nconst editorRef = ref<HTMLSpanElement | null>(null);\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst isIOS = ref(false);\n\nonMounted(() => {\n try {\n const nav = navigator as any;\n isIOS.value =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n } catch {\n isIOS.value = false;\n }\n});\n\nwatch(\n () => props.isEditing,\n (editing) => {\n if (editing && editorRef.value) {\n const editor = editorRef.value;\n editor.focus();\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n },\n);\n\nconst handleBlur = () => {\n if (!annotationProvides.value || !editorRef.value) return;\n annotationProvides.value.updateAnnotation(props.pageIndex, props.annotation.object.id, {\n contents: editorRef.value.innerText,\n });\n};\n\nconst editorStyle = computed(() => {\n const { object: anno } = props.annotation;\n const computedFontPx = anno.fontSize * props.scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS.value && props.isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return {\n color: anno.fontColor,\n fontSize: `${adjustedFontPx}px`,\n fontFamily: standardFontCss(anno.fontFamily),\n textAlign: textAlignmentToCss(anno.textAlign),\n flexDirection: 'column' as 'column',\n justifyContent:\n anno.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : anno.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: anno.color ?? anno.backgroundColor,\n opacity: anno.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: props.isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n };\n});\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n v-for=\"(d, i) in paths\"\n :key=\"i\"\n :d=\"d\"\n fill=\"none\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n /** Stroke color */\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n inkList: PdfInkListObject[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 1,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#000000');\n\nconst paths = computed(() => {\n return props.inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n const lx = x - props.rect.origin.x;\n const ly = y - props.rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + `${lx} ${ly} `;\n });\n return d.trim();\n });\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :stroke=\"strokeColor\"\n :style=\"getEndingStyle(endings.start)\"\n :fill=\"endings.start.filled ? color : 'none'\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :stroke=\"strokeColor\"\n :style=\"getEndingStyle(endings.end)\"\n :fill=\"endings.end.filled ? color : 'none'\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst props = withDefaults(\n defineProps<{\n color?: string;\n opacity?: number;\n strokeWidth: number;\n strokeColor?: string;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n linePoints: LinePoints;\n lineEndings?: LineEndings;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n isSelected: boolean;\n }>(),\n {\n color: 'transparent',\n opacity: 1,\n strokeColor: '#000000',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n);\n\nconst localLine = computed(() => ({\n x1: props.linePoints.start.x - props.rect.origin.x,\n y1: props.linePoints.start.y - props.rect.origin.y,\n x2: props.linePoints.end.x - props.rect.origin.x,\n y2: props.linePoints.end.y - props.rect.origin.y,\n}));\n\nconst endings = computed(() => {\n const { x1, y1, x2, y2 } = localLine.value;\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(\n props.lineEndings?.start,\n props.strokeWidth,\n angle + Math.PI,\n x1,\n y1,\n ),\n end: patching.createEnding(props.lineEndings?.end, props.strokeWidth, angle, x2, y2),\n };\n});\n\nconst getEndingStyle = (ending: patching.SvgEnding) => ({\n cursor: props.isSelected ? 'move' : 'pointer',\n strokeWidth: props.strokeWidth,\n strokeLinecap: 'butt' as 'butt',\n pointerEvents: (props.isSelected ? 'none' : ending.filled ? 'visible' : 'visibleStroke') as\n | 'none'\n | 'visible'\n | 'visibleStroke',\n ...(props.strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: props.strokeDashArray?.join(','),\n }),\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${svgWidth}px`,\n height: `${svgHeight}px`,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${width} ${height}`\"\n >\n <!-- Invisible hit area for the entire link region -->\n <!-- IRT links are not directly clickable - interaction goes through parent -->\n <rect\n :x=\"0\"\n :y=\"0\"\n :width=\"width\"\n :height=\"height\"\n fill=\"transparent\"\n @pointerdown=\"hasIRT ? undefined : onClick\"\n @touchstart=\"hasIRT ? undefined : onClick\"\n :style=\"{\n cursor: hitAreaCursor,\n pointerEvents: hitAreaPointerEvents,\n }\"\n />\n\n <!-- Underline style: line at bottom of rect -->\n <line\n v-if=\"isUnderline\"\n :x1=\"1\"\n :y1=\"height - 1\"\n :x2=\"width - 1\"\n :y2=\"height - 1\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth\"\n :stroke-dasharray=\"dashArray\"\n style=\"pointer-events: none\"\n />\n\n <!-- Solid/Dashed style: rectangle border -->\n <rect\n v-else\n :x=\"strokeWidth / 2\"\n :y=\"strokeWidth / 2\"\n :width=\"Math.max(width - strokeWidth, 0)\"\n :height=\"Math.max(height - strokeWidth, 0)\"\n fill=\"transparent\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth\"\n :stroke-dasharray=\"dashArray\"\n style=\"pointer-events: none\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour – defaults to blue when omitted */\n strokeColor?: string;\n /** Stroke width in PDF units */\n strokeWidth?: number;\n /** Stroke type – defaults to underline when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – for dashed style */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent | TouchEvent) => void;\n /** Whether this link has an IRT (In Reply To) reference - disables direct interaction */\n hasIRT?: boolean;\n }>(),\n {\n strokeColor: '#0000FF',\n strokeWidth: 2,\n strokeStyle: PdfAnnotationBorderStyle.UNDERLINE,\n hasIRT: false,\n },\n);\n\nconst width = computed(() => props.rect.size.width);\nconst height = computed(() => props.rect.size.height);\nconst svgWidth = computed(() => width.value * props.scale);\nconst svgHeight = computed(() => height.value * props.scale);\n\n// Calculate dash array for SVG\nconst dashArray = computed(() => {\n if (props.strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n return props.strokeDashArray?.join(',') ?? `${props.strokeWidth * 3},${props.strokeWidth}`;\n }\n return undefined;\n});\n\n// For underline style, render a line at the bottom\n// For solid/dashed, render a rectangle border\nconst isUnderline = computed(() => props.strokeStyle === PdfAnnotationBorderStyle.UNDERLINE);\n\nconst hitAreaCursor = computed(() =>\n props.hasIRT ? 'default' : props.isSelected ? 'move' : 'pointer',\n);\nconst hitAreaPointerEvents = computed(() =>\n props.hasIRT ? 'none' : props.isSelected ? 'none' : 'visible',\n);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n :d=\"pathData\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :opacity=\"opacity\"\n :style=\"{\n fill: currentVertex ? 'none' : color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n <path\n v-if=\"isPreviewing && localPts.length > 1\"\n :d=\"`M ${localPts[localPts.length - 1].x} ${\n localPts[localPts.length - 1].y\n } L ${localPts[0].x} ${localPts[0].y}`\"\n fill=\"none\"\n :style=\"{\n stroke: strokeColor,\n strokeWidth,\n strokeDasharray: '4,4',\n opacity: 0.7,\n }\"\n />\n <rect\n v-if=\"isPreviewing && localPts.length >= 2\"\n :x=\"localPts[0].x - handleSize / scale / 2\"\n :y=\"localPts[0].y - handleSize / scale / 2\"\n :width=\"handleSize / scale\"\n :height=\"handleSize / scale\"\n :fill=\"strokeColor\"\n :opacity=\"0.4\"\n :stroke=\"strokeColor\"\n :stroke-width=\"strokeWidth / 2\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n currentVertex?: Position;\n handleSize?: number;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n handleSize: 14,\n },\n);\n\nconst allPoints = computed(() =>\n props.currentVertex ? [...props.vertices, props.currentVertex] : props.vertices,\n);\n\nconst localPts = computed(() =>\n allPoints.value.map(({ x, y }) => ({\n x: x - props.rect.origin.x,\n y: y - props.rect.origin.y,\n })),\n);\n\nconst pathData = computed(() => {\n if (!localPts.value.length) return '';\n const [first, ...rest] = localPts.value;\n const isPreview = !!props.currentVertex;\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n});\n\nconst isPreviewing = computed(() => props.currentVertex && props.vertices.length > 0);\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: `${width}px`,\n height: `${height}px`,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }\"\n :width=\"width\"\n :height=\"height\"\n :viewBox=\"`0 0 ${rect.size.width} ${rect.size.height}`\"\n >\n <path\n :d=\"pathData\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :opacity=\"opacity\"\n :style=\"{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"getEndingStyle(endings.start)\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n :stroke=\"strokeColor\"\n :fill=\"endings.end.filled ? color : 'none'\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"getEndingStyle(endings.end)\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst props = withDefaults(\n defineProps<{\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n lineEndings?: LineEndings;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n },\n);\n\nconst localPts = computed(() =>\n props.vertices.map(({ x, y }) => ({\n x: x - props.rect.origin.x,\n y: y - props.rect.origin.y,\n })),\n);\n\nconst pathData = computed(() => {\n if (localPts.value.length === 0) return '';\n const [first, ...rest] = localPts.value;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('')).trim();\n});\n\nconst endings = computed(() => {\n if (localPts.value.length < 2) return { start: null, end: null };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts.value[0], localPts.value[1]);\n const endRad = toAngle(\n localPts.value[localPts.value.length - 2],\n localPts.value[localPts.value.length - 1],\n );\n\n return {\n start: patching.createEnding(\n props.lineEndings?.start,\n props.strokeWidth,\n startRad + Math.PI,\n localPts.value[0].x,\n localPts.value[0].y,\n ),\n end: patching.createEnding(\n props.lineEndings?.end,\n props.strokeWidth,\n endRad,\n localPts.value[localPts.value.length - 1].x,\n localPts.value[localPts.value.length - 1].y,\n ),\n };\n});\n\nconst getEndingStyle = (ending: patching.SvgEnding) => ({\n cursor: props.isSelected ? 'move' : 'pointer',\n strokeWidth: props.strokeWidth,\n pointerEvents: (props.isSelected ? 'none' : ending.filled ? 'visible' : 'visibleStroke') as\n | 'none'\n | 'visible'\n | 'visibleStroke',\n strokeLinecap: 'butt' as 'butt',\n});\n\nconst width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\n</script>\n","<template>\n <svg\n :style=\"{\n position: 'absolute',\n width: svgWidth,\n height: svgHeight,\n pointerEvents: 'none',\n zIndex: 2,\n }\"\n :width=\"svgWidth\"\n :height=\"svgHeight\"\n :viewBox=\"`0 0 ${geometry.width + strokeWidth} ${geometry.height + strokeWidth}`\"\n >\n <rect\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n :fill=\"color\"\n :opacity=\"opacity\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n },\n);\n\nconst geometry = computed(() => {\n const outerW = props.rect.size.width;\n const outerH = props.rect.size.height;\n const innerW = Math.max(outerW - props.strokeWidth, 0);\n const innerH = Math.max(outerH - props.strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: props.strokeWidth / 2,\n y: props.strokeWidth / 2,\n };\n});\n\nconst svgWidth = computed(() => (geometry.value.width + props.strokeWidth) * props.scale);\nconst svgHeight = computed(() => (geometry.value.height + props.strokeWidth) * props.scale);\n</script>\n","<template>\n <img\n v-if=\"imageUrl\"\n :src=\"imageUrl\"\n @load=\"handleImageLoad\"\n :style=\"{\n width: '100%',\n height: '100%',\n display: 'block',\n ...style,\n }\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onUnmounted, CSSProperties, computed } from 'vue';\nimport { ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { deepToRaw } from '@embedpdf/utils/vue';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n style?: CSSProperties;\n }>(),\n {\n scaleFactor: 1,\n },\n);\n\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst imageUrl = ref<string | null>(null);\nconst urlRef = ref<string | null>(null);\nconst currentTask = ref<any>(null);\n\n// Extract primitive values to avoid unnecessary re-renders\nconst annotationId = computed(() => props.annotation.id);\nconst rectWidth = computed(() => props.annotation.rect.size.width);\nconst rectHeight = computed(() => props.annotation.rect.size.height);\n\nwatch(\n () => [\n props.pageIndex,\n props.scaleFactor,\n props.documentId,\n annotationId.value,\n rectWidth.value,\n rectHeight.value,\n annotationProvides.value,\n ],\n (_, __, onCleanup) => {\n if (annotationProvides.value) {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n\n const task = annotationProvides.value.forDocument(props.documentId).renderAnnotation({\n pageIndex: props.pageIndex,\n annotation: deepToRaw(props.annotation),\n options: {\n scaleFactor: props.scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n\n currentTask.value = task;\n\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n imageUrl.value = url;\n urlRef.value = url;\n }, ignore);\n\n onCleanup(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n });\n }\n },\n { immediate: true },\n);\n\nonUnmounted(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n if (currentTask.value) {\n currentTask.value.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task on unmount',\n });\n }\n});\n\nconst handleImageLoad = () => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n};\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: 'pointer',\n }\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n >\n <RenderAnnotation\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :annotation=\"{ ...annotation.object, id: annotation.object.id }\"\n :scaleFactor=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport RenderAnnotation from '../render-annotation.vue';\n\ndefineProps<{\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: PointerEvent | TouchEvent) => void;\n}>();\n</script>\n","<template>\n <div\n v-for=\"(b, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? b.origin.x - rect.origin.x : b.origin.x) * scale}px`,\n top: `${(rect ? b.origin.y - rect.origin.y : b.origin.y) * scale}px`,\n width: `${b.size.width * scale}px`,\n height: `${b.size.height * scale}px`,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n }\"\n ></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: `${amplitude * 2}px`,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst amplitude = computed(() => 2 * props.scale);\nconst period = computed(() => 6 * props.scale);\n\nconst svgDataUri = computed(() => {\n const amp = amplitude.value;\n const per = period.value;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${per}\" height=\"${\n amp * 2\n }\" viewBox=\"0 0 ${per} ${amp * 2}\">\n <path d=\"M0 ${amp} Q ${per / 4} 0 ${per / 2} ${amp} T ${per} ${amp}\"\n fill=\"none\" stroke=\"${resolvedColor.value}\" stroke-width=\"${amp}\" stroke-linecap=\"round\"/>\n </svg>`;\n return `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n});\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: `${thickness}px`,\n background: resolvedColor,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"onClick\"\n @touchstart=\"onClick\"\n :style=\"{\n position: 'absolute',\n left: `${(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px`,\n top: `${(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px`,\n width: `${r.size.width * scale}px`,\n height: `${r.size.height * scale}px`,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n }\"\n >\n <div\n :style=\"{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: `${thickness}px`,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }>(),\n {\n opacity: 0.5,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <template v-for=\"annotation in annotations\" :key=\"annotation.object.id\">\n <!-- Custom Renderer (from external plugins like redaction) -->\n <AnnotationContainer\n v-if=\"findCustomRenderer(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default>\n <component\n :is=\"findCustomRenderer(annotation)!.component\"\n :annotation=\"annotation\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :pageIndex=\"pageIndex\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Ink -->\n <AnnotationContainer\n v-else-if=\"isInk(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Ink\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Square -->\n <AnnotationContainer\n v-else-if=\"isSquare(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Square\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Circle -->\n <AnnotationContainer\n v-else-if=\"isCircle(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Circle\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Line -->\n <AnnotationContainer\n v-else-if=\"isLine(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Line\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Polyline -->\n <AnnotationContainer\n v-else-if=\"isPolyline(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Polyline\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Polygon -->\n <AnnotationContainer\n v-else-if=\"isPolygon(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Polygon\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- FreeText -->\n <AnnotationContainer\n v-else-if=\"isFreeText(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :onDoubleClick=\"(e) => handleDoubleClick(e, annotation.object.id)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.FreeText\n :isSelected=\"isSelected(annotation)\"\n :isEditing=\"editingId === annotation.object.id\"\n :annotation=\"{ ...annotation, object: currentObject }\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Stamp -->\n <AnnotationContainer\n v-else-if=\"isStamp(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default>\n <AnnoComponents.Stamp\n :documentId=\"documentId\"\n :isSelected=\"isSelected(annotation)\"\n :annotation=\"annotation\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"(e: PointerEvent | TouchEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Text Markup: Underline, StrikeOut, Squiggly, Highlight -->\n <AnnotationContainer\n v-else-if=\"isUnderline(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Underline\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isStrikeout(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Strikeout\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isSquiggly(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Squiggly\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <AnnotationContainer\n v-else-if=\"isHighlight(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isDraggable=\"isDraggable(annotation)\"\n :isResizable=\"isResizable(annotation)\"\n :lockAspectRatio=\"lockAspectRatio(annotation)\"\n :onSelect=\"(e) => handleClick(e, annotation)\"\n :vertexConfig=\"getVertexConfig(annotation)\"\n :selectionMenu=\"isMultiSelected ? undefined : selectionMenu\"\n :zIndex=\"0\"\n :style=\"{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <TextMarkupComponents.Highlight\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent) => handleClick(e, annotation)\"\n />\n </template>\n <template #selection-menu=\"slotProps\" v-if=\"!isMultiSelected\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n\n <!-- Link -->\n <AnnotationContainer\n v-else-if=\"isLink(annotation)\"\n :trackedAnnotation=\"annotation\"\n :isSelected=\"showIndividualSelection(annotation)\"\n :isMultiSelected=\"isMultiSelected\"\n :isDraggable=\"false\"\n :isResizable=\"false\"\n :lockAspectRatio=\"false\"\n :onSelect=\"(e) => handleLinkClick(e, annotation)\"\n :selectionMenu=\"\n annotation.object.inReplyToId ? undefined : isMultiSelected ? undefined : selectionMenu\n \"\n :style=\"{ mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal) }\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject }\">\n <AnnoComponents.Link\n v-bind=\"currentObject\"\n :isSelected=\"isSelected(annotation)\"\n :scale=\"scale\"\n :onClick=\"(e: MouseEvent | TouchEvent) => handleLinkClick(e, annotation)\"\n :hasIRT=\"!!annotation.object.inReplyToId\"\n />\n </template>\n <template\n #selection-menu=\"slotProps\"\n v-if=\"!isMultiSelected && !annotation.object.inReplyToId\"\n >\n <slot name=\"selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n </template>\n\n <!-- Group Selection Box (shown when multiple annotations are selected on this page) -->\n <GroupSelectionBox\n v-if=\"allSelectedOnSamePage && selectedAnnotationsOnPage.length >= 2\"\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :rotation=\"rotation\"\n :pageWidth=\"pageWidth\"\n :pageHeight=\"pageHeight\"\n :selectedAnnotations=\"selectedAnnotationsOnPage\"\n :isDraggable=\"areAllSelectedDraggable\"\n :isResizable=\"areAllSelectedResizable\"\n :resizeUI=\"resizeUI\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n >\n <template #group-selection-menu=\"slotProps\">\n <slot name=\"group-selection-menu\" v-bind=\"slotProps\" />\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\" />\n </template>\n </GroupSelectionBox>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { blendModeToCss, PdfBlendMode, Position } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n isCircle,\n isFreeText,\n isHighlight,\n isInk,\n isLine,\n isLink,\n isPolygon,\n isPolyline,\n isSquare,\n isSquiggly,\n isStamp,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n resolveInteractionProp,\n} from '@embedpdf/plugin-annotation';\nimport type { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/vue';\nimport type { EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/vue';\nimport { useAnnotationCapability } from '../hooks';\nimport AnnotationContainer from './annotation-container.vue';\nimport GroupSelectionBox from './group-selection-box.vue';\nimport * as AnnoComponents from './annotations';\nimport * as TextMarkupComponents from './text-markup';\nimport { VertexConfig } from '../../shared/types';\nimport {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n} from '../types';\nimport type { BoxedAnnotationRenderer } from '../context';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Render function for group selection menu (schema-driven approach) */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n /** Custom renderers for specific annotation types (provided by external plugins) */\n annotationRenderers?: BoxedAnnotationRenderer[];\n}>();\n\n// Find a custom renderer for the given annotation\nconst findCustomRenderer = (annotation: TrackedAnnotation) => {\n return props.annotationRenderers?.find((r) => r.matches(annotation.object));\n};\n\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { provides: selectionProvides } = useSelectionCapability();\nconst annotations = ref<TrackedAnnotation[]>([]);\nconst allSelectedIds = ref<string[]>([]);\nconst { register } = usePointerHandlers({\n documentId: () => props.documentId,\n pageIndex: props.pageIndex,\n});\nconst editingId = ref<string | null>(null);\n\n// Get scoped API for this document\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\n// Check if multiple annotations are selected\nconst isMultiSelected = computed(() => allSelectedIds.value.length > 1);\n\nwatchEffect((onCleanup) => {\n if (annotationProvides.value) {\n // Initialize with current state immediately (like React)\n const currentState = annotationProvides.value.getState();\n annotations.value = getAnnotationsByPageIndex(currentState, props.pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(currentState);\n\n // Then subscribe to changes\n const off = annotationProvides.value.onStateChange((state) => {\n annotations.value = getAnnotationsByPageIndex(state, props.pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(state);\n });\n onCleanup(off);\n }\n});\n\nconst handlePointerDown = (_pos: Position, pe: EmbedPdfPointerEvent<PointerEvent>) => {\n if (pe.target === pe.currentTarget && annotationProvides.value) {\n annotationProvides.value.deselectAnnotation();\n editingId.value = null;\n }\n};\n\nconst handleClick = (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides.value && selectionProvides.value) {\n selectionProvides.value.clear();\n\n // Check for modifier key (Cmd on Mac, Ctrl on Windows/Linux)\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n // Toggle selection: add or remove from current selection\n annotationProvides.value.toggleSelection(props.pageIndex, annotation.object.id);\n } else {\n // Exclusive select: clear and select only this one\n annotationProvides.value.selectAnnotation(props.pageIndex, annotation.object.id);\n }\n\n if (annotation.object.id !== editingId.value) {\n editingId.value = null;\n }\n }\n};\n\n// Special handler for link annotations - if IRT exists, select the parent\nconst handleLinkClick = (\n e: MouseEvent | TouchEvent,\n annotation: TrackedAnnotation<PdfLinkAnnoObject>,\n) => {\n e.stopPropagation();\n if (!annotationProvides.value || !selectionProvides.value) return;\n\n selectionProvides.value.clear();\n\n // If link has IRT, select the parent annotation instead\n if (annotation.object.inReplyToId) {\n const parentId = annotation.object.inReplyToId;\n const parent = annotations.value.find((a) => a.object.id === parentId);\n if (parent) {\n annotationProvides.value.selectAnnotation(parent.object.pageIndex, parentId);\n return;\n }\n }\n\n // Standalone link - select it directly\n annotationProvides.value.selectAnnotation(props.pageIndex, annotation.object.id);\n};\n\nconst handleDoubleClick = (_e: MouseEvent | PointerEvent, id: string) => {\n if (isFreeText(annotations.value.find((a) => a.object.id === id)!)) {\n editingId.value = id;\n }\n};\n\nwatchEffect((onCleanup) => {\n if (annotationProvides.value) {\n const unregister = register({ onPointerDown: handlePointerDown });\n if (unregister) {\n onCleanup(unregister);\n }\n }\n});\n\n// Check if an annotation is selected\nconst isSelected = (annotation: TrackedAnnotation) =>\n allSelectedIds.value.includes(annotation.object.id);\n\n// Get selected annotations that are on THIS page (for group selection box)\nconst selectedAnnotationsOnPage = computed(() =>\n annotations.value.filter((anno) => allSelectedIds.value.includes(anno.object.id)),\n);\n\n// Check if all selected annotations on this page are draggable in group context\nconst areAllSelectedDraggable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n const groupDraggable = resolveInteractionProp(\n tool?.interaction.isGroupDraggable,\n ta.object,\n true,\n );\n const singleDraggable = resolveInteractionProp(tool?.interaction.isDraggable, ta.object, true);\n return tool?.interaction.isGroupDraggable !== undefined ? groupDraggable : singleDraggable;\n });\n});\n\n// Check if all selected annotations on this page are resizable in group context\nconst areAllSelectedResizable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n const groupResizable = resolveInteractionProp(\n tool?.interaction.isGroupResizable,\n ta.object,\n true,\n );\n const singleResizable = resolveInteractionProp(tool?.interaction.isResizable, ta.object, true);\n return tool?.interaction.isGroupResizable !== undefined ? groupResizable : singleResizable;\n });\n});\n\n// Check if all selected annotations are on the same page (this page)\nconst allSelectedOnSamePage = computed(() => {\n if (!annotationProvides.value) return false;\n // Early return if not enough selections (also creates reactive dependency on allSelectedIds)\n if (allSelectedIds.value.length < 2) return false;\n const allSelected = annotationProvides.value.getSelectedAnnotations();\n // All selected must be on this page\n return allSelected.every((ta) => ta.object.pageIndex === props.pageIndex);\n});\n\n// --- Component Logic ---\nconst getTool = (annotation: TrackedAnnotation) =>\n annotationProvides.value?.findToolForAnnotation(annotation.object);\n\nconst isDraggable = (anno: TrackedAnnotation) => {\n if (isFreeText(anno) && editingId.value === anno.object.id) return false;\n if (isMultiSelected.value) return false;\n return resolveInteractionProp(getTool(anno)?.interaction.isDraggable, anno.object, false);\n};\nconst isResizable = (anno: TrackedAnnotation) => {\n if (isMultiSelected.value) return false;\n return resolveInteractionProp(getTool(anno)?.interaction.isResizable, anno.object, false);\n};\nconst lockAspectRatio = (anno: TrackedAnnotation) =>\n resolveInteractionProp(getTool(anno)?.interaction.lockAspectRatio, anno.object, false);\n\n// Should show individual selection UI (not when multi-selected)\nconst showIndividualSelection = (anno: TrackedAnnotation) =>\n isSelected(anno) && !isMultiSelected.value;\n\n// Props to pass to AnnotationContainer (excluding selectionMenu which is handled explicitly)\nconst containerProps = computed(() => {\n const { selectionMenu: _sm, groupSelectionMenu: _gsm, ...rest } = props;\n return rest;\n});\n\nconst getVertexConfig = (annotation: TrackedAnnotation): VertexConfig<any> | undefined => {\n if (isLine(annotation)) {\n return {\n extractVertices: (anno) => [anno.linePoints.start, anno.linePoints.end],\n transformAnnotation: (anno, vertices) => ({\n ...anno,\n linePoints: { start: vertices[0], end: vertices[1] },\n }),\n };\n }\n if (isPolyline(annotation) || isPolygon(annotation)) {\n return {\n extractVertices: (anno) => anno.vertices,\n transformAnnotation: (anno, vertices) => ({ ...anno, vertices }),\n };\n }\n return undefined;\n};\n</script>\n","<template>\n <div\n v-if=\"boundingRect && activeTool\"\n :style=\"{\n mixBlendMode: blendMode,\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }\"\n >\n <Highlight\n v-if=\"activeTool.defaults.type === PdfAnnotationSubtype.HIGHLIGHT\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Underline\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.UNDERLINE\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Strikeout\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.STRIKEOUT\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n <Squiggly\n v-else-if=\"activeTool.defaults.type === PdfAnnotationSubtype.SQUIGGLY\"\n :strokeColor=\"activeTool.defaults.strokeColor\"\n :opacity=\"activeTool.defaults.opacity\"\n :segmentRects=\"rects\"\n :scale=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onUnmounted, watchEffect, computed } from 'vue';\nimport { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/vue';\nimport { useAnnotationCapability } from '../hooks';\nimport Highlight from './text-markup/highlight.vue';\nimport Underline from './text-markup/underline.vue';\nimport Strikeout from './text-markup/strikeout.vue';\nimport Squiggly from './text-markup/squiggly.vue';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n}>();\n\nconst { provides: selectionProvides } = useSelectionCapability();\nconst { provides: annotationProvides } = useAnnotationCapability();\nconst rects = ref<Rect[]>([]);\nconst boundingRect = ref<Rect | null>(null);\nconst activeTool = ref<AnnotationTool | null>(null);\n\nwatchEffect((onCleanup) => {\n const unsubscribers: (() => void)[] = [];\n\n if (selectionProvides.value) {\n const scoped = selectionProvides.value.forDocument(props.documentId);\n const off = scoped.onSelectionChange(() => {\n rects.value = scoped.getHighlightRectsForPage(props.pageIndex);\n boundingRect.value = scoped.getBoundingRectForPage(props.pageIndex);\n });\n unsubscribers.push(off);\n }\n\n if (annotationProvides.value) {\n const scoped = annotationProvides.value.forDocument(props.documentId);\n // Initialize with current active tool\n activeTool.value = scoped.getActiveTool();\n\n const off = scoped.onActiveToolChange((event) => (activeTool.value = event));\n unsubscribers.push(off);\n }\n\n onCleanup(() => {\n unsubscribers.forEach((unsub) => unsub());\n });\n});\n\nconst blendMode = computed(() => {\n if (!activeTool.value) return blendModeToCss(PdfBlendMode.Normal);\n const defaultMode =\n activeTool.value.defaults.type === PdfAnnotationSubtype.HIGHLIGHT\n ? PdfBlendMode.Multiply\n : PdfBlendMode.Normal;\n return blendModeToCss(activeTool.value.defaults.blendMode ?? defaultMode);\n});\n</script>\n","<template>\n <div :style=\"style\">\n <Circle\n v-if=\"preview.type === PdfAnnotationSubtype.CIRCLE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Square\n v-else-if=\"preview.type === PdfAnnotationSubtype.SQUARE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Polygon\n v-else-if=\"preview.type === PdfAnnotationSubtype.POLYGON\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Polyline\n v-else-if=\"preview.type === PdfAnnotationSubtype.POLYLINE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Line\n v-else-if=\"preview.type === PdfAnnotationSubtype.LINE\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <Ink\n v-else-if=\"preview.type === PdfAnnotationSubtype.INK\"\n :isSelected=\"false\"\n :scale=\"scale\"\n v-bind=\"preview.data\"\n />\n <div\n v-else-if=\"preview.type === PdfAnnotationSubtype.FREETEXT\"\n :style=\"{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, CSSProperties } from 'vue';\nimport { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Circle, Square, Polygon, Polyline, Line, Ink } from './annotations';\n\nconst props = defineProps<{\n preview: AnyPreviewState;\n scale: number;\n}>();\n\nconst style = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${props.preview.bounds.origin.x * props.scale}px`,\n top: `${props.preview.bounds.origin.y * props.scale}px`,\n width: `${props.preview.bounds.size.width * props.scale}px`,\n height: `${props.preview.bounds.size.height * props.scale}px`,\n pointerEvents: 'none',\n zIndex: 10,\n}));\n</script>\n","<template>\n <input ref=\"fileInputRef\" type=\"file\" style=\"display: none\" />\n <canvas ref=\"canvasRef\" style=\"display: none\"></canvas>\n <PreviewRenderer\n v-for=\"[toolId, preview] in previews.entries()\"\n :key=\"toolId\"\n :preview=\"preview\"\n :scale=\"scale\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, computed } from 'vue';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport PreviewRenderer from './preview-renderer.vue';\n\nconst props = defineProps<{\n documentId: string;\n pageIndex: number;\n scale: number;\n}>();\n\nconst { plugin: annotationPlugin } = useAnnotationPlugin();\nconst previews = ref<Map<string, AnyPreviewState>>(new Map());\nconst fileInputRef = ref<HTMLInputElement | null>(null);\nconst canvasRef = ref<HTMLCanvasElement | null>(null);\n\nconst services = computed<HandlerServices>(() => ({\n requestFile: ({ accept, onFile }) => {\n const input = fileInputRef.value;\n if (!input) return;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef.value;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1);\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n}));\n\nlet unregister: (() => void) | undefined;\n\nwatchEffect((onCleanup) => {\n if (annotationPlugin.value) {\n unregister = annotationPlugin.value.registerPageHandlers(\n props.documentId,\n props.pageIndex,\n props.scale,\n {\n services: services.value,\n onPreview: (toolId, state) => {\n const next = new Map(previews.value);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n previews.value = next;\n },\n },\n );\n }\n\n onCleanup(() => {\n unregister?.();\n });\n});\n</script>\n","import {\n inject,\n provide,\n markRaw,\n onUnmounted,\n shallowRef,\n type InjectionKey,\n type ShallowRef,\n} from 'vue';\nimport type { BoxedAnnotationRenderer, AnnotationRendererEntry } from './types';\nimport type { PdfAnnotationObject } from '@embedpdf/models';\n\n/**\n * Annotation Renderer Registry\n *\n * Allows external plugins to register custom annotation renderers\n * that integrate with the annotation layer.\n */\nexport interface AnnotationRendererRegistry {\n register(entries: BoxedAnnotationRenderer[]): () => void;\n getAll(): BoxedAnnotationRenderer[];\n}\n\nconst RendererRegistryKey: InjectionKey<AnnotationRendererRegistry> = Symbol(\n 'AnnotationRendererRegistry',\n);\n\nexport function createRendererRegistry(): AnnotationRendererRegistry {\n const renderers: ShallowRef<BoxedAnnotationRenderer[]> = shallowRef([]);\n\n return {\n register(entries: BoxedAnnotationRenderer[]) {\n const ids = new Set(entries.map((e) => e.id));\n // Add new, replace existing by id\n renderers.value = [...renderers.value.filter((r) => !ids.has(r.id)), ...entries];\n // Return cleanup function\n return () => {\n renderers.value = renderers.value.filter((r) => !entries.some((e) => e.id === r.id));\n };\n },\n getAll() {\n return renderers.value;\n },\n };\n}\n\nexport function provideRendererRegistry(): AnnotationRendererRegistry {\n const registry = createRendererRegistry();\n provide(RendererRegistryKey, registry);\n return registry;\n}\n\nexport function useRendererRegistry(): AnnotationRendererRegistry | null {\n return inject(RendererRegistryKey, null);\n}\n\n/**\n * Composable for plugins to register renderers.\n * Automatically cleans up on unmount.\n */\nexport function useRegisterRenderers(entries: BoxedAnnotationRenderer[]) {\n const registry = useRendererRegistry();\n if (!registry) return;\n\n const unregister = registry.register(entries);\n onUnmounted(unregister);\n}\n\n/**\n * Factory to create a boxed renderer from a typed entry.\n * Wraps component in markRaw to prevent reactivity overhead.\n */\nexport function createRenderer<T extends PdfAnnotationObject>(\n entry: AnnotationRendererEntry<T>,\n): BoxedAnnotationRenderer {\n return {\n id: entry.id,\n matches: entry.matches,\n component: markRaw(entry.component) as Component<AnnotationRendererProps>,\n };\n}\n\n// Re-export types for convenience\nimport type { Component } from 'vue';\nimport type { AnnotationRendererProps } from './types';\nexport type { AnnotationRendererProps, AnnotationRendererEntry, BoxedAnnotationRenderer };\n","<template>\n <div>\n <Annotations\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"actualScale\"\n :rotation=\"actualRotation\"\n :pageWidth=\"pageWidth\"\n :pageHeight=\"pageHeight\"\n :resizeUI=\"resizeUI\"\n :vertexUI=\"vertexUI\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionMenu=\"selectionMenu\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n :annotationRenderers=\"allRenderers\"\n >\n <!-- Forward slots for manual customization (only used if selectionMenu prop not provided) -->\n <template #selection-menu=\"slotProps\">\n <slot name=\"selection-menu\" v-bind=\"slotProps\"></slot>\n </template>\n <template #group-selection-menu=\"slotProps\">\n <slot name=\"group-selection-menu\" v-bind=\"slotProps\"></slot>\n </template>\n <template #resize-handle=\"slotProps\">\n <slot name=\"resize-handle\" v-bind=\"slotProps\"></slot>\n </template>\n <template #vertex-handle=\"slotProps\">\n <slot name=\"vertex-handle\" v-bind=\"slotProps\"></slot>\n </template>\n </Annotations>\n <TextMarkup :documentId=\"documentId\" :pageIndex=\"pageIndex\" :scale=\"actualScale\" />\n <AnnotationPaintLayer :documentId=\"documentId\" :pageIndex=\"pageIndex\" :scale=\"actualScale\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Rotation } from '@embedpdf/models';\nimport Annotations from './annotations.vue';\nimport TextMarkup from './text-markup.vue';\nimport AnnotationPaintLayer from './annotation-paint-layer.vue';\nimport {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n} from '../types';\nimport { useRendererRegistry, type BoxedAnnotationRenderer } from '../context';\n\nconst props = defineProps<{\n /** The ID of the document that this layer displays annotations for */\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: number;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize selection menu */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Customize group selection menu */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n /** Custom renderers for specific annotation types (provided by external plugins) */\n annotationRenderers?: BoxedAnnotationRenderer[];\n}>();\n\n// Get renderers from registry (provided by parent)\nconst registry = useRendererRegistry();\n\n// Merge: registry + explicit props (props take precedence by id)\nconst allRenderers = computed(() => {\n const fromRegistry = registry?.getAll() ?? [];\n const fromProps = props.annotationRenderers ?? [];\n const merged = [...fromRegistry];\n for (const r of fromProps) {\n const idx = merged.findIndex((m) => m.id === r.id);\n if (idx >= 0) merged[idx] = r;\n else merged.push(r);\n }\n return merged;\n});\n\nconst documentState = useDocumentState(() => props.documentId);\nconst page = computed(() => documentState.value?.document?.pages?.[props.pageIndex]);\nconst pageWidth = computed(() => page.value?.size?.width ?? 0);\nconst pageHeight = computed(() => page.value?.size?.height ?? 0);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nconst actualRotation = computed(() => {\n if (props.rotation !== undefined) return props.rotation;\n return documentState.value?.rotation ?? Rotation.Degree0;\n});\n</script>\n","<script setup lang=\"ts\">\nimport { provideRendererRegistry } from '../context';\n\n/**\n * Provider component that sets up the annotation renderer registry.\n * Used as a wrapper via createPluginPackage().addWrapper().\n */\nprovideRendererRegistry();\n</script>\n\n<template>\n <slot />\n</template>\n","import { createPluginPackage } from '@embedpdf/core';\nimport { AnnotationPluginPackage as BaseAnnotationPackage } from '@embedpdf/plugin-annotation';\nimport { RendererRegistryProvider } from './components';\n\nexport * from './hooks';\nexport * from './components';\nexport * from './types';\nexport * from './context';\nexport * from '@embedpdf/plugin-annotation';\n\n// Automatically wrap with RendererRegistryProvider\nexport const AnnotationPluginPackage = createPluginPackage(BaseAnnotationPackage)\n .addWrapper(RendererRegistryProvider)\n .build();\n"],"names":["useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","inheritAttrs","props","__props","HANDLE_COLOR","VERTEX_COLOR","preview","shallowRef","toRaw","trackedAnnotation","object","provides","annotationCapability","plugin","annotationPlugin","permissions","useDocumentPermissions","documentId","gestureBaseRef","ref","gestureBaseRectRef","effectiveIsDraggable","computed","value","canModifyAnnotations","isDraggable","isMultiSelected","effectiveIsResizable","isResizable","guardedOnDoubleClick","onDoubleClick","e","_a","call","annotationProvides","forDocument","currentObject","showOutline","isSelected","shouldShowMenu","selectionMenu","slots","menuRect","origin","x","rect","scale","y","size","width","height","menuContext","type","annotation","pageIndex","menuPlacement","suggestTop","spaceAbove","spaceBelow","renderSelectionMenu","menuWrapperProps","selected","placement","context","elementSnapshot","verticesSnapshot","obj","vertexConfig","extractVertices","constraintsSnapshot","minWidth","minHeight","boundingBox","pageWidth","pageHeight","dragProps","vertices","resize","useInteractionHandles","controller","element","constraints","maintainAspectRatio","lockAspectRatio","pageRotation","rotation","enabled","onUpdate","event","transformData","changes","metadata","pageSize","state","startDrag","annotationIds","startResize","resizeHandle","handle","delta","updateDrag","updateResize","base","vertexChanges","transformAnnotation","patched","_b","_c","updateAnnotation","commitDrag","commitResize","resizeUI","handleSize","spacing","outlineOffset","offsetMode","includeSides","zIndex","vertexUI","vertexSize","includeVertices","doubleProps","useDoublePressProps","watchEffect","onCleanup","handleEvent","patch","previewPatches","unsubs","onDragChange","onResizeChange","forEach","u","containerStyle","position","left","top","outline","selectionOutlineColor","pointerEvents","touchAction","cursor","mergedContainerStyle","style","useSlots","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_mergeProps","_unref","_renderSlot","_ctx","$slots","_Fragment","key","backgroundColor","ref_for","length","vertex","_createBlock","CounterRotate","default","_withCtx","_resolveDynamicComponent","gestureBase","isDraggingRef","isResizingRef","color","HANDLE_SIZE","groupBox","rects","selectedAnnotations","map","ta","boundingRectOrEmpty","previewGroupBox","watch","newGroupBox","immediate","boxStyle","annotations","groupSelectionMenu","renderGroupMenu","transformType","isMove","isResize","newRect","rawDelta","clampedDelta","onPointerdown","$event","stopPropagation","geometry","outerW","outerH","innerW","Math","max","strokeWidth","innerH","cx","cy","rx","ry","svgWidth","svgHeight","_normalizeStyle","viewBox","fill","opacity","_cache","onClick","args","onTouchstart","stroke","strokeColor","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","editorRef","isIOS","onMounted","nav","navigator","test","userAgent","platform","maxTouchPoints","isEditing","editing","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","handleBlur","contents","innerText","editorStyle","anno","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","overflow","transform","transformOrigin","onBlur","tabindex","contenteditable","resolvedColor","paths","inkList","points","d","i","lx","ly","trim","_renderList","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","getEndingStyle","ending","strokeLinecap","filled","dashArray","isUnderline","UNDERLINE","hitAreaCursor","hasIRT","hitAreaPointerEvents","allPoints","currentVertex","localPts","pathData","first","rest","isPreview","p","isPreviewing","toAngle","a","b","startRad","endRad","imageUrl","urlRef","currentTask","annotationId","rectWidth","rectHeight","scaleFactor","_","__","URL","revokeObjectURL","task","renderAnnotation","deepToRaw","options","dpr","devicePixelRatio","wait","blob","url","createObjectURL","ignore","abort","code","PdfErrorCode","Cancelled","message","onUnmounted","handleImageLoad","src","onLoad","_createVNode","RenderAnnotation","segmentRects","amplitude","period","svgDataUri","amp","per","svg","encodeURIComponent","r","backgroundSize","thickness","findCustomRenderer","annotationRenderers","find","matches","selectionProvides","useSelectionCapability","allSelectedIds","register","usePointerHandlers","editingId","currentState","getState","getAnnotationsByPageIndex","getSelectedAnnotationIds","onStateChange","handlePointerDown","_pos","pe","target","currentTarget","deselectAnnotation","handleClick","clear","metaKey","ctrlKey","toggleSelection","selectAnnotation","handleLinkClick","inReplyToId","parentId","parent","unregister","onPointerDown","includes","selectedAnnotationsOnPage","filter","areAllSelectedDraggable","every","tool","findToolForAnnotation","groupDraggable","resolveInteractionProp","interaction","isGroupDraggable","singleDraggable","areAllSelectedResizable","groupResizable","isGroupResizable","singleResizable","allSelectedOnSamePage","getSelectedAnnotations","getTool","isFreeText","showIndividualSelection","containerProps","_sm","_gsm","getVertexConfig","isLine","isPolyline","isPolygon","AnnotationContainer","onSelect","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","_createSlots","component","slotProps","fn","isInk","AnnoComponents.Ink","isSquare","AnnoComponents.Square","isCircle","AnnoComponents.Circle","AnnoComponents.Line","AnnoComponents.Polyline","AnnoComponents.Polygon","handleDoubleClick","AnnoComponents.FreeText","isStamp","AnnoComponents.Stamp","TextMarkupComponents.Underline","isStrikeout","TextMarkupComponents.Strikeout","isSquiggly","TextMarkupComponents.Squiggly","isHighlight","Multiply","TextMarkupComponents.Highlight","isLink","AnnoComponents.Link","GroupSelectionBox","boundingRect","activeTool","unsubscribers","scoped","off","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","push","getActiveTool","onActiveToolChange","unsub","defaultMode","defaults","PdfAnnotationSubtype","HIGHLIGHT","Highlight","Underline","STRIKEOUT","Strikeout","SQUIGGLY","Squiggly","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","previews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","entries","PreviewRenderer","RendererRegistryKey","Symbol","createRendererRegistry","renderers","ids","Set","has","some","getAll","provideRendererRegistry","registry","provide","useRendererRegistry","inject","allRenderers","fromRegistry","fromProps","merged","idx","findIndex","m","documentState","useDocumentState","page","pages","actualScale","actualRotation","Rotation","Degree0","Annotations","TextMarkup","AnnotationPaintLayer","AnnotationPluginPackage","createPluginPackage","BaseAnnotationPackage","addWrapper","RendererRegistryProvider","build","entry","markRaw","toValue","initialDocumentState","providesValue","docId","scope","newState"],"mappings":"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"}
|