@embedpdf/plugin-annotation 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +1196 -92
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/actions.d.ts +31 -2
  6. package/dist/lib/annotation-plugin.d.ts +177 -2
  7. package/dist/lib/handlers/types.d.ts +1 -1
  8. package/dist/lib/helpers.d.ts +6 -1
  9. package/dist/lib/selectors.d.ts +97 -8
  10. package/dist/lib/tools/default-tools.d.ts +39 -11
  11. package/dist/lib/tools/types.d.ts +7 -1
  12. package/dist/lib/types.d.ts +265 -1
  13. package/dist/preact/adapter.d.ts +3 -3
  14. package/dist/preact/index.cjs +1 -1
  15. package/dist/preact/index.cjs.map +1 -1
  16. package/dist/preact/index.js +857 -403
  17. package/dist/preact/index.js.map +1 -1
  18. package/dist/react/adapter.d.ts +1 -1
  19. package/dist/react/index.cjs +1 -1
  20. package/dist/react/index.cjs.map +1 -1
  21. package/dist/react/index.js +857 -403
  22. package/dist/react/index.js.map +1 -1
  23. package/dist/shared/components/annotation-container.d.ts +8 -1
  24. package/dist/shared/components/annotation-layer.d.ts +4 -2
  25. package/dist/shared/components/annotations/ink.d.ts +3 -3
  26. package/dist/shared/components/annotations/link.d.ts +28 -0
  27. package/dist/shared/components/annotations.d.ts +2 -1
  28. package/dist/shared/components/group-selection-box.d.ts +32 -0
  29. package/dist/shared/components/index.d.ts +1 -0
  30. package/dist/shared/components/text-markup/highlight.d.ts +3 -2
  31. package/dist/shared/components/text-markup/squiggly.d.ts +3 -2
  32. package/dist/shared/components/text-markup/strikeout.d.ts +3 -2
  33. package/dist/shared/components/text-markup/underline.d.ts +3 -2
  34. package/dist/shared/components/types.d.ts +7 -0
  35. package/dist/shared-preact/components/annotation-container.d.ts +8 -1
  36. package/dist/shared-preact/components/annotation-layer.d.ts +4 -2
  37. package/dist/shared-preact/components/annotations/ink.d.ts +3 -3
  38. package/dist/shared-preact/components/annotations/link.d.ts +28 -0
  39. package/dist/shared-preact/components/annotations.d.ts +2 -1
  40. package/dist/shared-preact/components/group-selection-box.d.ts +32 -0
  41. package/dist/shared-preact/components/index.d.ts +1 -0
  42. package/dist/shared-preact/components/text-markup/highlight.d.ts +3 -2
  43. package/dist/shared-preact/components/text-markup/squiggly.d.ts +3 -2
  44. package/dist/shared-preact/components/text-markup/strikeout.d.ts +3 -2
  45. package/dist/shared-preact/components/text-markup/underline.d.ts +3 -2
  46. package/dist/shared-preact/components/types.d.ts +7 -0
  47. package/dist/shared-react/components/annotation-container.d.ts +8 -1
  48. package/dist/shared-react/components/annotation-layer.d.ts +4 -2
  49. package/dist/shared-react/components/annotations/ink.d.ts +3 -3
  50. package/dist/shared-react/components/annotations/link.d.ts +28 -0
  51. package/dist/shared-react/components/annotations.d.ts +2 -1
  52. package/dist/shared-react/components/group-selection-box.d.ts +32 -0
  53. package/dist/shared-react/components/index.d.ts +1 -0
  54. package/dist/shared-react/components/text-markup/highlight.d.ts +3 -2
  55. package/dist/shared-react/components/text-markup/squiggly.d.ts +3 -2
  56. package/dist/shared-react/components/text-markup/strikeout.d.ts +3 -2
  57. package/dist/shared-react/components/text-markup/underline.d.ts +3 -2
  58. package/dist/shared-react/components/types.d.ts +7 -0
  59. package/dist/svelte/components/AnnotationLayer.svelte.d.ts +5 -1
  60. package/dist/svelte/components/Annotations.svelte.d.ts +5 -1
  61. package/dist/svelte/components/GroupSelectionBox.svelte.d.ts +32 -0
  62. package/dist/svelte/components/annotations/Ink.svelte.d.ts +2 -1
  63. package/dist/svelte/components/annotations/Link.svelte.d.ts +24 -0
  64. package/dist/svelte/components/annotations/index.d.ts +1 -0
  65. package/dist/svelte/components/index.d.ts +1 -0
  66. package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +2 -1
  67. package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +2 -1
  68. package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +2 -1
  69. package/dist/svelte/components/text-markup/Underline.svelte.d.ts +2 -1
  70. package/dist/svelte/components/types.d.ts +2 -0
  71. package/dist/svelte/index.cjs +1 -1
  72. package/dist/svelte/index.cjs.map +1 -1
  73. package/dist/svelte/index.js +905 -255
  74. package/dist/svelte/index.js.map +1 -1
  75. package/dist/svelte/types.d.ts +7 -0
  76. package/dist/vue/components/annotation-container.vue.d.ts +2 -0
  77. package/dist/vue/components/annotation-layer.vue.d.ts +28 -5
  78. package/dist/vue/components/annotations/index.d.ts +1 -0
  79. package/dist/vue/components/annotations/ink.vue.d.ts +2 -2
  80. package/dist/vue/components/annotations/line.vue.d.ts +1 -1
  81. package/dist/vue/components/annotations/link.vue.d.ts +29 -0
  82. package/dist/vue/components/annotations/polygon.vue.d.ts +1 -1
  83. package/dist/vue/components/annotations/polyline.vue.d.ts +1 -1
  84. package/dist/vue/components/annotations.vue.d.ts +65 -1
  85. package/dist/vue/components/group-selection-box.vue.d.ts +73 -0
  86. package/dist/vue/components/index.d.ts +1 -0
  87. package/dist/vue/components/text-markup/highlight.vue.d.ts +2 -2
  88. package/dist/vue/components/text-markup/squiggly.vue.d.ts +2 -2
  89. package/dist/vue/components/text-markup/strikeout.vue.d.ts +2 -2
  90. package/dist/vue/components/text-markup/underline.vue.d.ts +2 -2
  91. package/dist/vue/hooks/use-annotation.d.ts +2 -0
  92. package/dist/vue/index.cjs +1 -1
  93. package/dist/vue/index.cjs.map +1 -1
  94. package/dist/vue/index.js +946 -406
  95. package/dist/vue/index.js.map +1 -1
  96. package/dist/vue/types.d.ts +7 -0
  97. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/react/adapter.ts","../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/preview-renderer.tsx","../../src/shared/components/annotation-paint-layer.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["export {\n Fragment,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n useLayoutEffect,\n JSX,\n ChangeEvent,\n} from 'react';\nexport type {\n ReactNode,\n HTMLAttributes,\n CSSProperties,\n MouseEvent,\n PointerEvent,\n TouchEvent,\n} from 'react';\n\nexport const suppressContentEditableWarningProps = {\n suppressContentEditableWarning: true,\n};\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\nimport { useState, useEffect } from '@framework';\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\n */\nexport const useAnnotation = (documentId: string) => {\n const { provides } = useAnnotationCapability();\n const [state, setState] = useState<AnnotationDocumentState>(\n provides?.forDocument(documentId)?.getState() ?? initialDocumentState(),\n );\n\n useEffect(() => {\n if (!provides) return;\n\n const scope = provides.forDocument(documentId);\n\n // Get initial state\n setState(scope.getState());\n\n // Subscribe to state changes\n return scope.onStateChange((newState) => {\n setState(newState);\n });\n }, [provides, documentId]);\n\n return {\n state,\n provides: provides?.forDocument(documentId) ?? null,\n };\n};\n","import { PdfAnnotationObject } from '@embedpdf/models';\nimport {\n CounterRotate,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, JSX, CSSProperties, useRef, useEffect, useMemo } from '@framework';\nimport { useDocumentPermissions } from '@embedpdf/core/@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { VertexConfig } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n isSelected: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n style?: CSSProperties;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: any) => void; // You'll need to import proper MouseEvent type\n onSelect: (event: any) => void;\n zIndex?: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<T>;\n}\n\n// Simplified AnnotationContainer\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n documentId,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style = {},\n vertexConfig,\n selectionMenu,\n outlineOffset = 1,\n onDoubleClick,\n onSelect,\n zIndex = 1,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n customAnnotationRenderer,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const [preview, setPreview] = useState<T>(trackedAnnotation.object);\n const { provides: annotationCapability } = useAnnotationCapability();\n const { canModifyAnnotations } = useDocumentPermissions(documentId);\n const gestureBaseRef = useRef<T | null>(null);\n\n // Override props based on permission\n const effectiveIsDraggable = canModifyAnnotations && isDraggable;\n const effectiveIsResizable = canModifyAnnotations && isResizable;\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n const currentObject = preview\n ? { ...trackedAnnotation.object, ...preview }\n : trackedAnnotation.object;\n\n // Defaults retain current behavior\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const VERTEX_COLOR = vertexUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n const VERTEX_SIZE = vertexUI?.size ?? 12;\n\n const { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n enabled: isSelected,\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n\n if (event.state === 'start') {\n gestureBaseRef.current = currentObject;\n }\n\n const transformType = event.transformData.type;\n const base = gestureBaseRef.current ?? currentObject;\n\n const changes = event.transformData.changes.vertices\n ? vertexConfig?.transformAnnotation(base, event.transformData.changes.vertices)\n : { rect: event.transformData.changes.rect };\n\n const patched = annotationCapability?.transformAnnotation<T>(base, {\n type: transformType,\n changes: changes as Partial<T>,\n metadata: event.transformData.metadata,\n });\n\n if (patched) {\n setPreview((prev) => ({\n ...prev,\n ...patched,\n }));\n }\n\n if (event.state === 'end' && patched) {\n gestureBaseRef.current = null;\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.object.id, patched);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n });\n\n // Wrap onDoubleClick to respect permissions\n const guardedOnDoubleClick = useMemo(() => {\n if (!canModifyAnnotations || !onDoubleClick) return undefined;\n return onDoubleClick;\n }, [canModifyAnnotations, onDoubleClick]);\n\n const doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n return (\n <div data-no-interaction>\n <div\n {...(effectiveIsDraggable && isSelected ? dragProps : {})}\n {...doubleProps}\n style={{\n position: 'absolute',\n left: currentObject.rect.origin.x * scale,\n top: currentObject.rect.origin.y * scale,\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n outline: isSelected ? `1px solid ${selectionOutlineColor}` : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n pointerEvents: isSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: isSelected && effectiveIsDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {(() => {\n const childrenRender =\n typeof children === 'function' ? children(currentObject) : children;\n // Check for custom renderer first\n const customRender = customAnnotationRenderer?.({\n annotation: currentObject,\n children: childrenRender,\n isSelected,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n pageIndex,\n onSelect,\n });\n if (customRender !== null && customRender !== undefined) {\n return customRender;\n }\n\n // Fall back to default children rendering\n return childrenRender;\n })()}\n\n {isSelected &&\n effectiveIsResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n\n {isSelected &&\n canModifyAnnotations &&\n vertices.map(({ key, ...vProps }) =>\n vertexUI?.component ? (\n vertexUI.component({\n key,\n ...vProps,\n backgroundColor: VERTEX_COLOR,\n })\n ) : (\n <div\n key={key}\n {...vProps}\n style={{ ...vProps.style, backgroundColor: VERTEX_COLOR }}\n />\n ),\n )}\n </div>\n {/* CounterRotate remains unchanged */}\n {selectionMenu && (\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(props) =>\n selectionMenu({\n ...props,\n context: {\n type: 'annotation',\n annotation: trackedAnnotation,\n pageIndex,\n },\n selected: isSelected,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: HighlightProps) {\n return (\n <>\n {segmentRects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n />\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\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 ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\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 {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\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 + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\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 >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\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 {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.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 // Calculate angles in the direction of the line segments\n const startRad = toAngle(localPts[0], localPts[1]); // direction FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // direction FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from line start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip points in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\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: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n\n // New optional props for preview rendering\n currentVertex?: Position;\n handleSize?: number;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex, // A preview-only prop\n handleSize = 14, // in CSS pixels\n}: PolygonProps): JSX.Element {\n const allPoints = currentVertex ? [...vertices, currentVertex] : vertices;\n\n const localPts = useMemo(\n () => allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [allPoints, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n // Don't close the path with 'Z' if it's a preview\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n }, [localPts, currentVertex]);\n\n const isPreviewing = currentVertex && vertices.length > 0;\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: currentVertex ? 'none' : color, // No fill during preview\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n {/* --- Preview-only elements --- */}\n {isPreviewing && vertices.length > 1 && (\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style={{ stroke: strokeColor, strokeWidth, strokeDasharray: '4,4', opacity: 0.7 }}\n />\n )}\n {isPreviewing && vertices.length >= 2 && (\n <rect\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 strokeWidth={strokeWidth / 2}\n />\n )}\n </svg>\n );\n}\n","import {\n MouseEvent,\n TouchEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n suppressContentEditableWarningProps,\n} from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n const [isIOS, setIsIOS] = useState(false);\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n useLayoutEffect(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n setIsIOS(ios);\n } catch {\n setIsIOS(false);\n }\n }, []);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n // iOS zoom prevention: keep focused font-size >= 16px, visually scale down if needed.\n const computedFontPx = annotation.object.fontSize * scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n tabIndex={0}\n style={{\n color: annotation.object.fontColor,\n fontSize: adjustedFontPx,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n }}\n contentEditable={isEditing}\n {...suppressContentEditableWarningProps}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n documentId,\n pageIndex,\n annotation,\n scaleFactor = 1,\n style,\n ...props\n}: RenderAnnotationProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const urlRef = useRef<string | null>(null);\n\n const { width, height } = annotation.rect.size;\n\n useEffect(() => {\n if (annotationProvides) {\n const task = annotationProvides.forDocument(documentId).renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, documentId, annotation.id, width, height]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return (\n <Fragment>\n {imageUrl && (\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n {...props}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({\n isSelected,\n annotation,\n documentId,\n pageIndex,\n scale,\n onClick,\n}: StampProps) {\n return (\n <div\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: 'pointer',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n documentId={documentId}\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { blendModeToCss, PdfAnnotationObject, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n} from '@embedpdf/plugin-annotation';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { Square } from './annotations/square';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { Circle } from './annotations/circle';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\n\ninterface AnnotationsProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { documentId, pageIndex, scale, selectionMenu } = annotationsProps;\n const { provides: annotationCapability } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ documentId, pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n useEffect(() => {\n if (annotationProvides) {\n // Initialize with current state immediately\n const currentState = annotationProvides.getState();\n setAnnotations(getAnnotationsByPageIndex(currentState, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(currentState, pageIndex));\n\n // Then subscribe to changes\n return annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides, pageIndex]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n selectionProvides.clear();\n if (annotation.object.id !== editingId) {\n setEditingId(null);\n }\n }\n },\n [annotationProvides, selectionProvides, editingId, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers, {\n documentId,\n });\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.object.id === annotation.object.id;\n const isEditing = editingId === annotation.object.id;\n const tool = annotationProvides?.findToolForAnnotation(annotation.object);\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ],\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n linePoints: {\n start: vertices[0],\n end: vertices[1],\n },\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={(tool?.interaction.isDraggable ?? true) && !isEditing}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(_object) => (\n <Stamp\n isSelected={isSelected}\n annotation={annotation}\n documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ documentId, pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<AnnotationTool | null>(null);\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n return selectionProvides.forDocument(documentId).onSelectionChange(() => {\n setRects(selectionProvides.forDocument(documentId).getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.forDocument(documentId).getBoundingRectForPage(pageIndex));\n });\n }, [selectionProvides, documentId, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current active tool\n setActiveTool(annotationProvides.forDocument(documentId).getActiveTool());\n\n return annotationProvides\n .forDocument(documentId)\n .onActiveToolChange((event) => setActiveTool(event));\n }, [annotationProvides, documentId]);\n\n if (!boundingRect) return null;\n if (!activeTool || !activeTool.defaults) return null;\n\n switch (activeTool.defaults.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { Circle } from './annotations/circle';\nimport { Square } from './annotations/square';\nimport { Polygon } from './annotations/polygon';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Polyline } from './annotations/polyline';\nimport { Line } from './annotations/line';\nimport { Ink } from './annotations/ink';\n\ninterface Props {\n preview: AnyPreviewState;\n scale: number;\n}\n\nexport function PreviewRenderer({ preview, scale }: Props) {\n const { bounds } = preview;\n\n const style = {\n position: 'absolute' as const,\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n pointerEvents: 'none' as const,\n zIndex: 10,\n };\n\n // Use type guards for proper type narrowing\n if (preview.type === PdfAnnotationSubtype.CIRCLE) {\n return (\n <div style={style}>\n <Circle isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.SQUARE) {\n return (\n <div style={style}>\n <Square isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYGON) {\n return (\n <div style={style}>\n <Polygon isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYLINE) {\n return (\n <div style={style}>\n <Polyline isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.LINE) {\n return (\n <div style={style}>\n <Line isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.INK) {\n return (\n <div style={style}>\n <Ink isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.FREETEXT) {\n return (\n <div style={style}>\n {/* Render a simple dashed border preview */}\n <div\n style={{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }}\n />\n </div>\n );\n }\n\n return null;\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport { PreviewRenderer } from './preview-renderer';\n\ninterface Props {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ documentId, pageIndex, scale }: Props) {\n const { plugin: annotationPlugin } = useAnnotationPlugin();\n const [previews, setPreviews] = useState<Map<string, AnyPreviewState>>(new Map());\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const services = useMemo<HandlerServices>(\n () => ({\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef.current) return;\n const input = fileInputRef.current;\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.current;\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\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\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 [],\n );\n\n useEffect(() => {\n if (!annotationPlugin) return;\n\n return annotationPlugin.registerPageHandlers(documentId, pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n setPreviews((prev) => {\n const next = new Map(prev);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n return next;\n });\n },\n });\n }, [documentId, pageIndex, scale, annotationPlugin, services]);\n\n return (\n <>\n {/* Hidden DOM elements required by services */}\n <input ref={fileInputRef} type=\"file\" style={{ display: 'none' }} />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n\n {/* Render any active previews from any tool */}\n {Array.from(previews.entries()).map(([toolId, preview]) => (\n <PreviewRenderer key={toolId} preview={preview} scale={scale} />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, useMemo } from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport {\n ResizeHandleUI,\n VertexHandleUI,\n CustomAnnotationRenderer,\n AnnotationSelectionMenuRenderFn,\n} from './types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject, Rotation } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\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 selection menu across all annotations on this layer */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n style?: CSSProperties;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize annotation renderer */\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n};\n\nexport function AnnotationLayer({\n style,\n documentId,\n pageIndex,\n scale: overrideScale,\n rotation: overrideRotation,\n selectionMenu,\n resizeUI,\n vertexUI,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n const documentState = useDocumentState(documentId);\n const page = documentState?.document?.pages?.[pageIndex];\n const width = page?.size?.width ?? 0;\n const height = page?.size?.height ?? 0;\n\n const actualScale = useMemo(() => {\n if (overrideScale !== undefined) return overrideScale;\n return documentState?.scale ?? 1;\n }, [overrideScale, documentState?.scale]);\n\n const actualRotation = useMemo(() => {\n if (overrideRotation !== undefined) return overrideRotation;\n return documentState?.rotation ?? Rotation.Degree0;\n }, [overrideRotation, documentState?.rotation]);\n\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n documentId={documentId}\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={actualScale}\n rotation={actualRotation}\n pageWidth={width}\n pageHeight={height}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n <AnnotationPaintLayer documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n </div>\n );\n}\n"],"names":["props","Fragment","annotation"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/react/adapter.ts","../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/group-selection-box.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/components/annotations/square.tsx","../../src/shared/components/annotations/circle.tsx","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/components/annotations/free-text.tsx","../../src/shared/components/render-annotation.tsx","../../src/shared/components/annotations/stamp.tsx","../../src/shared/components/annotations/link.tsx","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/preview-renderer.tsx","../../src/shared/components/annotation-paint-layer.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["export {\n Fragment,\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n useLayoutEffect,\n createContext,\n useContext,\n JSX,\n ChangeEvent,\n} from 'react';\nexport type {\n ReactNode,\n HTMLAttributes,\n CSSProperties,\n MouseEvent,\n PointerEvent,\n TouchEvent,\n} from 'react';\n\nexport const suppressContentEditableWarningProps = {\n suppressContentEditableWarning: true,\n};\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n} from '@embedpdf/plugin-annotation';\nimport { useState, useEffect } from '@framework';\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\n */\nexport const useAnnotation = (documentId: string) => {\n const { provides } = useAnnotationCapability();\n const [state, setState] = useState<AnnotationDocumentState>(\n provides?.forDocument(documentId)?.getState() ?? initialDocumentState(),\n );\n\n useEffect(() => {\n if (!provides) return;\n\n const scope = provides.forDocument(documentId);\n\n // Get initial state\n setState(scope.getState());\n\n // Subscribe to state changes\n return scope.onStateChange((newState) => {\n setState(newState);\n });\n }, [provides, documentId]);\n\n return {\n state,\n provides: provides?.forDocument(documentId) ?? null,\n };\n};\n","import { PdfAnnotationObject, Rect } from '@embedpdf/models';\nimport {\n CounterRotate,\n useDoublePressProps,\n useInteractionHandles,\n} from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, JSX, CSSProperties, useRef, useEffect, useMemo, useCallback } from '@framework';\nimport { useDocumentPermissions } from '@embedpdf/core/@framework';\n\nimport { useAnnotationCapability, useAnnotationPlugin } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { VertexConfig } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\n documentId: string;\n pageIndex: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n isSelected: boolean;\n /** Whether multiple annotations are selected (container becomes passive) */\n isMultiSelected?: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n lockAspectRatio?: boolean;\n style?: CSSProperties;\n vertexConfig?: VertexConfig<T>;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n outlineOffset?: number;\n onDoubleClick?: (event: any) => void;\n onSelect: (event: any) => void;\n zIndex?: number;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<T>;\n}\n\n/**\n * AnnotationContainer wraps individual annotations with interaction handles.\n * When isMultiSelected is true, the container becomes passive - drag/resize\n * is handled by the GroupSelectionBox instead.\n */\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n documentId,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isMultiSelected = false,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style = {},\n vertexConfig,\n selectionMenu,\n outlineOffset = 1,\n onDoubleClick,\n onSelect,\n zIndex = 1,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n customAnnotationRenderer,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const [preview, setPreview] = useState<T>(trackedAnnotation.object);\n const { provides: annotationCapability } = useAnnotationCapability();\n const { plugin } = useAnnotationPlugin();\n const { canModifyAnnotations } = useDocumentPermissions(documentId);\n const gestureBaseRef = useRef<T | null>(null);\n\n // When multi-selected, disable individual drag/resize - GroupSelectionBox handles it\n const effectiveIsDraggable = canModifyAnnotations && isDraggable && !isMultiSelected;\n const effectiveIsResizable = canModifyAnnotations && isResizable && !isMultiSelected;\n // Get scoped API for this document\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n const currentObject = preview\n ? { ...trackedAnnotation.object, ...preview }\n : trackedAnnotation.object;\n\n // UI constants\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const VERTEX_COLOR = vertexUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n const VERTEX_SIZE = vertexUI?.size ?? 12;\n\n // Store original rect at gesture start (only need rect for delta calculation)\n const gestureBaseRectRef = useRef<Rect | null>(null);\n\n // Handle single-annotation drag/resize (only when NOT multi-selected)\n // Uses the unified plugin API - all preview updates come from event subscriptions!\n const handleUpdate = useCallback(\n (\n event: Parameters<\n NonNullable<Parameters<typeof useInteractionHandles>[0]['controller']['onUpdate']>\n >[0],\n ) => {\n if (!event.transformData?.type || isMultiSelected || !plugin) return;\n\n const { type, changes, metadata } = event.transformData;\n const id = trackedAnnotation.object.id;\n const pageSize = { width: pageWidth, height: pageHeight };\n\n // Gesture start - initialize plugin drag/resize\n if (event.state === 'start') {\n gestureBaseRectRef.current = trackedAnnotation.object.rect;\n gestureBaseRef.current = trackedAnnotation.object; // For vertex edit\n if (type === 'move') {\n plugin.startDrag(documentId, { annotationIds: [id], pageSize });\n } else if (type === 'resize') {\n plugin.startResize(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.current) {\n if (type === 'move') {\n const delta = {\n x: changes.rect.origin.x - gestureBaseRectRef.current.origin.x,\n y: changes.rect.origin.y - gestureBaseRectRef.current.origin.y,\n };\n plugin.updateDrag(documentId, delta);\n } else if (type === 'resize') {\n plugin.updateResize(documentId, changes.rect);\n }\n }\n\n // Vertex edit - handle directly (no attached link handling needed)\n if (type === 'vertex-edit' && changes.vertices && vertexConfig) {\n const base = gestureBaseRef.current ?? trackedAnnotation.object;\n const vertexChanges = vertexConfig.transformAnnotation(base, changes.vertices);\n const patched = annotationCapability?.transformAnnotation<T>(base, {\n type,\n changes: vertexChanges as Partial<T>,\n metadata,\n });\n if (patched) {\n setPreview((prev) => ({ ...prev, ...patched }));\n if (event.state === 'end') {\n annotationProvides?.updateAnnotation(pageIndex, id, patched);\n }\n }\n }\n\n // Gesture end - commit\n if (event.state === 'end') {\n gestureBaseRectRef.current = null;\n gestureBaseRef.current = null;\n if (type === 'move') plugin.commitDrag(documentId);\n else if (type === 'resize') plugin.commitResize(documentId);\n }\n },\n [\n plugin,\n documentId,\n trackedAnnotation.object,\n pageWidth,\n pageHeight,\n pageIndex,\n isMultiSelected,\n vertexConfig,\n annotationCapability,\n annotationProvides,\n ],\n );\n\n const { dragProps, vertices, resize } = useInteractionHandles({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n // Disable interaction handles when multi-selected\n enabled: isSelected && !isMultiSelected,\n onUpdate: handleUpdate,\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n });\n\n // Wrap onDoubleClick to respect permissions\n const guardedOnDoubleClick = useMemo(() => {\n if (!canModifyAnnotations || !onDoubleClick) return undefined;\n return onDoubleClick;\n }, [canModifyAnnotations, onDoubleClick]);\n\n const doubleProps = useDoublePressProps(guardedOnDoubleClick);\n\n // Sync preview with tracked annotation when it changes\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n // Subscribe to unified drag changes - plugin sends pre-computed patches!\n // ALL preview updates come through here (primary, attached links, multi-select)\n useEffect(() => {\n if (!plugin) return;\n const id = trackedAnnotation.object.id;\n\n const handleEvent = (event: {\n documentId: string;\n type: string;\n previewPatches?: Record<string, any>;\n }) => {\n if (event.documentId !== documentId) return;\n const patch = event.previewPatches?.[id];\n if (event.type === 'update' && patch) setPreview((prev) => ({ ...prev, ...patch }) as T);\n else if (event.type === 'cancel') setPreview(trackedAnnotation.object);\n };\n\n const unsubs = [plugin.onDragChange(handleEvent), plugin.onResizeChange(handleEvent)];\n\n return () => unsubs.forEach((u) => u());\n }, [plugin, documentId, trackedAnnotation.object]);\n\n // Determine if we should show the outline\n // When multi-selected, don't show individual outlines - GroupSelectionBox shows the group outline\n const showOutline = isSelected && !isMultiSelected;\n\n return (\n <div data-no-interaction>\n <div\n {...(effectiveIsDraggable && isSelected ? dragProps : {})}\n {...doubleProps}\n style={{\n position: 'absolute',\n left: currentObject.rect.origin.x * scale,\n top: currentObject.rect.origin.y * scale,\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n outline: showOutline ? `1px solid ${selectionOutlineColor}` : 'none',\n outlineOffset: showOutline ? `${outlineOffset}px` : '0px',\n pointerEvents: isSelected && !isMultiSelected ? 'auto' : 'none',\n touchAction: 'none',\n cursor: isSelected && effectiveIsDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {(() => {\n const childrenRender =\n typeof children === 'function' ? children(currentObject) : children;\n const customRender = customAnnotationRenderer?.({\n annotation: currentObject,\n children: childrenRender,\n isSelected,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n pageIndex,\n onSelect,\n });\n if (customRender !== null && customRender !== undefined) {\n return customRender;\n }\n return childrenRender;\n })()}\n\n {/* Resize handles - only when single-selected */}\n {isSelected &&\n effectiveIsResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n\n {/* Vertex handles - only when single-selected */}\n {isSelected &&\n canModifyAnnotations &&\n !isMultiSelected &&\n vertices.map(({ key, ...vProps }) =>\n vertexUI?.component ? (\n vertexUI.component({\n key,\n ...vProps,\n backgroundColor: VERTEX_COLOR,\n })\n ) : (\n <div\n key={key}\n {...vProps}\n style={{ ...vProps.style, backgroundColor: VERTEX_COLOR }}\n />\n ),\n )}\n </div>\n\n {/* Selection menu - hide when multi-selected */}\n {selectionMenu && !isMultiSelected && (\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(counterRotateProps) =>\n selectionMenu({\n ...counterRotateProps,\n context: {\n type: 'annotation',\n annotation: trackedAnnotation,\n pageIndex,\n },\n selected: isSelected,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { Rect, boundingRectOrEmpty } from '@embedpdf/models';\nimport { useInteractionHandles, CounterRotate } from '@embedpdf/utils/@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { useState, useMemo, useCallback, useRef, useEffect } from '@framework';\n\nimport { useAnnotationPlugin } from '../hooks';\nimport { ResizeHandleUI, GroupSelectionMenuRenderFn } from './types';\n\ninterface GroupSelectionBoxProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n /** All selected annotations on this page */\n selectedAnnotations: TrackedAnnotation[];\n /** Whether the group is draggable (all annotations must be group-draggable) */\n isDraggable: boolean;\n /** Whether the group is resizable (all annotations must be group-resizable) */\n isResizable: boolean;\n /** Resize handle UI customization */\n resizeUI?: ResizeHandleUI;\n /** Selection outline color */\n selectionOutlineColor?: string;\n /** Outline offset */\n outlineOffset?: number;\n /** Z-index for the group box */\n zIndex?: number;\n /** Group selection menu render function */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n}\n\n/**\n * GroupSelectionBox renders a bounding box around all selected annotations\n * with drag and resize handles for group manipulation.\n */\nexport function GroupSelectionBox({\n documentId,\n pageIndex,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n selectedAnnotations,\n isDraggable,\n isResizable,\n resizeUI,\n selectionOutlineColor = '#007ACC',\n outlineOffset = 2,\n zIndex = 100,\n groupSelectionMenu,\n}: GroupSelectionBoxProps): JSX.Element | null {\n const { plugin } = useAnnotationPlugin();\n const gestureBaseRef = useRef<Rect | null>(null);\n const isDraggingRef = useRef(false);\n const isResizingRef = useRef(false);\n\n // Compute the group bounding box from all selected annotations\n const groupBox = useMemo(() => {\n const rects = selectedAnnotations.map((ta) => ta.object.rect);\n return boundingRectOrEmpty(rects);\n }, [selectedAnnotations]);\n\n // Preview state for the group box during drag/resize\n const [previewGroupBox, setPreviewGroupBox] = useState<Rect>(groupBox);\n\n // Sync preview with actual group box when not dragging/resizing\n useEffect(() => {\n if (!isDraggingRef.current && !isResizingRef.current) {\n setPreviewGroupBox(groupBox);\n }\n }, [groupBox]);\n\n // Handle both drag and resize updates using unified plugin API\n // The plugin handles attached links automatically and commits all patches\n const handleUpdate = useCallback(\n (\n event: Parameters<\n NonNullable<Parameters<typeof useInteractionHandles>[0]['controller']['onUpdate']>\n >[0],\n ) => {\n if (!event.transformData?.type) return;\n if (!plugin) return;\n\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 && !isDraggable) return;\n\n if (event.state === 'start') {\n gestureBaseRef.current = groupBox;\n\n if (isMove) {\n isDraggingRef.current = true;\n // Use unified drag API - plugin handles attached links automatically\n plugin.startDrag(documentId, {\n annotationIds: selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: pageWidth, height: pageHeight },\n });\n } else if (isResize) {\n isResizingRef.current = true;\n // Use unified resize API - plugin handles attached links automatically\n plugin.startResize(documentId, {\n annotationIds: selectedAnnotations.map((ta) => ta.object.id),\n pageSize: { width: pageWidth, height: pageHeight },\n resizeHandle: event.transformData.metadata?.handle ?? 'se',\n });\n }\n }\n\n const base = gestureBaseRef.current ?? groupBox;\n\n if (isMove && event.transformData.changes.rect) {\n // Calculate delta from original position\n const newRect = event.transformData.changes.rect;\n const rawDelta = {\n x: newRect.origin.x - base.origin.x,\n y: newRect.origin.y - base.origin.y,\n };\n\n // Plugin clamps delta and emits events (attached links receive updates too)\n const clampedDelta = plugin.updateDrag(documentId, rawDelta);\n\n // Update preview group box with clamped delta\n setPreviewGroupBox({\n ...base,\n origin: {\n x: base.origin.x + clampedDelta.x,\n y: base.origin.y + clampedDelta.y,\n },\n });\n } else if (isResize && event.transformData.changes.rect) {\n const newGroupBox = event.transformData.changes.rect;\n\n // Plugin computes rects for all participants and emits events\n plugin.updateResize(documentId, newGroupBox);\n\n // Update preview\n setPreviewGroupBox(newGroupBox);\n }\n\n if (event.state === 'end') {\n gestureBaseRef.current = null;\n\n if (isMove && isDraggingRef.current) {\n isDraggingRef.current = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitDrag(documentId);\n } else if (isResize && isResizingRef.current) {\n isResizingRef.current = false;\n // Plugin commits all patches (selected + attached links) - no patch building needed!\n plugin.commitResize(documentId);\n }\n }\n },\n [plugin, documentId, pageWidth, pageHeight, groupBox, isDraggable, selectedAnnotations],\n );\n\n // UI constants\n const HANDLE_COLOR = resizeUI?.color ?? '#007ACC';\n const HANDLE_SIZE = resizeUI?.size ?? 12;\n\n // Use interaction handles for both drag and resize\n const { dragProps, resize } = useInteractionHandles({\n controller: {\n element: previewGroupBox,\n constraints: {\n minWidth: 20,\n minHeight: 20,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: false,\n pageRotation: rotation,\n scale: scale,\n enabled: true,\n onUpdate: handleUpdate,\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: 0,\n zIndex: zIndex,\n },\n includeVertices: false,\n });\n\n // Don't render if less than 2 annotations selected\n if (selectedAnnotations.length < 2) {\n return null;\n }\n\n return (\n <div data-group-selection-box data-no-interaction>\n {/* Group box - draggable only if isDraggable is true */}\n <div\n {...(isDraggable\n ? dragProps\n : {\n onPointerDown: (e) => e.stopPropagation(),\n })}\n style={{\n position: 'absolute',\n left: previewGroupBox.origin.x * scale,\n top: previewGroupBox.origin.y * scale,\n width: previewGroupBox.size.width * scale,\n height: previewGroupBox.size.height * scale,\n outline: `2px dashed ${selectionOutlineColor}`,\n outlineOffset: outlineOffset - 1,\n cursor: isDraggable ? 'move' : 'default',\n touchAction: 'none',\n zIndex,\n }}\n >\n {/* Resize handles */}\n {isResizable &&\n resize.map(({ key, ...hProps }) =>\n resizeUI?.component ? (\n resizeUI.component({\n key,\n ...hProps,\n backgroundColor: HANDLE_COLOR,\n })\n ) : (\n <div\n key={key}\n {...hProps}\n style={{ ...hProps.style, backgroundColor: HANDLE_COLOR }}\n />\n ),\n )}\n </div>\n\n {/* Group selection menu */}\n {groupSelectionMenu && (\n <CounterRotate\n rect={{\n origin: {\n x: previewGroupBox.origin.x * scale,\n y: previewGroupBox.origin.y * scale,\n },\n size: {\n width: previewGroupBox.size.width * scale,\n height: previewGroupBox.size.height * scale,\n },\n }}\n rotation={rotation}\n >\n {(counterRotateProps) =>\n groupSelectionMenu({\n ...counterRotateProps,\n context: {\n type: 'group',\n annotations: selectedAnnotations,\n pageIndex,\n },\n selected: true,\n placement: {\n suggestTop: false,\n },\n })\n }\n </CounterRotate>\n )}\n </div>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: HighlightProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n\n return (\n <>\n {segmentRects.map((b, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n />\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: UnderlineProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: resolvedColor,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: StrikeoutProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n const thickness = 2 * scale;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: resolvedColor,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { CSSProperties, MouseEvent, TouchEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = {\n /** Stroke/markup color */\n strokeColor?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n strokeColor,\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n}: SquigglyProps) {\n const resolvedColor = strokeColor ?? '#FFFF00';\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${resolvedColor}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`;\n\n // Completely escape the SVG markup\n const svgDataUri = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {segmentRects.map((r, i) => (\n <div\n key={i}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\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 ))}\n </>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke color */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement> | TouchEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n isSelected,\n strokeColor,\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n const resolvedColor = strokeColor ?? '#000000';\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\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 {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: resolvedColor,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n}: SquareProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, x, y } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = (width + strokeWidth) * scale;\n const svgHeight = (height + strokeWidth) * scale;\n\n return (\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 + strokeWidth} ${height + strokeWidth}`}\n >\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n}\n\n/**\n * Renders a PDF Circle annotation (ellipse) as SVG.\n */\nexport function Circle({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n isSelected,\n}: CircleProps): JSX.Element {\n /* ------------------------------------------------------------------ */\n /* geometry helpers */\n /* ------------------------------------------------------------------ */\n const { width, height, cx, cy, rx, ry } = useMemo(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n }, [rect, strokeWidth]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n return (\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 >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={color}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, LinePoints, LineEndings, PdfAnnotationBorderStyle } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LineProps {\n /** interior colour */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke colour (falls back to PDFium default black) */\n strokeColor?: string;\n /** Stroke style */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Line start / end points (page units) */\n linePoints: LinePoints;\n /** Line endings (eg. OpenArrow / Butt) */\n lineEndings?: LineEndings;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether the annotation is selected */\n isSelected: boolean;\n}\n\n/**\n * Renders a PDF Line annotation as SVG (with arrow/butt endings).\n */\nexport function Line({\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n}: LineProps): JSX.Element {\n /* -------------------------------------------------------------- */\n /* Localise the line within its own bounding box */\n /* -------------------------------------------------------------- */\n const { x1, y1, x2, y2 } = useMemo(() => {\n return {\n x1: linePoints.start.x - rect.origin.x,\n y1: linePoints.start.y - rect.origin.y,\n x2: linePoints.end.x - rect.origin.x,\n y2: linePoints.end.y - rect.origin.y,\n };\n }, [linePoints, rect]);\n\n /* -------------------------------------------------------------- */\n /* Arrow-head path data via shared factory */\n /* -------------------------------------------------------------- */\n const endings = useMemo(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n }, [lineEndings, strokeWidth, x1, y1, x2, y2]);\n\n /* -------------------------------------------------------------- */\n /* Absolute placement + scaling (same pattern as other shapes) */\n /* -------------------------------------------------------------- */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\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 {/* Main line */}\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n opacity={opacity}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n stroke: strokeColor,\n strokeWidth,\n strokeLinecap: 'butt',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* Optional arrowheads / butt caps */}\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onPointerDown={onClick}\n onTouchStart={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.start.filled ? color : 'none'}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n fill={endings.end.filled ? color : 'none'}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, TouchEvent, useMemo } from '@framework';\nimport { Rect, Position, LineEndings } from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\ninterface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n}\n\nexport function Polyline({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n}: PolylineProps): JSX.Element {\n // Localise vertices to annotation rect\n const localPts = useMemo(\n () => vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [vertices, rect],\n );\n\n // Build path data \"M x0 y0 L x1 y1 ...\"\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n }, [localPts]);\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = useMemo(() => {\n if (localPts.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 // Calculate angles in the direction of the line segments\n const startRad = toAngle(localPts[0], localPts[1]); // direction FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // direction FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from line start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip points in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n }, [localPts, lineEndings, strokeWidth]);\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected ? 'none' : 'visibleStroke',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n }}\n />\n {endings.start && (\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.start.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n {endings.end && (\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onPointerDown={onClick}\n onTouchStart={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\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: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n\n // New optional props for preview rendering\n currentVertex?: Position;\n handleSize?: number;\n}\n\nexport function Polygon({\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex, // A preview-only prop\n handleSize = 14, // in CSS pixels\n}: PolygonProps): JSX.Element {\n const allPoints = currentVertex ? [...vertices, currentVertex] : vertices;\n\n const localPts = useMemo(\n () => allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n [allPoints, rect],\n );\n\n const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n // Don't close the path with 'Z' if it's a preview\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n }, [localPts, currentVertex]);\n\n const isPreviewing = currentVertex && vertices.length > 0;\n\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n <path\n d={pathData}\n onPointerDown={onClick}\n onTouchStart={onClick}\n opacity={opacity}\n style={{\n fill: currentVertex ? 'none' : color, // No fill during preview\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n {/* --- Preview-only elements --- */}\n {isPreviewing && vertices.length > 1 && (\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style={{ stroke: strokeColor, strokeWidth, strokeDasharray: '4,4', opacity: 0.7 }}\n />\n )}\n {isPreviewing && vertices.length >= 2 && (\n <rect\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 strokeWidth={strokeWidth / 2}\n />\n )}\n </svg>\n );\n}\n","import {\n MouseEvent,\n TouchEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n suppressContentEditableWarningProps,\n} from '@framework';\nimport {\n PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../..';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n\ninterface FreeTextProps {\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n onDoubleClick?: (event: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function FreeText({\n isSelected,\n isEditing,\n annotation,\n pageIndex,\n scale,\n onClick,\n}: FreeTextProps) {\n const editorRef = useRef<HTMLSpanElement>(null);\n const { provides: annotationProvides } = useAnnotationCapability();\n const [isIOS, setIsIOS] = useState(false);\n\n useEffect(() => {\n if (isEditing && editorRef.current) {\n const editor = editorRef.current;\n editor.focus();\n\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [isEditing]);\n\n useLayoutEffect(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n setIsIOS(ios);\n } catch {\n setIsIOS(false);\n }\n }, []);\n\n const handleBlur = () => {\n if (!annotationProvides) return;\n if (!editorRef.current) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.current.innerText,\n });\n };\n\n // iOS zoom prevention: keep focused font-size >= 16px, visually scale down if needed.\n const computedFontPx = annotation.object.fontSize * scale;\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp =\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX;\n const adjustedFontPx = needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx;\n const scaleComp = needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1;\n const invScalePercent = needsComp ? 100 / scaleComp : 100;\n\n return (\n <div\n style={{\n position: 'absolute',\n width: annotation.object.rect.size.width * scale,\n height: annotation.object.rect.size.height * scale,\n cursor: isSelected && !isEditing ? 'move' : 'default',\n pointerEvents: isSelected && !isEditing ? 'none' : 'auto',\n zIndex: 2,\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <span\n ref={editorRef}\n onBlur={handleBlur}\n tabIndex={0}\n style={{\n color: annotation.object.fontColor,\n fontSize: adjustedFontPx,\n fontFamily: standardFontCss(annotation.object.fontFamily),\n textAlign: textAlignmentToCss(annotation.object.textAlign),\n flexDirection: 'column',\n justifyContent:\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n display: 'flex',\n backgroundColor: annotation.object.color ?? annotation.object.backgroundColor,\n opacity: annotation.object.opacity,\n width: needsComp ? `${invScalePercent}%` : '100%',\n height: needsComp ? `${invScalePercent}%` : '100%',\n lineHeight: '1.18',\n overflow: 'hidden',\n cursor: isEditing ? 'text' : 'pointer',\n outline: 'none',\n transform: needsComp ? `scale(${scaleComp})` : undefined,\n transformOrigin: 'top left',\n }}\n contentEditable={isEditing}\n {...suppressContentEditableWarningProps}\n >\n {annotation.object.contents}\n </span>\n </div>\n );\n}\n","import { Fragment, HTMLAttributes, CSSProperties, useEffect, useRef, useState } from '@framework';\nimport { AppearanceMode, ignore, PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n\nimport { useAnnotationCapability } from '../hooks/use-annotation';\n\ntype RenderAnnotationProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\n documentId,\n pageIndex,\n annotation,\n scaleFactor = 1,\n style,\n ...props\n}: RenderAnnotationProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const urlRef = useRef<string | null>(null);\n\n const { width, height } = annotation.rect.size;\n\n useEffect(() => {\n if (annotationProvides) {\n const task = annotationProvides.forDocument(documentId).renderAnnotation({\n pageIndex,\n annotation,\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n setImageUrl(url);\n urlRef.current = url;\n }, ignore);\n\n return () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n }, [pageIndex, scaleFactor, annotationProvides, documentId, annotation.id, width, height]);\n\n const handleImageLoad = () => {\n if (urlRef.current) {\n URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n }\n };\n\n return (\n <Fragment>\n {imageUrl && (\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n {...props}\n style={{\n width: '100%',\n height: '100%',\n display: 'block',\n ...(style || {}),\n }}\n />\n )}\n </Fragment>\n );\n}\n","import { MouseEvent, TouchEvent } from '@framework';\nimport { PdfStampAnnoObject } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { RenderAnnotation } from '../render-annotation';\n\ninterface StampProps {\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n documentId: string;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({\n isSelected,\n annotation,\n documentId,\n pageIndex,\n scale,\n onClick,\n}: StampProps) {\n return (\n <div\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n zIndex: 2,\n pointerEvents: isSelected ? 'none' : 'auto',\n cursor: 'pointer',\n }}\n onPointerDown={onClick}\n onTouchStart={onClick}\n >\n <RenderAnnotation\n documentId={documentId}\n pageIndex={pageIndex}\n annotation={{ ...annotation.object, id: annotation.object.id }}\n scaleFactor={scale}\n />\n </div>\n );\n}\n","import { useMemo, MouseEvent, TouchEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface LinkProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Stroke colour – defaults to blue when omitted */\n strokeColor?: string;\n /** Stroke width in PDF units */\n strokeWidth?: number;\n /** Stroke type – defaults to underline when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – for dashed style */\n strokeDashArray?: number[];\n /** Bounding box of the annotation (PDF units) */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Click handler (used for selection) */\n onClick?: (e: MouseEvent<SVGElement> | TouchEvent<SVGElement>) => void;\n /** Whether this link has an IRT (In Reply To) reference - disables direct interaction */\n hasIRT?: boolean;\n}\n\n/**\n * Renders a PDF Link annotation as SVG.\n * Supports underline (default), solid, and dashed border styles.\n */\nexport function Link({\n isSelected,\n strokeColor = '#0000FF',\n strokeWidth = 2,\n strokeStyle = PdfAnnotationBorderStyle.UNDERLINE,\n strokeDashArray,\n rect,\n scale,\n onClick,\n hasIRT = false,\n}: LinkProps): JSX.Element {\n const { width, height } = useMemo(() => {\n return {\n width: rect.size.width,\n height: rect.size.height,\n };\n }, [rect]);\n\n const svgWidth = width * scale;\n const svgHeight = height * scale;\n\n // Calculate dash array for SVG\n const dashArray = useMemo(() => {\n if (strokeStyle === PdfAnnotationBorderStyle.DASHED) {\n return strokeDashArray?.join(',') ?? `${strokeWidth * 3},${strokeWidth}`;\n }\n return undefined;\n }, [strokeStyle, strokeDashArray, strokeWidth]);\n\n // For underline style, render a line at the bottom\n // For solid/dashed, render a rectangle border\n const isUnderline = strokeStyle === PdfAnnotationBorderStyle.UNDERLINE;\n\n return (\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 >\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 onPointerDown={hasIRT ? undefined : onClick}\n onTouchStart={hasIRT ? undefined : onClick}\n style={{\n cursor: hasIRT ? 'default' : isSelected ? 'move' : 'pointer',\n pointerEvents: hasIRT ? 'none' : isSelected ? 'none' : 'visible',\n }}\n />\n\n {isUnderline ? (\n // Underline style: line at bottom of rect\n <line\n x1={1}\n y1={height - 1}\n x2={width - 1}\n y2={height - 1}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n strokeDasharray={dashArray}\n style={{\n pointerEvents: 'none',\n }}\n />\n ) : (\n // Solid/Dashed style: rectangle border\n <rect\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 strokeWidth={strokeWidth}\n strokeDasharray={dashArray}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </svg>\n );\n}\n","import { blendModeToCss, PdfAnnotationObject, PdfBlendMode } from '@embedpdf/models';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationIds,\n isHighlight,\n isInk,\n isSquiggly,\n isCircle,\n isStrikeout,\n isUnderline,\n TrackedAnnotation,\n isSquare,\n isLine,\n isPolyline,\n isPolygon,\n isFreeText,\n isStamp,\n isLink,\n} from '@embedpdf/plugin-annotation';\nimport { PdfLinkAnnoObject } from '@embedpdf/models';\nimport { PointerEventHandlers, EmbedPdfPointerEvent } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport {\n useMemo,\n useState,\n useEffect,\n useCallback,\n MouseEvent,\n Fragment,\n TouchEvent,\n} from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { GroupSelectionBox } from './group-selection-box';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { Square } from './annotations/square';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n VertexHandleUI,\n} from './types';\nimport { Circle } from './annotations/circle';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { FreeText } from './annotations/free-text';\nimport { Stamp } from './annotations/stamp';\nimport { Link } from './annotations/link';\n\ninterface AnnotationsProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { documentId, pageIndex, scale, pageWidth, pageHeight, selectionMenu } = annotationsProps;\n const { provides: annotationCapability } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ documentId, pageIndex });\n const [allSelectedIds, setAllSelectedIds] = useState<string[]>([]);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Get scoped API for this document (memoized to prevent infinite loops)\n const annotationProvides = useMemo(\n () => (annotationCapability ? annotationCapability.forDocument(documentId) : null),\n [annotationCapability, documentId],\n );\n\n // Check if multiple annotations are selected\n const isMultiSelected = allSelectedIds.length > 1;\n\n useEffect(() => {\n if (annotationProvides) {\n // Initialize with current state immediately\n const currentState = annotationProvides.getState();\n setAnnotations(getAnnotationsByPageIndex(currentState, pageIndex));\n setAllSelectedIds(getSelectedAnnotationIds(currentState));\n\n // Then subscribe to changes\n return annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setAllSelectedIds(getSelectedAnnotationIds(state));\n });\n }\n }, [annotationProvides, pageIndex]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<EmbedPdfPointerEvent<MouseEvent>> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n setEditingId(null);\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n selectionProvides.clear();\n\n // Check for modifier key (Cmd on Mac, Ctrl on Windows/Linux)\n const isModifierPressed = 'metaKey' in e ? e.metaKey || e.ctrlKey : false;\n\n if (isModifierPressed) {\n // Toggle selection: add or remove from current selection\n annotationProvides.toggleSelection(pageIndex, annotation.object.id);\n } else {\n // Exclusive select: clear and select only this one\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n }\n\n if (annotation.object.id !== editingId) {\n setEditingId(null);\n }\n }\n },\n [annotationProvides, selectionProvides, editingId, pageIndex],\n );\n\n // Special handler for link annotations - if IRT exists, select the parent\n const handleLinkClick = useCallback(\n (e: MouseEvent | TouchEvent, annotation: TrackedAnnotation<PdfLinkAnnoObject>) => {\n e.stopPropagation();\n if (!annotationProvides || !selectionProvides) return;\n\n selectionProvides.clear();\n\n // If link has IRT, select the parent annotation instead\n if (annotation.object.inReplyToId) {\n const parentId = annotation.object.inReplyToId;\n const parent = annotations.find((a) => a.object.id === parentId);\n if (parent) {\n annotationProvides.selectAnnotation(parent.object.pageIndex, parentId);\n return;\n }\n }\n\n // Standalone link - select it directly\n annotationProvides.selectAnnotation(pageIndex, annotation.object.id);\n },\n [annotationProvides, selectionProvides, annotations, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers, {\n documentId,\n });\n }, [register, handlers]);\n // Get selected annotations that are on THIS page (for group selection box)\n const selectedAnnotationsOnPage = useMemo(() => {\n return annotations.filter((anno) => allSelectedIds.includes(anno.object.id));\n }, [annotations, allSelectedIds]);\n\n // Check if all selected annotations on this page are draggable in group context\n const areAllSelectedDraggable = useMemo(() => {\n if (selectedAnnotationsOnPage.length < 2) return false;\n\n return selectedAnnotationsOnPage.every((ta) => {\n const tool = annotationProvides?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupDraggable ?? tool?.interaction.isDraggable ?? true;\n });\n }, [selectedAnnotationsOnPage, annotationProvides]);\n\n // Check if all selected annotations on this page are resizable in group context\n const areAllSelectedResizable = useMemo(() => {\n if (selectedAnnotationsOnPage.length < 2) return false;\n\n return selectedAnnotationsOnPage.every((ta) => {\n const tool = annotationProvides?.findToolForAnnotation(ta.object);\n // Use group-specific property, falling back to single-annotation property\n return tool?.interaction.isGroupResizable ?? tool?.interaction.isResizable ?? true;\n });\n }, [selectedAnnotationsOnPage, annotationProvides]);\n\n // Check if all selected annotations are on the same page (this page)\n const allSelectedOnSamePage = useMemo(() => {\n if (!annotationProvides) return false;\n const allSelected = annotationProvides.getSelectedAnnotations();\n // All selected must be on this page\n return allSelected.length > 1 && allSelected.every((ta) => ta.object.pageIndex === pageIndex);\n }, [annotationProvides, pageIndex, allSelectedIds]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = allSelectedIds.includes(annotation.object.id);\n const isEditing = editingId === annotation.object.id;\n const tool = annotationProvides?.findToolForAnnotation(annotation.object);\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquare(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isCircle(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isUnderline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n zIndex={0}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight {...obj} scale={scale} onClick={(e) => handleClick(e, annotation)} />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ],\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n linePoints: {\n start: vertices[0],\n end: vertices[1],\n },\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolyline(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isPolygon(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (annotation) => annotation.vertices,\n transformAnnotation: (annotation, vertices) => {\n return {\n ...annotation,\n vertices,\n };\n },\n }}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\n )}\n </AnnotationContainer>\n );\n }\n\n if (isFreeText(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={(tool?.interaction.isDraggable ?? true) && !isEditing}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingId(annotation.object.id);\n }}\n {...annotationsProps}\n >\n {(object) => (\n <FreeText\n isSelected={isSelected}\n isEditing={isEditing}\n annotation={{\n ...annotation,\n object,\n }}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStamp(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={selectionMenu}\n onSelect={(e) => handleClick(e, annotation)}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(_object) => (\n <Stamp\n isSelected={isSelected}\n annotation={annotation}\n documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLink(annotation)) {\n // IRT-linked links are not independently draggable/resizable\n const hasIRT = !!annotation.object.inReplyToId;\n return (\n <AnnotationContainer\n key={annotation.object.id}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isMultiSelected={isMultiSelected}\n isDraggable={false}\n isResizable={false}\n lockAspectRatio={false}\n selectionMenu={hasIRT ? undefined : selectionMenu}\n onSelect={(e) => handleLinkClick(e, annotation)}\n {...annotationsProps}\n >\n {(obj) => (\n <Link\n {...obj}\n isSelected={isSelected}\n scale={scale}\n onClick={(e) => handleLinkClick(e, annotation)}\n hasIRT={hasIRT}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n /* --------- fallback: an unsupported subtype --------------- */\n return null;\n })}\n\n {/* Group selection box for multi-select drag/resize */}\n {allSelectedOnSamePage && selectedAnnotationsOnPage.length >= 2 && (\n <GroupSelectionBox\n documentId={documentId}\n pageIndex={pageIndex}\n scale={scale}\n rotation={annotationsProps.rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n selectedAnnotations={selectedAnnotationsOnPage}\n isDraggable={areAllSelectedDraggable}\n isResizable={areAllSelectedResizable}\n resizeUI={annotationsProps.resizeUI}\n selectionOutlineColor={annotationsProps.selectionOutlineColor}\n groupSelectionMenu={annotationsProps.groupSelectionMenu}\n />\n )}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { AnnotationTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ documentId, pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<AnnotationTool | null>(null);\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n return selectionProvides.forDocument(documentId).onSelectionChange(() => {\n setRects(selectionProvides.forDocument(documentId).getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.forDocument(documentId).getBoundingRectForPage(pageIndex));\n });\n }, [selectionProvides, documentId, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current active tool\n setActiveTool(annotationProvides.forDocument(documentId).getActiveTool());\n\n return annotationProvides\n .forDocument(documentId)\n .onActiveToolChange((event) => setActiveTool(event));\n }, [annotationProvides, documentId]);\n\n if (!boundingRect) return null;\n if (!activeTool || !activeTool.defaults) return null;\n\n switch (activeTool.defaults.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n strokeColor={activeTool.defaults?.strokeColor}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { AnyPreviewState } from '@embedpdf/plugin-annotation';\nimport { Circle } from './annotations/circle';\nimport { Square } from './annotations/square';\nimport { Polygon } from './annotations/polygon';\nimport { PdfAnnotationSubtype } from '@embedpdf/models';\nimport { Polyline } from './annotations/polyline';\nimport { Line } from './annotations/line';\nimport { Ink } from './annotations/ink';\n\ninterface Props {\n preview: AnyPreviewState;\n scale: number;\n}\n\nexport function PreviewRenderer({ preview, scale }: Props) {\n const { bounds } = preview;\n\n const style = {\n position: 'absolute' as const,\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n pointerEvents: 'none' as const,\n zIndex: 10,\n };\n\n // Use type guards for proper type narrowing\n if (preview.type === PdfAnnotationSubtype.CIRCLE) {\n return (\n <div style={style}>\n <Circle isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.SQUARE) {\n return (\n <div style={style}>\n <Square isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYGON) {\n return (\n <div style={style}>\n <Polygon isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.POLYLINE) {\n return (\n <div style={style}>\n <Polyline isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.LINE) {\n return (\n <div style={style}>\n <Line isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.INK) {\n return (\n <div style={style}>\n <Ink isSelected={false} scale={scale} {...preview.data} />\n </div>\n );\n }\n\n if (preview.type === PdfAnnotationSubtype.FREETEXT) {\n return (\n <div style={style}>\n {/* Render a simple dashed border preview */}\n <div\n style={{\n width: '100%',\n height: '100%',\n border: `1px dashed ${preview.data.fontColor || '#000000'}`,\n backgroundColor: 'transparent',\n }}\n />\n </div>\n );\n }\n\n return null;\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport { useAnnotationPlugin } from '../hooks';\nimport { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\nimport { PreviewRenderer } from './preview-renderer';\n\ninterface Props {\n documentId: string;\n pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ documentId, pageIndex, scale }: Props) {\n const { plugin: annotationPlugin } = useAnnotationPlugin();\n const [previews, setPreviews] = useState<Map<string, AnyPreviewState>>(new Map());\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const services = useMemo<HandlerServices>(\n () => ({\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef.current) return;\n const input = fileInputRef.current;\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.current;\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\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\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 [],\n );\n\n useEffect(() => {\n if (!annotationPlugin) return;\n\n return annotationPlugin.registerPageHandlers(documentId, pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n setPreviews((prev) => {\n const next = new Map(prev);\n if (state) {\n next.set(toolId, state);\n } else {\n next.delete(toolId);\n }\n return next;\n });\n },\n });\n }, [documentId, pageIndex, scale, annotationPlugin, services]);\n\n return (\n <>\n {/* Hidden DOM elements required by services */}\n <input ref={fileInputRef} type=\"file\" style={{ display: 'none' }} />\n <canvas ref={canvasRef} style={{ display: 'none' }} />\n\n {/* Render any active previews from any tool */}\n {Array.from(previews.entries()).map(([toolId, preview]) => (\n <PreviewRenderer key={toolId} preview={preview} scale={scale} />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, useMemo } from '@framework';\nimport { useDocumentState } from '@embedpdf/core/@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport {\n ResizeHandleUI,\n VertexHandleUI,\n CustomAnnotationRenderer,\n AnnotationSelectionMenuRenderFn,\n GroupSelectionMenuRenderFn,\n} from './types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject, Rotation } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\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 selection menu across all annotations on this layer */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Customize group selection menu across all annotations on this layer */\n groupSelectionMenu?: GroupSelectionMenuRenderFn;\n style?: CSSProperties;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize annotation renderer */\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n};\n\nexport function AnnotationLayer({\n style,\n documentId,\n pageIndex,\n scale: overrideScale,\n rotation: overrideRotation,\n selectionMenu,\n groupSelectionMenu,\n resizeUI,\n vertexUI,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n const documentState = useDocumentState(documentId);\n const page = documentState?.document?.pages?.[pageIndex];\n const width = page?.size?.width ?? 0;\n const height = page?.size?.height ?? 0;\n\n const actualScale = useMemo(() => {\n if (overrideScale !== undefined) return overrideScale;\n return documentState?.scale ?? 1;\n }, [overrideScale, documentState?.scale]);\n\n const actualRotation = useMemo(() => {\n if (overrideRotation !== undefined) return overrideRotation;\n return documentState?.rotation ?? Rotation.Degree0;\n }, [overrideRotation, documentState?.rotation]);\n\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n documentId={documentId}\n selectionMenu={selectionMenu}\n groupSelectionMenu={groupSelectionMenu}\n pageIndex={pageIndex}\n scale={actualScale}\n rotation={actualRotation}\n pageWidth={width}\n pageHeight={height}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n <AnnotationPaintLayer documentId={documentId} pageIndex={pageIndex} scale={actualScale} />\n </div>\n );\n}\n"],"names":["Fragment","isUnderline","annotation"],"mappings":"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"}