@embedpdf/plugin-annotation 1.3.11 → 1.3.13

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 (54) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/index.d.ts +1 -0
  6. package/dist/preact/index.cjs +1 -1
  7. package/dist/preact/index.cjs.map +1 -1
  8. package/dist/preact/index.js +21 -5
  9. package/dist/preact/index.js.map +1 -1
  10. package/dist/react/index.cjs +1 -1
  11. package/dist/react/index.cjs.map +1 -1
  12. package/dist/react/index.js +21 -5
  13. package/dist/react/index.js.map +1 -1
  14. package/dist/shared-preact/components/annotation-container.d.ts +2 -1
  15. package/dist/shared-preact/components/annotation-layer.d.ts +1 -1
  16. package/dist/shared-preact/components/annotations.d.ts +1 -1
  17. package/dist/shared-preact/components/types.d.ts +51 -0
  18. package/dist/shared-preact/hooks/use-annotation.d.ts +5 -1
  19. package/dist/shared-preact/types.d.ts +1 -50
  20. package/dist/shared-react/components/annotation-container.d.ts +2 -1
  21. package/dist/shared-react/components/annotation-layer.d.ts +1 -1
  22. package/dist/shared-react/components/annotations.d.ts +1 -1
  23. package/dist/shared-react/components/types.d.ts +51 -0
  24. package/dist/shared-react/hooks/use-annotation.d.ts +5 -1
  25. package/dist/shared-react/types.d.ts +1 -50
  26. package/dist/vue/components/annotation-container.vue.d.ts +48 -0
  27. package/dist/vue/components/annotation-layer.vue.d.ts +27 -0
  28. package/dist/vue/components/annotation-paint-layer.vue.d.ts +6 -0
  29. package/dist/vue/components/annotations/circle.vue.d.ts +19 -0
  30. package/dist/vue/components/annotations/free-text.vue.d.ts +12 -0
  31. package/dist/vue/components/annotations/index.d.ts +8 -0
  32. package/dist/vue/components/annotations/ink.vue.d.ts +16 -0
  33. package/dist/vue/components/annotations/line.vue.d.ts +22 -0
  34. package/dist/vue/components/annotations/polygon.vue.d.ts +24 -0
  35. package/dist/vue/components/annotations/polyline.vue.d.ts +19 -0
  36. package/dist/vue/components/annotations/square.vue.d.ts +19 -0
  37. package/dist/vue/components/annotations/stamp.vue.d.ts +11 -0
  38. package/dist/vue/components/annotations.vue.d.ts +77 -0
  39. package/dist/vue/components/index.d.ts +9 -0
  40. package/dist/vue/components/preview-renderer.vue.d.ts +7 -0
  41. package/dist/vue/components/render-annotation.vue.d.ts +12 -0
  42. package/dist/vue/components/text-markup/highlight.vue.d.ts +14 -0
  43. package/dist/vue/components/text-markup/index.d.ts +4 -0
  44. package/dist/vue/components/text-markup/squiggly.vue.d.ts +14 -0
  45. package/dist/vue/components/text-markup/strikeout.vue.d.ts +14 -0
  46. package/dist/vue/components/text-markup/underline.vue.d.ts +14 -0
  47. package/dist/vue/components/text-markup.vue.d.ts +6 -0
  48. package/dist/vue/hooks/use-annotation.d.ts +2682 -0
  49. package/dist/vue/index.cjs +1 -1
  50. package/dist/vue/index.cjs.map +1 -1
  51. package/dist/vue/index.d.ts +1 -0
  52. package/dist/vue/index.js +1921 -1
  53. package/dist/vue/index.js.map +1 -1
  54. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/react/adapter.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":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","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 { 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 } from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n SelectionMenuProps,\n VertexConfig,\n VertexHandleUI,\n} from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\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?: (props: SelectionMenuProps) => JSX.Element;\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 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: annotationProvides } = useAnnotationCapability();\n const gestureBaseRef = useRef<T | null>(null);\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 / scale, height: pageHeight / scale },\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 = annotationProvides?.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 const doubleProps = useDoublePressProps(onDoubleClick);\n\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n return (\n <div data-no-interaction>\n <div\n {...(isDraggable && 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 && isDraggable ? 'move' : 'default',\n zIndex,\n ...style,\n }}\n {...props}\n >\n {(() => {\n // Check for custom renderer first\n const customRender = customAnnotationRenderer?.({\n annotation: currentObject,\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 typeof children === 'function' ? children(currentObject) : children;\n })()}\n\n {isSelected &&\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\n {isSelected &&\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 <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 {({ rect, menuWrapperProps }) =>\n selectionMenu &&\n selectionMenu({\n annotation: trackedAnnotation,\n selected: isSelected,\n rect,\n menuWrapperProps,\n })\n }\n </CounterRotate>\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 pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\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.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, 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 pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({ isSelected, annotation, pageIndex, scale, onClick }: 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 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 { CustomAnnotationRenderer, ResizeHandleUI, SelectionMenu, VertexHandleUI } 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 pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale, selectionMenu } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\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 }, [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 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 pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ 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 const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\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 pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ 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(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 }, [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 } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { SelectionMenu, ResizeHandleUI, VertexHandleUI, CustomAnnotationRenderer } from '../types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n /** Customize selection menu across all annotations on this layer */\n selectionMenu?: SelectionMenu;\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 pageIndex,\n scale,\n selectionMenu,\n resizeUI,\n vertexUI,\n pageWidth,\n pageHeight,\n rotation,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <AnnotationPaintLayer pageIndex={pageIndex} scale={scale} />\n </div>\n );\n}\n"],"names":["useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","suppressContentEditableWarningProps","suppressContentEditableWarning","AnnotationContainer","scale","pageIndex","rotation","pageWidth","pageHeight","trackedAnnotation","children","isSelected","isDraggable","isResizable","lockAspectRatio","style","vertexConfig","selectionMenu","outlineOffset","onDoubleClick","onSelect","zIndex","resizeUI","vertexUI","selectionOutlineColor","customAnnotationRenderer","props","preview","setPreview","useState","object","provides","annotationProvides","gestureBaseRef","useRef","currentObject","HANDLE_COLOR","color","VERTEX_COLOR","HANDLE_SIZE","size","VERTEX_SIZE","dragProps","vertices","resize","useInteractionHandles","controller","element","rect","extractVertices","constraints","minWidth","minHeight","boundingBox","width","height","maintainAspectRatio","pageRotation","enabled","onUpdate","event","_a","transformData","type","state","current","transformType","base","changes","transformAnnotation","patched","metadata","prev","updateAnnotation","handleSize","spacing","offsetMode","includeSides","vertexSize","includeVertices","doubleProps","useDoublePressProps","useEffect","jsxs","jsxRuntime","position","left","origin","x","top","y","outline","pointerEvents","touchAction","cursor","customRender","annotation","map","key","hProps","component","backgroundColor","jsx","vProps","CounterRotate","menuWrapperProps","selected","Highlight","opacity","segmentRects","onClick","Fragment","b","i","onPointerDown","onTouchStart","background","Underline","thickness","r","bottom","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","Math","max","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","length","first","rest","p","toAngle","a","startRad","endRad","Polygon","currentVertex","allPoints","isPreview","isPreviewing","FreeText","isEditing","editorRef","isIOS","setIsIOS","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","useLayoutEffect","nav","navigator","ios","test","userAgent","platform","maxTouchPoints","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","ref","onBlur","contents","innerText","tabIndex","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","transformOrigin","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","target","currentTarget","deselectAnnotation","handleClick","useCallback","e","stopPropagation","selectAnnotation","clear","tool","findToolForAnnotation","isInk","interaction","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","rects","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","defaults","PdfAnnotationSubtype","UNDERLINE","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","PreviewRenderer","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","border","AnnotationPaintLayer","plugin","annotationPlugin","previews","setPreviews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","value","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","Array","from","entries"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","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 { AnnotationPlugin, AnnotationState, initialState } 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\nexport const useAnnotation = () => {\n const { provides } = useAnnotationCapability();\n const [state, setState] = useState<AnnotationState>(initialState({ enabled: true }));\n\n useEffect(() => {\n return provides?.onStateChange((action) => {\n setState(action);\n });\n }, [provides]);\n\n return {\n state,\n provides,\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 } from '@framework';\n\nimport { useAnnotationCapability } from '../hooks';\nimport {\n CustomAnnotationRenderer,\n ResizeHandleUI,\n SelectionMenuProps,\n VertexHandleUI,\n} from './types';\nimport { VertexConfig } from '../types';\n\ninterface AnnotationContainerProps<T extends PdfAnnotationObject> {\n scale: number;\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?: (props: SelectionMenuProps) => JSX.Element;\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 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: annotationProvides } = useAnnotationCapability();\n const gestureBaseRef = useRef<T | null>(null);\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 / scale, height: pageHeight / scale },\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 = annotationProvides?.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 const doubleProps = useDoublePressProps(onDoubleClick);\n\n useEffect(() => {\n setPreview(trackedAnnotation.object);\n }, [trackedAnnotation.object]);\n\n return (\n <div data-no-interaction>\n <div\n {...(isDraggable && 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 && isDraggable ? '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 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\n {isSelected &&\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 <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 {({ rect, menuWrapperProps }) =>\n selectionMenu &&\n selectionMenu({\n annotation: trackedAnnotation,\n selected: isSelected,\n rect,\n menuWrapperProps,\n })\n }\n </CounterRotate>\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 pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: CSSProperties;\n};\n\nexport function RenderAnnotation({\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.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, 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 pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent<HTMLDivElement> | TouchEvent<HTMLDivElement>) => void;\n}\n\nexport function Stamp({ isSelected, annotation, pageIndex, scale, onClick }: 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 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 { CustomAnnotationRenderer, ResizeHandleUI, SelectionMenu, VertexHandleUI } 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 pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale, selectionMenu } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\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 }, [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 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 pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ 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 const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\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 pageIndex: number;\n scale: number;\n}\n\nexport function AnnotationPaintLayer({ 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(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 }, [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 } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { SelectionMenu, ResizeHandleUI, VertexHandleUI, CustomAnnotationRenderer } from './types';\nimport { AnnotationPaintLayer } from './annotation-paint-layer';\nimport { PdfAnnotationObject } from '@embedpdf/models';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n /** Customize selection menu across all annotations on this layer */\n selectionMenu?: SelectionMenu;\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 pageIndex,\n scale,\n selectionMenu,\n resizeUI,\n vertexUI,\n pageWidth,\n pageHeight,\n rotation,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations\n selectionMenu={selectionMenu}\n pageIndex={pageIndex}\n scale={scale}\n rotation={rotation}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n resizeUI={resizeUI}\n vertexUI={vertexUI}\n selectionOutlineColor={selectionOutlineColor}\n customAnnotationRenderer={customAnnotationRenderer}\n />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <AnnotationPaintLayer pageIndex={pageIndex} scale={scale} />\n </div>\n );\n}\n"],"names":["suppressContentEditableWarningProps","suppressContentEditableWarning","useAnnotationPlugin","usePlugin","AnnotationPlugin","id","useAnnotationCapability","useCapability","AnnotationContainer","scale","pageIndex","rotation","pageWidth","pageHeight","trackedAnnotation","children","isSelected","isDraggable","isResizable","lockAspectRatio","style","vertexConfig","selectionMenu","outlineOffset","onDoubleClick","onSelect","zIndex","resizeUI","vertexUI","selectionOutlineColor","customAnnotationRenderer","props","preview","setPreview","useState","object","provides","annotationProvides","gestureBaseRef","useRef","currentObject","HANDLE_COLOR","color","VERTEX_COLOR","HANDLE_SIZE","size","VERTEX_SIZE","dragProps","vertices","resize","useInteractionHandles","controller","element","rect","extractVertices","constraints","minWidth","minHeight","boundingBox","width","height","maintainAspectRatio","pageRotation","enabled","onUpdate","event","_a","transformData","type","state","current","transformType","base","changes","transformAnnotation","patched","metadata","prev","updateAnnotation","handleSize","spacing","offsetMode","includeSides","vertexSize","includeVertices","doubleProps","useDoublePressProps","useEffect","jsxs","jsxRuntime","position","left","origin","x","top","y","outline","pointerEvents","touchAction","cursor","childrenRender","customRender","annotation","map","key","hProps","component","backgroundColor","jsx","vProps","CounterRotate","menuWrapperProps","selected","Highlight","opacity","segmentRects","onClick","Fragment","b","i","onPointerDown","onTouchStart","background","Underline","thickness","r","bottom","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","overflow","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","Square","strokeColor","strokeStyle","PdfAnnotationBorderStyle","SOLID","strokeDashArray","outerW","outerH","Math","max","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","length","first","rest","p","toAngle","a","startRad","endRad","Polygon","currentVertex","allPoints","isPreview","isPreviewing","FreeText","isEditing","editorRef","isIOS","setIsIOS","editor","focus","selection","window","getSelection","range","document","createRange","selectNodeContents","collapse","removeAllRanges","addRange","useLayoutEffect","nav","navigator","ios","test","userAgent","platform","maxTouchPoints","computedFontPx","fontSize","needsComp","adjustedFontPx","scaleComp","invScalePercent","ref","onBlur","contents","innerText","tabIndex","fontColor","fontFamily","standardFontCss","textAlign","textAlignmentToCss","flexDirection","justifyContent","verticalAlign","PdfVerticalAlignment","Top","Middle","display","lineHeight","transformOrigin","contentEditable","RenderAnnotation","scaleFactor","imageUrl","setImageUrl","urlRef","task","renderAnnotation","options","dpr","devicePixelRatio","wait","blob","url","URL","createObjectURL","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","src","onLoad","Stamp","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","editingId","setEditingId","onStateChange","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","target","currentTarget","deselectAnnotation","handleClick","useCallback","e","stopPropagation","selectAnnotation","clear","tool","findToolForAnnotation","isInk","interaction","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","isFreeText","isStamp","_object","TextMarkup","rects","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","defaults","PdfAnnotationSubtype","UNDERLINE","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","PreviewRenderer","bounds","CIRCLE","data","SQUARE","POLYGON","POLYLINE","LINE","INK","FREETEXT","border","AnnotationPaintLayer","plugin","annotationPlugin","previews","setPreviews","Map","fileInputRef","canvasRef","services","requestFile","accept","onFile","input","onchange","file","files","value","click","processImage","source","maxWidth","maxHeight","onComplete","canvas","getContext","ctx","img","Image","crossOrigin","onload","naturalWidth","naturalHeight","scaleX","scaleY","min","finalWidth","finalHeight","drawImage","imageData","getImageData","registerPageHandlers","onPreview","toolId","next","set","delete","Array","from","entries","setState","initialState","action"],"mappings":"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"}