@embedpdf/plugin-annotation 2.11.1 → 2.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +201 -41
- package/dist/index.js.map +1 -1
- package/dist/lib/annotation-plugin.d.ts +3 -0
- package/dist/lib/handlers/types.d.ts +6 -10
- package/dist/lib/tools/types.d.ts +2 -0
- package/dist/lib/types.d.ts +48 -3
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +19 -25
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +19 -25
- package/dist/react/index.js.map +1 -1
- package/dist/svelte/components/annotations/StampPreview.svelte.d.ts +10 -0
- package/dist/svelte/index.cjs +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.js +48 -50
- package/dist/svelte/index.js.map +1 -1
- package/dist/vue/components/annotations/stamp-preview.vue.d.ts +10 -0
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.js +98 -97
- package/dist/vue/index.js.map +1 -1
- package/package.json +12 -12
package/dist/vue/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/vue/components/appearance-image.vue","../../src/vue/hooks/use-annotation.ts","../../src/vue/hooks/use-ios-zoom-prevention.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/link-locked.vue","../../src/vue/components/annotations/link-preview.vue","../../src/vue/components/annotations/ink.vue","../../src/vue/components/annotations/ink-preview.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/annotations/square-preview.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/annotations/circle-preview.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/annotations/line-preview.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/annotations/polyline-preview.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/annotations/polygon-preview.vue","../../src/vue/components/annotations/free-text-preview.vue","../../src/vue/components/renderers/ink-renderer.vue","../../src/vue/components/renderers/square-renderer.vue","../../src/vue/components/renderers/circle-renderer.vue","../../src/vue/components/renderers/line-renderer.vue","../../src/vue/components/renderers/polyline-renderer.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/components/annotation-navigation-handler.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","import { computed, toValue, type CSSProperties, type MaybeRefOrGetter } from 'vue';\n\nconst MIN_IOS_FOCUS_FONT_PX = 16;\n\nfunction detectIOS(): boolean {\n try {\n const nav = navigator as any;\n return (\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1)\n );\n } catch {\n return false;\n }\n}\n\nlet _isIOS: boolean | undefined;\nfunction getIsIOS(): boolean {\n if (_isIOS === undefined) {\n _isIOS = detectIOS();\n }\n return _isIOS;\n}\n\nexport function useIOSZoomPrevention(\n computedFontPx: MaybeRefOrGetter<number>,\n active: MaybeRefOrGetter<boolean>,\n) {\n const isIOS = getIsIOS();\n\n return computed(() => {\n const px = toValue(computedFontPx);\n const isActive = toValue(active);\n const needsComp = isIOS && isActive && px > 0 && px < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : px;\n const scaleComp = needsComp ? px / MIN_IOS_FOCUS_FONT_PX : 1;\n\n const wrapperStyle: CSSProperties | undefined = needsComp\n ? {\n width: `${100 / scaleComp}%`,\n height: `${100 / scaleComp}%`,\n transform: `scale(${scaleComp})`,\n transformOrigin: 'top left',\n }\n : undefined;\n\n return { needsComp, adjustedFontPx, scaleComp, wrapperStyle };\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, Rect } 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, P = never>(\n entry: AnnotationRendererEntry<T, P>,\n): BoxedAnnotationRenderer {\n return {\n id: entry.id,\n matches: entry.matches ?? (() => false),\n component: (entry.component\n ? markRaw(entry.component)\n : () => null) as Component<AnnotationRendererProps>,\n matchesPreview: entry.matchesPreview,\n previewContainerStyle: entry.previewContainerStyle\n ? (props) => entry.previewContainerStyle!(props as { data: P; bounds: Rect; scale: number })\n : undefined,\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 renderPreview: entry.renderPreview\n ? (markRaw(entry.renderPreview) as BoxedAnnotationRenderer['renderPreview'])\n : undefined,\n hiddenWhenLocked: entry.hiddenWhenLocked,\n renderLocked: entry.renderLocked\n ? (markRaw(entry.renderLocked) as BoxedAnnotationRenderer['renderLocked'])\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","<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = defineProps<AnnotationRendererProps<PdfLinkAnnoObject>>();\n\nconst { provides } = useAnnotationCapability();\n\nconst handleClick = () => {\n const target = props.annotation.object.target;\n if (!target || !provides.value) return;\n provides.value.forDocument(props.documentId).navigateTarget(target);\n};\n</script>\n\n<template>\n <div\n @click=\"handleClick\"\n :style=\"{\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n pointerEvents: 'auto',\n }\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\nimport { LinkPreviewData } from '@embedpdf/plugin-annotation';\n\nconst props = defineProps<{\n data: LinkPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n\nconst style = computed(() => ({\n position: 'absolute' as const,\n left: 0,\n top: 0,\n width: `${props.bounds.size.width * props.scale}px`,\n height: `${props.bounds.size.height * props.scale}px`,\n borderBottom: `${props.data.strokeWidth * props.scale}px solid ${props.data.strokeColor}`,\n backgroundColor: 'rgba(0, 0, 255, 0.05)',\n boxSizing: 'border-box' as const,\n}));\n</script>\n\n<template>\n <div :style=\"style\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { InkPreviewData } from '@embedpdf/plugin-annotation';\nimport Ink from './ink.vue';\n\ndefineProps<{\n data: InkPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Ink :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { SquarePreviewData } from '@embedpdf/plugin-annotation';\nimport Square from './square.vue';\n\ndefineProps<{\n data: SquarePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Square :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { CirclePreviewData } from '@embedpdf/plugin-annotation';\nimport Circle from './circle.vue';\n\ndefineProps<{\n data: CirclePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Circle :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.end.filled\n ? 'visible'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { LinePreviewData } from '@embedpdf/plugin-annotation';\nimport Line from './line.vue';\n\ndefineProps<{\n data: LinePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Line :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.end.filled\n ? 'visible'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { PolylinePreviewData } from '@embedpdf/plugin-annotation';\nimport Polyline from './polyline.vue';\n\ndefineProps<{\n data: PolylinePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Polyline :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { PolygonPreviewData } from '@embedpdf/plugin-annotation';\nimport Polygon from './polygon.vue';\n\ndefineProps<{\n data: PolygonPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Polygon :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\nimport { FreeTextPreviewData } from '@embedpdf/plugin-annotation';\n\nconst props = defineProps<{\n data: FreeTextPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n\nconst style = computed(() => ({\n width: '100%',\n height: '100%',\n border: `1px dashed ${props.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n}));\n</script>\n\n<template>\n <div :style=\"style\" />\n</template>\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 <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 <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 <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 <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 <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: !onClick ? 'none' : 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, nextTick } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCssProperties,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability, useIOSZoomPrevention } 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 ios = useIOSZoomPrevention(\n () => props.annotation.object.fontSize * props.scale,\n () => props.isEditing,\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 { needsComp, adjustedFontPx, scaleComp } = ios.value;\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' : props.onClick ? 'pointer' : 'default',\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: !onClick ? 'none' : isSelected ? 'none' : 'auto',\n cursor: onClick ? 'pointer' : 'default',\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 || !props.onClick ? 'default' : props.isSelected ? 'move' : 'pointer',\n);\nconst hitAreaPointerEvents = computed(() =>\n props.hasIRT || !props.onClick ? '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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: !onClick ? 'none' : isSelected ? 'none' : 'auto',\n cursor: isSelected ? 'move' : onClick ? 'pointer' : 'default',\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 blendModeToCss,\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 {\n LinkPreviewData,\n InkPreviewData,\n CirclePreviewData,\n SquarePreviewData,\n LinePreviewData,\n PolylinePreviewData,\n PolygonPreviewData,\n FreeTextPreviewData,\n} from '@embedpdf/plugin-annotation';\nimport type { BoxedAnnotationRenderer } from '../context';\nimport { createRenderer } from '../context/renderer-registry';\nimport LinkLockedMode from './annotations/link-locked.vue';\nimport LinkPreview from './annotations/link-preview.vue';\nimport InkPreview from './annotations/ink-preview.vue';\nimport SquarePreview from './annotations/square-preview.vue';\nimport CirclePreview from './annotations/circle-preview.vue';\nimport LinePreview from './annotations/line-preview.vue';\nimport PolylinePreview from './annotations/polyline-preview.vue';\nimport PolygonPreview from './annotations/polygon-preview.vue';\nimport FreeTextPreview from './annotations/free-text-preview.vue';\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, InkPreviewData>({\n id: 'ink',\n matches: (a): a is PdfInkAnnoObject => a.type === PdfAnnotationSubtype.INK,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.INK,\n component: InkRenderer,\n renderPreview: InkPreview,\n previewContainerStyle: ({ data }) => ({\n mixBlendMode: blendModeToCss(data.blendMode ?? PdfBlendMode.Normal),\n }),\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfSquareAnnoObject, SquarePreviewData>({\n id: 'square',\n matches: (a): a is PdfSquareAnnoObject => a.type === PdfAnnotationSubtype.SQUARE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.SQUARE,\n component: SquareRenderer,\n renderPreview: SquarePreview,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfCircleAnnoObject, CirclePreviewData>({\n id: 'circle',\n matches: (a): a is PdfCircleAnnoObject => a.type === PdfAnnotationSubtype.CIRCLE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.CIRCLE,\n component: CircleRenderer,\n renderPreview: CirclePreview,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLineAnnoObject, LinePreviewData>({\n id: 'line',\n matches: (a): a is PdfLineAnnoObject => a.type === PdfAnnotationSubtype.LINE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.LINE,\n component: LineRenderer,\n renderPreview: LinePreview,\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, PolylinePreviewData>({\n id: 'polyline',\n matches: (a): a is PdfPolylineAnnoObject => a.type === PdfAnnotationSubtype.POLYLINE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.POLYLINE,\n component: PolylineRenderer,\n renderPreview: PolylinePreview,\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, PolygonPreviewData>({\n id: 'polygon',\n matches: (a): a is PdfPolygonAnnoObject => a.type === PdfAnnotationSubtype.POLYGON,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.POLYGON,\n component: PolygonRenderer,\n renderPreview: PolygonPreview,\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, FreeTextPreviewData>({\n id: 'freeText',\n matches: (a): a is PdfFreeTextAnnoObject => a.type === PdfAnnotationSubtype.FREETEXT,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.FREETEXT,\n component: FreeTextRenderer,\n renderPreview: FreeTextPreview,\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, LinkPreviewData>({\n id: 'link',\n matches: (a): a is PdfLinkAnnoObject => a.type === PdfAnnotationSubtype.LINK,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.LINK,\n component: LinkRenderer,\n renderPreview: LinkPreview,\n interactionDefaults: { isDraggable: true, isResizable: true, 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 renderLocked: LinkLockedMode,\n }),\n];\n","<template>\n <template\n v-for=\"{ annotation, renderer, locked } in resolvedAnnotations\"\n :key=\"annotation.object.id\"\n >\n <AnnotationContainer\n :trackedAnnotation=\"annotation\"\n :isSelected=\"locked ? false : allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"locked ? false : editingId === annotation.object.id\"\n :isMultiSelected=\"locked ? false : isMultiSelected\"\n :isDraggable=\"getFinalDraggable(annotation, renderer, locked)\"\n :isResizable=\"getResolvedResizable(annotation, renderer, locked)\"\n :lockAspectRatio=\"getResolvedLockAspectRatio(annotation, renderer)\"\n :isRotatable=\"getResolvedRotatable(annotation, renderer, locked)\"\n :vertexConfig=\"locked ? undefined : renderer.vertexConfig\"\n :selectionMenu=\"getSelectionMenu(annotation, renderer, locked)\"\n :onSelect=\"getOnSelect(annotation, renderer, locked)\"\n :onDoubleClick=\"getOnDoubleClick(renderer, annotation, locked)\"\n :zIndex=\"renderer.zIndex\"\n :blendMode=\"getBlendMode(annotation, renderer)\"\n :style=\"renderer.containerStyle?.(annotation.object)\"\n :appearance=\"getAppearance(annotation, renderer, locked)\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject, appearanceActive }\">\n <component\n :is=\"locked && renderer.renderLocked ? renderer.renderLocked : renderer.component\"\n :annotation=\"annotation\"\n :currentObject=\"currentObject\"\n :isSelected=\"locked ? false : allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"locked ? false : editingId === annotation.object.id\"\n :scale=\"scale\"\n :pageIndex=\"pageIndex\"\n :documentId=\"documentId\"\n :onClick=\"locked ? undefined : getOnSelect(annotation, renderer, locked)\"\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\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 getAnnotationCategories,\n isCategoryLocked,\n hasLockedFlag,\n type LockMode,\n LockModeType,\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>>({});\nconst lockedMode = shallowRef<LockMode>({ type: LockModeType.None });\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 lockedMode.value = state.locked;\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\n .map((annotation) => {\n const renderer = resolveRenderer(annotation);\n if (!renderer) return null;\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object) ?? null;\n const categories = getAnnotationCategories(tool);\n const locked =\n hasLockedFlag(annotation.object) || isCategoryLocked(categories, lockedMode.value);\n if (locked && renderer.hiddenWhenLocked) return null;\n return { annotation, renderer, tool, locked };\n })\n .filter((v): v is NonNullable<typeof v> => v !== null),\n);\n\nconst getFinalDraggable = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return undefined;\n if (renderer.hideSelectionMenu?.(annotation.object)) return undefined;\n if (isMultiSelected.value) return undefined;\n return props.selectionMenu;\n};\n\nconst noopSelect = (e: AnnotationInteractionEvent) => {\n e.stopPropagation();\n};\n\nconst getOnSelect = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return noopSelect;\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 = (\n renderer: BoxedAnnotationRenderer,\n annotation: TrackedAnnotation,\n locked: boolean,\n) => {\n if (locked) return undefined;\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 locked: boolean,\n): AnnotationAppearances<Blob> | null | undefined => {\n if (locked && renderer.renderLocked) return 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 v-if=\"match?.renderPreview\" :style=\"style\">\n <component\n :is=\"match.renderPreview\"\n :data=\"preview.data\"\n :bounds=\"preview.bounds\"\n :scale=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, CSSProperties } from 'vue';\nimport { PreviewState } from '@embedpdf/plugin-annotation';\nimport { useRendererRegistry } from '../context/renderer-registry';\nimport { builtInRenderers } from './built-in-renderers';\n\nconst props = defineProps<{\n toolId: string;\n preview: PreviewState;\n scale: number;\n}>();\n\nconst registry = useRendererRegistry();\n\nconst allRenderers = computed(() => {\n const external = registry?.getAll() ?? [];\n const externalIds = new Set(external.map((r) => r.id));\n return [...external, ...builtInRenderers.filter((r) => !externalIds.has(r.id))];\n});\n\nconst match = computed(\n () =>\n allRenderers.value.find((r) => r.matchesPreview?.(props.preview) && r.renderPreview) ??\n allRenderers.value.find((r) => r.id === props.toolId && r.renderPreview) ??\n null,\n);\n\nconst style = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${props.preview.bounds.origin.x * props.scale}px`,\n top: `${props.preview.bounds.origin.y * props.scale}px`,\n width: `${props.preview.bounds.size.width * props.scale}px`,\n height: `${props.preview.bounds.size.height * props.scale}px`,\n pointerEvents: 'none',\n zIndex: 10,\n ...match.value?.previewContainerStyle?.({\n data: props.preview.data,\n bounds: props.preview.bounds,\n scale: props.scale,\n }),\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 :toolId=\"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 { PreviewState, 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, PreviewState>>(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","<script setup lang=\"ts\">\nimport { watchEffect } from 'vue';\nimport { useAnnotationPlugin, useAnnotationCapability } from '../hooks';\n\nconst { plugin } = useAnnotationPlugin();\nconst { provides } = useAnnotationCapability();\n\nwatchEffect((onCleanup) => {\n const p = provides.value;\n const pl = plugin.value;\n if (!p || !pl) return;\n\n const unsub = p.onNavigate((event) => {\n if (event.result.outcome === 'uri' && pl.config.autoOpenLinks !== false) {\n window.open(event.result.uri, '_blank', 'noopener,noreferrer');\n }\n });\n\n onCleanup(unsub);\n});\n</script>\n\n<template>\n <span style=\"display: none\" />\n</template>\n","import { createPluginPackage } from '@embedpdf/core';\nimport { AnnotationPluginPackage as BaseAnnotationPackage } from '@embedpdf/plugin-annotation';\nimport { RendererRegistryProvider } from './components';\nimport AnnotationNavigationHandler from './components/annotation-navigation-handler.vue';\n\nexport * from './hooks';\nexport * from './components';\nexport * from './types';\nexport * from './context';\nexport * from '@embedpdf/plugin-annotation';\n\nexport const AnnotationPluginPackage = createPluginPackage(BaseAnnotationPackage)\n .addWrapper(RendererRegistryProvider)\n .addUtility(AnnotationNavigationHandler)\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","_isIOS","getIsIOS","nav","navigator","test","userAgent","platform","maxTouchPoints","detectIOS","useIOSZoomPrevention","computedFontPx","active","isIOS","computed","px","toValue","isActive","needsComp","scaleComp","adjustedFontPx","wrapperStyle","width","height","transform","transformOrigin","inheritAttrs","HANDLE_COLOR","_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","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","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","matrix","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","matchesPreview","previewContainerStyle","defaultBlendMode","containerStyle","interactionDefaults","useAppearanceStream","selectOverride","hideSelectionMenu","renderPreview","hiddenWhenLocked","renderLocked","handleClick","target","navigateTarget","onClick","borderBottom","strokeWidth","strokeColor","resolvedColor","paths","inkList","points","i","lx","ly","trim","hitStrokeWidth","_renderList","onPointerdown","args","Ink","isCloudy","cloudyBorderIntensity","geometry","outerW","outerH","cloudyPath","generateCloudyRectanglePath","rectangleDifferences","svgWidth","svgHeight","overflow","path","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","Square","innerW","innerH","cx","cy","rx","ry","generateCloudyEllipsePath","Circle","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","filled","Line","localPts","pathData","first","p","toAngle","a","b","startRad","endRad","Polyline","allPoints","currentVertex","isPreview","generateCloudyPolygonPath","isPreviewing","Polygon","fontColor","InkVue","SquareVue","CircleVue","LineVue","PolylineVue","PolygonVue","editorRef","editingRef","ios","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","invScalePercent","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","InkPreview","blendModeToCss","PdfBlendMode","Normal","SQUARE","SquareRenderer","SquarePreview","CIRCLE","CircleRenderer","CirclePreview","LINE","LineRenderer","LinePreview","v","POLYLINE","PolylineRenderer","PolylinePreview","POLYGON","PolygonRenderer","PolygonPreview","HIGHLIGHT","HighlightRenderer","Multiply","UnderlineRenderer","STRIKEOUT","StrikeoutRenderer","SQUIGGLY","SquigglyRenderer","TEXT","TextRenderer","CARET","CaretRenderer","FREETEXT","FreeTextRenderer","FreeTextPreview","toolDraggable","setEditingId","STAMP","StampRenderer","LINK","LinkRenderer","LinkPreview","helpers","clearSelection","parent","allAnnotations","find","selectAnnotation","LinkLockedMode","selectionProvides","useSelectionCapability","allSelectedIds","usePointerHandlers","editingId","appearanceMap","lockedMode","LockModeType","None","prevScale","allRenderers","external","annotationRenderers","externalIds","_prev","syncState","getAnnotationsByPageIndex","getSelectedAnnotationIds","locked","getState","onStateChange","onAnnotationEvent","editAfterCreate","invalidatePageAppearances","cancelled","getPageAppearances","resolvedAnnotations","renderer","resolveRenderer","categories","getAnnotationCategories","hasLockedFlag","isCategoryLocked","getFinalDraggable","resolvedDraggable","resolveInteractionProp","interaction","getResolvedResizable","getResolvedLockAspectRatio","getResolvedRotatable","getSelectionMenu","noopSelect","getOnSelect","selectHelpers","defaultSelect","pi","clear","metaKey","ctrlKey","toggleSelection","pointerHandlers","onPointerDown","_pos","pe","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","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","match","toolId","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","next","set","delete","PreviewRenderer","resolvedResizeUi","resolvedVertexUi","onMounted","console","warn","fromRegistry","fromProps","merged","idx","findIndex","m","documentState","useDocumentState","page","pages","actualScale","actualRotation","Annotations","TextMarkup","AnnotationPaintLayer","pl","onNavigate","result","outcome","config","autoOpenLinks","open","uri","AnnotationPluginPackage","createPluginPackage","BaseAnnotationPackage","addWrapper","RendererRegistryProvider","addUtility","AnnotationNavigationHandler","build","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/hooks/use-ios-zoom-prevention.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/link-locked.vue","../../src/vue/components/annotations/link-preview.vue","../../src/vue/components/annotations/ink.vue","../../src/vue/components/annotations/ink-preview.vue","../../src/vue/components/annotations/square.vue","../../src/vue/components/annotations/square-preview.vue","../../src/vue/components/annotations/circle.vue","../../src/vue/components/annotations/circle-preview.vue","../../src/vue/components/annotations/line.vue","../../src/vue/components/annotations/line-preview.vue","../../src/vue/components/annotations/polyline.vue","../../src/vue/components/annotations/polyline-preview.vue","../../src/vue/components/annotations/polygon.vue","../../src/vue/components/annotations/polygon-preview.vue","../../src/vue/components/annotations/free-text-preview.vue","../../src/vue/components/annotations/stamp-preview.vue","../../src/vue/components/renderers/ink-renderer.vue","../../src/vue/components/renderers/square-renderer.vue","../../src/vue/components/renderers/circle-renderer.vue","../../src/vue/components/renderers/line-renderer.vue","../../src/vue/components/renderers/polyline-renderer.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/components/annotation-navigation-handler.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","import { computed, toValue, type CSSProperties, type MaybeRefOrGetter } from 'vue';\n\nconst MIN_IOS_FOCUS_FONT_PX = 16;\n\nfunction detectIOS(): boolean {\n try {\n const nav = navigator as any;\n return (\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1)\n );\n } catch {\n return false;\n }\n}\n\nlet _isIOS: boolean | undefined;\nfunction getIsIOS(): boolean {\n if (_isIOS === undefined) {\n _isIOS = detectIOS();\n }\n return _isIOS;\n}\n\nexport function useIOSZoomPrevention(\n computedFontPx: MaybeRefOrGetter<number>,\n active: MaybeRefOrGetter<boolean>,\n) {\n const isIOS = getIsIOS();\n\n return computed(() => {\n const px = toValue(computedFontPx);\n const isActive = toValue(active);\n const needsComp = isIOS && isActive && px > 0 && px < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : px;\n const scaleComp = needsComp ? px / MIN_IOS_FOCUS_FONT_PX : 1;\n\n const wrapperStyle: CSSProperties | undefined = needsComp\n ? {\n width: `${100 / scaleComp}%`,\n height: `${100 / scaleComp}%`,\n transform: `scale(${scaleComp})`,\n transformOrigin: 'top left',\n }\n : undefined;\n\n return { needsComp, adjustedFontPx, scaleComp, wrapperStyle };\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, Rect } 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, P = never>(\n entry: AnnotationRendererEntry<T, P>,\n): BoxedAnnotationRenderer {\n return {\n id: entry.id,\n matches: entry.matches ?? (() => false),\n component: (entry.component\n ? markRaw(entry.component)\n : () => null) as Component<AnnotationRendererProps>,\n matchesPreview: entry.matchesPreview,\n previewContainerStyle: entry.previewContainerStyle\n ? (props) => entry.previewContainerStyle!(props as { data: P; bounds: Rect; scale: number })\n : undefined,\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 renderPreview: entry.renderPreview\n ? (markRaw(entry.renderPreview) as BoxedAnnotationRenderer['renderPreview'])\n : undefined,\n hiddenWhenLocked: entry.hiddenWhenLocked,\n renderLocked: entry.renderLocked\n ? (markRaw(entry.renderLocked) as BoxedAnnotationRenderer['renderLocked'])\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","<script lang=\"ts\">\nexport default { inheritAttrs: false };\n</script>\n\n<script setup lang=\"ts\">\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { AnnotationRendererProps } from '../../context/types';\nimport { useAnnotationCapability } from '../../hooks';\n\nconst props = defineProps<AnnotationRendererProps<PdfLinkAnnoObject>>();\n\nconst { provides } = useAnnotationCapability();\n\nconst handleClick = () => {\n const target = props.annotation.object.target;\n if (!target || !provides.value) return;\n provides.value.forDocument(props.documentId).navigateTarget(target);\n};\n</script>\n\n<template>\n <div\n @click=\"handleClick\"\n :style=\"{\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n pointerEvents: 'auto',\n }\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\nimport { LinkPreviewData } from '@embedpdf/plugin-annotation';\n\nconst props = defineProps<{\n data: LinkPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n\nconst style = computed(() => ({\n position: 'absolute' as const,\n left: 0,\n top: 0,\n width: `${props.bounds.size.width * props.scale}px`,\n height: `${props.bounds.size.height * props.scale}px`,\n borderBottom: `${props.data.strokeWidth * props.scale}px solid ${props.data.strokeColor}`,\n backgroundColor: 'rgba(0, 0, 255, 0.05)',\n boxSizing: 'border-box' as const,\n}));\n</script>\n\n<template>\n <div :style=\"style\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { InkPreviewData } from '@embedpdf/plugin-annotation';\nimport Ink from './ink.vue';\n\ndefineProps<{\n data: InkPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Ink :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { SquarePreviewData } from '@embedpdf/plugin-annotation';\nimport Square from './square.vue';\n\ndefineProps<{\n data: SquarePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Square :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { CirclePreviewData } from '@embedpdf/plugin-annotation';\nimport Circle from './circle.vue';\n\ndefineProps<{\n data: CirclePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Circle :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.end.filled\n ? 'visible'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { LinePreviewData } from '@embedpdf/plugin-annotation';\nimport Line from './line.vue';\n\ndefineProps<{\n data: LinePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Line :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : endings.end.filled\n ? 'visible'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { PolylinePreviewData } from '@embedpdf/plugin-annotation';\nimport Polyline from './polyline.vue';\n\ndefineProps<{\n data: PolylinePreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Polyline :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick\n ? 'none'\n : isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : '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","<script setup lang=\"ts\">\nimport { Rect } from '@embedpdf/models';\nimport { PolygonPreviewData } from '@embedpdf/plugin-annotation';\nimport Polygon from './polygon.vue';\n\ndefineProps<{\n data: PolygonPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n</script>\n\n<template>\n <Polygon :isSelected=\"false\" :scale=\"scale\" v-bind=\"data\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rect } from '@embedpdf/models';\nimport { FreeTextPreviewData } from '@embedpdf/plugin-annotation';\n\nconst props = defineProps<{\n data: FreeTextPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n\nconst style = computed(() => ({\n width: '100%',\n height: '100%',\n border: `1px dashed ${props.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n}));\n</script>\n\n<template>\n <div :style=\"style\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { Rect } from '@embedpdf/models';\nimport type { StampPreviewData } from '@embedpdf/plugin-annotation';\n\nconst props = defineProps<{\n data: StampPreviewData;\n bounds: Rect;\n scale: number;\n}>();\n\nconst rotationDeg = computed(() => ((4 - props.data.pageRotation) % 4) * 90);\n\nconst style = computed(() => ({\n width: '100%',\n height: '100%',\n opacity: 0.6,\n objectFit: 'contain' as const,\n pointerEvents: 'none' as const,\n transform: rotationDeg.value ? `rotate(${rotationDeg.value}deg)` : undefined,\n}));\n</script>\n\n<template>\n <img :src=\"data.ghostUrl\" :style=\"style\" alt=\"\" />\n</template>\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 <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 <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 <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 <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 <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: !onClick ? 'none' : 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, nextTick } from 'vue';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCssProperties,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability, useIOSZoomPrevention } 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 ios = useIOSZoomPrevention(\n () => props.annotation.object.fontSize * props.scale,\n () => props.isEditing,\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 { needsComp, adjustedFontPx, scaleComp } = ios.value;\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' : props.onClick ? 'pointer' : 'default',\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: !onClick ? 'none' : isSelected ? 'none' : 'auto',\n cursor: onClick ? 'pointer' : 'default',\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 || !props.onClick ? 'default' : props.isSelected ? 'move' : 'pointer',\n);\nconst hitAreaPointerEvents = computed(() =>\n props.hasIRT || !props.onClick ? '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' : onClick ? 'pointer' : 'default',\n pointerEvents: !onClick ? 'none' : 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: !onClick ? 'none' : isSelected ? 'none' : 'auto',\n cursor: isSelected ? 'move' : onClick ? 'pointer' : 'default',\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 blendModeToCss,\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 {\n LinkPreviewData,\n InkPreviewData,\n CirclePreviewData,\n SquarePreviewData,\n LinePreviewData,\n PolylinePreviewData,\n PolygonPreviewData,\n FreeTextPreviewData,\n StampPreviewData,\n} from '@embedpdf/plugin-annotation';\nimport type { BoxedAnnotationRenderer } from '../context';\nimport { createRenderer } from '../context/renderer-registry';\nimport LinkLockedMode from './annotations/link-locked.vue';\nimport LinkPreview from './annotations/link-preview.vue';\nimport InkPreview from './annotations/ink-preview.vue';\nimport SquarePreview from './annotations/square-preview.vue';\nimport CirclePreview from './annotations/circle-preview.vue';\nimport LinePreview from './annotations/line-preview.vue';\nimport PolylinePreview from './annotations/polyline-preview.vue';\nimport PolygonPreview from './annotations/polygon-preview.vue';\nimport FreeTextPreview from './annotations/free-text-preview.vue';\nimport StampPreview from './annotations/stamp-preview.vue';\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, InkPreviewData>({\n id: 'ink',\n matches: (a): a is PdfInkAnnoObject => a.type === PdfAnnotationSubtype.INK,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.INK,\n component: InkRenderer,\n renderPreview: InkPreview,\n previewContainerStyle: ({ data }) => ({\n mixBlendMode: blendModeToCss(data.blendMode ?? PdfBlendMode.Normal),\n }),\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfSquareAnnoObject, SquarePreviewData>({\n id: 'square',\n matches: (a): a is PdfSquareAnnoObject => a.type === PdfAnnotationSubtype.SQUARE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.SQUARE,\n component: SquareRenderer,\n renderPreview: SquarePreview,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfCircleAnnoObject, CirclePreviewData>({\n id: 'circle',\n matches: (a): a is PdfCircleAnnoObject => a.type === PdfAnnotationSubtype.CIRCLE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.CIRCLE,\n component: CircleRenderer,\n renderPreview: CirclePreview,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLineAnnoObject, LinePreviewData>({\n id: 'line',\n matches: (a): a is PdfLineAnnoObject => a.type === PdfAnnotationSubtype.LINE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.LINE,\n component: LineRenderer,\n renderPreview: LinePreview,\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, PolylinePreviewData>({\n id: 'polyline',\n matches: (a): a is PdfPolylineAnnoObject => a.type === PdfAnnotationSubtype.POLYLINE,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.POLYLINE,\n component: PolylineRenderer,\n renderPreview: PolylinePreview,\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, PolygonPreviewData>({\n id: 'polygon',\n matches: (a): a is PdfPolygonAnnoObject => a.type === PdfAnnotationSubtype.POLYGON,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.POLYGON,\n component: PolygonRenderer,\n renderPreview: PolygonPreview,\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, FreeTextPreviewData>({\n id: 'freeText',\n matches: (a): a is PdfFreeTextAnnoObject => a.type === PdfAnnotationSubtype.FREETEXT,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.FREETEXT,\n component: FreeTextRenderer,\n renderPreview: FreeTextPreview,\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, StampPreviewData>({\n id: 'stamp',\n matches: (a): a is PdfStampAnnoObject => a.type === PdfAnnotationSubtype.STAMP,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.STAMP,\n component: StampRenderer,\n renderPreview: StampPreview,\n useAppearanceStream: false,\n interactionDefaults: { isDraggable: true, isResizable: true, isRotatable: true },\n }),\n\n createRenderer<PdfLinkAnnoObject, LinkPreviewData>({\n id: 'link',\n matches: (a): a is PdfLinkAnnoObject => a.type === PdfAnnotationSubtype.LINK,\n matchesPreview: (p) => p.type === PdfAnnotationSubtype.LINK,\n component: LinkRenderer,\n renderPreview: LinkPreview,\n interactionDefaults: { isDraggable: true, isResizable: true, 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 renderLocked: LinkLockedMode,\n }),\n];\n","<template>\n <template\n v-for=\"{ annotation, renderer, locked } in resolvedAnnotations\"\n :key=\"annotation.object.id\"\n >\n <AnnotationContainer\n :trackedAnnotation=\"annotation\"\n :isSelected=\"locked ? false : allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"locked ? false : editingId === annotation.object.id\"\n :isMultiSelected=\"locked ? false : isMultiSelected\"\n :isDraggable=\"getFinalDraggable(annotation, renderer, locked)\"\n :isResizable=\"getResolvedResizable(annotation, renderer, locked)\"\n :lockAspectRatio=\"getResolvedLockAspectRatio(annotation, renderer)\"\n :isRotatable=\"getResolvedRotatable(annotation, renderer, locked)\"\n :vertexConfig=\"locked ? undefined : renderer.vertexConfig\"\n :selectionMenu=\"getSelectionMenu(annotation, renderer, locked)\"\n :onSelect=\"getOnSelect(annotation, renderer, locked)\"\n :onDoubleClick=\"getOnDoubleClick(renderer, annotation, locked)\"\n :zIndex=\"renderer.zIndex\"\n :blendMode=\"getBlendMode(annotation, renderer)\"\n :style=\"renderer.containerStyle?.(annotation.object)\"\n :appearance=\"getAppearance(annotation, renderer, locked)\"\n v-bind=\"containerProps\"\n >\n <template #default=\"{ annotation: currentObject, appearanceActive }\">\n <component\n :is=\"locked && renderer.renderLocked ? renderer.renderLocked : renderer.component\"\n :annotation=\"annotation\"\n :currentObject=\"currentObject\"\n :isSelected=\"locked ? false : allSelectedIds.includes(annotation.object.id)\"\n :isEditing=\"locked ? false : editingId === annotation.object.id\"\n :scale=\"scale\"\n :pageIndex=\"pageIndex\"\n :documentId=\"documentId\"\n :onClick=\"locked ? undefined : getOnSelect(annotation, renderer, locked)\"\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\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 getAnnotationCategories,\n isCategoryLocked,\n hasLockedFlag,\n type LockMode,\n LockModeType,\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>>({});\nconst lockedMode = shallowRef<LockMode>({ type: LockModeType.None });\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 lockedMode.value = state.locked;\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\n .map((annotation) => {\n const renderer = resolveRenderer(annotation);\n if (!renderer) return null;\n const tool = annotationProvides.value?.findToolForAnnotation(annotation.object) ?? null;\n const categories = getAnnotationCategories(tool);\n const locked =\n hasLockedFlag(annotation.object) || isCategoryLocked(categories, lockedMode.value);\n if (locked && renderer.hiddenWhenLocked) return null;\n return { annotation, renderer, tool, locked };\n })\n .filter((v): v is NonNullable<typeof v> => v !== null),\n);\n\nconst getFinalDraggable = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return false;\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 = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return undefined;\n if (renderer.hideSelectionMenu?.(annotation.object)) return undefined;\n if (isMultiSelected.value) return undefined;\n return props.selectionMenu;\n};\n\nconst noopSelect = (e: AnnotationInteractionEvent) => {\n e.stopPropagation();\n};\n\nconst getOnSelect = (\n annotation: TrackedAnnotation,\n renderer: BoxedAnnotationRenderer,\n locked: boolean,\n) => {\n if (locked) return noopSelect;\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 = (\n renderer: BoxedAnnotationRenderer,\n annotation: TrackedAnnotation,\n locked: boolean,\n) => {\n if (locked) return undefined;\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 locked: boolean,\n): AnnotationAppearances<Blob> | null | undefined => {\n if (locked && renderer.renderLocked) return 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 v-if=\"match?.renderPreview\" :style=\"style\">\n <component\n :is=\"match.renderPreview\"\n :data=\"preview.data\"\n :bounds=\"preview.bounds\"\n :scale=\"scale\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, CSSProperties } from 'vue';\nimport { PreviewState } from '@embedpdf/plugin-annotation';\nimport { useRendererRegistry } from '../context/renderer-registry';\nimport { builtInRenderers } from './built-in-renderers';\n\nconst props = defineProps<{\n toolId: string;\n preview: PreviewState;\n scale: number;\n}>();\n\nconst registry = useRendererRegistry();\n\nconst allRenderers = computed(() => {\n const external = registry?.getAll() ?? [];\n const externalIds = new Set(external.map((r) => r.id));\n return [...external, ...builtInRenderers.filter((r) => !externalIds.has(r.id))];\n});\n\nconst match = computed(\n () =>\n allRenderers.value.find((r) => r.matchesPreview?.(props.preview) && r.renderPreview) ??\n allRenderers.value.find((r) => r.id === props.toolId && r.renderPreview) ??\n null,\n);\n\nconst style = computed<CSSProperties>(() => ({\n position: 'absolute',\n left: `${props.preview.bounds.origin.x * props.scale}px`,\n top: `${props.preview.bounds.origin.y * props.scale}px`,\n width: `${props.preview.bounds.size.width * props.scale}px`,\n height: `${props.preview.bounds.size.height * props.scale}px`,\n pointerEvents: 'none',\n zIndex: 10,\n ...match.value?.previewContainerStyle?.({\n data: props.preview.data,\n bounds: props.preview.bounds,\n scale: props.scale,\n }),\n}));\n</script>\n","<template>\n <input ref=\"fileInputRef\" type=\"file\" style=\"display: none\" />\n <PreviewRenderer\n v-for=\"[toolId, preview] in previews.entries()\"\n :key=\"toolId\"\n :toolId=\"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 { PreviewState, 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, PreviewState>>(new Map());\nconst fileInputRef = ref<HTMLInputElement | 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}));\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","<script setup lang=\"ts\">\nimport { watchEffect } from 'vue';\nimport { useAnnotationPlugin, useAnnotationCapability } from '../hooks';\n\nconst { plugin } = useAnnotationPlugin();\nconst { provides } = useAnnotationCapability();\n\nwatchEffect((onCleanup) => {\n const p = provides.value;\n const pl = plugin.value;\n if (!p || !pl) return;\n\n const unsub = p.onNavigate((event) => {\n if (event.result.outcome === 'uri' && pl.config.autoOpenLinks !== false) {\n window.open(event.result.uri, '_blank', 'noopener,noreferrer');\n }\n });\n\n onCleanup(unsub);\n});\n</script>\n\n<template>\n <span style=\"display: none\" />\n</template>\n","import { createPluginPackage } from '@embedpdf/core';\nimport { AnnotationPluginPackage as BaseAnnotationPackage } from '@embedpdf/plugin-annotation';\nimport { RendererRegistryProvider } from './components';\nimport AnnotationNavigationHandler from './components/annotation-navigation-handler.vue';\n\nexport * from './hooks';\nexport * from './components';\nexport * from './types';\nexport * from './context';\nexport * from '@embedpdf/plugin-annotation';\n\nexport const AnnotationPluginPackage = createPluginPackage(BaseAnnotationPackage)\n .addWrapper(RendererRegistryProvider)\n .addUtility(AnnotationNavigationHandler)\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","_isIOS","getIsIOS","nav","navigator","test","userAgent","platform","maxTouchPoints","detectIOS","useIOSZoomPrevention","computedFontPx","active","isIOS","computed","px","toValue","isActive","needsComp","scaleComp","adjustedFontPx","wrapperStyle","width","height","transform","transformOrigin","inheritAttrs","HANDLE_COLOR","_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","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","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","matrix","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","matchesPreview","previewContainerStyle","defaultBlendMode","containerStyle","interactionDefaults","useAppearanceStream","selectOverride","hideSelectionMenu","renderPreview","hiddenWhenLocked","renderLocked","handleClick","target","navigateTarget","onClick","borderBottom","strokeWidth","strokeColor","resolvedColor","paths","inkList","points","i","lx","ly","trim","hitStrokeWidth","_renderList","onPointerdown","args","Ink","isCloudy","cloudyBorderIntensity","geometry","outerW","outerH","cloudyPath","generateCloudyRectanglePath","rectangleDifferences","svgWidth","svgHeight","overflow","path","strokeStyle","PdfAnnotationBorderStyle","DASHED","strokeDasharray","strokeDashArray","join","Square","innerW","innerH","cx","cy","rx","ry","generateCloudyEllipsePath","Circle","localLine","x1","linePoints","start","y1","x2","end","y2","endings","angle","atan2","patching","createEnding","lineEndings","PI","filled","Line","localPts","pathData","first","p","toAngle","a","b","startRad","endRad","Polyline","allPoints","currentVertex","isPreview","generateCloudyPolygonPath","isPreviewing","Polygon","fontColor","rotationDeg","objectFit","ghostUrl","InkVue","SquareVue","CircleVue","LineVue","PolylineVue","PolygonVue","editorRef","editingRef","ios","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","invScalePercent","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","InkPreview","blendModeToCss","PdfBlendMode","Normal","SQUARE","SquareRenderer","SquarePreview","CIRCLE","CircleRenderer","CirclePreview","LINE","LineRenderer","LinePreview","v","POLYLINE","PolylineRenderer","PolylinePreview","POLYGON","PolygonRenderer","PolygonPreview","HIGHLIGHT","HighlightRenderer","Multiply","UnderlineRenderer","STRIKEOUT","StrikeoutRenderer","SQUIGGLY","SquigglyRenderer","TEXT","TextRenderer","CARET","CaretRenderer","FREETEXT","FreeTextRenderer","FreeTextPreview","toolDraggable","setEditingId","STAMP","StampRenderer","StampPreview","LINK","LinkRenderer","LinkPreview","helpers","clearSelection","parent","allAnnotations","find","selectAnnotation","LinkLockedMode","selectionProvides","useSelectionCapability","allSelectedIds","usePointerHandlers","editingId","appearanceMap","lockedMode","LockModeType","None","prevScale","allRenderers","external","annotationRenderers","externalIds","_prev","syncState","getAnnotationsByPageIndex","getSelectedAnnotationIds","locked","getState","onStateChange","onAnnotationEvent","editAfterCreate","invalidatePageAppearances","cancelled","getPageAppearances","resolvedAnnotations","renderer","resolveRenderer","categories","getAnnotationCategories","hasLockedFlag","isCategoryLocked","getFinalDraggable","resolvedDraggable","resolveInteractionProp","interaction","getResolvedResizable","getResolvedLockAspectRatio","getResolvedRotatable","getSelectionMenu","noopSelect","getOnSelect","selectHelpers","defaultSelect","pi","clear","metaKey","ctrlKey","toggleSelection","pointerHandlers","onPointerDown","_pos","pe","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","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","match","toolId","previews","Map","fileInputRef","services","requestFile","accept","onFile","input","onchange","file","files","click","registerPageHandlers","onPreview","next","set","delete","PreviewRenderer","resolvedResizeUi","resolvedVertexUi","onMounted","console","warn","fromRegistry","fromProps","merged","idx","findIndex","m","documentState","useDocumentState","page","pages","actualScale","actualRotation","Annotations","TextMarkup","AnnotationPaintLayer","pl","onNavigate","result","outcome","config","autoOpenLinks","open","uri","AnnotationPluginPackage","createPluginPackage","BaseAnnotationPackage","addWrapper","RendererRegistryProvider","addUtility","AnnotationNavigationHandler","build","initialDocumentState","providesValue","docId","scope","newState"],"mappings":"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"}
|