@embedpdf/plugin-annotation 2.9.0 → 2.9.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/vue/components/appearance-image.vue","../../src/vue/hooks/use-annotation.ts","../../src/vue/components/annotation-container.vue","../../src/shared/annotation-bounds.ts","../../src/vue/components/group-selection-box.vue","../../src/vue/context/renderer-registry.ts","../../src/vue/components/annotations/ink.vue","../../src/vue/components/renderers/ink-renderer.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/renderers/square-renderer.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/renderers/circle-renderer.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/renderers/line-renderer.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/renderers/polyline-renderer.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/renderers/polygon-renderer.vue","../../src/vue/components/annotations/free-text.vue","../../src/vue/components/renderers/free-text-renderer.vue","../../src/vue/components/render-annotation.vue","../../src/vue/components/annotations/stamp.vue","../../src/vue/components/renderers/stamp-renderer.vue","../../src/vue/components/annotations/link.vue","../../src/vue/components/renderers/link-renderer.vue","../../src/vue/components/text-markup/highlight.vue","../../src/vue/components/renderers/highlight-renderer.vue","../../src/vue/components/text-markup/underline.vue","../../src/vue/components/renderers/underline-renderer.vue","../../src/vue/components/text-markup/strikeout.vue","../../src/vue/components/renderers/strikeout-renderer.vue","../../src/vue/components/text-markup/squiggly.vue","../../src/vue/components/renderers/squiggly-renderer.vue","../../src/vue/components/annotations/caret.vue","../../src/vue/components/renderers/caret-renderer.vue","../../src/vue/components/annotations/text.vue","../../src/vue/components/renderers/text-renderer.vue","../../src/vue/components/built-in-renderers.ts","../../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","../../src/vue/components/renderer-registry-provider.vue","../../src/vue/index.ts"],"sourcesContent":["<template>\n <img\n v-if=\"imageUrl\"\n :src=\"imageUrl\"\n alt=\"\"\n draggable=\"false\"\n @load=\"handleImageLoad\"\n :style=\"{\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n userSelect: 'none',\n ...style,\n }\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, type CSSProperties } from 'vue';\nimport type { AnnotationAppearanceImage } from '@embedpdf/models';\n\nconst props = defineProps<{\n appearance: AnnotationAppearanceImage<Blob>;\n style?: CSSProperties;\n}>();\n\nconst imageUrl = ref<string | null>(null);\nconst urlRef = ref<string | null>(null);\n\nwatchEffect((onCleanup) => {\n const url = URL.createObjectURL(props.appearance.data);\n imageUrl.value = url;\n urlRef.value = url;\n\n onCleanup(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n });\n});\n\nconst handleImageLoad = () => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n};\n</script>\n","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=\"contentsStyle\">\n <!-- Visual Layer: blend mode applied here, contains only annotation content -->\n <div :style=\"visualLayerStyle\">\n <!-- Inner div: rotated visual content - no pointer events -->\n <div :style=\"visualInnerStyle\">\n <!-- Annotation content - renders in unrotated coordinate space -->\n <slot :annotation=\"childObject\" :appearanceActive=\"apActive\"></slot>\n\n <!-- AP overlay canvas (always in DOM, toggled via display) -->\n <AppearanceImageVue\n v-if=\"appearance?.normal\"\n :appearance=\"appearance.normal\"\n :style=\"{ display: apActive ? 'block' : 'none' }\"\n />\n </div>\n </div>\n\n <!-- Interaction Layer: no blend mode, contains rotation guides, handles, drag/resize/vertex -->\n <div :style=\"outerAABBStyle\">\n <!-- Rotation guide lines - anchored at stable AABB center -->\n <template v-if=\"rotationActive\">\n <div :style=\"guideHorizontalStyle\" />\n <div :style=\"guideVerticalStyle\" />\n <div :style=\"guideAngleStyle\" />\n </template>\n\n <!-- Rotation handle - orbits in AABB space -->\n <template v-if=\"isSelected && effectiveIsRotatable && rotationHandleData\">\n <div\n @pointerenter=\"isHandleHovered = true\"\n @pointerleave=\"\n isHandleHovered = false;\n cursorScreen = null;\n \"\n @pointermove=\"onHandlePointerMove\"\n :style=\"contentsStyle\"\n >\n <!-- Connector line -->\n <div v-if=\"SHOW_CONNECTOR\" :style=\"connectorLineStyle\" />\n <!-- Rotation handle element -->\n <slot\n v-if=\"slots['rotation-handle']\"\n name=\"rotation-handle\"\n v-bind=\"rotationHandleSlotProps\"\n >\n <div v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </slot>\n <div v-else v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </div>\n </template>\n\n <!-- Inner div: drag/resize/vertex interaction -->\n <div\n v-bind=\"{ ...(effectiveIsDraggable && isSelected ? dragProps : {}), ...doubleProps }\"\n :style=\"innerRotatedStyle\"\n >\n <!-- Resize handles - rotate with the shape -->\n <template v-if=\"isSelected && effectiveIsResizable && !rotationActive\">\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\n <!-- Vertex handles - rotate with the shape -->\n <template\n v-if=\"\n isSelected &&\n permissions.canModifyAnnotations &&\n !isMultiSelected &&\n !rotationActive &&\n 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 <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 </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot - hide when multi-selected or rotating -->\n <CounterRotate v-if=\"shouldShowMenu && !rotationActive\" :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\n <!-- Cursor-following rotation tooltip - portaled to body to escape CSS transform chain -->\n <Teleport to=\"body\" v-if=\"(rotationActive || isHandleHovered) && cursorScreen\">\n <div :style=\"tooltipStyle\">{{ normalizedRotationDisplay.toFixed(0) }}°</div>\n </Teleport>\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 {\n ref,\n computed,\n watchEffect,\n useSlots,\n toRaw,\n shallowRef,\n Teleport,\n type CSSProperties,\n type VNode,\n} from 'vue';\nimport { PdfAnnotationObject, Rect, AnnotationAppearances, CssBlendMode } from '@embedpdf/models';\nimport { getCounterRotation } from '@embedpdf/utils';\nimport AppearanceImageVue from './appearance-image.vue';\nimport { inferRotationCenterFromRects } from '@embedpdf/plugin-annotation';\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 {\n AnnotationSelectionContext,\n AnnotationSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n RotationHandleUI,\n RotationHandleSlotProps,\n SelectionOutline,\n} 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 the annotation is in editing mode */\n isEditing?: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n isRotatable?: boolean;\n lockAspectRatio?: boolean;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** @deprecated Use `selectionOutline.offset` instead */\n outlineOffset?: number;\n onDoubleClick?: (event: PointerEvent | MouseEvent) => void;\n onSelect: (event: PointerEvent | MouseEvent) => void;\n /** Pre-rendered appearance stream images for AP mode rendering */\n appearance?: AnnotationAppearances<Blob> | null;\n zIndex?: number;\n /** @deprecated Use `selectionOutline.color` instead */\n selectionOutlineColor?: string;\n /** Customize the selection outline (color, style, width, offset) */\n selectionOutline?: SelectionOutline;\n /** Customize resize handle appearance */\n resizeUi?: ResizeHandleUI;\n /** Customize vertex handle appearance */\n vertexUi?: VertexHandleUI;\n /** Customize rotation handle appearance */\n rotationUi?: RotationHandleUI;\n blendMode?: CssBlendMode;\n style?: CSSProperties;\n }>(),\n {\n lockAspectRatio: false,\n isEditing: false,\n isMultiSelected: false,\n isRotatable: true,\n outlineOffset: 1,\n zIndex: 1,\n selectionOutlineColor: '#007ACC',\n },\n);\n\n// UI constants\nconst HANDLE_COLOR = computed(() => props.resizeUi?.color ?? '#007ACC');\nconst VERTEX_COLOR = computed(() => props.vertexUi?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUi?.size ?? 12);\nconst VERTEX_SIZE = computed(() => props.vertexUi?.size ?? 12);\nconst ROTATION_SIZE = computed(() => props.rotationUi?.size ?? 32);\nconst ROTATION_COLOR = computed(() => props.rotationUi?.color ?? 'white');\nconst ROTATION_CONNECTOR_COLOR = computed(() => props.rotationUi?.connectorColor ?? '#007ACC');\nconst ROTATION_ICON_COLOR = computed(() => props.rotationUi?.iconColor ?? '#007ACC');\nconst SHOW_CONNECTOR = computed(() => props.rotationUi?.showConnector ?? false);\nconst ROTATION_MARGIN = computed(() => props.rotationUi?.margin);\nconst ROTATION_BORDER_COLOR = computed(() => props.rotationUi?.border?.color ?? '#007ACC');\nconst ROTATION_BORDER_WIDTH = computed(() => props.rotationUi?.border?.width ?? 1);\nconst ROTATION_BORDER_STYLE = computed(() => props.rotationUi?.border?.style ?? 'solid');\n\n// Outline resolution (new object > deprecated props > defaults)\nconst outlineColor = computed(\n () => props.selectionOutline?.color ?? props.selectionOutlineColor ?? '#007ACC',\n);\nconst outlineStyle = computed(() => props.selectionOutline?.style ?? 'solid');\nconst outlineWidth = computed(() => props.selectionOutline?.width ?? 1);\nconst outlineOff = computed(() => props.selectionOutline?.offset ?? props.outlineOffset ?? 1);\n\nconst preview = shallowRef<Partial<T>>(toRaw(props.trackedAnnotation.object));\nconst liveRotation = ref<number | null>(null);\nconst cursorScreen = ref<{ x: number; y: number } | null>(null);\nconst isHandleHovered = ref(false);\nconst gestureActive = ref(false);\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/rotate - 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);\nconst effectiveIsRotatable = computed(\n () => permissions.value.canModifyAnnotations && props.isRotatable && !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\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// Annotation flags\nconst hasNoZoom = computed(() => (props.trackedAnnotation.object.flags ?? []).includes('noZoom'));\nconst hasNoRotate = computed(() =>\n (props.trackedAnnotation.object.flags ?? []).includes('noRotate'),\n);\n// noZoom: maintain constant screen-pixel size regardless of zoom level.\nconst visualScale = computed(() => (hasNoZoom.value ? 1 : props.scale));\n// noRotate: stay visually upright regardless of page rotation.\nconst effectivePageRotation = computed(() => (hasNoRotate.value ? 0 : props.rotation));\n\n// Get annotation's current rotation\n// During drag, use liveRotation if available; otherwise use the annotation's rotation\nconst annotationRotation = computed(\n () => liveRotation.value ?? (currentObject.value as any).rotation ?? 0,\n);\nconst rotationDisplay = computed(\n () => liveRotation.value ?? (currentObject.value as any).rotation ?? 0,\n);\nconst normalizedRotationDisplay = computed(() => {\n const val = rotationDisplay.value;\n return Number.isFinite(val) ? Math.round(val * 10) / 10 : 0;\n});\nconst rotationActive = computed(() => liveRotation.value !== null);\n\n// Geometry model:\n// - `rect` is the visible AABB container.\n// - `unrotatedRect` is the local editing frame for resize/vertex operations.\nconst explicitUnrotatedRect = computed(\n () => (currentObject.value as any).unrotatedRect as Rect | undefined,\n);\nconst effectiveUnrotatedRect = computed(\n () => explicitUnrotatedRect.value ?? currentObject.value.rect,\n);\nconst rotationPivot = computed(() => {\n if (explicitUnrotatedRect.value && annotationRotation.value !== 0) {\n return inferRotationCenterFromRects(\n effectiveUnrotatedRect.value,\n currentObject.value.rect,\n annotationRotation.value,\n );\n }\n return undefined;\n});\nconst controllerElement = computed(() => effectiveUnrotatedRect.value);\n\n// For children, override rect to use unrotatedRect so content renders in unrotated space\nconst childObject = computed<T>(() => {\n if (explicitUnrotatedRect.value) {\n return { ...currentObject.value, rect: explicitUnrotatedRect.value };\n }\n return currentObject.value;\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 * visualScale.value,\n height: currentObject.value.rect.size.height * visualScale.value,\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 - calculate suggestTop based on rotation handle position\nconst menuPlacement = computed<SelectionMenuPlacement>(() => {\n const effectiveAngle =\n (((annotationRotation.value + effectivePageRotation.value * 90) % 360) + 360) % 360;\n const handleNearMenuSide =\n effectiveIsRotatable.value && effectiveAngle > 90 && effectiveAngle < 270;\n return {\n suggestTop: handleNearMenuSide,\n };\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 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 {\n dragProps,\n vertices,\n resize,\n rotation: rotationHandleData,\n} = useInteractionHandles({\n controller: {\n element: controllerElement,\n vertices: verticesSnapshot,\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\n pageRotation: computed(() => props.rotation),\n annotationRotation: computed(() => annotationRotation.value),\n rotationCenter: computed(() => rotationPivot.value),\n rotationElement: computed(() => currentObject.value.rect),\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 =\n (props.trackedAnnotation.object as any).unrotatedRect ??\n props.trackedAnnotation.object.rect;\n gestureBaseRef.value = currentObject.value;\n\n if (type === 'resize' || type === 'vertex-edit') {\n gestureActive.value = true;\n }\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 // Rotation - handle via plugin rotation API\n if (type === 'rotate') {\n const cursorAngle = metadata?.rotationAngle ?? annotationRotation.value;\n const cursorPos = metadata?.cursorPosition;\n if (cursorPos) cursorScreen.value = { x: cursorPos.clientX, y: cursorPos.clientY };\n if (event.state === 'start') {\n liveRotation.value = cursorAngle;\n plugin.startRotation(props.documentId, {\n annotationIds: [id],\n cursorAngle,\n rotationCenter: metadata?.rotationCenter,\n });\n } else if (event.state === 'move') {\n liveRotation.value = cursorAngle;\n plugin.updateRotation(props.documentId, cursorAngle, metadata?.rotationDelta);\n } else if (event.state === 'end') {\n liveRotation.value = null;\n cursorScreen.value = null;\n plugin.commitRotation(props.documentId);\n }\n return;\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureActive.value = false;\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.value,\n spacing: outlineOff.value,\n offsetMode: 'outside',\n includeSides: props.lockAspectRatio ? false : true,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE.value,\n zIndex: props.zIndex + 2,\n },\n rotationUI: {\n handleSize: ROTATION_SIZE.value,\n margin: ROTATION_MARGIN.value,\n zIndex: props.zIndex + 3,\n showConnector: SHOW_CONNECTOR.value,\n },\n includeVertices: !!props.vertexConfig,\n includeRotation: effectiveIsRotatable,\n currentRotation: annotationRotation,\n});\n\nconst doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n// Handle pointer move on the rotation handle wrapper (for cursor tooltip when not rotating)\nconst onHandlePointerMove = (e: PointerEvent) => {\n if (!rotationActive.value) {\n cursorScreen.value = { x: e.clientX, y: e.clientY };\n }\n};\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/rotate 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 if (event.type === 'end' || event.type === 'cancel') {\n liveRotation.value = null;\n }\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 = [\n plugin.onDragChange(handleEvent),\n plugin.onResizeChange(handleEvent),\n plugin.onRotateChange(handleEvent),\n ];\n\n onCleanup(() => unsubs.forEach((u) => u()));\n});\n\n// ─── Layout computations ───────────────────────────────────────────────\n// noZoom: use visualScale (=1) so the annotation keeps a constant screen-pixel size.\n// noRotate: counter-rotate the outer div so the annotation stays upright on rotated pages.\nconst aabbWidth = computed(() => currentObject.value.rect.size.width * visualScale.value);\nconst aabbHeight = computed(() => currentObject.value.rect.size.height * visualScale.value);\nconst innerWidth = computed(() => effectiveUnrotatedRect.value.size.width * visualScale.value);\nconst innerHeight = computed(() => effectiveUnrotatedRect.value.size.height * visualScale.value);\nconst usesCustomPivot = computed(\n () => Boolean(explicitUnrotatedRect.value) && annotationRotation.value !== 0,\n);\nconst innerLeft = computed(() =>\n usesCustomPivot.value\n ? (effectiveUnrotatedRect.value.origin.x - currentObject.value.rect.origin.x) *\n visualScale.value\n : (aabbWidth.value - innerWidth.value) / 2,\n);\nconst innerTop = computed(() =>\n usesCustomPivot.value\n ? (effectiveUnrotatedRect.value.origin.y - currentObject.value.rect.origin.y) *\n visualScale.value\n : (aabbHeight.value - innerHeight.value) / 2,\n);\nconst innerTransformOrigin = computed(() => {\n if (usesCustomPivot.value && rotationPivot.value) {\n return `${(rotationPivot.value.x - effectiveUnrotatedRect.value.origin.x) * visualScale.value}px ${(rotationPivot.value.y - effectiveUnrotatedRect.value.origin.y) * visualScale.value}px`;\n }\n return 'center center';\n});\nconst centerX = computed(() =>\n rotationPivot.value\n ? (rotationPivot.value.x - currentObject.value.rect.origin.x) * visualScale.value\n : aabbWidth.value / 2,\n);\nconst centerY = computed(() =>\n rotationPivot.value\n ? (rotationPivot.value.y - currentObject.value.rect.origin.y) * visualScale.value\n : aabbHeight.value / 2,\n);\nconst guideLength = computed(() => Math.max(300, Math.max(aabbWidth.value, aabbHeight.value) + 80));\n// noRotate: compute counter-rotation to undo page rotation on this annotation's outer div.\nconst counterRot = computed(() =>\n hasNoRotate.value\n ? getCounterRotation(\n { origin: { x: 0, y: 0 }, size: { width: aabbWidth.value, height: aabbHeight.value } },\n props.rotation,\n )\n : null,\n);\nconst rotationIconSize = computed(() => Math.round(ROTATION_SIZE.value * 0.6));\n\nconst apActive = computed(\n () =>\n !!props.appearance?.normal &&\n !gestureActive.value &&\n !props.isEditing &&\n !props.trackedAnnotation.dictMode,\n);\n\n// ─── Extracted style computations ──────────────────────────────────────\nconst contentsStyle: CSSProperties = { display: 'contents' };\n\nconst layerBaseStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${currentObject.value.rect.origin.x * props.scale}px`,\n top: `${currentObject.value.rect.origin.y * props.scale}px`,\n width: `${counterRot.value ? counterRot.value.width : aabbWidth.value}px`,\n height: `${counterRot.value ? counterRot.value.height : aabbHeight.value}px`,\n pointerEvents: 'none',\n zIndex: props.zIndex,\n ...(counterRot.value ? { transform: counterRot.value.matrix, transformOrigin: '0 0' } : {}),\n}));\n\nconst visualLayerStyle = computed<CSSProperties>(() => ({\n ...layerBaseStyle.value,\n ...(props.blendMode ? { mixBlendMode: props.blendMode } : {}),\n ...props.style,\n}));\n\nconst outerAABBStyle = computed<CSSProperties>(() => layerBaseStyle.value);\n\nconst visualInnerStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${innerLeft.value}px`,\n top: `${innerTop.value}px`,\n width: `${innerWidth.value}px`,\n height: `${innerHeight.value}px`,\n transform: annotationRotation.value !== 0 ? `rotate(${annotationRotation.value}deg)` : undefined,\n transformOrigin: innerTransformOrigin.value,\n pointerEvents: 'none',\n}));\n\nconst innerRotatedStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${innerLeft.value}px`,\n top: `${innerTop.value}px`,\n width: `${innerWidth.value}px`,\n height: `${innerHeight.value}px`,\n transform: annotationRotation.value !== 0 ? `rotate(${annotationRotation.value}deg)` : undefined,\n transformOrigin: innerTransformOrigin.value,\n outline: showOutline.value\n ? `${outlineWidth.value}px ${outlineStyle.value} ${outlineColor.value}`\n : 'none',\n outlineOffset: showOutline.value ? `${outlineOff.value}px` : '0px',\n pointerEvents: props.isSelected && !props.isMultiSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: props.isSelected && effectiveIsDraggable.value ? 'move' : 'default',\n}));\n\nconst guideHorizontalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value - guideLength.value / 2}px`,\n top: `${centerY.value}px`,\n width: `${guideLength.value}px`,\n height: '1px',\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideVerticalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value}px`,\n top: `${centerY.value - guideLength.value / 2}px`,\n width: '1px',\n height: `${guideLength.value}px`,\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideAngleStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value - guideLength.value / 2}px`,\n top: `${centerY.value}px`,\n width: `${guideLength.value}px`,\n height: '1px',\n transformOrigin: 'center center',\n transform: `rotate(${annotationRotation.value}deg)`,\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.8,\n pointerEvents: 'none',\n}));\n\nconst connectorLineStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.connector.style ?? {}),\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.handle.style ?? {}),\n backgroundColor: ROTATION_COLOR.value,\n border: `${ROTATION_BORDER_WIDTH.value}px ${ROTATION_BORDER_STYLE.value} ${ROTATION_BORDER_COLOR.value}`,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n opacity: rotationActive.value ? 0 : 1,\n}));\n\n// Event handlers from the rotation handle (without style - style is applied separately)\nconst rotationHandleBindings = computed(() => {\n if (!rotationHandleData.value) return {};\n const { style: _s, ...rest } = rotationHandleData.value.handle;\n return rest;\n});\n\nconst rotationHandleSlotProps = computed<RotationHandleSlotProps | Record<string, never>>(() => {\n if (!rotationHandleData.value) return {} as Record<string, never>;\n return {\n ...rotationHandleData.value.handle,\n backgroundColor: ROTATION_COLOR.value,\n iconColor: ROTATION_ICON_COLOR.value,\n connectorStyle: connectorLineStyle.value,\n showConnector: SHOW_CONNECTOR.value,\n opacity: rotationActive.value ? 0 : 1,\n border: {\n color: ROTATION_BORDER_COLOR.value,\n width: ROTATION_BORDER_WIDTH.value,\n style: ROTATION_BORDER_STYLE.value,\n },\n };\n});\n\nconst tooltipStyle = computed<CSSProperties>(() => ({\n position: 'fixed',\n left: cursorScreen.value ? `${cursorScreen.value.x + 16}px` : '0',\n top: cursorScreen.value ? `${cursorScreen.value.y - 16}px` : '0',\n background: 'rgba(0,0,0,0.8)',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n pointerEvents: 'none',\n zIndex: 10000,\n whiteSpace: 'nowrap',\n}));\n\n// Add useSlots to access slot information\nconst slots = useSlots();\n</script>\n","import { Rotation } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\nexport interface ScreenBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction mapCounterRotatePoint(\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: Rotation,\n): { x: number; y: number } {\n switch (rotation) {\n case 1:\n return { x: y, y: height - x };\n case 2:\n return { x: width - x, y: height - y };\n case 3:\n return { x: width - y, y: x };\n default:\n return { x, y };\n }\n}\n\n/**\n * Compute the screen-space bounding box of an annotation, correctly accounting\n * for `noZoom` (constant pixel size regardless of zoom) and `noRotate`\n * (visually upright regardless of page rotation) annotation flags.\n */\nexport function getAnnotationScreenBounds(\n annotation: TrackedAnnotation,\n scale: number,\n rotation: Rotation,\n): ScreenBounds {\n const flags = annotation.object.flags ?? [];\n const hasNoZoom = flags.includes('noZoom');\n const hasNoRotate = flags.includes('noRotate');\n\n const left = annotation.object.rect.origin.x * scale;\n const top = annotation.object.rect.origin.y * scale;\n const width = annotation.object.rect.size.width * (hasNoZoom ? 1 : scale);\n const height = annotation.object.rect.size.height * (hasNoZoom ? 1 : scale);\n\n if (!hasNoRotate || rotation === 0) {\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n };\n }\n\n const corners = [\n mapCounterRotatePoint(0, 0, width, height, rotation),\n mapCounterRotatePoint(width, 0, width, height, rotation),\n mapCounterRotatePoint(0, height, width, height, rotation),\n mapCounterRotatePoint(width, height, width, height, rotation),\n ];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const corner of corners) {\n if (corner.x < minX) minX = corner.x;\n if (corner.y < minY) minY = corner.y;\n if (corner.x > maxX) maxX = corner.x;\n if (corner.y > maxY) maxY = corner.y;\n }\n\n return {\n left: left + minX,\n top: top + minY,\n right: left + maxX,\n bottom: top + maxY,\n };\n}\n","<template>\n <div v-if=\"selectedAnnotations.length >= 2\" data-group-selection-box data-no-interaction>\n <!-- Outer div: AABB container - stable center for guide lines and rotation handle -->\n <div :style=\"outerStyle\">\n <!-- Rotation guide lines - anchored at stable center -->\n <template v-if=\"rotationActive\">\n <div :style=\"guideHorizontalStyle\" />\n <div :style=\"guideVerticalStyle\" />\n <div :style=\"guideAngleStyle\" />\n </template>\n\n <!-- Rotation handle - orbits in AABB space -->\n <template v-if=\"effectiveIsRotatable && rotationHandleData\">\n <div\n @pointerenter=\"isHandleHovered = true\"\n @pointerleave=\"\n isHandleHovered = false;\n cursorScreen = null;\n \"\n @pointermove=\"onHandlePointerMove\"\n :style=\"contentsStyle\"\n >\n <!-- Connector line -->\n <div v-if=\"SHOW_CONNECTOR\" :style=\"connectorLineStyle\" />\n <!-- Rotation handle element -->\n <slot\n v-if=\"slots['rotation-handle']\"\n name=\"rotation-handle\"\n v-bind=\"rotationHandleSlotProps\"\n >\n <div v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </slot>\n <div v-else v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </div>\n </template>\n\n <!-- Inner div: group content area with outline and resize handles -->\n <div\n v-bind=\"\n effectiveIsDraggable\n ? dragProps\n : { onPointerdown: (e: PointerEvent) => e.stopPropagation() }\n \"\n :style=\"boxStyle\"\n >\n <!-- Resize handles -->\n <template v-if=\"effectiveIsResizable && !rotationActive\">\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 </div>\n\n <!-- Group selection menu -->\n <CounterRotate v-if=\"shouldShowMenu && !rotationActive\" :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\n <!-- Cursor-following rotation tooltip - portaled to body to escape CSS transform chain -->\n <Teleport to=\"body\" v-if=\"(rotationActive || isHandleHovered) && cursorScreen\">\n <div :style=\"tooltipStyle\">{{ normalizedRotationDisplay.toFixed(0) }}°</div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n useSlots,\n type CSSProperties,\n type VNode,\n shallowRef,\n watch,\n Teleport,\n} from 'vue';\nimport { Rect, Rotation, 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 { getAnnotationScreenBounds } from '../../shared/annotation-bounds';\nimport { useDocumentPermissions } from '@embedpdf/core/vue';\nimport { useAnnotationPlugin } from '../hooks';\nimport {\n GroupSelectionContext,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n RotationHandleUI,\n RotationHandleSlotProps,\n SelectionOutline,\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 /** Whether the group can be rotated */\n isRotatable?: boolean;\n /** Whether to lock aspect ratio during group resize */\n lockAspectRatio?: boolean;\n /** Resize handle UI customization */\n resizeUi?: ResizeHandleUI;\n /** Rotation handle UI customization */\n rotationUi?: RotationHandleUI;\n /** @deprecated Use `selectionOutline.color` instead */\n selectionOutlineColor?: string;\n /** @deprecated Use `selectionOutline.offset` instead */\n outlineOffset?: number;\n /** Customize the selection outline (color, style, width, offset) */\n selectionOutline?: SelectionOutline;\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 isRotatable: true,\n lockAspectRatio: false,\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);\nconst liveRotation = ref<number | null>(null);\nconst cursorScreen = ref<{ x: number; y: number } | null>(null);\nconst isHandleHovered = ref(false);\n\n// Check permissions before allowing drag/resize/rotate\nconst effectiveIsDraggable = computed(\n () => permissions.value.canModifyAnnotations && props.isDraggable,\n);\nconst effectiveIsResizable = computed(\n () => permissions.value.canModifyAnnotations && props.isResizable,\n);\nconst effectiveIsRotatable = computed(\n () => permissions.value.canModifyAnnotations && props.isRotatable,\n);\n\n// UI constants\nconst HANDLE_COLOR = computed(() => props.resizeUi?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUi?.size ?? 12);\nconst ROTATION_SIZE = computed(() => props.rotationUi?.size ?? 32);\nconst ROTATION_COLOR = computed(() => props.rotationUi?.color ?? 'white');\nconst ROTATION_CONNECTOR_COLOR = computed(() => props.rotationUi?.connectorColor ?? '#007ACC');\nconst ROTATION_ICON_COLOR = computed(() => props.rotationUi?.iconColor ?? '#007ACC');\nconst SHOW_CONNECTOR = computed(() => props.rotationUi?.showConnector ?? false);\nconst ROTATION_MARGIN = computed(() => props.rotationUi?.margin);\nconst ROTATION_BORDER_COLOR = computed(() => props.rotationUi?.border?.color ?? '#007ACC');\nconst ROTATION_BORDER_WIDTH = computed(() => props.rotationUi?.border?.width ?? 1);\nconst ROTATION_BORDER_STYLE = computed(() => props.rotationUi?.border?.style ?? 'solid');\n\n// Outline resolution (new object > deprecated props > group defaults)\nconst outlineColor = computed(\n () => props.selectionOutline?.color ?? props.selectionOutlineColor ?? '#007ACC',\n);\nconst outlineStyleVal = computed(() => props.selectionOutline?.style ?? 'dashed');\nconst outlineWidth = computed(() => props.selectionOutline?.width ?? 2);\nconst outlineOff = computed(() => props.selectionOutline?.offset ?? props.outlineOffset ?? 2);\n\n// Rotation display\nconst groupRotationDisplay = computed(() => liveRotation.value ?? 0);\nconst rotationActive = computed(() => liveRotation.value !== null);\nconst normalizedRotationDisplay = computed(() => {\n const val = groupRotationDisplay.value;\n return Number.isFinite(val) ? Math.round(val * 10) / 10 : 0;\n});\nconst rotationIconSize = computed(() => Math.round(ROTATION_SIZE.value * 0.6));\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\nwatch(\n () => groupBox.value,\n (newGroupBox) => {\n if (!isDraggingRef.value && !isResizingRef.value) {\n previewGroupBox.value = newGroupBox;\n }\n },\n { immediate: true },\n);\n\n// Subscribe to rotation end/cancel events\nwatch(\n () => annotationPlugin.value,\n (plugin, _old, onCleanup) => {\n if (!plugin) return;\n const unsub = plugin.onRotateChange((event: { documentId: string; type: string }) => {\n if (event.documentId !== props.documentId) return;\n if (event.type === 'end' || event.type === 'cancel') {\n liveRotation.value = null;\n }\n });\n onCleanup(unsub);\n },\n { immediate: true },\n);\n\n// Layout computations\n// Compute visual bounds correction to account for mixed noZoom/noRotate selections.\nconst visualBoundsCorrection = computed(() => {\n let visualLeft = Infinity;\n let visualTop = Infinity;\n let visualRight = -Infinity;\n let visualBottom = -Infinity;\n for (const ta of props.selectedAnnotations) {\n const bounds = getAnnotationScreenBounds(ta, props.scale, props.rotation as Rotation);\n if (bounds.left < visualLeft) visualLeft = bounds.left;\n if (bounds.top < visualTop) visualTop = bounds.top;\n if (bounds.right > visualRight) visualRight = bounds.right;\n if (bounds.bottom > visualBottom) visualBottom = bounds.bottom;\n }\n const gb = groupBox.value;\n const logicalLeft = gb.origin.x * props.scale;\n const logicalTop = gb.origin.y * props.scale;\n const logicalRight = (gb.origin.x + gb.size.width) * props.scale;\n const logicalBottom = (gb.origin.y + gb.size.height) * props.scale;\n return {\n left: visualLeft - logicalLeft,\n top: visualTop - logicalTop,\n right: visualRight - logicalRight,\n bottom: visualBottom - logicalBottom,\n };\n});\n\nconst groupBoxLeft = computed(\n () => previewGroupBox.value.origin.x * props.scale + visualBoundsCorrection.value.left,\n);\nconst groupBoxTop = computed(\n () => previewGroupBox.value.origin.y * props.scale + visualBoundsCorrection.value.top,\n);\nconst groupBoxWidth = computed(\n () =>\n previewGroupBox.value.size.width * props.scale +\n (visualBoundsCorrection.value.right - visualBoundsCorrection.value.left),\n);\nconst groupBoxHeight = computed(\n () =>\n previewGroupBox.value.size.height * props.scale +\n (visualBoundsCorrection.value.bottom - visualBoundsCorrection.value.top),\n);\nconst groupCenterX = computed(() => groupBoxWidth.value / 2);\nconst groupCenterY = computed(() => groupBoxHeight.value / 2);\nconst groupGuideLength = computed(() =>\n Math.max(300, Math.max(groupBoxWidth.value, groupBoxHeight.value) + 80),\n);\n\n// ─── Extracted style computations ──────────────────────────────────────\nconst contentsStyle: CSSProperties = { display: 'contents' };\n\nconst outerStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupBoxLeft.value}px`,\n top: `${groupBoxTop.value}px`,\n width: `${groupBoxWidth.value}px`,\n height: `${groupBoxHeight.value}px`,\n pointerEvents: 'none',\n zIndex: props.zIndex,\n}));\n\nconst boxStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: 0,\n top: 0,\n width: `${groupBoxWidth.value}px`,\n height: `${groupBoxHeight.value}px`,\n outline: rotationActive.value\n ? 'none'\n : `${outlineWidth.value}px ${outlineStyleVal.value} ${outlineColor.value}`,\n outlineOffset: `${outlineOff.value - 1}px`,\n cursor: effectiveIsDraggable.value ? 'move' : 'default',\n touchAction: 'none',\n pointerEvents: 'auto',\n}));\n\nconst guideHorizontalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value - groupGuideLength.value / 2}px`,\n top: `${groupCenterY.value}px`,\n width: `${groupGuideLength.value}px`,\n height: '1px',\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideVerticalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value}px`,\n top: `${groupCenterY.value - groupGuideLength.value / 2}px`,\n width: '1px',\n height: `${groupGuideLength.value}px`,\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideAngleStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value - groupGuideLength.value / 2}px`,\n top: `${groupCenterY.value}px`,\n width: `${groupGuideLength.value}px`,\n height: '1px',\n transformOrigin: 'center center',\n transform: `rotate(${groupRotationDisplay.value}deg)`,\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.8,\n pointerEvents: 'none',\n}));\n\nconst connectorLineStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.connector.style ?? {}),\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.handle.style ?? {}),\n backgroundColor: ROTATION_COLOR.value,\n border: `${ROTATION_BORDER_WIDTH.value}px ${ROTATION_BORDER_STYLE.value} ${ROTATION_BORDER_COLOR.value}`,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleBindings = computed(() => {\n if (!rotationHandleData.value) return {};\n const { style: _s, ...rest } = rotationHandleData.value.handle;\n return rest;\n});\n\nconst rotationHandleSlotProps = computed<RotationHandleSlotProps | Record<string, never>>(() => {\n if (!rotationHandleData.value) return {} as Record<string, never>;\n return {\n ...rotationHandleData.value.handle,\n backgroundColor: ROTATION_COLOR.value,\n iconColor: ROTATION_ICON_COLOR.value,\n connectorStyle: connectorLineStyle.value,\n showConnector: SHOW_CONNECTOR.value,\n opacity: rotationActive.value ? 0 : 1,\n border: {\n color: ROTATION_BORDER_COLOR.value,\n width: ROTATION_BORDER_WIDTH.value,\n style: ROTATION_BORDER_STYLE.value,\n },\n };\n});\n\nconst tooltipStyle = computed<CSSProperties>(() => ({\n position: 'fixed',\n left: cursorScreen.value ? `${cursorScreen.value.x + 16}px` : '0',\n top: cursorScreen.value ? `${cursorScreen.value.y - 16}px` : '0',\n background: 'rgba(0,0,0,0.8)',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n pointerEvents: 'none',\n zIndex: 10000,\n whiteSpace: 'nowrap',\n}));\n\n// Menu rect for counter-rotate component\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: groupBoxLeft.value,\n y: groupBoxTop.value,\n },\n size: {\n width: groupBoxWidth.value,\n height: groupBoxHeight.value,\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 - calculate suggestTop based on rotation handle position\nconst menuPlacement = computed<SelectionMenuPlacement>(() => {\n const effectiveAngle = (((groupRotationDisplay.value + props.rotation * 90) % 360) + 360) % 360;\n const handleNearMenuSide =\n effectiveIsRotatable.value && effectiveAngle > 90 && effectiveAngle < 270;\n return {\n suggestTop: handleNearMenuSide,\n };\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// Handle pointer move on the rotation handle wrapper (for cursor tooltip when not rotating)\nconst onHandlePointerMove = (e: PointerEvent) => {\n if (!rotationActive.value) {\n cursorScreen.value = { x: e.clientX, y: e.clientY };\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 drag, resize, and rotation\nconst {\n dragProps,\n resize,\n rotation: rotationHandleData,\n} = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: computed(() => []),\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\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 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 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 // Handle rotation\n if (transformType === 'rotate') {\n if (!props.isRotatable) return;\n const ids = props.selectedAnnotations.map((ta) => ta.object.id);\n const cursorAngle = event.transformData.metadata?.rotationAngle ?? 0;\n const cursorPos = event.transformData.metadata?.cursorPosition;\n if (cursorPos) cursorScreen.value = { x: cursorPos.clientX, y: cursorPos.clientY };\n if (event.state === 'start') {\n liveRotation.value = cursorAngle;\n plugin.startRotation(props.documentId, {\n annotationIds: ids,\n cursorAngle,\n rotationCenter: event.transformData.metadata?.rotationCenter,\n });\n } else if (event.state === 'move') {\n liveRotation.value = cursorAngle;\n plugin.updateRotation(\n props.documentId,\n cursorAngle,\n event.transformData.metadata?.rotationDelta,\n );\n } else if (event.state === 'end') {\n liveRotation.value = null;\n cursorScreen.value = null;\n plugin.commitRotation(props.documentId);\n }\n return;\n }\n\n const base = gestureBase.value ?? groupBox.value;\n\n if (isMove && event.transformData.changes.rect) {\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 const clampedDelta = plugin.updateDrag(props.documentId, rawDelta);\n\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 plugin.updateResize(props.documentId, newGroupBox);\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.commitDrag(props.documentId);\n } else if (isResize && isResizingRef.value) {\n isResizingRef.value = false;\n plugin.commitResize(props.documentId);\n }\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE.value,\n spacing: outlineOff.value,\n offsetMode: 'outside',\n includeSides: !props.lockAspectRatio,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: props.zIndex,\n },\n rotationUI: {\n handleSize: ROTATION_SIZE.value,\n margin: ROTATION_MARGIN.value,\n zIndex: props.zIndex + 2,\n showConnector: SHOW_CONNECTOR.value,\n },\n includeVertices: false,\n includeRotation: effectiveIsRotatable,\n currentRotation: computed(() => liveRotation.value ?? 0),\n});\n</script>\n","import {\n inject,\n provide,\n markRaw,\n onUnmounted,\n shallowRef,\n type InjectionKey,\n type ShallowRef,\n type Component,\n type CSSProperties,\n} from 'vue';\nimport type {\n BoxedAnnotationRenderer,\n AnnotationRendererEntry,\n AnnotationRendererProps,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n} from './types';\nimport type { PdfAnnotationObject } from '@embedpdf/models';\nimport type { VertexConfig } from '../../shared/types';\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 renderers.value = [...renderers.value.filter((r) => !ids.has(r.id)), ...entries];\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 vertexConfig: entry.vertexConfig as VertexConfig<PdfAnnotationObject> | undefined,\n zIndex: entry.zIndex,\n defaultBlendMode: entry.defaultBlendMode,\n containerStyle: entry.containerStyle as\n | ((annotation: PdfAnnotationObject) => CSSProperties)\n | undefined,\n interactionDefaults: entry.interactionDefaults,\n useAppearanceStream: entry.useAppearanceStream,\n isDraggable: entry.isDraggable,\n onDoubleClick: entry.onDoubleClick,\n selectOverride: entry.selectOverride as BoxedAnnotationRenderer['selectOverride'],\n hideSelectionMenu: entry.hideSelectionMenu as\n | ((annotation: PdfAnnotationObject) => boolean)\n | undefined,\n };\n}\n\n// Re-export types for convenience\nexport type {\n AnnotationRendererProps,\n AnnotationRendererEntry,\n BoxedAnnotationRenderer,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n};\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-for=\"(d, i) in paths\"\n :key=\"`hit-${i}`\"\n :d=\"d\"\n fill=\"none\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-for=\"(d, i) in paths\"\n :key=\"`vis-${i}`\"\n :d=\"d\"\n fill=\"none\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n inkList: PdfInkListObject[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 1,\n appearanceActive: false,\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);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <InkVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfInkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport InkVue from '../annotations/ink.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfInkAnnoObject>>();\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 ${rect.size.width} ${rect.size.height}`\"\n overflow=\"visible\"\n >\n <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <rect\n v-else\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n strokeLinejoin: 'round',\n }\"\n />\n <rect\n v-else\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, PdfRectDifferences, Rect } from '@embedpdf/models';\nimport { generateCloudyRectanglePath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n rectangleDifferences?: PdfRectDifferences;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value) return null;\n return generateCloudyRectanglePath(\n { x: 0, y: 0, width: props.rect.size.width, height: props.rect.size.height },\n props.rectangleDifferences,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\n});\n\nconst svgWidth = computed(() => props.rect.size.width * props.scale);\nconst svgHeight = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <SquareVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfSquareAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport SquareVue from '../annotations/square.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfSquareAnnoObject>>();\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 overflow=\"visible\"\n >\n <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <ellipse\n v-else\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n strokeLinejoin: 'round',\n }\"\n />\n <ellipse\n v-else\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, PdfRectDifferences, Rect } from '@embedpdf/models';\nimport { generateCloudyEllipsePath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n rectangleDifferences?: PdfRectDifferences;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value) return null;\n return generateCloudyEllipsePath(\n { x: 0, y: 0, width: props.rect.size.width, height: props.rect.size.height },\n props.rectangleDifferences,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\n});\n\nconst svgWidth = computed(() => geometry.value.width * props.scale);\nconst svgHeight = computed(() => geometry.value.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <CircleVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfCircleAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport CircleVue from '../annotations/circle.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfCircleAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\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 :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n :style=\"{\n pointerEvents: 'none',\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\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 :style=\"{\n pointerEvents: 'none',\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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 MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n isSelected: boolean;\n appearanceActive?: boolean;\n }>(),\n {\n color: 'transparent',\n opacity: 1,\n strokeColor: '#000000',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\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 width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <LineVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfLineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport LineVue from '../annotations/line.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfLineAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n :d=\"pathData\"\n fill=\"none\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\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 fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n :d=\"pathData\"\n :opacity=\"opacity\"\n :style=\"{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\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 :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n :style=\"{\n pointerEvents: 'none',\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\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 :style=\"{\n pointerEvents: 'none',\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n lineEndings?: LineEndings;\n appearanceActive?: boolean;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\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 width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <PolylineVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfPolylineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport PolylineVue from '../annotations/polyline.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfPolylineAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n :d=\"isCloudy && cloudyPath ? cloudyPath.path : pathData\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :opacity=\"opacity\"\n :style=\"{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\n strokeLinejoin: 'round',\n }\"\n />\n <template v-else>\n <path\n :d=\"pathData\"\n :opacity=\"opacity\"\n :style=\"{\n fill: currentVertex ? 'none' : color,\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\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 pointerEvents: 'none',\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 style=\"pointer-events: none\"\n />\n </template>\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { generateCloudyPolygonPath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n currentVertex?: Position;\n handleSize?: number;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n handleSize: 14,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value || allPoints.value.length < 3) return null;\n return generateCloudyPolygonPath(\n allPoints.value,\n props.rect.origin,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\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);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <PolygonVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfPolygonAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport PolygonVue from '../annotations/polygon.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfPolygonAnnoObject>>();\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 opacity: appearanceActive ? 0 : 1,\n }\"\n @pointerdown=\"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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, onMounted } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCssProperties,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n appearanceActive: false,\n },\n);\n\nconst editorRef = ref<HTMLSpanElement | null>(null);\nconst editingRef = ref(false);\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst annotationProvides = computed(\n () => annotationCapability.value?.forDocument(props.documentId) ?? null,\n);\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 editingRef.value = true;\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 (!editingRef.value) return;\n editingRef.value = false;\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 ...standardFontCssProperties(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 <FreeTextVue\n :documentId=\"documentId\"\n :isSelected=\"isSelected\"\n :isEditing=\"isEditing\"\n :annotation=\"{ ...annotation, object: currentObject }\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfFreeTextAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport FreeTextVue from '../annotations/free-text.vue';\n\nconst {\n annotation,\n currentObject,\n isSelected,\n isEditing,\n scale,\n pageIndex,\n documentId,\n onClick,\n appearanceActive,\n} = defineProps<AnnotationRendererProps<PdfFreeTextAnnoObject>>();\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 unrotated?: boolean;\n style?: CSSProperties;\n }>(),\n {\n scaleFactor: 1,\n unrotated: false,\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.unrotated,\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 unrotated: props.unrotated,\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 >\n <RenderAnnotation\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :annotation=\"{ ...annotation.object, id: annotation.object.id }\"\n :scaleFactor=\"scale\"\n :unrotated=\"unrotated\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport RenderAnnotation from '../render-annotation.vue';\n\nconst props = defineProps<{\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: PointerEvent) => void;\n}>();\n\nconst unrotated = computed(\n () => !!props.annotation.object.rotation && !!props.annotation.object.unrotatedRect,\n);\n</script>\n","<template>\n <StampVue\n :isSelected=\"isSelected\"\n :annotation=\"annotation\"\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport StampVue from '../annotations/stamp.vue';\n\nconst { annotation, isSelected, documentId, pageIndex, scale, onClick } =\n defineProps<AnnotationRendererProps<PdfStampAnnoObject>>();\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?.($event)\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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: PointerEvent | MouseEvent) => 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 <LinkVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :hasIRT=\"!!currentObject.inReplyToId\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport LinkVue from '../annotations/link.vue';\n\nconst { currentObject, isSelected, scale, onClick } =\n defineProps<AnnotationRendererProps<PdfLinkAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(b, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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: appearanceActive ? 'transparent' : resolvedColor,\n opacity: appearanceActive ? undefined : opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n }\"\n ></div>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\n</script>\n","<template>\n <HighlightVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfHighlightAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport HighlightVue from '../text-markup/highlight.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfHighlightAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <UnderlineVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfUnderlineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport UnderlineVue from '../text-markup/underline.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfUnderlineAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <StrikeoutVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStrikeOutAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport StrikeoutVue from '../text-markup/strikeout.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfStrikeOutAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\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 <SquigglyVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfSquigglyAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport SquigglyVue from '../text-markup/squiggly.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfSquigglyAnnoObject>>();\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 ${width} ${height}`\"\n overflow=\"visible\"\n >\n <!-- Hit area -->\n <path\n :d=\"path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"4\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visible',\n }\"\n />\n <!-- Visual -->\n <path\n v-if=\"!appearanceActive\"\n :d=\"path\"\n :fill=\"strokeColor\"\n :stroke=\"strokeColor\"\n :stroke-width=\"0.5\"\n :opacity=\"opacity\"\n fill-rule=\"evenodd\"\n :style=\"{ pointerEvents: 'none' }\"\n />\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n strokeColor?: string;\n opacity?: number;\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n strokeColor: '#000000',\n opacity: 1,\n appearanceActive: false,\n },\n);\n\nconst width = computed(() => props.rect.size.width);\nconst height = computed(() => props.rect.size.height);\n\nconst path = computed(() => {\n const w = width.value;\n const h = height.value;\n const midX = w / 2;\n\n return [\n `M 0 ${h}`,\n `C ${w * 0.27} ${h} ${midX} ${h - h * 0.44} ${midX} 0`,\n `C ${midX} ${h - h * 0.44} ${w - w * 0.27} ${h} ${w} ${h}`,\n 'Z',\n ].join(' ');\n});\n\nconst svgWidth = computed(() => width.value * props.scale);\nconst svgHeight = computed(() => height.value * props.scale);\n</script>\n","<template>\n <CaretVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfCaretAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport CaretVue from '../annotations/caret.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfCaretAnnoObject>>();\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n inset: 0,\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: isSelected ? 'move' : 'pointer',\n }\"\n @pointerdown=\"onClick\"\n >\n <svg\n v-if=\"!appearanceActive\"\n :style=\"{ position: 'absolute', inset: 0, pointerEvents: 'none' }\"\n viewBox=\"0 0 20 20\"\n width=\"100%\"\n height=\"100%\"\n >\n <path\n d=\"M 0.5 15.5 L 0.5 0.5 L 19.5 0.5 L 19.5 15.5 L 8.5 15.5 L 6.5 19.5 L 4.5 15.5 Z\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :stroke=\"lineColor\"\n stroke-width=\"1\"\n stroke-linejoin=\"miter\"\n />\n <line x1=\"2.5\" y1=\"4.25\" x2=\"17.5\" y2=\"4.25\" :stroke=\"lineColor\" stroke-width=\"1\" />\n <line x1=\"2.5\" y1=\"8\" x2=\"17.5\" y2=\"8\" :stroke=\"lineColor\" stroke-width=\"1\" />\n <line x1=\"2.5\" y1=\"11.75\" x2=\"17.5\" y2=\"11.75\" :stroke=\"lineColor\" stroke-width=\"1\" />\n </svg>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { getContrastStrokeColor } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n color?: string;\n opacity?: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n color: '#facc15',\n opacity: 1,\n appearanceActive: false,\n },\n);\n\nconst lineColor = computed(() => getContrastStrokeColor(props.color));\n</script>\n","<template>\n <TextVue\n :isSelected=\"isSelected\"\n :color=\"currentObject.strokeColor ?? currentObject.color\"\n :opacity=\"currentObject.opacity\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfTextAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport TextVue from '../annotations/text.vue';\n\nconst { currentObject, isSelected, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfTextAnnoObject>>();\n</script>\n","import {\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfInkAnnoObject,\n PdfSquareAnnoObject,\n PdfCircleAnnoObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n PdfFreeTextAnnoObject,\n PdfStampAnnoObject,\n PdfLinkAnnoObject,\n PdfHighlightAnnoObject,\n PdfUnderlineAnnoObject,\n PdfStrikeOutAnnoObject,\n PdfSquigglyAnnoObject,\n PdfCaretAnnoObject,\n PdfTextAnnoObject,\n} from '@embedpdf/models';\nimport type { BoxedAnnotationRenderer } from '../context';\nimport { createRenderer } from '../context/renderer-registry';\n\nimport InkRenderer from './renderers/ink-renderer.vue';\nimport SquareRenderer from './renderers/square-renderer.vue';\nimport CircleRenderer from './renderers/circle-renderer.vue';\nimport LineRenderer from './renderers/line-renderer.vue';\nimport PolylineRenderer from './renderers/polyline-renderer.vue';\nimport PolygonRenderer from './renderers/polygon-renderer.vue';\nimport FreeTextRenderer from './renderers/free-text-renderer.vue';\nimport StampRenderer from './renderers/stamp-renderer.vue';\nimport LinkRenderer from './renderers/link-renderer.vue';\nimport HighlightRenderer from './renderers/highlight-renderer.vue';\nimport UnderlineRenderer from './renderers/underline-renderer.vue';\nimport StrikeoutRenderer from './renderers/strikeout-renderer.vue';\nimport SquigglyRenderer from './renderers/squiggly-renderer.vue';\nimport CaretRenderer from './renderers/caret-renderer.vue';\nimport TextRenderer from './renderers/text-renderer.vue';\n\nexport const builtInRenderers: BoxedAnnotationRenderer[] = [\n createRenderer<PdfInkAnnoObject>({\n id: 'ink',\n matches: (a): a is PdfInkAnnoObject => a.type === PdfAnnotationSubtype.INK,\n component: InkRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfSquareAnnoObject>({\n id: 'square',\n matches: (a): a is PdfSquareAnnoObject => a.type === PdfAnnotationSubtype.SQUARE,\n component: SquareRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfCircleAnnoObject>({\n id: 'circle',\n matches: (a): a is PdfCircleAnnoObject => a.type === PdfAnnotationSubtype.CIRCLE,\n component: CircleRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLineAnnoObject>({\n id: 'line',\n matches: (a): a is PdfLineAnnoObject => a.type === PdfAnnotationSubtype.LINE,\n component: LineRenderer,\n vertexConfig: {\n extractVertices: (a) => [a.linePoints.start, a.linePoints.end],\n transformAnnotation: (a, v) => ({\n ...a,\n linePoints: { start: v[0], end: v[1] },\n }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfPolylineAnnoObject>({\n id: 'polyline',\n matches: (a): a is PdfPolylineAnnoObject => a.type === PdfAnnotationSubtype.POLYLINE,\n component: PolylineRenderer,\n vertexConfig: {\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfPolygonAnnoObject>({\n id: 'polygon',\n matches: (a): a is PdfPolygonAnnoObject => a.type === PdfAnnotationSubtype.POLYGON,\n component: PolygonRenderer,\n vertexConfig: {\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfHighlightAnnoObject>({\n id: 'highlight',\n matches: (a): a is PdfHighlightAnnoObject => a.type === PdfAnnotationSubtype.HIGHLIGHT,\n component: HighlightRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n defaultBlendMode: PdfBlendMode.Multiply,\n }),\n\n createRenderer<PdfUnderlineAnnoObject>({\n id: 'underline',\n matches: (a): a is PdfUnderlineAnnoObject => a.type === PdfAnnotationSubtype.UNDERLINE,\n component: UnderlineRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfStrikeOutAnnoObject>({\n id: 'strikeout',\n matches: (a): a is PdfStrikeOutAnnoObject => a.type === PdfAnnotationSubtype.STRIKEOUT,\n component: StrikeoutRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfSquigglyAnnoObject>({\n id: 'squiggly',\n matches: (a): a is PdfSquigglyAnnoObject => a.type === PdfAnnotationSubtype.SQUIGGLY,\n component: SquigglyRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfTextAnnoObject>({\n id: 'text',\n matches: (a): a is PdfTextAnnoObject => a.type === PdfAnnotationSubtype.TEXT && !a.inReplyToId,\n component: TextRenderer,\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfCaretAnnoObject>({\n id: 'caret',\n matches: (a): a is PdfCaretAnnoObject => a.type === PdfAnnotationSubtype.CARET,\n component: CaretRenderer,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfFreeTextAnnoObject>({\n id: 'freeText',\n matches: (a): a is PdfFreeTextAnnoObject => a.type === PdfAnnotationSubtype.FREETEXT,\n component: FreeTextRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n isDraggable: (toolDraggable, { isEditing }) => toolDraggable && !isEditing,\n onDoubleClick: (id, setEditingId) => setEditingId(id),\n }),\n\n createRenderer<PdfStampAnnoObject>({\n id: 'stamp',\n matches: (a): a is PdfStampAnnoObject => a.type === PdfAnnotationSubtype.STAMP,\n component: StampRenderer,\n useAppearanceStream: false,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLinkAnnoObject>({\n id: 'link',\n matches: (a): a is PdfLinkAnnoObject => a.type === PdfAnnotationSubtype.LINK,\n component: LinkRenderer,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n useAppearanceStream: false,\n selectOverride: (e, annotation, helpers) => {\n e.stopPropagation();\n helpers.clearSelection();\n if (annotation.object.inReplyToId) {\n const parent = helpers.allAnnotations.find(\n (a) => a.object.id === annotation.object.inReplyToId,\n );\n if (parent) {\n helpers.selectAnnotation(parent.object.pageIndex, parent.object.id);\n return;\n }\n }\n helpers.selectAnnotation(helpers.pageIndex, annotation.object.id);\n },\n hideSelectionMenu: (a) => !!a.inReplyToId,\n }),\n];\n","<template>\n <template v-for=\"{ annotation, renderer } in resolvedAnnotations\" :key=\"annotation.object.id\">\n <template v-if=\"renderer\">\n <AnnotationContainer\n :trackedAnnotation=\"annotation\"\n :isSelected=\"allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"editingId === annotation.object.id\"\n :isMultiSelected=\"isMultiSelected\"\n :isDraggable=\"getFinalDraggable(annotation, renderer)\"\n :isResizable=\"getResolvedResizable(annotation, renderer)\"\n :lockAspectRatio=\"getResolvedLockAspectRatio(annotation, renderer)\"\n :isRotatable=\"getResolvedRotatable(annotation, renderer)\"\n :vertexConfig=\"renderer.vertexConfig\"\n :selectionMenu=\"getSelectionMenu(annotation, renderer)\"\n :onSelect=\"getOnSelect(annotation, renderer)\"\n :onDoubleClick=\"getOnDoubleClick(renderer, annotation)\"\n :zIndex=\"renderer.zIndex\"\n :blendMode=\"getBlendMode(annotation, renderer)\"\n :style=\"renderer.containerStyle?.(annotation.object)\"\n :appearance=\"getAppearance(annotation, renderer)\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject, appearanceActive }\">\n <component\n :is=\"renderer.component\"\n :annotation=\"annotation\"\n :currentObject=\"currentObject\"\n :isSelected=\"allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"editingId === annotation.object.id\"\n :scale=\"scale\"\n :pageIndex=\"pageIndex\"\n :documentId=\"documentId\"\n :onClick=\"getOnSelect(annotation, renderer)\"\n :appearanceActive=\"appearanceActive\"\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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n </template>\n </template>\n\n <!-- Group Selection Box -->\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 :isRotatable=\"areAllSelectedRotatable\"\n :lockAspectRatio=\"shouldLockGroupAspectRatio\"\n :resizeUi=\"resizeUi\"\n :rotationUi=\"rotationUi\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionOutline=\"groupSelectionOutline ?? selectionOutline\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n >\n <template #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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-handle\" v-bind=\"slotProps\" />\n </template>\n </GroupSelectionBox>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, shallowRef, computed, watch } from 'vue';\nimport {\n blendModeToCss,\n PdfAnnotationObject,\n PdfBlendMode,\n type CssBlendMode,\n Position,\n AnnotationAppearanceMap,\n AnnotationAppearances,\n} from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n TrackedAnnotation,\n resolveInteractionProp,\n} from '@embedpdf/plugin-annotation';\nimport type { EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/vue';\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 {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n RotationHandleUI,\n SelectionOutline,\n} from '../types';\nimport type {\n BoxedAnnotationRenderer,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n} from '../context';\nimport { builtInRenderers } from './built-in-renderers';\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 rotationUi?: RotationHandleUI;\n selectionOutlineColor?: string;\n selectionOutline?: SelectionOutline;\n groupSelectionOutline?: SelectionOutline;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n annotationRenderers?: BoxedAnnotationRenderer[];\n}>();\n\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { provides: selectionProvides } = useSelectionCapability();\nconst annotations = shallowRef<TrackedAnnotation[]>([]);\nconst allSelectedIds = shallowRef<string[]>([]);\nconst { register } = usePointerHandlers({\n documentId: () => props.documentId,\n pageIndex: props.pageIndex,\n});\nconst editingId = ref<string | null>(null);\nconst appearanceMap = shallowRef<AnnotationAppearanceMap<Blob>>({});\nlet prevScale = props.scale;\n\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\nconst isMultiSelected = computed(() => allSelectedIds.value.length > 1);\n\n// Merge renderers: external renderers override built-ins by ID\nconst allRenderers = computed(() => {\n const external = props.annotationRenderers ?? [];\n const externalIds = new Set(external.map((r) => r.id));\n return [...external, ...builtInRenderers.filter((r) => !externalIds.has(r.id))];\n});\n\nconst resolveRenderer = (annotation: TrackedAnnotation): BoxedAnnotationRenderer | null => {\n return allRenderers.value.find((r) => r.matches(annotation.object)) ?? null;\n};\n\nconst getAppearanceForAnnotation = (ta: TrackedAnnotation): AnnotationAppearances<Blob> | null => {\n if (ta.dictMode) return null;\n if (ta.object.rotation && ta.object.unrotatedRect) return null;\n const appearances = appearanceMap.value[ta.object.id];\n if (!appearances?.normal) return null;\n return appearances;\n};\n\n// Subscribe to annotation state. Explicit watch dependencies avoid accidental\n// reactive tracking inside provider methods that can create update loops.\nwatch(\n [annotationProvides, () => props.pageIndex],\n ([provides, pageIndex], _prev, onCleanup) => {\n if (!provides) {\n annotations.value = [];\n allSelectedIds.value = [];\n return;\n }\n\n const syncState = (state: ReturnType<typeof provides.getState>) => {\n annotations.value = getAnnotationsByPageIndex(state, pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(state);\n };\n\n syncState(provides.getState());\n const off = provides.onStateChange(syncState);\n onCleanup(off);\n },\n { immediate: true },\n);\n\n// Fetch appearance map, invalidate on scale change\nwatch(\n [annotationProvides, () => props.pageIndex, () => props.scale],\n ([provides, pageIndex, scale], _prev, onCleanup) => {\n if (!provides) {\n appearanceMap.value = {};\n return;\n }\n\n if (prevScale !== scale) {\n provides.invalidatePageAppearances(pageIndex);\n prevScale = scale;\n }\n\n let cancelled = false;\n onCleanup(() => {\n cancelled = true;\n });\n\n const task = provides.getPageAppearances(pageIndex, {\n scaleFactor: scale,\n dpr: typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n });\n task.wait(\n (map) => {\n if (!cancelled) appearanceMap.value = map;\n },\n () => {\n if (!cancelled) appearanceMap.value = {};\n },\n );\n },\n { immediate: true },\n);\n\nconst resolvedAnnotations = computed(() =>\n annotations.value.map((annotation) => ({\n annotation,\n renderer: resolveRenderer(annotation),\n })),\n);\n\nconst getFinalDraggable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n const defaults = renderer.interactionDefaults;\n const isEditing = editingId.value === annotation.object.id;\n const resolvedDraggable = resolveInteractionProp(\n tool?.interaction.isDraggable,\n annotation.object,\n defaults?.isDraggable ?? true,\n );\n return renderer.isDraggable\n ? renderer.isDraggable(resolvedDraggable, { isEditing })\n : resolvedDraggable;\n};\n\nconst getResolvedResizable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.isResizable,\n annotation.object,\n renderer.interactionDefaults?.isResizable ?? false,\n );\n};\n\nconst getResolvedLockAspectRatio = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.lockAspectRatio,\n annotation.object,\n renderer.interactionDefaults?.lockAspectRatio ?? false,\n );\n};\n\nconst getResolvedRotatable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.isRotatable,\n annotation.object,\n renderer.interactionDefaults?.isRotatable ?? false,\n );\n};\n\nconst getSelectionMenu = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n if (renderer.hideSelectionMenu?.(annotation.object)) return undefined;\n if (isMultiSelected.value) return undefined;\n return props.selectionMenu;\n};\n\nconst getOnSelect = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n if (renderer.selectOverride) {\n const selectHelpers: SelectOverrideHelpers = {\n defaultSelect: handleClick,\n selectAnnotation: (pi: number, id: string) =>\n annotationProvides.value?.selectAnnotation(pi, id),\n clearSelection: () => selectionProvides.value?.clear(),\n allAnnotations: annotations.value,\n pageIndex: props.pageIndex,\n };\n return (e: AnnotationInteractionEvent) =>\n renderer.selectOverride!(e, annotation, selectHelpers);\n }\n return (e: AnnotationInteractionEvent) => handleClick(e, annotation);\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: AnnotationInteractionEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides.value && selectionProvides.value) {\n selectionProvides.value.clear();\n\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n annotationProvides.value.toggleSelection(props.pageIndex, annotation.object.id);\n } else {\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\nconst setEditingId = (id: string) => {\n editingId.value = id;\n};\n\nconst pointerHandlers = { onPointerDown: handlePointerDown };\n\nwatch(\n annotationProvides,\n (provides, _prev, onCleanup) => {\n if (!provides) return;\n const unregister = register(pointerHandlers);\n if (unregister) {\n onCleanup(unregister);\n }\n },\n { immediate: true },\n);\n\nconst selectedAnnotationsOnPage = computed(() =>\n annotations.value.filter((anno) => allSelectedIds.value.includes(anno.object.id)),\n);\n\nconst areAllSelectedDraggable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\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\nconst areAllSelectedResizable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\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\nconst areAllSelectedRotatable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n const groupRotatable = resolveInteractionProp(\n tool?.interaction.isGroupRotatable,\n ta.object,\n true,\n );\n const singleRotatable = resolveInteractionProp(tool?.interaction.isRotatable, ta.object, true);\n return tool?.interaction.isGroupRotatable !== undefined ? groupRotatable : singleRotatable;\n });\n});\n\nconst shouldLockGroupAspectRatio = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.some((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n const groupLock = resolveInteractionProp(\n tool?.interaction.lockGroupAspectRatio,\n ta.object,\n false,\n );\n const singleLock = resolveInteractionProp(tool?.interaction.lockAspectRatio, ta.object, false);\n return tool?.interaction.lockGroupAspectRatio !== undefined ? groupLock : singleLock;\n });\n});\n\nconst allSelectedOnSamePage = computed(() => {\n if (!annotationProvides.value) return false;\n if (allSelectedIds.value.length < 2) return false;\n const allSelected = annotationProvides.value.getSelectedAnnotations();\n return allSelected.every((ta) => ta.object.pageIndex === props.pageIndex);\n});\n\n// --- Renderer resolution helpers ---\n\nconst getOnDoubleClick = (renderer: BoxedAnnotationRenderer, annotation: TrackedAnnotation) => {\n if (!renderer.onDoubleClick) return undefined;\n return (e: AnnotationInteractionEvent) => {\n e.stopPropagation();\n renderer.onDoubleClick!(annotation.object.id, setEditingId);\n };\n};\n\nconst getBlendMode = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n): CssBlendMode => {\n return blendModeToCss(\n annotation.object.blendMode ?? renderer.defaultBlendMode ?? PdfBlendMode.Normal,\n );\n};\n\nconst getAppearance = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n): AnnotationAppearances<Blob> | null | undefined => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n const useAP = tool?.behavior?.useAppearanceStream ?? renderer.useAppearanceStream ?? true;\n return useAP ? getAppearanceForAnnotation(annotation) : undefined;\n};\n\nconst containerProps = computed(() => {\n const {\n selectionMenu: _sm,\n groupSelectionMenu: _gsm,\n groupSelectionOutline: _gso,\n annotationRenderers: _ar,\n ...rest\n } = props;\n return rest;\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 { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode } 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 const base: 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\n if (props.preview.type === PdfAnnotationSubtype.INK) {\n base.mixBlendMode = blendModeToCss(props.preview.data.blendMode ?? PdfBlendMode.Normal);\n }\n\n return base;\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=\"resolvedResizeUi\"\n :vertexUi=\"resolvedVertexUi\"\n :rotationUi=\"rotationUi\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionOutline=\"selectionOutline\"\n :groupSelectionOutline=\"groupSelectionOutline\"\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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-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, onMounted } 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 RotationHandleUI,\n SelectionOutline,\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 /** @deprecated Use `resizeUi` (or `:resize-ui` in templates) instead */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUi?: VertexHandleUI;\n /** @deprecated Use `vertexUi` (or `:vertex-ui` in templates) instead */\n vertexUI?: VertexHandleUI;\n /** Customize rotation handle */\n rotationUi?: RotationHandleUI;\n /** @deprecated Use `selectionOutline` instead */\n selectionOutlineColor?: string;\n /** Customize the selection outline for individual annotations */\n selectionOutline?: SelectionOutline;\n /** Customize the selection outline for the group selection box (falls back to selectionOutline) */\n groupSelectionOutline?: SelectionOutline;\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// Resolve deprecated prop aliases (resizeUI -> resizeUi, vertexUI -> vertexUi)\nconst resolvedResizeUi = computed(() => props.resizeUi ?? props.resizeUI);\nconst resolvedVertexUi = computed(() => props.vertexUi ?? props.vertexUI);\n\nonMounted(() => {\n if (props.resizeUI) {\n console.warn(\n '[AnnotationLayer] The \"resizeUI\" prop is deprecated. Use :resize-ui in templates instead.',\n );\n }\n if (props.vertexUI) {\n console.warn(\n '[AnnotationLayer] The \"vertexUI\" prop is deprecated. Use :vertex-ui in templates instead.',\n );\n }\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 // Combine page intrinsic rotation with document rotation\n const pageRotation = page.value?.rotation ?? 0;\n const docRotation = documentState.value?.rotation ?? 0;\n return ((pageRotation + docRotation) % 4) as Rotation;\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":["props","__props","imageUrl","ref","urlRef","watchEffect","onCleanup","url","URL","createObjectURL","appearance","data","value","revokeObjectURL","handleImageLoad","_createElementBlock","src","alt","draggable","onLoad","style","_normalizeStyle","useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","inheritAttrs","HANDLE_COLOR","computed","_a","resizeUi","color","VERTEX_COLOR","vertexUi","HANDLE_SIZE","size","VERTEX_SIZE","ROTATION_SIZE","rotationUi","ROTATION_COLOR","ROTATION_CONNECTOR_COLOR","connectorColor","ROTATION_ICON_COLOR","iconColor","SHOW_CONNECTOR","showConnector","ROTATION_MARGIN","margin","ROTATION_BORDER_COLOR","_b","border","ROTATION_BORDER_WIDTH","width","ROTATION_BORDER_STYLE","outlineColor","selectionOutline","selectionOutlineColor","outlineStyle","outlineWidth","outlineOff","offset","outlineOffset","preview","shallowRef","toRaw","trackedAnnotation","object","liveRotation","cursorScreen","isHandleHovered","gestureActive","provides","annotationCapability","plugin","annotationPlugin","permissions","useDocumentPermissions","documentId","gestureBaseRef","gestureBaseRectRef","effectiveIsDraggable","canModifyAnnotations","isDraggable","isMultiSelected","effectiveIsResizable","isResizable","effectiveIsRotatable","isRotatable","guardedOnDoubleClick","onDoubleClick","e","call","annotationProvides","forDocument","currentObject","hasNoZoom","flags","includes","hasNoRotate","visualScale","scale","effectivePageRotation","rotation","annotationRotation","rotationDisplay","normalizedRotationDisplay","val","Number","isFinite","Math","round","rotationActive","explicitUnrotatedRect","unrotatedRect","effectiveUnrotatedRect","rect","rotationPivot","inferRotationCenterFromRects","controllerElement","childObject","showOutline","isSelected","shouldShowMenu","selectionMenu","slots","menuRect","origin","x","y","height","menuContext","type","annotation","pageIndex","menuPlacement","effectiveAngle","suggestTop","renderSelectionMenu","menuWrapperProps","selected","placement","context","verticesSnapshot","obj","vertexConfig","extractVertices","constraintsSnapshot","minWidth","minHeight","boundingBox","pageWidth","pageHeight","dragProps","vertices","resize","rotationHandleData","useInteractionHandles","controller","element","constraints","maintainAspectRatio","lockAspectRatio","pageRotation","rotationCenter","rotationElement","enabled","onUpdate","event","transformData","changes","metadata","pageSize","state","startDrag","annotationIds","startResize","resizeHandle","handle","delta","updateDrag","updateResize","base","vertexChanges","transformAnnotation","patched","_c","updateAnnotation","cursorAngle","rotationAngle","cursorPos","cursorPosition","clientX","clientY","startRotation","updateRotation","rotationDelta","commitRotation","commitDrag","commitResize","resizeUI","handleSize","spacing","offsetMode","includeSides","zIndex","vertexUI","vertexSize","rotationUI","includeVertices","includeRotation","currentRotation","doubleProps","useDoublePressProps","onHandlePointerMove","handleEvent","patch","previewPatches","unsubs","onDragChange","onResizeChange","onRotateChange","forEach","u","aabbWidth","aabbHeight","innerWidth","innerHeight","usesCustomPivot","Boolean","innerLeft","innerTop","innerTransformOrigin","centerX","centerY","guideLength","max","counterRot","getCounterRotation","rotationIconSize","apActive","normal","isEditing","dictMode","contentsStyle","display","layerBaseStyle","position","left","top","pointerEvents","transform","matrix","transformOrigin","visualLayerStyle","blendMode","mixBlendMode","outerAABBStyle","visualInnerStyle","innerRotatedStyle","outline","touchAction","cursor","guideHorizontalStyle","backgroundColor","opacity","guideVerticalStyle","guideAngleStyle","connectorLineStyle","connector","rotationHandleStyle","boxSizing","alignItems","justifyContent","rotationHandleBindings","_s","rest","rotationHandleSlotProps","connectorStyle","tooltipStyle","background","padding","borderRadius","fontSize","fontFamily","whiteSpace","useSlots","_createElementVNode","_renderSlot","_ctx","$slots","appearanceActive","_createBlock","AppearanceImageVue","_Fragment","key","_unref","onPointerenter","onPointerleave","_cache","$event","onPointermove","_normalizeProps","_mergeProps","viewBox","fill","stroke","d","_openBlock","ref_for","length","vertex","CounterRotate","default","_withCtx","_resolveDynamicComponent","_Teleport","to","toFixed","mapCounterRotatePoint","getAnnotationScreenBounds","right","bottom","corners","minX","Infinity","minY","maxX","maxY","corner","gestureBase","isDraggingRef","isResizingRef","outlineStyleVal","groupRotationDisplay","groupBox","rects","selectedAnnotations","map","ta","boundingRectOrEmpty","previewGroupBox","watch","newGroupBox","immediate","_old","visualBoundsCorrection","visualLeft","visualTop","visualRight","visualBottom","bounds","gb","groupBoxLeft","groupBoxTop","groupBoxWidth","groupBoxHeight","groupCenterX","groupCenterY","groupGuideLength","outerStyle","boxStyle","annotations","groupSelectionMenu","renderGroupMenu","elementSnapshot","transformType","isMove","isResize","ids","_d","_e","_f","newRect","rawDelta","clampedDelta","_hoisted_1","stopPropagation","RendererRegistryKey","Symbol","createRendererRegistry","renderers","register","entries","Set","filter","r","has","some","getAll","provideRendererRegistry","registry","provide","useRendererRegistry","inject","createRenderer","entry","matches","component","markRaw","defaultBlendMode","containerStyle","interactionDefaults","useAppearanceStream","selectOverride","hideSelectionMenu","resolvedColor","strokeColor","paths","inkList","points","i","lx","ly","trim","hitStrokeWidth","strokeWidth","_renderList","onPointerdown","onClick","args","InkVue","isCloudy","cloudyBorderIntensity","geometry","outerW","outerH","cloudyPath","generateCloudyRectanglePath","rectangleDifferences","svgWidth","svgHeight","overflow","path","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","SquareVue","innerW","innerH","cx","cy","rx","ry","generateCloudyEllipsePath","CircleVue","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","filled","LineVue","localPts","pathData","first","p","toAngle","a","b","startRad","endRad","PolylineVue","allPoints","currentVertex","isPreview","generateCloudyPolygonPath","isPreviewing","PolygonVue","editorRef","editingRef","isIOS","onMounted","nav","navigator","test","userAgent","platform","maxTouchPoints","editing","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","handleBlur","contents","innerText","editorStyle","anno","computedFontPx","needsComp","adjustedFontPx","scaleComp","invScalePercent","fontColor","standardFontCssProperties","textAlign","textAlignmentToCss","flexDirection","verticalAlign","PdfVerticalAlignment","Top","Middle","lineHeight","onBlur","tabindex","contenteditable","FreeTextVue","currentTask","annotationId","rectWidth","rectHeight","scaleFactor","unrotated","_","__","task","renderAnnotation","deepToRaw","options","dpr","devicePixelRatio","wait","blob","ignore","abort","code","PdfErrorCode","Cancelled","message","onUnmounted","_createVNode","RenderAnnotation","StampVue","dashArray","isUnderline","UNDERLINE","hitAreaCursor","hasIRT","hitAreaPointerEvents","LinkVue","inReplyToId","segmentRects","HighlightVue","thickness","UnderlineVue","StrikeoutVue","amplitude","period","svgDataUri","amp","per","svg","encodeURIComponent","backgroundSize","SquigglyVue","w","h","midX","CaretVue","lineColor","getContrastStrokeColor","TextVue","builtInRenderers","PdfAnnotationSubtype","INK","InkRenderer","SQUARE","SquareRenderer","CIRCLE","CircleRenderer","LINE","LineRenderer","v","POLYLINE","PolylineRenderer","POLYGON","PolygonRenderer","HIGHLIGHT","HighlightRenderer","PdfBlendMode","Multiply","UnderlineRenderer","STRIKEOUT","StrikeoutRenderer","SQUIGGLY","SquigglyRenderer","TEXT","TextRenderer","CARET","CaretRenderer","FREETEXT","FreeTextRenderer","toolDraggable","setEditingId","STAMP","StampRenderer","LINK","LinkRenderer","helpers","clearSelection","parent","allAnnotations","find","selectAnnotation","selectionProvides","useSelectionCapability","allSelectedIds","usePointerHandlers","editingId","appearanceMap","prevScale","allRenderers","external","annotationRenderers","externalIds","resolveRenderer","_prev","syncState","getAnnotationsByPageIndex","getSelectedAnnotationIds","getState","onStateChange","invalidatePageAppearances","cancelled","getPageAppearances","resolvedAnnotations","renderer","getFinalDraggable","tool","findToolForAnnotation","defaults","resolvedDraggable","resolveInteractionProp","interaction","getResolvedResizable","getResolvedLockAspectRatio","getResolvedRotatable","getSelectionMenu","getOnSelect","selectHelpers","defaultSelect","handleClick","pi","clear","metaKey","ctrlKey","toggleSelection","pointerHandlers","onPointerDown","_pos","pe","target","currentTarget","deselectAnnotation","unregister","selectedAnnotationsOnPage","areAllSelectedDraggable","every","groupDraggable","isGroupDraggable","singleDraggable","areAllSelectedResizable","groupResizable","isGroupResizable","singleResizable","areAllSelectedRotatable","groupRotatable","isGroupRotatable","singleRotatable","shouldLockGroupAspectRatio","groupLock","lockGroupAspectRatio","singleLock","allSelectedOnSamePage","getSelectedAnnotations","getOnDoubleClick","getBlendMode","blendModeToCss","Normal","getAppearance","behavior","appearances","getAppearanceForAnnotation","containerProps","_sm","_gsm","groupSelectionOutline","_gso","_ar","AnnotationContainer","onSelect","_createSlots","slotProps","fn","GroupSelectionBox","boundingRect","activeTool","unsubscribers","scoped","off","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","push","getActiveTool","onActiveToolChange","unsub","defaultMode","Highlight","Underline","Strikeout","Squiggly","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","PreviewRenderer","resolvedResizeUi","resolvedVertexUi","console","warn","fromRegistry","fromProps","merged","idx","findIndex","m","documentState","useDocumentState","page","pages","actualScale","actualRotation","Annotations","TextMarkup","AnnotationPaintLayer","AnnotationPluginPackage","createPluginPackage","BaseAnnotationPackage","addWrapper","RendererRegistryProvider","build","toValue","initialDocumentState","providesValue","docId","scope","newState"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/vue/components/appearance-image.vue","../../src/vue/hooks/use-annotation.ts","../../src/vue/components/annotation-container.vue","../../src/shared/annotation-bounds.ts","../../src/vue/components/group-selection-box.vue","../../src/vue/context/renderer-registry.ts","../../src/vue/components/annotations/ink.vue","../../src/vue/components/renderers/ink-renderer.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/renderers/square-renderer.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/renderers/circle-renderer.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/renderers/line-renderer.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/renderers/polyline-renderer.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/renderers/polygon-renderer.vue","../../src/vue/components/annotations/free-text.vue","../../src/vue/components/renderers/free-text-renderer.vue","../../src/vue/components/render-annotation.vue","../../src/vue/components/annotations/stamp.vue","../../src/vue/components/renderers/stamp-renderer.vue","../../src/vue/components/annotations/link.vue","../../src/vue/components/renderers/link-renderer.vue","../../src/vue/components/text-markup/highlight.vue","../../src/vue/components/renderers/highlight-renderer.vue","../../src/vue/components/text-markup/underline.vue","../../src/vue/components/renderers/underline-renderer.vue","../../src/vue/components/text-markup/strikeout.vue","../../src/vue/components/renderers/strikeout-renderer.vue","../../src/vue/components/text-markup/squiggly.vue","../../src/vue/components/renderers/squiggly-renderer.vue","../../src/vue/components/annotations/caret.vue","../../src/vue/components/renderers/caret-renderer.vue","../../src/vue/components/annotations/text.vue","../../src/vue/components/renderers/text-renderer.vue","../../src/vue/components/built-in-renderers.ts","../../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","../../src/vue/components/renderer-registry-provider.vue","../../src/vue/index.ts"],"sourcesContent":["<template>\n <img\n v-if=\"imageUrl\"\n :src=\"imageUrl\"\n alt=\"\"\n draggable=\"false\"\n @load=\"handleImageLoad\"\n :style=\"{\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n userSelect: 'none',\n ...style,\n }\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watchEffect, type CSSProperties } from 'vue';\nimport type { AnnotationAppearanceImage } from '@embedpdf/models';\n\nconst props = defineProps<{\n appearance: AnnotationAppearanceImage<Blob>;\n style?: CSSProperties;\n}>();\n\nconst imageUrl = ref<string | null>(null);\nconst urlRef = ref<string | null>(null);\n\nwatchEffect((onCleanup) => {\n const url = URL.createObjectURL(props.appearance.data);\n imageUrl.value = url;\n urlRef.value = url;\n\n onCleanup(() => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n });\n});\n\nconst handleImageLoad = () => {\n if (urlRef.value) {\n URL.revokeObjectURL(urlRef.value);\n urlRef.value = null;\n }\n};\n</script>\n","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=\"contentsStyle\">\n <!-- Visual Layer: blend mode applied here, contains only annotation content -->\n <div :style=\"visualLayerStyle\">\n <!-- Inner div: rotated visual content - no pointer events -->\n <div :style=\"visualInnerStyle\">\n <!-- Annotation content - renders in unrotated coordinate space -->\n <slot :annotation=\"childObject\" :appearanceActive=\"apActive\"></slot>\n\n <!-- AP overlay canvas (always in DOM, toggled via display) -->\n <AppearanceImageVue\n v-if=\"appearance?.normal\"\n :appearance=\"appearance.normal\"\n :style=\"{ display: apActive ? 'block' : 'none' }\"\n />\n </div>\n </div>\n\n <!-- Interaction Layer: no blend mode, contains rotation guides, handles, drag/resize/vertex -->\n <div :style=\"outerAABBStyle\">\n <!-- Rotation guide lines - anchored at stable AABB center -->\n <template v-if=\"rotationActive\">\n <div :style=\"guideHorizontalStyle\" />\n <div :style=\"guideVerticalStyle\" />\n <div :style=\"guideAngleStyle\" />\n </template>\n\n <!-- Rotation handle - orbits in AABB space -->\n <template v-if=\"isSelected && effectiveIsRotatable && rotationHandleData\">\n <div\n @pointerenter=\"isHandleHovered = true\"\n @pointerleave=\"\n isHandleHovered = false;\n cursorScreen = null;\n \"\n @pointermove=\"onHandlePointerMove\"\n :style=\"contentsStyle\"\n >\n <!-- Connector line -->\n <div v-if=\"SHOW_CONNECTOR\" :style=\"connectorLineStyle\" />\n <!-- Rotation handle element -->\n <slot\n v-if=\"slots['rotation-handle']\"\n name=\"rotation-handle\"\n v-bind=\"rotationHandleSlotProps\"\n >\n <div v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </slot>\n <div v-else v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </div>\n </template>\n\n <!-- Inner div: drag/resize/vertex interaction -->\n <div\n v-bind=\"{ ...(effectiveIsDraggable && isSelected ? dragProps : {}), ...doubleProps }\"\n :style=\"innerRotatedStyle\"\n >\n <!-- Resize handles - rotate with the shape -->\n <template v-if=\"isSelected && effectiveIsResizable && !rotationActive\">\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\n <!-- Vertex handles - rotate with the shape -->\n <template\n v-if=\"\n isSelected &&\n permissions.canModifyAnnotations &&\n !isMultiSelected &&\n !rotationActive &&\n 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 <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 </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot - hide when multi-selected or rotating -->\n <CounterRotate v-if=\"shouldShowMenu && !rotationActive\" :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\n <!-- Cursor-following rotation tooltip - portaled to body to escape CSS transform chain -->\n <Teleport to=\"body\" v-if=\"(rotationActive || isHandleHovered) && cursorScreen\">\n <div :style=\"tooltipStyle\">{{ normalizedRotationDisplay.toFixed(0) }}°</div>\n </Teleport>\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 {\n ref,\n computed,\n watchEffect,\n useSlots,\n toRaw,\n shallowRef,\n Teleport,\n type CSSProperties,\n type VNode,\n} from 'vue';\nimport { PdfAnnotationObject, Rect, AnnotationAppearances, CssBlendMode } from '@embedpdf/models';\nimport { getCounterRotation } from '@embedpdf/utils';\nimport AppearanceImageVue from './appearance-image.vue';\nimport { inferRotationCenterFromRects } from '@embedpdf/plugin-annotation';\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 {\n AnnotationSelectionContext,\n AnnotationSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n RotationHandleUI,\n RotationHandleSlotProps,\n SelectionOutline,\n} 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 the annotation is in editing mode */\n isEditing?: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n isRotatable?: boolean;\n lockAspectRatio?: boolean;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** @deprecated Use `selectionOutline.offset` instead */\n outlineOffset?: number;\n onDoubleClick?: (event: PointerEvent | MouseEvent) => void;\n onSelect: (event: PointerEvent | MouseEvent) => void;\n /** Pre-rendered appearance stream images for AP mode rendering */\n appearance?: AnnotationAppearances<Blob> | null;\n zIndex?: number;\n /** @deprecated Use `selectionOutline.color` instead */\n selectionOutlineColor?: string;\n /** Customize the selection outline (color, style, width, offset) */\n selectionOutline?: SelectionOutline;\n /** Customize resize handle appearance */\n resizeUi?: ResizeHandleUI;\n /** Customize vertex handle appearance */\n vertexUi?: VertexHandleUI;\n /** Customize rotation handle appearance */\n rotationUi?: RotationHandleUI;\n blendMode?: CssBlendMode;\n style?: CSSProperties;\n }>(),\n {\n lockAspectRatio: false,\n isEditing: false,\n isMultiSelected: false,\n isRotatable: true,\n outlineOffset: 1,\n zIndex: 1,\n selectionOutlineColor: '#007ACC',\n },\n);\n\n// UI constants\nconst HANDLE_COLOR = computed(() => props.resizeUi?.color ?? '#007ACC');\nconst VERTEX_COLOR = computed(() => props.vertexUi?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUi?.size ?? 12);\nconst VERTEX_SIZE = computed(() => props.vertexUi?.size ?? 12);\nconst ROTATION_SIZE = computed(() => props.rotationUi?.size ?? 32);\nconst ROTATION_COLOR = computed(() => props.rotationUi?.color ?? 'white');\nconst ROTATION_CONNECTOR_COLOR = computed(() => props.rotationUi?.connectorColor ?? '#007ACC');\nconst ROTATION_ICON_COLOR = computed(() => props.rotationUi?.iconColor ?? '#007ACC');\nconst SHOW_CONNECTOR = computed(() => props.rotationUi?.showConnector ?? false);\nconst ROTATION_MARGIN = computed(() => props.rotationUi?.margin);\nconst ROTATION_BORDER_COLOR = computed(() => props.rotationUi?.border?.color ?? '#007ACC');\nconst ROTATION_BORDER_WIDTH = computed(() => props.rotationUi?.border?.width ?? 1);\nconst ROTATION_BORDER_STYLE = computed(() => props.rotationUi?.border?.style ?? 'solid');\n\n// Outline resolution (new object > deprecated props > defaults)\nconst outlineColor = computed(\n () => props.selectionOutline?.color ?? props.selectionOutlineColor ?? '#007ACC',\n);\nconst outlineStyle = computed(() => props.selectionOutline?.style ?? 'solid');\nconst outlineWidth = computed(() => props.selectionOutline?.width ?? 1);\nconst outlineOff = computed(() => props.selectionOutline?.offset ?? props.outlineOffset ?? 1);\n\nconst preview = shallowRef<Partial<T>>(toRaw(props.trackedAnnotation.object));\nconst liveRotation = ref<number | null>(null);\nconst cursorScreen = ref<{ x: number; y: number } | null>(null);\nconst isHandleHovered = ref(false);\nconst gestureActive = ref(false);\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/rotate - 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);\nconst effectiveIsRotatable = computed(\n () => permissions.value.canModifyAnnotations && props.isRotatable && !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\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// Annotation flags\nconst hasNoZoom = computed(() => (props.trackedAnnotation.object.flags ?? []).includes('noZoom'));\nconst hasNoRotate = computed(() =>\n (props.trackedAnnotation.object.flags ?? []).includes('noRotate'),\n);\n// noZoom: maintain constant screen-pixel size regardless of zoom level.\nconst visualScale = computed(() => (hasNoZoom.value ? 1 : props.scale));\n// noRotate: stay visually upright regardless of page rotation.\nconst effectivePageRotation = computed(() => (hasNoRotate.value ? 0 : props.rotation));\n\n// Get annotation's current rotation\n// During drag, use liveRotation if available; otherwise use the annotation's rotation\nconst annotationRotation = computed(\n () => liveRotation.value ?? (currentObject.value as any).rotation ?? 0,\n);\nconst rotationDisplay = computed(\n () => liveRotation.value ?? (currentObject.value as any).rotation ?? 0,\n);\nconst normalizedRotationDisplay = computed(() => {\n const val = rotationDisplay.value;\n return Number.isFinite(val) ? Math.round(val * 10) / 10 : 0;\n});\nconst rotationActive = computed(() => liveRotation.value !== null);\n\n// Geometry model:\n// - `rect` is the visible AABB container.\n// - `unrotatedRect` is the local editing frame for resize/vertex operations.\nconst explicitUnrotatedRect = computed(\n () => (currentObject.value as any).unrotatedRect as Rect | undefined,\n);\nconst effectiveUnrotatedRect = computed(\n () => explicitUnrotatedRect.value ?? currentObject.value.rect,\n);\nconst rotationPivot = computed(() => {\n if (explicitUnrotatedRect.value && annotationRotation.value !== 0) {\n return inferRotationCenterFromRects(\n effectiveUnrotatedRect.value,\n currentObject.value.rect,\n annotationRotation.value,\n );\n }\n return undefined;\n});\nconst controllerElement = computed(() => effectiveUnrotatedRect.value);\n\n// For children, override rect to use unrotatedRect so content renders in unrotated space\nconst childObject = computed<T>(() => {\n if (explicitUnrotatedRect.value) {\n return { ...currentObject.value, rect: explicitUnrotatedRect.value };\n }\n return currentObject.value;\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 * visualScale.value,\n height: currentObject.value.rect.size.height * visualScale.value,\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 - calculate suggestTop based on rotation handle position\nconst menuPlacement = computed<SelectionMenuPlacement>(() => {\n const effectiveAngle =\n (((annotationRotation.value + effectivePageRotation.value * 90) % 360) + 360) % 360;\n const handleNearMenuSide =\n effectiveIsRotatable.value && effectiveAngle > 90 && effectiveAngle < 270;\n return {\n suggestTop: handleNearMenuSide,\n };\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 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 {\n dragProps,\n vertices,\n resize,\n rotation: rotationHandleData,\n} = useInteractionHandles({\n controller: {\n element: controllerElement,\n vertices: verticesSnapshot,\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\n pageRotation: computed(() => props.rotation),\n annotationRotation: computed(() => annotationRotation.value),\n rotationCenter: computed(() => rotationPivot.value),\n rotationElement: computed(() => currentObject.value.rect),\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 =\n (props.trackedAnnotation.object as any).unrotatedRect ??\n props.trackedAnnotation.object.rect;\n gestureBaseRef.value = currentObject.value;\n\n if (type === 'resize' || type === 'vertex-edit') {\n gestureActive.value = true;\n }\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 // Rotation - handle via plugin rotation API\n if (type === 'rotate') {\n const cursorAngle = metadata?.rotationAngle ?? annotationRotation.value;\n const cursorPos = metadata?.cursorPosition;\n if (cursorPos) cursorScreen.value = { x: cursorPos.clientX, y: cursorPos.clientY };\n if (event.state === 'start') {\n liveRotation.value = cursorAngle;\n plugin.startRotation(props.documentId, {\n annotationIds: [id],\n cursorAngle,\n rotationCenter: metadata?.rotationCenter,\n });\n } else if (event.state === 'move') {\n liveRotation.value = cursorAngle;\n plugin.updateRotation(props.documentId, cursorAngle, metadata?.rotationDelta);\n } else if (event.state === 'end') {\n liveRotation.value = null;\n cursorScreen.value = null;\n plugin.commitRotation(props.documentId);\n }\n return;\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureActive.value = false;\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.value,\n spacing: outlineOff.value,\n offsetMode: 'outside',\n includeSides: props.lockAspectRatio ? false : true,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE.value,\n zIndex: props.zIndex + 2,\n },\n rotationUI: {\n handleSize: ROTATION_SIZE.value,\n margin: ROTATION_MARGIN.value,\n zIndex: props.zIndex + 3,\n showConnector: SHOW_CONNECTOR.value,\n },\n includeVertices: !!props.vertexConfig,\n includeRotation: effectiveIsRotatable,\n currentRotation: annotationRotation,\n});\n\nconst doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n// Handle pointer move on the rotation handle wrapper (for cursor tooltip when not rotating)\nconst onHandlePointerMove = (e: PointerEvent) => {\n if (!rotationActive.value) {\n cursorScreen.value = { x: e.clientX, y: e.clientY };\n }\n};\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/rotate 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 if (event.type === 'end' || event.type === 'cancel') {\n liveRotation.value = null;\n }\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 = [\n plugin.onDragChange(handleEvent),\n plugin.onResizeChange(handleEvent),\n plugin.onRotateChange(handleEvent),\n ];\n\n onCleanup(() => unsubs.forEach((u) => u()));\n});\n\n// ─── Layout computations ───────────────────────────────────────────────\n// noZoom: use visualScale (=1) so the annotation keeps a constant screen-pixel size.\n// noRotate: counter-rotate the outer div so the annotation stays upright on rotated pages.\nconst aabbWidth = computed(() => currentObject.value.rect.size.width * visualScale.value);\nconst aabbHeight = computed(() => currentObject.value.rect.size.height * visualScale.value);\nconst innerWidth = computed(() => effectiveUnrotatedRect.value.size.width * visualScale.value);\nconst innerHeight = computed(() => effectiveUnrotatedRect.value.size.height * visualScale.value);\nconst usesCustomPivot = computed(\n () => Boolean(explicitUnrotatedRect.value) && annotationRotation.value !== 0,\n);\nconst innerLeft = computed(() =>\n usesCustomPivot.value\n ? (effectiveUnrotatedRect.value.origin.x - currentObject.value.rect.origin.x) *\n visualScale.value\n : (aabbWidth.value - innerWidth.value) / 2,\n);\nconst innerTop = computed(() =>\n usesCustomPivot.value\n ? (effectiveUnrotatedRect.value.origin.y - currentObject.value.rect.origin.y) *\n visualScale.value\n : (aabbHeight.value - innerHeight.value) / 2,\n);\nconst innerTransformOrigin = computed(() => {\n if (usesCustomPivot.value && rotationPivot.value) {\n return `${(rotationPivot.value.x - effectiveUnrotatedRect.value.origin.x) * visualScale.value}px ${(rotationPivot.value.y - effectiveUnrotatedRect.value.origin.y) * visualScale.value}px`;\n }\n return 'center center';\n});\nconst centerX = computed(() =>\n rotationPivot.value\n ? (rotationPivot.value.x - currentObject.value.rect.origin.x) * visualScale.value\n : aabbWidth.value / 2,\n);\nconst centerY = computed(() =>\n rotationPivot.value\n ? (rotationPivot.value.y - currentObject.value.rect.origin.y) * visualScale.value\n : aabbHeight.value / 2,\n);\nconst guideLength = computed(() => Math.max(300, Math.max(aabbWidth.value, aabbHeight.value) + 80));\n// noRotate: compute counter-rotation to undo page rotation on this annotation's outer div.\nconst counterRot = computed(() =>\n hasNoRotate.value\n ? getCounterRotation(\n { origin: { x: 0, y: 0 }, size: { width: aabbWidth.value, height: aabbHeight.value } },\n props.rotation,\n )\n : null,\n);\nconst rotationIconSize = computed(() => Math.round(ROTATION_SIZE.value * 0.6));\n\nconst apActive = computed(\n () =>\n !!props.appearance?.normal &&\n !gestureActive.value &&\n !props.isEditing &&\n !props.trackedAnnotation.dictMode,\n);\n\n// ─── Extracted style computations ──────────────────────────────────────\nconst contentsStyle: CSSProperties = { display: 'contents' };\n\nconst layerBaseStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${currentObject.value.rect.origin.x * props.scale}px`,\n top: `${currentObject.value.rect.origin.y * props.scale}px`,\n width: `${counterRot.value ? counterRot.value.width : aabbWidth.value}px`,\n height: `${counterRot.value ? counterRot.value.height : aabbHeight.value}px`,\n pointerEvents: 'none',\n zIndex: props.zIndex,\n ...(counterRot.value ? { transform: counterRot.value.matrix, transformOrigin: '0 0' } : {}),\n}));\n\nconst visualLayerStyle = computed<CSSProperties>(() => ({\n ...layerBaseStyle.value,\n ...(props.blendMode ? { mixBlendMode: props.blendMode } : {}),\n ...props.style,\n}));\n\nconst outerAABBStyle = computed<CSSProperties>(() => layerBaseStyle.value);\n\nconst visualInnerStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${innerLeft.value}px`,\n top: `${innerTop.value}px`,\n width: `${innerWidth.value}px`,\n height: `${innerHeight.value}px`,\n transform: annotationRotation.value !== 0 ? `rotate(${annotationRotation.value}deg)` : undefined,\n transformOrigin: innerTransformOrigin.value,\n pointerEvents: props.isEditing ? 'auto' : 'none',\n}));\n\nconst innerRotatedStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${innerLeft.value}px`,\n top: `${innerTop.value}px`,\n width: `${innerWidth.value}px`,\n height: `${innerHeight.value}px`,\n transform: annotationRotation.value !== 0 ? `rotate(${annotationRotation.value}deg)` : undefined,\n transformOrigin: innerTransformOrigin.value,\n outline: showOutline.value\n ? `${outlineWidth.value}px ${outlineStyle.value} ${outlineColor.value}`\n : 'none',\n outlineOffset: showOutline.value ? `${outlineOff.value}px` : '0px',\n pointerEvents: props.isSelected && !props.isMultiSelected && !props.isEditing ? 'auto' : 'none',\n touchAction: 'none',\n cursor: props.isSelected && effectiveIsDraggable.value ? 'move' : 'default',\n}));\n\nconst guideHorizontalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value - guideLength.value / 2}px`,\n top: `${centerY.value}px`,\n width: `${guideLength.value}px`,\n height: '1px',\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideVerticalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value}px`,\n top: `${centerY.value - guideLength.value / 2}px`,\n width: '1px',\n height: `${guideLength.value}px`,\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideAngleStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${centerX.value - guideLength.value / 2}px`,\n top: `${centerY.value}px`,\n width: `${guideLength.value}px`,\n height: '1px',\n transformOrigin: 'center center',\n transform: `rotate(${annotationRotation.value}deg)`,\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: 0.8,\n pointerEvents: 'none',\n}));\n\nconst connectorLineStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.connector.style ?? {}),\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.handle.style ?? {}),\n backgroundColor: ROTATION_COLOR.value,\n border: `${ROTATION_BORDER_WIDTH.value}px ${ROTATION_BORDER_STYLE.value} ${ROTATION_BORDER_COLOR.value}`,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n opacity: rotationActive.value ? 0 : 1,\n}));\n\n// Event handlers from the rotation handle (without style - style is applied separately)\nconst rotationHandleBindings = computed(() => {\n if (!rotationHandleData.value) return {};\n const { style: _s, ...rest } = rotationHandleData.value.handle;\n return rest;\n});\n\nconst rotationHandleSlotProps = computed<RotationHandleSlotProps | Record<string, never>>(() => {\n if (!rotationHandleData.value) return {} as Record<string, never>;\n return {\n ...rotationHandleData.value.handle,\n backgroundColor: ROTATION_COLOR.value,\n iconColor: ROTATION_ICON_COLOR.value,\n connectorStyle: connectorLineStyle.value,\n showConnector: SHOW_CONNECTOR.value,\n opacity: rotationActive.value ? 0 : 1,\n border: {\n color: ROTATION_BORDER_COLOR.value,\n width: ROTATION_BORDER_WIDTH.value,\n style: ROTATION_BORDER_STYLE.value,\n },\n };\n});\n\nconst tooltipStyle = computed<CSSProperties>(() => ({\n position: 'fixed',\n left: cursorScreen.value ? `${cursorScreen.value.x + 16}px` : '0',\n top: cursorScreen.value ? `${cursorScreen.value.y - 16}px` : '0',\n background: 'rgba(0,0,0,0.8)',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n pointerEvents: 'none',\n zIndex: 10000,\n whiteSpace: 'nowrap',\n}));\n\n// Add useSlots to access slot information\nconst slots = useSlots();\n</script>\n","import { Rotation } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\nexport interface ScreenBounds {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nfunction mapCounterRotatePoint(\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: Rotation,\n): { x: number; y: number } {\n switch (rotation) {\n case 1:\n return { x: y, y: height - x };\n case 2:\n return { x: width - x, y: height - y };\n case 3:\n return { x: width - y, y: x };\n default:\n return { x, y };\n }\n}\n\n/**\n * Compute the screen-space bounding box of an annotation, correctly accounting\n * for `noZoom` (constant pixel size regardless of zoom) and `noRotate`\n * (visually upright regardless of page rotation) annotation flags.\n */\nexport function getAnnotationScreenBounds(\n annotation: TrackedAnnotation,\n scale: number,\n rotation: Rotation,\n): ScreenBounds {\n const flags = annotation.object.flags ?? [];\n const hasNoZoom = flags.includes('noZoom');\n const hasNoRotate = flags.includes('noRotate');\n\n const left = annotation.object.rect.origin.x * scale;\n const top = annotation.object.rect.origin.y * scale;\n const width = annotation.object.rect.size.width * (hasNoZoom ? 1 : scale);\n const height = annotation.object.rect.size.height * (hasNoZoom ? 1 : scale);\n\n if (!hasNoRotate || rotation === 0) {\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n };\n }\n\n const corners = [\n mapCounterRotatePoint(0, 0, width, height, rotation),\n mapCounterRotatePoint(width, 0, width, height, rotation),\n mapCounterRotatePoint(0, height, width, height, rotation),\n mapCounterRotatePoint(width, height, width, height, rotation),\n ];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const corner of corners) {\n if (corner.x < minX) minX = corner.x;\n if (corner.y < minY) minY = corner.y;\n if (corner.x > maxX) maxX = corner.x;\n if (corner.y > maxY) maxY = corner.y;\n }\n\n return {\n left: left + minX,\n top: top + minY,\n right: left + maxX,\n bottom: top + maxY,\n };\n}\n","<template>\n <div v-if=\"selectedAnnotations.length >= 2\" data-group-selection-box data-no-interaction>\n <!-- Outer div: AABB container - stable center for guide lines and rotation handle -->\n <div :style=\"outerStyle\">\n <!-- Rotation guide lines - anchored at stable center -->\n <template v-if=\"rotationActive\">\n <div :style=\"guideHorizontalStyle\" />\n <div :style=\"guideVerticalStyle\" />\n <div :style=\"guideAngleStyle\" />\n </template>\n\n <!-- Rotation handle - orbits in AABB space -->\n <template v-if=\"effectiveIsRotatable && rotationHandleData\">\n <div\n @pointerenter=\"isHandleHovered = true\"\n @pointerleave=\"\n isHandleHovered = false;\n cursorScreen = null;\n \"\n @pointermove=\"onHandlePointerMove\"\n :style=\"contentsStyle\"\n >\n <!-- Connector line -->\n <div v-if=\"SHOW_CONNECTOR\" :style=\"connectorLineStyle\" />\n <!-- Rotation handle element -->\n <slot\n v-if=\"slots['rotation-handle']\"\n name=\"rotation-handle\"\n v-bind=\"rotationHandleSlotProps\"\n >\n <div v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </slot>\n <div v-else v-bind=\"rotationHandleBindings\" :style=\"rotationHandleStyle\">\n <svg\n :width=\"rotationIconSize\"\n :height=\"rotationIconSize\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n :stroke=\"ROTATION_ICON_COLOR\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n </svg>\n </div>\n </div>\n </template>\n\n <!-- Inner div: group content area with outline and resize handles -->\n <div\n v-bind=\"\n effectiveIsDraggable\n ? dragProps\n : { onPointerdown: (e: PointerEvent) => e.stopPropagation() }\n \"\n :style=\"boxStyle\"\n >\n <!-- Resize handles -->\n <template v-if=\"effectiveIsResizable && !rotationActive\">\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 </div>\n\n <!-- Group selection menu -->\n <CounterRotate v-if=\"shouldShowMenu && !rotationActive\" :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\n <!-- Cursor-following rotation tooltip - portaled to body to escape CSS transform chain -->\n <Teleport to=\"body\" v-if=\"(rotationActive || isHandleHovered) && cursorScreen\">\n <div :style=\"tooltipStyle\">{{ normalizedRotationDisplay.toFixed(0) }}°</div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n ref,\n computed,\n useSlots,\n type CSSProperties,\n type VNode,\n shallowRef,\n watch,\n Teleport,\n} from 'vue';\nimport { Rect, Rotation, 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 { getAnnotationScreenBounds } from '../../shared/annotation-bounds';\nimport { useDocumentPermissions } from '@embedpdf/core/vue';\nimport { useAnnotationPlugin } from '../hooks';\nimport {\n GroupSelectionContext,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n RotationHandleUI,\n RotationHandleSlotProps,\n SelectionOutline,\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 /** Whether the group can be rotated */\n isRotatable?: boolean;\n /** Whether to lock aspect ratio during group resize */\n lockAspectRatio?: boolean;\n /** Resize handle UI customization */\n resizeUi?: ResizeHandleUI;\n /** Rotation handle UI customization */\n rotationUi?: RotationHandleUI;\n /** @deprecated Use `selectionOutline.color` instead */\n selectionOutlineColor?: string;\n /** @deprecated Use `selectionOutline.offset` instead */\n outlineOffset?: number;\n /** Customize the selection outline (color, style, width, offset) */\n selectionOutline?: SelectionOutline;\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 isRotatable: true,\n lockAspectRatio: false,\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);\nconst liveRotation = ref<number | null>(null);\nconst cursorScreen = ref<{ x: number; y: number } | null>(null);\nconst isHandleHovered = ref(false);\n\n// Check permissions before allowing drag/resize/rotate\nconst effectiveIsDraggable = computed(\n () => permissions.value.canModifyAnnotations && props.isDraggable,\n);\nconst effectiveIsResizable = computed(\n () => permissions.value.canModifyAnnotations && props.isResizable,\n);\nconst effectiveIsRotatable = computed(\n () => permissions.value.canModifyAnnotations && props.isRotatable,\n);\n\n// UI constants\nconst HANDLE_COLOR = computed(() => props.resizeUi?.color ?? '#007ACC');\nconst HANDLE_SIZE = computed(() => props.resizeUi?.size ?? 12);\nconst ROTATION_SIZE = computed(() => props.rotationUi?.size ?? 32);\nconst ROTATION_COLOR = computed(() => props.rotationUi?.color ?? 'white');\nconst ROTATION_CONNECTOR_COLOR = computed(() => props.rotationUi?.connectorColor ?? '#007ACC');\nconst ROTATION_ICON_COLOR = computed(() => props.rotationUi?.iconColor ?? '#007ACC');\nconst SHOW_CONNECTOR = computed(() => props.rotationUi?.showConnector ?? false);\nconst ROTATION_MARGIN = computed(() => props.rotationUi?.margin);\nconst ROTATION_BORDER_COLOR = computed(() => props.rotationUi?.border?.color ?? '#007ACC');\nconst ROTATION_BORDER_WIDTH = computed(() => props.rotationUi?.border?.width ?? 1);\nconst ROTATION_BORDER_STYLE = computed(() => props.rotationUi?.border?.style ?? 'solid');\n\n// Outline resolution (new object > deprecated props > group defaults)\nconst outlineColor = computed(\n () => props.selectionOutline?.color ?? props.selectionOutlineColor ?? '#007ACC',\n);\nconst outlineStyleVal = computed(() => props.selectionOutline?.style ?? 'dashed');\nconst outlineWidth = computed(() => props.selectionOutline?.width ?? 2);\nconst outlineOff = computed(() => props.selectionOutline?.offset ?? props.outlineOffset ?? 2);\n\n// Rotation display\nconst groupRotationDisplay = computed(() => liveRotation.value ?? 0);\nconst rotationActive = computed(() => liveRotation.value !== null);\nconst normalizedRotationDisplay = computed(() => {\n const val = groupRotationDisplay.value;\n return Number.isFinite(val) ? Math.round(val * 10) / 10 : 0;\n});\nconst rotationIconSize = computed(() => Math.round(ROTATION_SIZE.value * 0.6));\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\nwatch(\n () => groupBox.value,\n (newGroupBox) => {\n if (!isDraggingRef.value && !isResizingRef.value) {\n previewGroupBox.value = newGroupBox;\n }\n },\n { immediate: true },\n);\n\n// Subscribe to rotation end/cancel events\nwatch(\n () => annotationPlugin.value,\n (plugin, _old, onCleanup) => {\n if (!plugin) return;\n const unsub = plugin.onRotateChange((event: { documentId: string; type: string }) => {\n if (event.documentId !== props.documentId) return;\n if (event.type === 'end' || event.type === 'cancel') {\n liveRotation.value = null;\n }\n });\n onCleanup(unsub);\n },\n { immediate: true },\n);\n\n// Layout computations\n// Compute visual bounds correction to account for mixed noZoom/noRotate selections.\nconst visualBoundsCorrection = computed(() => {\n let visualLeft = Infinity;\n let visualTop = Infinity;\n let visualRight = -Infinity;\n let visualBottom = -Infinity;\n for (const ta of props.selectedAnnotations) {\n const bounds = getAnnotationScreenBounds(ta, props.scale, props.rotation as Rotation);\n if (bounds.left < visualLeft) visualLeft = bounds.left;\n if (bounds.top < visualTop) visualTop = bounds.top;\n if (bounds.right > visualRight) visualRight = bounds.right;\n if (bounds.bottom > visualBottom) visualBottom = bounds.bottom;\n }\n const gb = groupBox.value;\n const logicalLeft = gb.origin.x * props.scale;\n const logicalTop = gb.origin.y * props.scale;\n const logicalRight = (gb.origin.x + gb.size.width) * props.scale;\n const logicalBottom = (gb.origin.y + gb.size.height) * props.scale;\n return {\n left: visualLeft - logicalLeft,\n top: visualTop - logicalTop,\n right: visualRight - logicalRight,\n bottom: visualBottom - logicalBottom,\n };\n});\n\nconst groupBoxLeft = computed(\n () => previewGroupBox.value.origin.x * props.scale + visualBoundsCorrection.value.left,\n);\nconst groupBoxTop = computed(\n () => previewGroupBox.value.origin.y * props.scale + visualBoundsCorrection.value.top,\n);\nconst groupBoxWidth = computed(\n () =>\n previewGroupBox.value.size.width * props.scale +\n (visualBoundsCorrection.value.right - visualBoundsCorrection.value.left),\n);\nconst groupBoxHeight = computed(\n () =>\n previewGroupBox.value.size.height * props.scale +\n (visualBoundsCorrection.value.bottom - visualBoundsCorrection.value.top),\n);\nconst groupCenterX = computed(() => groupBoxWidth.value / 2);\nconst groupCenterY = computed(() => groupBoxHeight.value / 2);\nconst groupGuideLength = computed(() =>\n Math.max(300, Math.max(groupBoxWidth.value, groupBoxHeight.value) + 80),\n);\n\n// ─── Extracted style computations ──────────────────────────────────────\nconst contentsStyle: CSSProperties = { display: 'contents' };\n\nconst outerStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupBoxLeft.value}px`,\n top: `${groupBoxTop.value}px`,\n width: `${groupBoxWidth.value}px`,\n height: `${groupBoxHeight.value}px`,\n pointerEvents: 'none',\n zIndex: props.zIndex,\n}));\n\nconst boxStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: 0,\n top: 0,\n width: `${groupBoxWidth.value}px`,\n height: `${groupBoxHeight.value}px`,\n outline: rotationActive.value\n ? 'none'\n : `${outlineWidth.value}px ${outlineStyleVal.value} ${outlineColor.value}`,\n outlineOffset: `${outlineOff.value - 1}px`,\n cursor: effectiveIsDraggable.value ? 'move' : 'default',\n touchAction: 'none',\n pointerEvents: 'auto',\n}));\n\nconst guideHorizontalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value - groupGuideLength.value / 2}px`,\n top: `${groupCenterY.value}px`,\n width: `${groupGuideLength.value}px`,\n height: '1px',\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideVerticalStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value}px`,\n top: `${groupCenterY.value - groupGuideLength.value / 2}px`,\n width: '1px',\n height: `${groupGuideLength.value}px`,\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.35,\n pointerEvents: 'none',\n}));\n\nconst guideAngleStyle = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${groupCenterX.value - groupGuideLength.value / 2}px`,\n top: `${groupCenterY.value}px`,\n width: `${groupGuideLength.value}px`,\n height: '1px',\n transformOrigin: 'center center',\n transform: `rotate(${groupRotationDisplay.value}deg)`,\n backgroundColor: HANDLE_COLOR.value,\n opacity: 0.8,\n pointerEvents: 'none',\n}));\n\nconst connectorLineStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.connector.style ?? {}),\n backgroundColor: ROTATION_CONNECTOR_COLOR.value,\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleStyle = computed<CSSProperties>(() => ({\n ...(rotationHandleData.value?.handle.style ?? {}),\n backgroundColor: ROTATION_COLOR.value,\n border: `${ROTATION_BORDER_WIDTH.value}px ${ROTATION_BORDER_STYLE.value} ${ROTATION_BORDER_COLOR.value}`,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n opacity: rotationActive.value ? 0 : 1,\n}));\n\nconst rotationHandleBindings = computed(() => {\n if (!rotationHandleData.value) return {};\n const { style: _s, ...rest } = rotationHandleData.value.handle;\n return rest;\n});\n\nconst rotationHandleSlotProps = computed<RotationHandleSlotProps | Record<string, never>>(() => {\n if (!rotationHandleData.value) return {} as Record<string, never>;\n return {\n ...rotationHandleData.value.handle,\n backgroundColor: ROTATION_COLOR.value,\n iconColor: ROTATION_ICON_COLOR.value,\n connectorStyle: connectorLineStyle.value,\n showConnector: SHOW_CONNECTOR.value,\n opacity: rotationActive.value ? 0 : 1,\n border: {\n color: ROTATION_BORDER_COLOR.value,\n width: ROTATION_BORDER_WIDTH.value,\n style: ROTATION_BORDER_STYLE.value,\n },\n };\n});\n\nconst tooltipStyle = computed<CSSProperties>(() => ({\n position: 'fixed',\n left: cursorScreen.value ? `${cursorScreen.value.x + 16}px` : '0',\n top: cursorScreen.value ? `${cursorScreen.value.y - 16}px` : '0',\n background: 'rgba(0,0,0,0.8)',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n fontFamily: 'monospace',\n pointerEvents: 'none',\n zIndex: 10000,\n whiteSpace: 'nowrap',\n}));\n\n// Menu rect for counter-rotate component\nconst menuRect = computed<Rect>(() => ({\n origin: {\n x: groupBoxLeft.value,\n y: groupBoxTop.value,\n },\n size: {\n width: groupBoxWidth.value,\n height: groupBoxHeight.value,\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 - calculate suggestTop based on rotation handle position\nconst menuPlacement = computed<SelectionMenuPlacement>(() => {\n const effectiveAngle = (((groupRotationDisplay.value + props.rotation * 90) % 360) + 360) % 360;\n const handleNearMenuSide =\n effectiveIsRotatable.value && effectiveAngle > 90 && effectiveAngle < 270;\n return {\n suggestTop: handleNearMenuSide,\n };\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// Handle pointer move on the rotation handle wrapper (for cursor tooltip when not rotating)\nconst onHandlePointerMove = (e: PointerEvent) => {\n if (!rotationActive.value) {\n cursorScreen.value = { x: e.clientX, y: e.clientY };\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 drag, resize, and rotation\nconst {\n dragProps,\n resize,\n rotation: rotationHandleData,\n} = useInteractionHandles({\n controller: {\n element: elementSnapshot,\n vertices: computed(() => []),\n constraints: constraintsSnapshot,\n maintainAspectRatio: computed(() => props.lockAspectRatio),\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 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 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 // Handle rotation\n if (transformType === 'rotate') {\n if (!props.isRotatable) return;\n const ids = props.selectedAnnotations.map((ta) => ta.object.id);\n const cursorAngle = event.transformData.metadata?.rotationAngle ?? 0;\n const cursorPos = event.transformData.metadata?.cursorPosition;\n if (cursorPos) cursorScreen.value = { x: cursorPos.clientX, y: cursorPos.clientY };\n if (event.state === 'start') {\n liveRotation.value = cursorAngle;\n plugin.startRotation(props.documentId, {\n annotationIds: ids,\n cursorAngle,\n rotationCenter: event.transformData.metadata?.rotationCenter,\n });\n } else if (event.state === 'move') {\n liveRotation.value = cursorAngle;\n plugin.updateRotation(\n props.documentId,\n cursorAngle,\n event.transformData.metadata?.rotationDelta,\n );\n } else if (event.state === 'end') {\n liveRotation.value = null;\n cursorScreen.value = null;\n plugin.commitRotation(props.documentId);\n }\n return;\n }\n\n const base = gestureBase.value ?? groupBox.value;\n\n if (isMove && event.transformData.changes.rect) {\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 const clampedDelta = plugin.updateDrag(props.documentId, rawDelta);\n\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 plugin.updateResize(props.documentId, newGroupBox);\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.commitDrag(props.documentId);\n } else if (isResize && isResizingRef.value) {\n isResizingRef.value = false;\n plugin.commitResize(props.documentId);\n }\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE.value,\n spacing: outlineOff.value,\n offsetMode: 'outside',\n includeSides: !props.lockAspectRatio,\n zIndex: props.zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: props.zIndex,\n },\n rotationUI: {\n handleSize: ROTATION_SIZE.value,\n margin: ROTATION_MARGIN.value,\n zIndex: props.zIndex + 2,\n showConnector: SHOW_CONNECTOR.value,\n },\n includeVertices: false,\n includeRotation: effectiveIsRotatable,\n currentRotation: computed(() => liveRotation.value ?? 0),\n});\n</script>\n","import {\n inject,\n provide,\n markRaw,\n onUnmounted,\n shallowRef,\n type InjectionKey,\n type ShallowRef,\n type Component,\n type CSSProperties,\n} from 'vue';\nimport type {\n BoxedAnnotationRenderer,\n AnnotationRendererEntry,\n AnnotationRendererProps,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n} from './types';\nimport type { PdfAnnotationObject } from '@embedpdf/models';\nimport type { VertexConfig } from '../../shared/types';\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 renderers.value = [...renderers.value.filter((r) => !ids.has(r.id)), ...entries];\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 vertexConfig: entry.vertexConfig as VertexConfig<PdfAnnotationObject> | undefined,\n zIndex: entry.zIndex,\n defaultBlendMode: entry.defaultBlendMode,\n containerStyle: entry.containerStyle as\n | ((annotation: PdfAnnotationObject) => CSSProperties)\n | undefined,\n interactionDefaults: entry.interactionDefaults,\n useAppearanceStream: entry.useAppearanceStream,\n isDraggable: entry.isDraggable,\n onDoubleClick: entry.onDoubleClick,\n selectOverride: entry.selectOverride as BoxedAnnotationRenderer['selectOverride'],\n hideSelectionMenu: entry.hideSelectionMenu as\n | ((annotation: PdfAnnotationObject) => boolean)\n | undefined,\n };\n}\n\n// Re-export types for convenience\nexport type {\n AnnotationRendererProps,\n AnnotationRendererEntry,\n BoxedAnnotationRenderer,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n};\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-for=\"(d, i) in paths\"\n :key=\"`hit-${i}`\"\n :d=\"d\"\n fill=\"none\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-for=\"(d, i) in paths\"\n :key=\"`vis-${i}`\"\n :d=\"d\"\n fill=\"none\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n inkList: PdfInkListObject[];\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 1,\n appearanceActive: false,\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);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <InkVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfInkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport InkVue from '../annotations/ink.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfInkAnnoObject>>();\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 ${rect.size.width} ${rect.size.height}`\"\n overflow=\"visible\"\n >\n <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <rect\n v-else\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n strokeLinejoin: 'round',\n }\"\n />\n <rect\n v-else\n :x=\"geometry.x\"\n :y=\"geometry.y\"\n :width=\"geometry.width\"\n :height=\"geometry.height\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, PdfRectDifferences, Rect } from '@embedpdf/models';\nimport { generateCloudyRectanglePath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n rectangleDifferences?: PdfRectDifferences;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value) return null;\n return generateCloudyRectanglePath(\n { x: 0, y: 0, width: props.rect.size.width, height: props.rect.size.height },\n props.rectangleDifferences,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\n});\n\nconst svgWidth = computed(() => props.rect.size.width * props.scale);\nconst svgHeight = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <SquareVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfSquareAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport SquareVue from '../annotations/square.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfSquareAnnoObject>>();\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 overflow=\"visible\"\n >\n <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <ellipse\n v-else\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n }\"\n />\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n strokeLinejoin: 'round',\n }\"\n />\n <ellipse\n v-else\n :cx=\"geometry.cx\"\n :cy=\"geometry.cy\"\n :rx=\"geometry.rx\"\n :ry=\"geometry.ry\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\n stroke: strokeColor ?? color,\n strokeWidth: strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfAnnotationBorderStyle, PdfRectDifferences, Rect } from '@embedpdf/models';\nimport { generateCloudyEllipsePath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n rectangleDifferences?: PdfRectDifferences;\n }>(),\n {\n color: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value) return null;\n return generateCloudyEllipsePath(\n { x: 0, y: 0, width: props.rect.size.width, height: props.rect.size.height },\n props.rectangleDifferences,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\n});\n\nconst svgWidth = computed(() => geometry.value.width * props.scale);\nconst svgHeight = computed(() => geometry.value.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <CircleVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfCircleAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport CircleVue from '../annotations/circle.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfCircleAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.start\"\n :d=\"endings.start.d\"\n :transform=\"endings.start.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <line\n :x1=\"localLine.x1\"\n :y1=\"localLine.y1\"\n :x2=\"localLine.x2\"\n :y2=\"localLine.y2\"\n :opacity=\"opacity\"\n :style=\"{\n pointerEvents: 'none',\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 :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n :style=\"{\n pointerEvents: 'none',\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\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 :style=\"{\n pointerEvents: 'none',\n strokeWidth: strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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 MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n isSelected: boolean;\n appearanceActive?: boolean;\n }>(),\n {\n color: 'transparent',\n opacity: 1,\n strokeColor: '#000000',\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\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 width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <LineVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfLineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport LineVue from '../annotations/line.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfLineAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n :d=\"pathData\"\n fill=\"none\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\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 fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n <path\n v-if=\"endings.end\"\n :d=\"endings.end.d\"\n :transform=\"endings.end.transform\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n :d=\"pathData\"\n :opacity=\"opacity\"\n :style=\"{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\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 :stroke=\"strokeColor\"\n :fill=\"endings.start.filled ? color : 'none'\"\n :style=\"{\n pointerEvents: 'none',\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\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 :style=\"{\n pointerEvents: 'none',\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }\"\n />\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n lineEndings?: LineEndings;\n appearanceActive?: boolean;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n appearanceActive: false,\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 width = computed(() => props.rect.size.width * props.scale);\nconst height = computed(() => props.rect.size.height * props.scale);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <PolylineVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfPolylineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport PolylineVue from '../annotations/polyline.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfPolylineAnnoObject>>();\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 <!-- Hit area -- always rendered, transparent, wider stroke for mobile -->\n <path\n :d=\"isCloudy && cloudyPath ? cloudyPath.path : pathData\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"hitStrokeWidth\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }\"\n />\n\n <!-- Visual -- hidden when AP active, never interactive -->\n <template v-if=\"!appearanceActive\">\n <path\n v-if=\"isCloudy && cloudyPath\"\n :d=\"cloudyPath.path\"\n :opacity=\"opacity\"\n :style=\"{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\n strokeLinejoin: 'round',\n }\"\n />\n <template v-else>\n <path\n :d=\"pathData\"\n :opacity=\"opacity\"\n :style=\"{\n fill: currentVertex ? 'none' : color,\n stroke: strokeColor ?? color,\n strokeWidth,\n pointerEvents: 'none',\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 pointerEvents: 'none',\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 style=\"pointer-events: none\"\n />\n </template>\n </template>\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { generateCloudyPolygonPath } from '@embedpdf/plugin-annotation';\n\nconst MIN_HIT_AREA_SCREEN_PX = 20;\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) => void;\n currentVertex?: Position;\n handleSize?: number;\n appearanceActive?: boolean;\n cloudyBorderIntensity?: number;\n }>(),\n {\n color: 'transparent',\n strokeColor: '#000000',\n opacity: 1,\n strokeStyle: PdfAnnotationBorderStyle.SOLID,\n handleSize: 14,\n appearanceActive: false,\n },\n);\n\nconst isCloudy = computed(() => (props.cloudyBorderIntensity ?? 0) > 0);\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 cloudyPath = computed(() => {\n if (!isCloudy.value || allPoints.value.length < 3) return null;\n return generateCloudyPolygonPath(\n allPoints.value,\n props.rect.origin,\n props.cloudyBorderIntensity!,\n props.strokeWidth,\n );\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);\nconst hitStrokeWidth = computed(() =>\n Math.max(props.strokeWidth, MIN_HIT_AREA_SCREEN_PX / props.scale),\n);\n</script>\n","<template>\n <PolygonVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfPolygonAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport PolygonVue from '../annotations/polygon.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfPolygonAnnoObject>>();\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 opacity: appearanceActive ? 0 : 1,\n }\"\n @pointerdown=\"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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, onMounted, nextTick } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCssProperties,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = withDefaults(\n defineProps<{\n documentId: string;\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n appearanceActive: false,\n },\n);\n\nconst editorRef = ref<HTMLSpanElement | null>(null);\nconst editingRef = ref(false);\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst annotationProvides = computed(\n () => annotationCapability.value?.forDocument(props.documentId) ?? null,\n);\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 async (editing) => {\n if (!editing) return;\n await nextTick();\n if (!editorRef.value) return;\n editingRef.value = true;\n const editor = editorRef.value;\n editor.focus();\n\n const tool = annotationProvides.value?.findToolForAnnotation(props.annotation.object);\n const isDefaultContent =\n tool?.defaults?.contents != null &&\n props.annotation.object.contents === tool.defaults.contents;\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n if (!isDefaultContent) {\n range.collapse(false);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n }\n },\n { immediate: true },\n);\n\nconst handleBlur = () => {\n if (!editingRef.value) return;\n editingRef.value = false;\n if (!annotationProvides.value || !editorRef.value) return;\n annotationProvides.value.updateAnnotation(props.pageIndex, props.annotation.object.id, {\n contents: editorRef.value.innerText.replace(/\\u00A0/g, ' '),\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 ...standardFontCssProperties(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 <FreeTextVue\n :documentId=\"documentId\"\n :isSelected=\"isSelected\"\n :isEditing=\"isEditing\"\n :annotation=\"{ ...annotation, object: currentObject }\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfFreeTextAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport FreeTextVue from '../annotations/free-text.vue';\n\nconst {\n annotation,\n currentObject,\n isSelected,\n isEditing,\n scale,\n pageIndex,\n documentId,\n onClick,\n appearanceActive,\n} = defineProps<AnnotationRendererProps<PdfFreeTextAnnoObject>>();\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 unrotated?: boolean;\n style?: CSSProperties;\n }>(),\n {\n scaleFactor: 1,\n unrotated: false,\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.unrotated,\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 unrotated: props.unrotated,\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 >\n <RenderAnnotation\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :annotation=\"{ ...annotation.object, id: annotation.object.id }\"\n :scaleFactor=\"scale\"\n :unrotated=\"unrotated\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport RenderAnnotation from '../render-annotation.vue';\n\nconst props = defineProps<{\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: PointerEvent) => void;\n}>();\n\nconst unrotated = computed(\n () => !!props.annotation.object.rotation && !!props.annotation.object.unrotatedRect,\n);\n</script>\n","<template>\n <StampVue\n :isSelected=\"isSelected\"\n :annotation=\"annotation\"\n :documentId=\"documentId\"\n :pageIndex=\"pageIndex\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport StampVue from '../annotations/stamp.vue';\n\nconst { annotation, isSelected, documentId, pageIndex, scale, onClick } =\n defineProps<AnnotationRendererProps<PdfStampAnnoObject>>();\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?.($event)\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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: PointerEvent | MouseEvent) => 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 <LinkVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :hasIRT=\"!!currentObject.inReplyToId\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport LinkVue from '../annotations/link.vue';\n\nconst { currentObject, isSelected, scale, onClick } =\n defineProps<AnnotationRendererProps<PdfLinkAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(b, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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: appearanceActive ? 'transparent' : resolvedColor,\n opacity: appearanceActive ? undefined : opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n }\"\n ></div>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\n</script>\n","<template>\n <HighlightVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfHighlightAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport HighlightVue from '../text-markup/highlight.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfHighlightAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <UnderlineVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfUnderlineAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport UnderlineVue from '../text-markup/underline.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfUnderlineAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\n },\n);\n\nconst resolvedColor = computed(() => props.strokeColor ?? '#FFFF00');\nconst thickness = computed(() => 2 * props.scale);\n</script>\n","<template>\n <StrikeoutVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfStrikeOutAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport StrikeoutVue from '../text-markup/strikeout.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfStrikeOutAnnoObject>>();\n</script>\n","<template>\n <div\n v-for=\"(r, i) in segmentRects\"\n :key=\"i\"\n @pointerdown=\"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 <!-- Visual -- hidden when AP active, never interactive -->\n <div\n v-if=\"!appearanceActive\"\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 lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\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) => void;\n /** When true, AP image provides the visual; only render hit area */\n appearanceActive?: boolean;\n }>(),\n {\n opacity: 0.5,\n appearanceActive: false,\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 <SquigglyVue\n v-bind=\"currentObject\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfSquigglyAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport SquigglyVue from '../text-markup/squiggly.vue';\n\nconst { currentObject, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfSquigglyAnnoObject>>();\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 ${width} ${height}`\"\n overflow=\"visible\"\n >\n <!-- Hit area -->\n <path\n :d=\"path\"\n fill=\"transparent\"\n stroke=\"transparent\"\n :stroke-width=\"4\"\n @pointerdown=\"onClick\"\n :style=\"{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visible',\n }\"\n />\n <!-- Visual -->\n <path\n v-if=\"!appearanceActive\"\n :d=\"path\"\n :fill=\"strokeColor\"\n :stroke=\"strokeColor\"\n :stroke-width=\"0.5\"\n :opacity=\"opacity\"\n fill-rule=\"evenodd\"\n :style=\"{ pointerEvents: 'none' }\"\n />\n </svg>\n</template>\n\n<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n strokeColor?: string;\n opacity?: number;\n rect: Rect;\n scale: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n strokeColor: '#000000',\n opacity: 1,\n appearanceActive: false,\n },\n);\n\nconst width = computed(() => props.rect.size.width);\nconst height = computed(() => props.rect.size.height);\n\nconst path = computed(() => {\n const w = width.value;\n const h = height.value;\n const midX = w / 2;\n\n return [\n `M 0 ${h}`,\n `C ${w * 0.27} ${h} ${midX} ${h - h * 0.44} ${midX} 0`,\n `C ${midX} ${h - h * 0.44} ${w - w * 0.27} ${h} ${w} ${h}`,\n 'Z',\n ].join(' ');\n});\n\nconst svgWidth = computed(() => width.value * props.scale);\nconst svgHeight = computed(() => height.value * props.scale);\n</script>\n","<template>\n <CaretVue\n v-bind=\"currentObject\"\n :isSelected=\"isSelected\"\n :scale=\"scale\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfCaretAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport CaretVue from '../annotations/caret.vue';\n\nconst { currentObject, isSelected, scale, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfCaretAnnoObject>>();\n</script>\n","<template>\n <div\n :style=\"{\n position: 'absolute',\n inset: 0,\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: isSelected ? 'move' : 'pointer',\n }\"\n @pointerdown=\"onClick\"\n >\n <svg\n v-if=\"!appearanceActive\"\n :style=\"{ position: 'absolute', inset: 0, pointerEvents: 'none' }\"\n viewBox=\"0 0 20 20\"\n width=\"100%\"\n height=\"100%\"\n >\n <path\n d=\"M 0.5 15.5 L 0.5 0.5 L 19.5 0.5 L 19.5 15.5 L 8.5 15.5 L 6.5 19.5 L 4.5 15.5 Z\"\n :fill=\"color\"\n :opacity=\"opacity\"\n :stroke=\"lineColor\"\n stroke-width=\"1\"\n stroke-linejoin=\"miter\"\n />\n <line x1=\"2.5\" y1=\"4.25\" x2=\"17.5\" y2=\"4.25\" :stroke=\"lineColor\" stroke-width=\"1\" />\n <line x1=\"2.5\" y1=\"8\" x2=\"17.5\" y2=\"8\" :stroke=\"lineColor\" stroke-width=\"1\" />\n <line x1=\"2.5\" y1=\"11.75\" x2=\"17.5\" y2=\"11.75\" :stroke=\"lineColor\" stroke-width=\"1\" />\n </svg>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { getContrastStrokeColor } from '@embedpdf/models';\n\nconst props = withDefaults(\n defineProps<{\n isSelected: boolean;\n color?: string;\n opacity?: number;\n onClick?: (e: PointerEvent) => void;\n appearanceActive?: boolean;\n }>(),\n {\n color: '#facc15',\n opacity: 1,\n appearanceActive: false,\n },\n);\n\nconst lineColor = computed(() => getContrastStrokeColor(props.color));\n</script>\n","<template>\n <TextVue\n :isSelected=\"isSelected\"\n :color=\"currentObject.strokeColor ?? currentObject.color\"\n :opacity=\"currentObject.opacity\"\n :onClick=\"onClick\"\n :appearanceActive=\"appearanceActive\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { PdfTextAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport TextVue from '../annotations/text.vue';\n\nconst { currentObject, isSelected, onClick, appearanceActive } =\n defineProps<AnnotationRendererProps<PdfTextAnnoObject>>();\n</script>\n","import {\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfInkAnnoObject,\n PdfSquareAnnoObject,\n PdfCircleAnnoObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n PdfFreeTextAnnoObject,\n PdfStampAnnoObject,\n PdfLinkAnnoObject,\n PdfHighlightAnnoObject,\n PdfUnderlineAnnoObject,\n PdfStrikeOutAnnoObject,\n PdfSquigglyAnnoObject,\n PdfCaretAnnoObject,\n PdfTextAnnoObject,\n} from '@embedpdf/models';\nimport type { BoxedAnnotationRenderer } from '../context';\nimport { createRenderer } from '../context/renderer-registry';\n\nimport InkRenderer from './renderers/ink-renderer.vue';\nimport SquareRenderer from './renderers/square-renderer.vue';\nimport CircleRenderer from './renderers/circle-renderer.vue';\nimport LineRenderer from './renderers/line-renderer.vue';\nimport PolylineRenderer from './renderers/polyline-renderer.vue';\nimport PolygonRenderer from './renderers/polygon-renderer.vue';\nimport FreeTextRenderer from './renderers/free-text-renderer.vue';\nimport StampRenderer from './renderers/stamp-renderer.vue';\nimport LinkRenderer from './renderers/link-renderer.vue';\nimport HighlightRenderer from './renderers/highlight-renderer.vue';\nimport UnderlineRenderer from './renderers/underline-renderer.vue';\nimport StrikeoutRenderer from './renderers/strikeout-renderer.vue';\nimport SquigglyRenderer from './renderers/squiggly-renderer.vue';\nimport CaretRenderer from './renderers/caret-renderer.vue';\nimport TextRenderer from './renderers/text-renderer.vue';\n\nexport const builtInRenderers: BoxedAnnotationRenderer[] = [\n createRenderer<PdfInkAnnoObject>({\n id: 'ink',\n matches: (a): a is PdfInkAnnoObject => a.type === PdfAnnotationSubtype.INK,\n component: InkRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfSquareAnnoObject>({\n id: 'square',\n matches: (a): a is PdfSquareAnnoObject => a.type === PdfAnnotationSubtype.SQUARE,\n component: SquareRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfCircleAnnoObject>({\n id: 'circle',\n matches: (a): a is PdfCircleAnnoObject => a.type === PdfAnnotationSubtype.CIRCLE,\n component: CircleRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLineAnnoObject>({\n id: 'line',\n matches: (a): a is PdfLineAnnoObject => a.type === PdfAnnotationSubtype.LINE,\n component: LineRenderer,\n vertexConfig: {\n extractVertices: (a) => [a.linePoints.start, a.linePoints.end],\n transformAnnotation: (a, v) => ({\n ...a,\n linePoints: { start: v[0], end: v[1] },\n }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfPolylineAnnoObject>({\n id: 'polyline',\n matches: (a): a is PdfPolylineAnnoObject => a.type === PdfAnnotationSubtype.POLYLINE,\n component: PolylineRenderer,\n vertexConfig: {\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfPolygonAnnoObject>({\n id: 'polygon',\n matches: (a): a is PdfPolygonAnnoObject => a.type === PdfAnnotationSubtype.POLYGON,\n component: PolygonRenderer,\n vertexConfig: {\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n },\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: true },\n }),\n\n createRenderer<PdfHighlightAnnoObject>({\n id: 'highlight',\n matches: (a): a is PdfHighlightAnnoObject => a.type === PdfAnnotationSubtype.HIGHLIGHT,\n component: HighlightRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n defaultBlendMode: PdfBlendMode.Multiply,\n }),\n\n createRenderer<PdfUnderlineAnnoObject>({\n id: 'underline',\n matches: (a): a is PdfUnderlineAnnoObject => a.type === PdfAnnotationSubtype.UNDERLINE,\n component: UnderlineRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfStrikeOutAnnoObject>({\n id: 'strikeout',\n matches: (a): a is PdfStrikeOutAnnoObject => a.type === PdfAnnotationSubtype.STRIKEOUT,\n component: StrikeoutRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfSquigglyAnnoObject>({\n id: 'squiggly',\n matches: (a): a is PdfSquigglyAnnoObject => a.type === PdfAnnotationSubtype.SQUIGGLY,\n component: SquigglyRenderer,\n zIndex: 0,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfTextAnnoObject>({\n id: 'text',\n matches: (a): a is PdfTextAnnoObject => a.type === PdfAnnotationSubtype.TEXT && !a.inReplyToId,\n component: TextRenderer,\n interactionDefaults: { isDraggable: true, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfCaretAnnoObject>({\n id: 'caret',\n matches: (a): a is PdfCaretAnnoObject => a.type === PdfAnnotationSubtype.CARET,\n component: CaretRenderer,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n }),\n\n createRenderer<PdfFreeTextAnnoObject>({\n id: 'freeText',\n matches: (a): a is PdfFreeTextAnnoObject => a.type === PdfAnnotationSubtype.FREETEXT,\n component: FreeTextRenderer,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n isDraggable: (toolDraggable, { isEditing }) => toolDraggable && !isEditing,\n onDoubleClick: (id, setEditingId) => setEditingId(id),\n }),\n\n createRenderer<PdfStampAnnoObject>({\n id: 'stamp',\n matches: (a): a is PdfStampAnnoObject => a.type === PdfAnnotationSubtype.STAMP,\n component: StampRenderer,\n useAppearanceStream: false,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLinkAnnoObject>({\n id: 'link',\n matches: (a): a is PdfLinkAnnoObject => a.type === PdfAnnotationSubtype.LINK,\n component: LinkRenderer,\n interactionDefaults: { isDraggable: false, isResizable: false, isRotatable: false },\n useAppearanceStream: false,\n selectOverride: (e, annotation, helpers) => {\n e.stopPropagation();\n helpers.clearSelection();\n if (annotation.object.inReplyToId) {\n const parent = helpers.allAnnotations.find(\n (a) => a.object.id === annotation.object.inReplyToId,\n );\n if (parent) {\n helpers.selectAnnotation(parent.object.pageIndex, parent.object.id);\n return;\n }\n }\n helpers.selectAnnotation(helpers.pageIndex, annotation.object.id);\n },\n hideSelectionMenu: (a) => !!a.inReplyToId,\n }),\n];\n","<template>\n <template v-for=\"{ annotation, renderer } in resolvedAnnotations\" :key=\"annotation.object.id\">\n <template v-if=\"renderer\">\n <AnnotationContainer\n :trackedAnnotation=\"annotation\"\n :isSelected=\"allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"editingId === annotation.object.id\"\n :isMultiSelected=\"isMultiSelected\"\n :isDraggable=\"getFinalDraggable(annotation, renderer)\"\n :isResizable=\"getResolvedResizable(annotation, renderer)\"\n :lockAspectRatio=\"getResolvedLockAspectRatio(annotation, renderer)\"\n :isRotatable=\"getResolvedRotatable(annotation, renderer)\"\n :vertexConfig=\"renderer.vertexConfig\"\n :selectionMenu=\"getSelectionMenu(annotation, renderer)\"\n :onSelect=\"getOnSelect(annotation, renderer)\"\n :onDoubleClick=\"getOnDoubleClick(renderer, annotation)\"\n :zIndex=\"renderer.zIndex\"\n :blendMode=\"getBlendMode(annotation, renderer)\"\n :style=\"renderer.containerStyle?.(annotation.object)\"\n :appearance=\"getAppearance(annotation, renderer)\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject, appearanceActive }\">\n <component\n :is=\"renderer.component\"\n :annotation=\"annotation\"\n :currentObject=\"currentObject\"\n :isSelected=\"allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"editingId === annotation.object.id\"\n :scale=\"scale\"\n :pageIndex=\"pageIndex\"\n :documentId=\"documentId\"\n :onClick=\"getOnSelect(annotation, renderer)\"\n :appearanceActive=\"appearanceActive\"\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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-handle\" v-bind=\"slotProps\" />\n </template>\n </AnnotationContainer>\n </template>\n </template>\n\n <!-- Group Selection Box -->\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 :isRotatable=\"areAllSelectedRotatable\"\n :lockAspectRatio=\"shouldLockGroupAspectRatio\"\n :resizeUi=\"resizeUi\"\n :rotationUi=\"rotationUi\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionOutline=\"groupSelectionOutline ?? selectionOutline\"\n :groupSelectionMenu=\"groupSelectionMenu\"\n >\n <template #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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-handle\" v-bind=\"slotProps\" />\n </template>\n </GroupSelectionBox>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, shallowRef, computed, watch } from 'vue';\nimport {\n blendModeToCss,\n PdfAnnotationObject,\n PdfBlendMode,\n type CssBlendMode,\n Position,\n AnnotationAppearanceMap,\n AnnotationAppearances,\n} from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n TrackedAnnotation,\n resolveInteractionProp,\n} from '@embedpdf/plugin-annotation';\nimport type { EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/vue';\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 {\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n ResizeHandleUI,\n VertexHandleUI,\n RotationHandleUI,\n SelectionOutline,\n} from '../types';\nimport type {\n BoxedAnnotationRenderer,\n AnnotationInteractionEvent,\n SelectOverrideHelpers,\n} from '../context';\nimport { builtInRenderers } from './built-in-renderers';\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 rotationUi?: RotationHandleUI;\n selectionOutlineColor?: string;\n selectionOutline?: SelectionOutline;\n groupSelectionOutline?: SelectionOutline;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n annotationRenderers?: BoxedAnnotationRenderer[];\n}>();\n\nconst { provides: annotationCapability } = useAnnotationCapability();\nconst { provides: selectionProvides } = useSelectionCapability();\nconst annotations = shallowRef<TrackedAnnotation[]>([]);\nconst allSelectedIds = shallowRef<string[]>([]);\nconst { register } = usePointerHandlers({\n documentId: () => props.documentId,\n pageIndex: props.pageIndex,\n});\nconst editingId = ref<string | null>(null);\nconst appearanceMap = shallowRef<AnnotationAppearanceMap<Blob>>({});\nlet prevScale = props.scale;\n\nconst annotationProvides = computed(() =>\n annotationCapability.value ? annotationCapability.value.forDocument(props.documentId) : null,\n);\n\nconst isMultiSelected = computed(() => allSelectedIds.value.length > 1);\n\n// Merge renderers: external renderers override built-ins by ID\nconst allRenderers = computed(() => {\n const external = props.annotationRenderers ?? [];\n const externalIds = new Set(external.map((r) => r.id));\n return [...external, ...builtInRenderers.filter((r) => !externalIds.has(r.id))];\n});\n\nconst resolveRenderer = (annotation: TrackedAnnotation): BoxedAnnotationRenderer | null => {\n return allRenderers.value.find((r) => r.matches(annotation.object)) ?? null;\n};\n\nconst getAppearanceForAnnotation = (ta: TrackedAnnotation): AnnotationAppearances<Blob> | null => {\n if (ta.dictMode) return null;\n if (ta.object.rotation && ta.object.unrotatedRect) return null;\n const appearances = appearanceMap.value[ta.object.id];\n if (!appearances?.normal) return null;\n return appearances;\n};\n\n// Subscribe to annotation state. Explicit watch dependencies avoid accidental\n// reactive tracking inside provider methods that can create update loops.\nwatch(\n [annotationProvides, () => props.pageIndex],\n ([provides, pageIndex], _prev, onCleanup) => {\n if (!provides) {\n annotations.value = [];\n allSelectedIds.value = [];\n return;\n }\n\n const syncState = (state: ReturnType<typeof provides.getState>) => {\n annotations.value = getAnnotationsByPageIndex(state, pageIndex);\n allSelectedIds.value = getSelectedAnnotationIds(state);\n };\n\n syncState(provides.getState());\n const off = provides.onStateChange(syncState);\n onCleanup(off);\n\n const offEvent = provides.onAnnotationEvent((event) => {\n if (event.type === 'create' && event.editAfterCreate) {\n editingId.value = event.annotation.id;\n }\n });\n onCleanup(offEvent);\n },\n { immediate: true },\n);\n\n// Fetch appearance map, invalidate on scale change\nwatch(\n [annotationProvides, () => props.pageIndex, () => props.scale],\n ([provides, pageIndex, scale], _prev, onCleanup) => {\n if (!provides) {\n appearanceMap.value = {};\n return;\n }\n\n if (prevScale !== scale) {\n provides.invalidatePageAppearances(pageIndex);\n prevScale = scale;\n }\n\n let cancelled = false;\n onCleanup(() => {\n cancelled = true;\n });\n\n const task = provides.getPageAppearances(pageIndex, {\n scaleFactor: scale,\n dpr: typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n });\n task.wait(\n (map) => {\n if (!cancelled) appearanceMap.value = map;\n },\n () => {\n if (!cancelled) appearanceMap.value = {};\n },\n );\n },\n { immediate: true },\n);\n\nconst resolvedAnnotations = computed(() =>\n annotations.value.map((annotation) => ({\n annotation,\n renderer: resolveRenderer(annotation),\n })),\n);\n\nconst getFinalDraggable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n const defaults = renderer.interactionDefaults;\n const isEditing = editingId.value === annotation.object.id;\n const resolvedDraggable = resolveInteractionProp(\n tool?.interaction.isDraggable,\n annotation.object,\n defaults?.isDraggable ?? true,\n );\n return renderer.isDraggable\n ? renderer.isDraggable(resolvedDraggable, { isEditing })\n : resolvedDraggable;\n};\n\nconst getResolvedResizable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.isResizable,\n annotation.object,\n renderer.interactionDefaults?.isResizable ?? false,\n );\n};\n\nconst getResolvedLockAspectRatio = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.lockAspectRatio,\n annotation.object,\n renderer.interactionDefaults?.lockAspectRatio ?? false,\n );\n};\n\nconst getResolvedRotatable = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n return resolveInteractionProp(\n tool?.interaction.isRotatable,\n annotation.object,\n renderer.interactionDefaults?.isRotatable ?? false,\n );\n};\n\nconst getSelectionMenu = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n if (renderer.hideSelectionMenu?.(annotation.object)) return undefined;\n if (isMultiSelected.value) return undefined;\n return props.selectionMenu;\n};\n\nconst getOnSelect = (annotation: TrackedAnnotation, renderer: BoxedAnnotationRenderer) => {\n if (renderer.selectOverride) {\n const selectHelpers: SelectOverrideHelpers = {\n defaultSelect: handleClick,\n selectAnnotation: (pi: number, id: string) =>\n annotationProvides.value?.selectAnnotation(pi, id),\n clearSelection: () => selectionProvides.value?.clear(),\n allAnnotations: annotations.value,\n pageIndex: props.pageIndex,\n };\n return (e: AnnotationInteractionEvent) =>\n renderer.selectOverride!(e, annotation, selectHelpers);\n }\n return (e: AnnotationInteractionEvent) => handleClick(e, annotation);\n};\n\nconst handlePointerDown = (_pos: Position, pe: EmbedPdfPointerEvent<PointerEvent>) => {\n if (pe.target === pe.currentTarget && annotationProvides.value) {\n if (editingId.value && annotations.value.some((a) => a.object.id === editingId.value)) {\n pe.stopImmediatePropagation();\n }\n annotationProvides.value.deselectAnnotation();\n editingId.value = null;\n }\n};\n\nconst handleClick = (e: AnnotationInteractionEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides.value && selectionProvides.value) {\n selectionProvides.value.clear();\n\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n annotationProvides.value.toggleSelection(props.pageIndex, annotation.object.id);\n } else {\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\nconst setEditingId = (id: string) => {\n editingId.value = id;\n};\n\nconst pointerHandlers = { onPointerDown: handlePointerDown };\n\nwatch(\n annotationProvides,\n (provides, _prev, onCleanup) => {\n if (!provides) return;\n const unregister = register(pointerHandlers);\n if (unregister) {\n onCleanup(unregister);\n }\n },\n { immediate: true },\n);\n\nconst selectedAnnotationsOnPage = computed(() =>\n annotations.value.filter((anno) => allSelectedIds.value.includes(anno.object.id)),\n);\n\nconst areAllSelectedDraggable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\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\nconst areAllSelectedResizable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\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\nconst areAllSelectedRotatable = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.every((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n const groupRotatable = resolveInteractionProp(\n tool?.interaction.isGroupRotatable,\n ta.object,\n true,\n );\n const singleRotatable = resolveInteractionProp(tool?.interaction.isRotatable, ta.object, true);\n return tool?.interaction.isGroupRotatable !== undefined ? groupRotatable : singleRotatable;\n });\n});\n\nconst shouldLockGroupAspectRatio = computed(() => {\n if (selectedAnnotationsOnPage.value.length < 2) return false;\n return selectedAnnotationsOnPage.value.some((ta) => {\n const tool = annotationProvides.value?.findToolForAnnotation(ta.object);\n const groupLock = resolveInteractionProp(\n tool?.interaction.lockGroupAspectRatio,\n ta.object,\n false,\n );\n const singleLock = resolveInteractionProp(tool?.interaction.lockAspectRatio, ta.object, false);\n return tool?.interaction.lockGroupAspectRatio !== undefined ? groupLock : singleLock;\n });\n});\n\nconst allSelectedOnSamePage = computed(() => {\n if (!annotationProvides.value) return false;\n if (allSelectedIds.value.length < 2) return false;\n const allSelected = annotationProvides.value.getSelectedAnnotations();\n return allSelected.every((ta) => ta.object.pageIndex === props.pageIndex);\n});\n\n// --- Renderer resolution helpers ---\n\nconst getOnDoubleClick = (renderer: BoxedAnnotationRenderer, annotation: TrackedAnnotation) => {\n if (!renderer.onDoubleClick) return undefined;\n return (e: AnnotationInteractionEvent) => {\n e.stopPropagation();\n renderer.onDoubleClick!(annotation.object.id, setEditingId);\n };\n};\n\nconst getBlendMode = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n): CssBlendMode => {\n return blendModeToCss(\n annotation.object.blendMode ?? renderer.defaultBlendMode ?? PdfBlendMode.Normal,\n );\n};\n\nconst getAppearance = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n): AnnotationAppearances<Blob> | null | undefined => {\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object);\n const useAP = tool?.behavior?.useAppearanceStream ?? renderer.useAppearanceStream ?? true;\n return useAP ? getAppearanceForAnnotation(annotation) : undefined;\n};\n\nconst containerProps = computed(() => {\n const {\n selectionMenu: _sm,\n groupSelectionMenu: _gsm,\n groupSelectionOutline: _gso,\n annotationRenderers: _ar,\n ...rest\n } = props;\n return rest;\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 { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode } 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 const base: 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\n if (props.preview.type === PdfAnnotationSubtype.INK) {\n base.mixBlendMode = blendModeToCss(props.preview.data.blendMode ?? PdfBlendMode.Normal);\n }\n\n return base;\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=\"resolvedResizeUi\"\n :vertexUi=\"resolvedVertexUi\"\n :rotationUi=\"rotationUi\"\n :selectionOutlineColor=\"selectionOutlineColor\"\n :selectionOutline=\"selectionOutline\"\n :groupSelectionOutline=\"groupSelectionOutline\"\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 <template #rotation-handle=\"slotProps\">\n <slot name=\"rotation-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, onMounted } 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 RotationHandleUI,\n SelectionOutline,\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 /** @deprecated Use `resizeUi` (or `:resize-ui` in templates) instead */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUi?: VertexHandleUI;\n /** @deprecated Use `vertexUi` (or `:vertex-ui` in templates) instead */\n vertexUI?: VertexHandleUI;\n /** Customize rotation handle */\n rotationUi?: RotationHandleUI;\n /** @deprecated Use `selectionOutline` instead */\n selectionOutlineColor?: string;\n /** Customize the selection outline for individual annotations */\n selectionOutline?: SelectionOutline;\n /** Customize the selection outline for the group selection box (falls back to selectionOutline) */\n groupSelectionOutline?: SelectionOutline;\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// Resolve deprecated prop aliases (resizeUI -> resizeUi, vertexUI -> vertexUi)\nconst resolvedResizeUi = computed(() => props.resizeUi ?? props.resizeUI);\nconst resolvedVertexUi = computed(() => props.vertexUi ?? props.vertexUI);\n\nonMounted(() => {\n if (props.resizeUI) {\n console.warn(\n '[AnnotationLayer] The \"resizeUI\" prop is deprecated. Use :resize-ui in templates instead.',\n );\n }\n if (props.vertexUI) {\n console.warn(\n '[AnnotationLayer] The \"vertexUI\" prop is deprecated. Use :vertex-ui in templates instead.',\n );\n }\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 // Combine page intrinsic rotation with document rotation\n const pageRotation = page.value?.rotation ?? 0;\n const docRotation = documentState.value?.rotation ?? 0;\n return ((pageRotation + docRotation) % 4) as Rotation;\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":["props","__props","imageUrl","ref","urlRef","watchEffect","onCleanup","url","URL","createObjectURL","appearance","data","value","revokeObjectURL","handleImageLoad","_createElementBlock","src","alt","draggable","onLoad","style","_normalizeStyle","useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","inheritAttrs","HANDLE_COLOR","computed","_a","resizeUi","color","VERTEX_COLOR","vertexUi","HANDLE_SIZE","size","VERTEX_SIZE","ROTATION_SIZE","rotationUi","ROTATION_COLOR","ROTATION_CONNECTOR_COLOR","connectorColor","ROTATION_ICON_COLOR","iconColor","SHOW_CONNECTOR","showConnector","ROTATION_MARGIN","margin","ROTATION_BORDER_COLOR","_b","border","ROTATION_BORDER_WIDTH","width","ROTATION_BORDER_STYLE","outlineColor","selectionOutline","selectionOutlineColor","outlineStyle","outlineWidth","outlineOff","offset","outlineOffset","preview","shallowRef","toRaw","trackedAnnotation","object","liveRotation","cursorScreen","isHandleHovered","gestureActive","provides","annotationCapability","plugin","annotationPlugin","permissions","useDocumentPermissions","documentId","gestureBaseRef","gestureBaseRectRef","effectiveIsDraggable","canModifyAnnotations","isDraggable","isMultiSelected","effectiveIsResizable","isResizable","effectiveIsRotatable","isRotatable","guardedOnDoubleClick","onDoubleClick","e","call","annotationProvides","forDocument","currentObject","hasNoZoom","flags","includes","hasNoRotate","visualScale","scale","effectivePageRotation","rotation","annotationRotation","rotationDisplay","normalizedRotationDisplay","val","Number","isFinite","Math","round","rotationActive","explicitUnrotatedRect","unrotatedRect","effectiveUnrotatedRect","rect","rotationPivot","inferRotationCenterFromRects","controllerElement","childObject","showOutline","isSelected","shouldShowMenu","selectionMenu","slots","menuRect","origin","x","y","height","menuContext","type","annotation","pageIndex","menuPlacement","effectiveAngle","suggestTop","renderSelectionMenu","menuWrapperProps","selected","placement","context","verticesSnapshot","obj","vertexConfig","extractVertices","constraintsSnapshot","minWidth","minHeight","boundingBox","pageWidth","pageHeight","dragProps","vertices","resize","rotationHandleData","useInteractionHandles","controller","element","constraints","maintainAspectRatio","lockAspectRatio","pageRotation","rotationCenter","rotationElement","enabled","onUpdate","event","transformData","changes","metadata","pageSize","state","startDrag","annotationIds","startResize","resizeHandle","handle","delta","updateDrag","updateResize","base","vertexChanges","transformAnnotation","patched","_c","updateAnnotation","cursorAngle","rotationAngle","cursorPos","cursorPosition","clientX","clientY","startRotation","updateRotation","rotationDelta","commitRotation","commitDrag","commitResize","resizeUI","handleSize","spacing","offsetMode","includeSides","zIndex","vertexUI","vertexSize","rotationUI","includeVertices","includeRotation","currentRotation","doubleProps","useDoublePressProps","onHandlePointerMove","handleEvent","patch","previewPatches","unsubs","onDragChange","onResizeChange","onRotateChange","forEach","u","aabbWidth","aabbHeight","innerWidth","innerHeight","usesCustomPivot","Boolean","innerLeft","innerTop","innerTransformOrigin","centerX","centerY","guideLength","max","counterRot","getCounterRotation","rotationIconSize","apActive","normal","isEditing","dictMode","contentsStyle","display","layerBaseStyle","position","left","top","pointerEvents","transform","matrix","transformOrigin","visualLayerStyle","blendMode","mixBlendMode","outerAABBStyle","visualInnerStyle","innerRotatedStyle","outline","touchAction","cursor","guideHorizontalStyle","backgroundColor","opacity","guideVerticalStyle","guideAngleStyle","connectorLineStyle","connector","rotationHandleStyle","boxSizing","alignItems","justifyContent","rotationHandleBindings","_s","rest","rotationHandleSlotProps","connectorStyle","tooltipStyle","background","padding","borderRadius","fontSize","fontFamily","whiteSpace","useSlots","_createElementVNode","_renderSlot","_ctx","$slots","appearanceActive","_createBlock","AppearanceImageVue","_Fragment","key","_unref","onPointerenter","onPointerleave","_cache","$event","onPointermove","_normalizeProps","_mergeProps","viewBox","fill","stroke","d","_openBlock","ref_for","length","vertex","CounterRotate","default","_withCtx","_resolveDynamicComponent","_Teleport","to","toFixed","mapCounterRotatePoint","getAnnotationScreenBounds","right","bottom","corners","minX","Infinity","minY","maxX","maxY","corner","gestureBase","isDraggingRef","isResizingRef","outlineStyleVal","groupRotationDisplay","groupBox","rects","selectedAnnotations","map","ta","boundingRectOrEmpty","previewGroupBox","watch","newGroupBox","immediate","_old","visualBoundsCorrection","visualLeft","visualTop","visualRight","visualBottom","bounds","gb","groupBoxLeft","groupBoxTop","groupBoxWidth","groupBoxHeight","groupCenterX","groupCenterY","groupGuideLength","outerStyle","boxStyle","annotations","groupSelectionMenu","renderGroupMenu","elementSnapshot","transformType","isMove","isResize","ids","_d","_e","_f","newRect","rawDelta","clampedDelta","_hoisted_1","stopPropagation","RendererRegistryKey","Symbol","createRendererRegistry","renderers","register","entries","Set","filter","r","has","some","getAll","provideRendererRegistry","registry","provide","useRendererRegistry","inject","createRenderer","entry","matches","component","markRaw","defaultBlendMode","containerStyle","interactionDefaults","useAppearanceStream","selectOverride","hideSelectionMenu","resolvedColor","strokeColor","paths","inkList","points","i","lx","ly","trim","hitStrokeWidth","strokeWidth","_renderList","onPointerdown","onClick","args","InkVue","isCloudy","cloudyBorderIntensity","geometry","outerW","outerH","cloudyPath","generateCloudyRectanglePath","rectangleDifferences","svgWidth","svgHeight","overflow","path","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","SquareVue","innerW","innerH","cx","cy","rx","ry","generateCloudyEllipsePath","CircleVue","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","filled","LineVue","localPts","pathData","first","p","toAngle","a","b","startRad","endRad","PolylineVue","allPoints","currentVertex","isPreview","generateCloudyPolygonPath","isPreviewing","PolygonVue","editorRef","editingRef","isIOS","onMounted","nav","navigator","test","userAgent","platform","maxTouchPoints","async","editing","nextTick","editor","focus","tool","findToolForAnnotation","isDefaultContent","defaults","contents","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","handleBlur","innerText","replace","editorStyle","anno","computedFontPx","needsComp","adjustedFontPx","scaleComp","invScalePercent","fontColor","standardFontCssProperties","textAlign","textAlignmentToCss","flexDirection","verticalAlign","PdfVerticalAlignment","Top","Middle","lineHeight","onBlur","tabindex","contenteditable","FreeTextVue","currentTask","annotationId","rectWidth","rectHeight","scaleFactor","unrotated","_","__","task","renderAnnotation","deepToRaw","options","dpr","devicePixelRatio","wait","blob","ignore","abort","code","PdfErrorCode","Cancelled","message","onUnmounted","_createVNode","RenderAnnotation","StampVue","dashArray","isUnderline","UNDERLINE","hitAreaCursor","hasIRT","hitAreaPointerEvents","LinkVue","inReplyToId","segmentRects","HighlightVue","thickness","UnderlineVue","StrikeoutVue","amplitude","period","svgDataUri","amp","per","svg","encodeURIComponent","backgroundSize","SquigglyVue","w","h","midX","CaretVue","lineColor","getContrastStrokeColor","TextVue","builtInRenderers","PdfAnnotationSubtype","INK","InkRenderer","SQUARE","SquareRenderer","CIRCLE","CircleRenderer","LINE","LineRenderer","v","POLYLINE","PolylineRenderer","POLYGON","PolygonRenderer","HIGHLIGHT","HighlightRenderer","PdfBlendMode","Multiply","UnderlineRenderer","STRIKEOUT","StrikeoutRenderer","SQUIGGLY","SquigglyRenderer","TEXT","TextRenderer","CARET","CaretRenderer","FREETEXT","FreeTextRenderer","toolDraggable","setEditingId","STAMP","StampRenderer","LINK","LinkRenderer","helpers","clearSelection","parent","allAnnotations","find","selectAnnotation","selectionProvides","useSelectionCapability","allSelectedIds","usePointerHandlers","editingId","appearanceMap","prevScale","allRenderers","external","annotationRenderers","externalIds","resolveRenderer","_prev","syncState","getAnnotationsByPageIndex","getSelectedAnnotationIds","getState","onStateChange","onAnnotationEvent","editAfterCreate","invalidatePageAppearances","cancelled","getPageAppearances","resolvedAnnotations","renderer","getFinalDraggable","resolvedDraggable","resolveInteractionProp","interaction","getResolvedResizable","getResolvedLockAspectRatio","getResolvedRotatable","getSelectionMenu","getOnSelect","selectHelpers","defaultSelect","handleClick","pi","clear","metaKey","ctrlKey","toggleSelection","pointerHandlers","onPointerDown","_pos","pe","target","currentTarget","stopImmediatePropagation","deselectAnnotation","unregister","selectedAnnotationsOnPage","areAllSelectedDraggable","every","groupDraggable","isGroupDraggable","singleDraggable","areAllSelectedResizable","groupResizable","isGroupResizable","singleResizable","areAllSelectedRotatable","groupRotatable","isGroupRotatable","singleRotatable","shouldLockGroupAspectRatio","groupLock","lockGroupAspectRatio","singleLock","allSelectedOnSamePage","getSelectedAnnotations","getOnDoubleClick","getBlendMode","blendModeToCss","Normal","getAppearance","behavior","appearances","getAppearanceForAnnotation","containerProps","_sm","_gsm","groupSelectionOutline","_gso","_ar","AnnotationContainer","onSelect","_createSlots","slotProps","fn","GroupSelectionBox","boundingRect","activeTool","unsubscribers","scoped","off","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","push","getActiveTool","onActiveToolChange","unsub","defaultMode","Highlight","Underline","Strikeout","Squiggly","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","PreviewRenderer","resolvedResizeUi","resolvedVertexUi","console","warn","fromRegistry","fromProps","merged","idx","findIndex","m","documentState","useDocumentState","page","pages","actualScale","actualRotation","Annotations","TextMarkup","AnnotationPaintLayer","AnnotationPluginPackage","createPluginPackage","BaseAnnotationPackage","addWrapper","RendererRegistryProvider","build","toValue","initialDocumentState","providesValue","docId","scope","newState"],"mappings":"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"}