@embedpdf/plugin-annotation 1.0.11 → 1.0.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 (109) hide show
  1. package/dist/index.cjs +2 -693
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -266
  4. package/dist/index.js +509 -164
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +104 -0
  7. package/dist/lib/annotation-plugin.d.ts +34 -0
  8. package/dist/lib/helpers.d.ts +18 -0
  9. package/dist/lib/index.d.ts +12 -0
  10. package/dist/lib/manifest.d.ts +4 -0
  11. package/dist/lib/patching/derived-rect.d.ts +2 -0
  12. package/dist/lib/patching/index.d.ts +4 -0
  13. package/dist/lib/patching/line-ending-handlers.d.ts +20 -0
  14. package/dist/lib/patching/line-endings.d.ts +13 -0
  15. package/dist/lib/patching/patch-utils.d.ts +7 -0
  16. package/dist/lib/reducer.d.ts +5 -0
  17. package/dist/lib/selectors.d.ts +25 -0
  18. package/dist/lib/types.d.ts +168 -0
  19. package/dist/lib/utils.d.ts +11 -0
  20. package/dist/lib/variant-key.d.ts +8 -0
  21. package/dist/preact/adapter.d.ts +8 -0
  22. package/dist/preact/core.d.ts +1 -0
  23. package/dist/preact/index.cjs +2 -1038
  24. package/dist/preact/index.cjs.map +1 -1
  25. package/dist/preact/index.d.ts +1 -28
  26. package/dist/preact/index.js +2150 -539
  27. package/dist/preact/index.js.map +1 -1
  28. package/dist/preact/interaction-manager.d.ts +1 -0
  29. package/dist/preact/selection.d.ts +1 -0
  30. package/dist/react/adapter.d.ts +2 -0
  31. package/dist/react/core.d.ts +1 -0
  32. package/dist/react/index.cjs +2 -0
  33. package/dist/react/index.cjs.map +1 -0
  34. package/dist/react/index.d.ts +1 -0
  35. package/dist/react/index.js +2624 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/react/interaction-manager.d.ts +1 -0
  38. package/dist/react/selection.d.ts +1 -0
  39. package/dist/shared-preact/components/annotation-container.d.ts +24 -0
  40. package/dist/shared-preact/components/annotation-layer.d.ts +13 -0
  41. package/dist/shared-preact/components/annotations/circle-paint.d.ts +10 -0
  42. package/dist/shared-preact/components/annotations/circle.d.ts +29 -0
  43. package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
  44. package/dist/shared-preact/components/annotations/ink-paint.d.ts +18 -0
  45. package/dist/shared-preact/components/annotations/ink.d.ts +25 -0
  46. package/dist/shared-preact/components/annotations/line-paint.d.ts +10 -0
  47. package/dist/shared-preact/components/annotations/line.d.ts +33 -0
  48. package/dist/shared-preact/components/annotations/polygon-paint.d.ts +9 -0
  49. package/dist/shared-preact/components/annotations/polygon.d.ts +17 -0
  50. package/dist/shared-preact/components/annotations/polyline-paint.d.ts +10 -0
  51. package/dist/shared-preact/components/annotations/polyline.d.ts +17 -0
  52. package/dist/shared-preact/components/annotations/square-paint.d.ts +10 -0
  53. package/dist/shared-preact/components/annotations/square.d.ts +29 -0
  54. package/dist/shared-preact/components/annotations.d.ts +11 -0
  55. package/dist/shared-preact/components/counter-rotate-container.d.ts +32 -0
  56. package/dist/shared-preact/components/index.d.ts +1 -0
  57. package/dist/shared-preact/components/render-annotation.d.ts +11 -0
  58. package/dist/shared-preact/components/resize-handles.d.ts +9 -0
  59. package/dist/shared-preact/components/text-markup/highlight.d.ts +13 -0
  60. package/dist/shared-preact/components/text-markup/squiggly.d.ts +13 -0
  61. package/dist/shared-preact/components/text-markup/strikeout.d.ts +13 -0
  62. package/dist/shared-preact/components/text-markup/underline.d.ts +13 -0
  63. package/dist/shared-preact/components/text-markup.d.ts +6 -0
  64. package/dist/shared-preact/components/vertex-editor.d.ts +19 -0
  65. package/dist/shared-preact/hooks/index.d.ts +1 -0
  66. package/dist/shared-preact/hooks/use-annotation.d.ts +11 -0
  67. package/dist/shared-preact/hooks/use-drag-resize.d.ts +31 -0
  68. package/dist/shared-preact/index.d.ts +2 -0
  69. package/dist/shared-preact/patch-ink.d.ts +16 -0
  70. package/dist/shared-preact/patchers.d.ts +9 -0
  71. package/dist/shared-preact/types.d.ts +12 -0
  72. package/dist/shared-preact/vertex-patchers.d.ts +10 -0
  73. package/dist/shared-react/components/annotation-container.d.ts +24 -0
  74. package/dist/shared-react/components/annotation-layer.d.ts +13 -0
  75. package/dist/shared-react/components/annotations/circle-paint.d.ts +10 -0
  76. package/dist/shared-react/components/annotations/circle.d.ts +29 -0
  77. package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
  78. package/dist/shared-react/components/annotations/ink-paint.d.ts +17 -0
  79. package/dist/shared-react/components/annotations/ink.d.ts +25 -0
  80. package/dist/shared-react/components/annotations/line-paint.d.ts +10 -0
  81. package/dist/shared-react/components/annotations/line.d.ts +33 -0
  82. package/dist/shared-react/components/annotations/polygon-paint.d.ts +9 -0
  83. package/dist/shared-react/components/annotations/polygon.d.ts +17 -0
  84. package/dist/shared-react/components/annotations/polyline-paint.d.ts +10 -0
  85. package/dist/shared-react/components/annotations/polyline.d.ts +17 -0
  86. package/dist/shared-react/components/annotations/square-paint.d.ts +10 -0
  87. package/dist/shared-react/components/annotations/square.d.ts +29 -0
  88. package/dist/shared-react/components/annotations.d.ts +11 -0
  89. package/dist/shared-react/components/counter-rotate-container.d.ts +32 -0
  90. package/dist/shared-react/components/index.d.ts +1 -0
  91. package/dist/shared-react/components/render-annotation.d.ts +11 -0
  92. package/dist/shared-react/components/resize-handles.d.ts +9 -0
  93. package/dist/shared-react/components/text-markup/highlight.d.ts +13 -0
  94. package/dist/shared-react/components/text-markup/squiggly.d.ts +13 -0
  95. package/dist/shared-react/components/text-markup/strikeout.d.ts +13 -0
  96. package/dist/shared-react/components/text-markup/underline.d.ts +13 -0
  97. package/dist/shared-react/components/text-markup.d.ts +6 -0
  98. package/dist/shared-react/components/vertex-editor.d.ts +19 -0
  99. package/dist/shared-react/hooks/index.d.ts +1 -0
  100. package/dist/shared-react/hooks/use-annotation.d.ts +11 -0
  101. package/dist/shared-react/hooks/use-drag-resize.d.ts +31 -0
  102. package/dist/shared-react/index.d.ts +2 -0
  103. package/dist/shared-react/patch-ink.d.ts +16 -0
  104. package/dist/shared-react/patchers.d.ts +9 -0
  105. package/dist/shared-react/types.d.ts +12 -0
  106. package/dist/shared-react/vertex-patchers.d.ts +10 -0
  107. package/package.json +17 -15
  108. package/dist/index.d.cts +0 -266
  109. package/dist/preact/index.d.cts +0 -28
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-annotation.ts","../../src/preact/components/annotations.tsx","../../src/preact/components/annotation-container.tsx","../../src/preact/components/text-markup/highlight.tsx","../../src/preact/components/text-markup/underline.tsx","../../src/preact/components/text-markup/strikeout.tsx","../../src/preact/components/text-markup/squiggly.tsx","../../src/preact/components/annotations/ink.tsx","../../src/shared/resize-ink.ts","../../src/preact/components/text-markup.tsx","../../src/preact/components/annotations/ink-paint.tsx","../../src/preact/components/annotation-layer.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/preact';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n TrackedAnnotation,\n} from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../hooks';\nimport { useMemo, useState, useEffect, useCallback } from 'preact/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 { useSelectionCapability } from '@embedpdf/plugin-selection/preact';\nimport { resizeInkAnnotation } from '../../shared/resize-ink';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale } = 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\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 }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\n selectionProvides.clear();\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.localId === annotation.localId;\n\n switch (annotation.object.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Underline\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Strikeout\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Squiggly\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n rect={annotation.object.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Highlight\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n rect={annotation.object.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.INK:\n return (\n <AnnotationContainer\n key={annotation.localId}\n isSelected={isSelected}\n trackedAnnotation={annotation}\n outlineOffset={6}\n computeResizePatch={resizeInkAnnotation}\n {...annotationsProps}\n >\n {(obj: PdfInkAnnoObject) => (\n <Ink\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n inkList={obj.inkList}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n default:\n return null;\n }\n })}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Rect, restoreOffset, restoreRect } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { ResizeDirection } from '../../shared/types';\n\ntype AnnotationContainerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation;\n children: ComponentChildren | ((annotation: PdfAnnotationObject) => ComponentChildren);\n style?: JSX.CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n computeResizePatch?: (\n original: PdfAnnotationObject,\n newRect: Rect,\n direction: ResizeDirection,\n ) => Partial<PdfAnnotationObject>;\n};\n\ntype Point = { x: number; y: number };\n\nexport function AnnotationContainer({\n scale,\n pageIndex,\n rotation,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n computeResizePatch,\n ...props\n}: AnnotationContainerProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const ref = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<'idle' | 'dragging' | 'resizing'>('idle');\n const [resizeDirection, setResizeDirection] = useState<ResizeDirection | null>(null);\n const [startPos, setStartPos] = useState<Point | null>(null);\n const [startRect, setStartRect] = useState<Rect | null>(null);\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [previewObject, setPreviewObject] = useState<Partial<PdfAnnotationObject> | null>(null);\n\n useEffect(() => {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject(null);\n }, [trackedAnnotation]);\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!isSelected) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n const target = e.target as HTMLElement;\n\n if (isResizable && target.classList.contains('resize-handle')) {\n setDragState('resizing');\n setResizeDirection(target.dataset.direction as ResizeDirection);\n } else if (isDraggable) {\n setDragState('dragging');\n } else {\n return;\n }\n\n setStartPos({ x: e.clientX, y: e.clientY });\n setStartRect(currentRect);\n\n ref.current?.setPointerCapture(e.pointerId);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (dragState === 'idle' || !startPos || !startRect) return;\n\n const dispDelta = { x: e.clientX - startPos.x, y: e.clientY - startPos.y };\n const { x: dx, y: dy } = restoreOffset(dispDelta, rotation, scale);\n\n let newOriginX = startRect.origin.x;\n let newOriginY = startRect.origin.y;\n let newWidth = startRect.size.width;\n let newHeight = startRect.size.height;\n\n if (dragState === 'dragging') {\n newOriginX += dx;\n newOriginY += dy;\n } else if (dragState === 'resizing' && resizeDirection) {\n if (resizeDirection.includes('right')) {\n newWidth += dx;\n } else if (resizeDirection.includes('left')) {\n newOriginX += dx;\n newWidth -= dx;\n }\n\n if (resizeDirection.includes('bottom')) {\n newHeight += dy;\n } else if (resizeDirection.includes('top')) {\n newOriginY += dy;\n newHeight -= dy;\n }\n\n // Prevent negative dimensions\n if (newWidth < 1 || newHeight < 1) return;\n }\n\n const tentativeRect = {\n origin: { x: newOriginX, y: newOriginY },\n size: { width: newWidth, height: newHeight },\n };\n\n let previewPatch: Partial<PdfAnnotationObject> = { rect: tentativeRect };\n\n if (computeResizePatch) {\n const dir = dragState === 'resizing' ? resizeDirection : 'bottom-right';\n if (dir) {\n previewPatch = computeResizePatch(trackedAnnotation.object, tentativeRect, dir);\n }\n }\n\n setCurrentRect(previewPatch.rect || tentativeRect);\n setPreviewObject(previewPatch);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n if (dragState === 'idle') return;\n\n const usedDirection = resizeDirection || 'bottom-right';\n setDragState('idle');\n setResizeDirection(null);\n\n ref.current?.releasePointerCapture(e.pointerId);\n\n // Commit the changes\n if (annotationProvides && trackedAnnotation) {\n let patch: Partial<PdfAnnotationObject> = { rect: currentRect };\n if (computeResizePatch && usedDirection) {\n patch = computeResizePatch(trackedAnnotation.object, currentRect, usedDirection);\n }\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.localId, patch);\n }\n\n setStartPos(null);\n setStartRect(null);\n setPreviewObject(null);\n };\n\n const currentObject = previewObject\n ? ({ ...trackedAnnotation.object, ...previewObject } as PdfAnnotationObject)\n : trackedAnnotation.object;\n\n return (\n <div\n ref={ref}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n position: 'absolute',\n outline: isSelected ? '1px solid #007ACC' : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n left: `${currentRect.origin.x * scale}px`,\n top: `${currentRect.origin.y * scale}px`,\n width: `${currentRect.size.width * scale}px`,\n height: `${currentRect.size.height * scale}px`,\n pointerEvents: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...style,\n }}\n {...props}\n >\n {typeof children === 'function' ? children(currentObject) : children}\n {isSelected && isResizable && (\n <>\n <div\n className=\"resize-handle\"\n data-direction=\"top-left\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"top-right\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-left\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-right\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n </>\n )}\n </div>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={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 : null,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\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 {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useMemo } from 'preact/hooks';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\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) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps) {\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 }}\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 stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={opacity}\n pointerEvents=\"visibleStroke\"\n onMouseDown={onClick}\n style={{\n cursor: 'pointer',\n }}\n />\n ))}\n </svg>\n );\n}\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { ResizeDirection } from './types';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport function resizeInkAnnotation(\n original: PdfAnnotationObject, // Assumes type=INK\n newRect: Rect,\n direction: ResizeDirection,\n uniform: boolean = false,\n): Partial<PdfInkAnnoObject> {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n newRect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n newRect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: newRect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: newRect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = original.strokeWidth * avgScale;\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: newRect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { PdfAnnotationSubtype, Rect } from '@embedpdf/models';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/preact';\n\nimport { useEffect, useState } from 'preact/hooks';\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<ActiveTool>({ mode: null, defaults: 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\n switch (activeTool.mode) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: '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 rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","/** @jsxImportSource preact */\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/preact';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { PdfInkListObject, Rect, PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\nconst MAX_STROKE_WIDTH = 30;\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ mode: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (activeTool.mode !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand rect by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const rectMinX = minX - halfStroke;\n const rectMinY = minY - halfStroke;\n const rectMaxX = maxX + halfStroke;\n const rectMaxY = maxY + halfStroke;\n\n // Ignore tiny drawings\n if (rectMaxX - rectMinX < 1 || rectMaxY - rectMinY < 1) return;\n\n const rect: Rect = {\n origin: { x: rectMinX, y: rectMinY },\n size: { width: rectMaxX - rectMinX, height: rectMaxY - rectMinY },\n };\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setAnnotationMode(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand bounds by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const svgMaxX = maxX + halfStroke;\n const svgMaxY = maxY + halfStroke;\n\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\n const lx = x - svgMinX;\n const ly = y - svgMinY;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={toolColor}\n strokeWidth={toolStrokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={toolOpacity}\n />\n ))}\n </svg>\n );\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\n\ntype AnnotationLayerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n style?: JSX.CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations pageIndex={pageIndex} scale={scale} rotation={rotation} />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n </div>\n );\n}\n"],"mappings":"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","names":["import_models","import_preact","import_plugin_annotation","import_hooks","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_hooks","import_jsx_runtime","import_preact","import_models","import_jsx_runtime","import_models","import_preact","import_hooks","import_jsx_runtime","import_hooks","import_preact","import_models","import_jsx_runtime","allPoints","minX","minY","maxX","maxY","halfStroke","import_jsx_runtime"]}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/shared/components/counter-rotate-container.tsx","../../src/shared/components/vertex-editor.tsx","../../src/shared/hooks/use-drag-resize.ts","../../src/shared/components/resize-handles.tsx","../../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/patch-ink.ts","../../src/shared/components/annotations/line.tsx","../../src/shared/components/annotations/polyline.tsx","../../src/shared/components/annotations/polygon.tsx","../../src/shared/vertex-patchers.ts","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotations/circle-paint.tsx","../../src/shared/components/annotations/square-paint.tsx","../../src/shared/components/annotations/polyline-paint.tsx","../../src/shared/components/annotations/line-paint.tsx","../../src/shared/components/annotations/polygon-paint.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","import { Rect, Rotation, Size } from '@embedpdf/models';\nimport { ReactNode, CSSProperties, PointerEvent, Fragment } from '@framework';\n\ninterface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n}\n\ninterface CounterTransformResult {\n matrix: string; // CSS matrix(a,b,c,d,e,f)\n width: number; // new width\n height: number; // new height\n}\n\n/**\n * Given an already-placed rect (left/top/width/height in px) and the page rotation,\n * return the counter-rotation matrix + adjusted width/height.\n *\n * transform-origin is expected to be \"0 0\".\n * left/top DO NOT change, apply them as-is.\n */\nexport function getCounterRotation(rect: Rect, rotation: Rotation): CounterTransformResult {\n const { width: w, height: h } = rect.size;\n\n switch (rotation % 4) {\n case 1: // 90° cw → need matrix(0,-1,1,0,0,h) and swap w/h\n return {\n matrix: `matrix(0, -1, 1, 0, 0, ${h})`,\n width: h,\n height: w,\n };\n\n case 2: // 180° → matrix(-1,0,0,-1,w,h), width/height unchanged\n return {\n matrix: `matrix(-1, 0, 0, -1, ${w}, ${h})`,\n width: w,\n height: h,\n };\n\n case 3: // 270° cw → matrix(0,1,-1,0,w,0), swap w/h\n return {\n matrix: `matrix(0, 1, -1, 0, ${w}, 0)`,\n width: h,\n height: w,\n };\n\n default:\n return {\n matrix: `matrix(1, 0, 0, 1, 0, 0)`,\n width: w,\n height: h,\n };\n }\n}\n\nexport interface MenuWrapperProps {\n style: CSSProperties;\n onPointerDown: (e: PointerEvent<HTMLDivElement>) => void;\n}\n\ninterface CounterRotateComponentProps extends CounterRotateProps {\n children: (props: {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }) => ReactNode;\n}\n\nexport function CounterRotate({ children, ...props }: CounterRotateComponentProps) {\n const { rect, rotation } = props;\n const { matrix, width, height } = getCounterRotation(rect, rotation);\n\n const menuWrapperStyle: CSSProperties = {\n position: 'absolute',\n left: rect.origin.x,\n top: rect.origin.y,\n transform: matrix,\n transformOrigin: '0 0',\n width: width,\n height: height,\n pointerEvents: 'none',\n zIndex: 3,\n };\n\n const menuWrapperProps = {\n style: menuWrapperStyle,\n onPointerDown: (e: PointerEvent<HTMLDivElement>) => e.stopPropagation(),\n };\n\n return (\n <Fragment>\n {children({\n menuWrapperProps,\n matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: width, height: height },\n },\n })}\n </Fragment>\n );\n}\n","import { JSX, Fragment, PointerEvent, useState, useRef } from '@framework';\nimport { Position, Rect, restoreOffset } from '@embedpdf/models';\n\nexport interface VertexEditorProps {\n /** Bounding box (PDF units) of the annotation */\n rect: Rect;\n /** Page rotation (0-3) */\n rotation: number;\n /** Current zoom factor */\n scale: number;\n /** Array of vertices in PDF units */\n vertices: Position[];\n /** Called *every* drag frame with new vertices */\n onEdit: (v: Position[]) => void;\n /** Called once at end of drag to commit changes */\n onCommit: (v: Position[]) => void;\n /** Size of handle in CSS px */\n handleSize?: number;\n}\n\n/*\n * Renders N absolutely-positioned <div> handles *inside*\n * the already-counter-rotated AnnotationContainer. 
Each\n * handle captures pointer-events and updates the vertex\n * array in PDF units via restoreOffset().\n */\nexport function VertexEditor({\n rect,\n rotation,\n scale,\n vertices,\n onEdit,\n onCommit,\n handleSize = 12,\n}: VertexEditorProps): JSX.Element {\n const [dragIdx, setDragIdx] = useState<number | null>(null);\n const startScreen = useRef<{ x: number; y: number } | null>(null);\n const startVerts = useRef<Position[]>([]);\n\n const applyDelta = (deltaScreen: { x: number; y: number }): Position[] => {\n const deltaPdf = restoreOffset(deltaScreen, rotation, scale);\n const next = [...startVerts.current];\n if (dragIdx !== null) {\n next[dragIdx] = {\n x: next[dragIdx].x + deltaPdf.x,\n y: next[dragIdx].y + deltaPdf.y,\n };\n }\n return next;\n };\n\n // ─── pointer handlers ───────────────────────────────────────\n const handleDown = (idx: number) => (e: PointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n e.preventDefault();\n setDragIdx(idx);\n startScreen.current = { x: e.clientX, y: e.clientY };\n startVerts.current = vertices;\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent<HTMLDivElement>) => {\n if (dragIdx === null || !startScreen.current) return;\n const deltaRaw = {\n x: e.clientX - startScreen.current.x,\n y: e.clientY - startScreen.current.y,\n };\n onEdit(applyDelta(deltaRaw));\n };\n\n const handleUp = (e: PointerEvent<HTMLDivElement>) => {\n if (dragIdx === null || !startScreen.current) return;\n (e.target as HTMLElement).releasePointerCapture(e.pointerId);\n const deltaRaw = {\n x: e.clientX - startScreen.current.x,\n y: e.clientY - startScreen.current.y,\n };\n onCommit(applyDelta(deltaRaw));\n setDragIdx(null);\n };\n\n // ─── render handles ─────────────────────────────────────────\n return (\n <Fragment>\n {vertices.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - handleSize / 2;\n const top = (v.y - rect.origin.y) * scale - handleSize / 2;\n return (\n <div\n key={i}\n style={{\n position: 'absolute',\n left,\n top,\n width: handleSize,\n height: handleSize,\n borderRadius: '50%',\n background: '#2196f3',\n cursor: 'pointer',\n pointerEvents: 'auto',\n zIndex: 4,\n }}\n onPointerDown={handleDown(i)}\n onPointerMove={handleMove}\n onPointerUp={handleUp}\n />\n );\n })}\n </Fragment>\n );\n}\n","import { PointerEvent, useState, useRef, useEffect } from '@framework';\nimport { PdfAnnotationObject, Position, Rect, restoreOffset } from '@embedpdf/models';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { ResizeDirection } from '../types';\nimport { ComputePatch } from '../patchers';\n\ninterface UseDragResizeOpts<T extends PdfAnnotationObject> {\n /* invariants */\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n\n /* annotation info */\n tracked: TrackedAnnotation<T>;\n\n /* config */\n isSelected: boolean;\n isDraggable: boolean;\n isResizable: boolean;\n computePatch?: ComputePatch<T>;\n computeVertices?: (a: T) => Position[];\n\n /* state held by caller */\n currentRect: Rect;\n setCurrentRect: (r: Rect) => void;\n setCurrentVertices: (v: Position[]) => void;\n setPreviewObject: (p: Partial<T> | null) => void;\n\n /* commit */\n commit: (patch: Partial<T>) => void;\n}\n\ntype Point = { x: number; y: number };\ntype DragState = 'idle' | 'dragging' | 'resizing';\n\nexport function useDragResize<T extends PdfAnnotationObject>({\n scale,\n pageWidth,\n pageHeight,\n rotation,\n tracked,\n isSelected,\n isDraggable,\n isResizable,\n computePatch,\n computeVertices,\n currentRect,\n setCurrentRect,\n setCurrentVertices,\n setPreviewObject,\n commit,\n}: UseDragResizeOpts<T>) {\n /* ── local refs ─────────────────────────────────────────── */\n const drag = useRef<DragState>('idle');\n const dir = useRef<ResizeDirection>('none');\n const startPos = useRef<Point | null>(null);\n const startRect = useRef<Rect | null>(null);\n\n /* ── helpers ────────────────────────────────────────────── */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageW = pageWidth / scale;\n const pageH = pageHeight / scale;\n\n /* ── core maths shared by drag + resize ─────────────────── */\n const applyDelta = (dx: number, dy: number) => {\n if (!startRect.current) return currentRect;\n\n let { origin, size } = startRect.current;\n\n let ox = origin.x;\n let oy = origin.y;\n let w = size.width;\n let h = size.height;\n\n if (drag.current === 'dragging') {\n ox += dx;\n oy += dy;\n } else if (drag.current === 'resizing') {\n if (dir.current.includes('right')) w += dx;\n else if (dir.current.includes('left')) {\n ox += dx;\n w -= dx;\n }\n if (dir.current.includes('bottom')) h += dy;\n else if (dir.current.includes('top')) {\n oy += dy;\n h -= dy;\n }\n }\n /* prevent negative dimensions */\n if (w < 1 || h < 1) return currentRect;\n\n /* clamp to page */\n w = clamp(w, 1, pageW);\n h = clamp(h, 1, pageH);\n ox = clamp(ox, 0, pageW - w);\n oy = clamp(oy, 0, pageH - h);\n\n return { origin: { x: ox, y: oy }, size: { width: w, height: h } };\n };\n\n /* ── pointer handlers for the container ─────────────────── */\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isDraggable) return;\n e.stopPropagation();\n e.preventDefault();\n drag.current = 'dragging';\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (drag.current === 'idle' || !startPos.current) return;\n const disp = {\n x: e.clientX - startPos.current.x,\n y: e.clientY - startPos.current.y,\n };\n const { x, y } = restoreOffset(disp, rotation, scale);\n const nextRect = applyDelta(x, y);\n\n /* build preview patch */\n let patch: Partial<T> = { rect: nextRect } as Partial<T>;\n if (computePatch) {\n patch = computePatch(tracked.object, {\n rect: nextRect,\n direction: drag.current === 'resizing' ? dir.current : 'bottom-right',\n });\n if (computeVertices) setCurrentVertices(computeVertices({ ...tracked.object, ...patch }));\n }\n setCurrentRect(patch.rect ?? nextRect);\n setPreviewObject(patch);\n };\n\n const onPointerUp = () => {\n if (drag.current === 'idle') return;\n const usedDir = dir.current || 'bottom-right';\n drag.current = 'idle';\n\n /* final patch */\n let patch: Partial<T> = { rect: currentRect } as Partial<T>;\n if (computePatch) {\n patch = computePatch(tracked.object, {\n rect: currentRect,\n direction: usedDir,\n });\n }\n commit(patch);\n\n /* cleanup */\n startPos.current = null;\n startRect.current = null;\n dir.current = 'none';\n setPreviewObject(null);\n };\n\n /* ── handle pointer-down from resize handles ─────────────── */\n const startResize = (direction: ResizeDirection) => (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected || !isResizable) return;\n e.stopPropagation();\n e.preventDefault();\n drag.current = 'resizing';\n dir.current = direction;\n startPos.current = { x: e.clientX, y: e.clientY };\n startRect.current = currentRect;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n /* reset when annotation changes */\n useEffect(() => {\n drag.current = 'idle';\n dir.current = 'none';\n startPos.current = null;\n startRect.current = null;\n }, [tracked]);\n\n /* ── public surface ─────────────────────────────────────── */\n return {\n rootHandlers: {\n onPointerDown,\n onPointerMove,\n onPointerUp,\n },\n startResize,\n };\n}\n","import { ResizeDirection } from '../types';\nimport { PointerEvent } from '@framework';\n\ninterface Props {\n rotation: number;\n outlineOffset?: number;\n startResize: (d: ResizeDirection) => (e: PointerEvent<HTMLDivElement>) => void;\n}\n\nconst commonStyle = (o: number) => ({\n position: 'absolute' as const,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n});\n\nexport function ResizeHandles({ rotation, outlineOffset = 1, startResize }: Props) {\n const o = outlineOffset;\n return (\n <>\n <div\n style={{\n ...commonStyle(o),\n top: -7 - o,\n left: -7 - o,\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n onPointerDown={startResize('top-left')}\n />\n <div\n style={{\n ...commonStyle(o),\n top: -7 - o,\n right: -7 - o,\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n onPointerDown={startResize('top-right')}\n />\n <div\n style={{\n ...commonStyle(o),\n bottom: -7 - o,\n left: -7 - o,\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n onPointerDown={startResize('bottom-left')}\n />\n <div\n style={{\n ...commonStyle(o),\n bottom: -7 - o,\n right: -7 - o,\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n onPointerDown={startResize('bottom-right')}\n />\n </>\n );\n}\n","import {\n JSX,\n HTMLAttributes,\n CSSProperties,\n useState,\n Fragment,\n useLayoutEffect,\n} from '@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Position, Rect, rectEquals } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { SelectionMenuProps } from '../../shared/types';\nimport { CounterRotate } from './counter-rotate-container';\nimport { VertexEditor } from './vertex-editor';\nimport { ComputePatch } from '../patchers';\nimport { useDragResize } from '../hooks/use-drag-resize';\nimport { ResizeHandles } from './resize-handles';\n\ntype AnnotationContainerProps<T extends PdfAnnotationObject> = Omit<\n HTMLAttributes<HTMLDivElement>,\n 'style' | 'children'\n> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation<T>;\n children: JSX.Element | ((annotation: T) => JSX.Element);\n style?: CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n selectionMenu?: (props: SelectionMenuProps) => JSX.Element;\n computeVertices?: (annotation: T) => Position[];\n computePatch?: ComputePatch<T>;\n};\n\nexport function AnnotationContainer<T extends PdfAnnotationObject>({\n scale,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n computeVertices,\n computePatch,\n selectionMenu,\n ...props\n}: AnnotationContainerProps<T>): JSX.Element {\n const { provides: annotationProvides } = useAnnotationCapability();\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [currentVertices, setCurrentVertices] = useState<Position[]>(\n computeVertices?.(trackedAnnotation.object) ?? [],\n );\n const [previewObject, setPreviewObject] = useState<Partial<T> | null>(null);\n\n /* hook owns every pointer detail */\n const { rootHandlers, startResize } = useDragResize({\n scale,\n pageWidth,\n pageHeight,\n rotation,\n tracked: trackedAnnotation,\n isSelected,\n isDraggable,\n isResizable,\n computePatch,\n computeVertices,\n currentRect,\n setCurrentRect,\n setCurrentVertices,\n setPreviewObject,\n commit: (patch) =>\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.localId, patch),\n });\n\n useLayoutEffect(() => {\n if (!rectEquals(trackedAnnotation.object.rect, currentRect)) {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject((prev) => (prev ? { ...prev, rect: trackedAnnotation.object.rect } : null));\n setCurrentVertices(computeVertices?.(trackedAnnotation.object) ?? []);\n }\n }, [trackedAnnotation]);\n\n const currentObject = previewObject\n ? { ...trackedAnnotation.object, ...previewObject }\n : trackedAnnotation.object;\n\n return (\n <Fragment>\n <div\n /* attach handlers */\n {...rootHandlers}\n style={{\n position: 'absolute',\n outline: isSelected ? '1px solid #007ACC' : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n left: `${currentRect.origin.x * scale}px`,\n top: `${currentRect.origin.y * scale}px`,\n width: `${currentRect.size.width * scale}px`,\n height: `${currentRect.size.height * scale}px`,\n pointerEvents: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...style,\n }}\n {...props}\n >\n {/* children */}\n {typeof children === 'function' ? children(currentObject) : children}\n\n {/* vertex editing – unchanged */}\n {isSelected && currentVertices.length > 0 && (\n <VertexEditor\n rect={currentRect}\n rotation={rotation}\n scale={scale}\n vertices={currentVertices}\n onEdit={(v) => {\n setCurrentVertices(v);\n if (computePatch) {\n const patch = computePatch(trackedAnnotation.object, {\n rect: currentRect,\n vertices: v,\n });\n setPreviewObject(patch);\n setCurrentRect(patch.rect || currentRect);\n }\n }}\n onCommit={(v) => {\n if (annotationProvides && computePatch) {\n const patch = computePatch(trackedAnnotation.object, {\n rect: currentRect,\n vertices: v,\n });\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.localId, patch);\n }\n }}\n />\n )}\n\n {/* resize handles */}\n {isSelected && isResizable && (\n <ResizeHandles\n rotation={rotation}\n outlineOffset={outlineOffset}\n startResize={startResize}\n />\n )}\n </div>\n\n {/* CounterRotate remains unchanged */}\n <CounterRotate\n rect={{\n origin: { x: currentRect.origin.x * scale, y: currentRect.origin.y * scale },\n size: { width: currentRect.size.width * scale, height: currentRect.size.height * scale },\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 </Fragment>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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 { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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 { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\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 {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={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 {...props}\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 } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\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>) => void;\n /** Cursor on the ink */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: 'visibleStroke',\n stroke: color,\n strokeWidth: strokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface SquareProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\n}\n\n/**\n * Renders a PDF Square annotation (rectangle) as SVG.\n */\nexport function Square({\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : '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 } from '@framework';\nimport { PdfAnnotationBorderStyle, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface CircleProps {\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>) => void;\n /** Cursor shown over the annotation */\n cursor?: string;\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 cursor,\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 onMouseDown={onClick}\n style={{\n cursor,\n pointerEvents: color === 'transparent' ? 'visibleStroke' : 'visible',\n stroke: strokeColor ?? color,\n strokeWidth,\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { ComputePatch } from './patchers';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport const patchInk: ComputePatch<PdfInkAnnoObject> = (original, ctx) => {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = ctx.rect.size.width / oldRect.size.width;\n let scaleY = ctx.rect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (ctx.rect.size.width < minSize || ctx.rect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n ctx.rect = {\n origin: ctx.rect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (ctx.uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n ctx.rect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: ctx.rect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: ctx.rect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = Math.round(original.strokeWidth * avgScale);\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: ctx.rect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n};\n","import { useMemo, MouseEvent } 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>) => 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n stroke={strokeColor}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n strokeLinecap: 'butt',\n pointerEvents: 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, 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>) => 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 const startRad = toAngle(localPts[1], localPts[0]); // direction INTO first segment\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]);\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip points outward from first segment start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad,\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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: 'none',\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: '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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: 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 onMouseDown={onClick}\n style={{\n cursor: isSelected ? 'move' : 'pointer',\n strokeWidth,\n pointerEvents: endings.end.filled ? 'visible' : 'visibleStroke',\n strokeLinecap: 'butt',\n }}\n />\n )}\n </svg>\n );\n}\n","import { MouseEvent, useMemo } from '@framework';\nimport { Rect, Position, PdfAnnotationBorderStyle } from '@embedpdf/models';\n\ninterface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string; // interior fill colour\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>) => void;\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}: PolygonProps): JSX.Element {\n // Translate vertices into local coords\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 const pathData = useMemo(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (`M ${first.x} ${first.y} ` + rest.map((p) => `L ${p.x} ${p.y} `).join('') + 'Z').trim();\n }, [localPts]);\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 onMouseDown={onClick}\n opacity={opacity}\n style={{\n fill: color,\n stroke: strokeColor ?? color,\n strokeWidth,\n cursor: isSelected ? 'move' : 'pointer',\n pointerEvents: color === 'transparent' ? 'visibleStroke' : 'visible',\n strokeLinecap: 'butt',\n strokeLinejoin: 'miter',\n ...(strokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: strokeDashArray?.join(','),\n }),\n }}\n />\n </svg>\n );\n}\n","import {\n PdfAnnotationSubtype,\n PdfAnnotationObject,\n PdfLineAnnoObject,\n PdfPolylineAnnoObject,\n PdfPolygonAnnoObject,\n Rect,\n Position,\n expandRect,\n rectFromPoints,\n} from '@embedpdf/models';\nimport { patching } from '@embedpdf/plugin-annotation';\n\nexport interface PatchContext {\n rect: Rect;\n vertices?: Position[];\n}\n\nexport type PatchFn<T extends PdfAnnotationObject> = (original: T, ctx: PatchContext) => Partial<T>;\n\nexport const patchLine: PatchFn<PdfLineAnnoObject> = (orig, ctx) => {\n /* ---------- vertex edit ------------------------------------------------ */\n if (ctx.vertices && ctx.vertices.length >= 2) {\n const rect = patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings);\n return {\n rect,\n linePoints: { start: ctx.vertices[0], end: ctx.vertices[1] },\n };\n }\n\n /* ---------- rect drag -------------------------------------------------- */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n return {\n rect: ctx.rect,\n linePoints: {\n start: { x: orig.linePoints.start.x + dx, y: orig.linePoints.start.y + dy },\n end: { x: orig.linePoints.end.x + dx, y: orig.linePoints.end.y + dy },\n },\n };\n};\n\nexport const patchPolyline: PatchFn<PdfPolylineAnnoObject> = (orig, ctx) => {\n /* vertex update */\n if (ctx.vertices && ctx.vertices.length) {\n return {\n rect: patching.lineRectWithEndings(ctx.vertices, orig.strokeWidth, orig.lineEndings),\n vertices: ctx.vertices,\n };\n }\n\n /* rect move */\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport const patchPolygon: PatchFn<PdfPolygonAnnoObject> = (orig, ctx) => {\n if (ctx.vertices && ctx.vertices.length) {\n const pad = orig.strokeWidth / 2;\n return {\n rect: expandRect(rectFromPoints(ctx.vertices), pad),\n vertices: ctx.vertices,\n };\n }\n\n const dx = ctx.rect.origin.x - orig.rect.origin.x;\n const dy = ctx.rect.origin.y - orig.rect.origin.y;\n const moved = orig.vertices.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n return {\n rect: ctx.rect,\n vertices: moved,\n };\n};\n\nexport function getPatchFn(type: PdfAnnotationSubtype) {\n switch (type) {\n case PdfAnnotationSubtype.LINE:\n return patchLine;\n case PdfAnnotationSubtype.POLYLINE:\n return patchPolyline;\n case PdfAnnotationSubtype.POLYGON:\n return patchPolygon;\n default:\n return undefined;\n }\n}\n","import { blendModeToCss, 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} 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 { useMemo, useState, useEffect, useCallback, MouseEvent, Fragment } 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 { SelectionMenu } from '../types';\nimport { Circle } from './annotations/circle';\nimport { patchInk } from '../patch-ink';\nimport { Line } from './annotations/line';\nimport { Polyline } from './annotations/polyline';\nimport { Polygon } from './annotations/polygon';\nimport { VertexEditor } from './vertex-editor';\nimport { patchLine, patchPolygon, patchPolyline } from '../vertex-patchers';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n selectionMenu?: SelectionMenu;\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\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 }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\n selectionProvides.clear();\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.localId === annotation.localId;\n\n if (isInk(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n computePatch={patchInk}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Ink\n cursor={isSelected ? 'move' : 'pointer'}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n inkList={obj.inkList}\n rect={obj.rect}\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.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Square\n cursor={isSelected ? 'move' : 'pointer'}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\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.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={true}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Circle\n cursor={isSelected ? 'move' : 'pointer'}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\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.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Underline\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isStrikeout(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Strikeout\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isSquiggly(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Squiggly\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isHighlight(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n selectionMenu={selectionMenu}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Highlight\n color={obj.color}\n opacity={obj.opacity}\n rects={obj.segmentRects}\n scale={scale}\n rect={obj.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n }\n\n if (isLine(annotation)) {\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchLine}\n computeVertices={(annotation) => [\n annotation.linePoints.start,\n annotation.linePoints.end,\n ]}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Line\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n linePoints={obj.linePoints}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\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.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computePatch={patchPolyline}\n computeVertices={(annotation) => annotation.vertices}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polyline\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n lineEndings={obj.lineEndings}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\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.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={true}\n isResizable={false}\n selectionMenu={selectionMenu}\n computeVertices={(annotation) => annotation.vertices}\n computePatch={patchPolygon}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj) => (\n <Fragment>\n <Polygon\n isSelected={isSelected}\n rect={obj.rect}\n color={obj.color}\n opacity={obj.opacity}\n vertices={obj.vertices}\n strokeWidth={obj.strokeWidth}\n strokeColor={obj.strokeColor}\n strokeStyle={obj.strokeStyle}\n strokeDashArray={obj.strokeDashArray}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </Fragment>\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 { ActiveTool, makeVariantKey } 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<ActiveTool>({ variantKey: null, defaults: 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\n switch (activeTool.variantKey) {\n case makeVariantKey(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 rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(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 rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(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 rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(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 rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState, JSX } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfInkListObject,\n Rect,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n PdfBlendMode,\n rectFromPoints,\n expandRect,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n const toolBlendMode = activeTool.defaults?.blendMode ?? PdfBlendMode.Normal;\n const intent = activeTool.defaults?.intent;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\n\n // Ignore tiny drawings\n if (rect.size.width < 1 || rect.size.height < 1) return;\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n intent,\n blendMode: toolBlendMode,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const rect = expandRect(rectFromPoints(allPoints), toolStrokeWidth / 2);\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\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\n return (\n <svg\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={rect.size.width * scale}\n height={rect.size.height * scale}\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={toolOpacity}\n style={{\n stroke: toolColor,\n strokeWidth: toolStrokeWidth,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }}\n />\n ))}\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfCircleAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface CirclePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const CirclePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: CirclePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.CIRCLE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'circle', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small circles\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfCircleAnnoObject = {\n type: PdfAnnotationSubtype.CIRCLE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\n\n const cx = halfStroke + width / 2;\n const cy = halfStroke + height / 2;\n const rx = width / 2;\n const ry = height / 2;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n <ellipse\n cx={cx}\n cy={cy}\n rx={rx}\n ry={ry}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfAnnotationBorderStyle,\n PdfSquareAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface SquarePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const SquarePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: SquarePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.SQUARE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray ?? [];\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'square', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – anchor/start + current point for preview */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n // Ignore very small squares\n if (maxX - minX >= 1 && maxY - minY >= 1) {\n const halfStroke = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - halfStroke, y: minY - halfStroke },\n size: {\n width: maxX - minX + toolStrokeWidth,\n height: maxY - minY + toolStrokeWidth,\n },\n };\n\n const anno: PdfSquareAnnoObject = {\n type: PdfAnnotationSubtype.SQUARE,\n rect,\n flags: ['print'],\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n }\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n }),\n [\n start,\n current,\n annotationProvides,\n pageIndex,\n pageWidthPDF,\n pageHeightPDF,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const minX = Math.min(start.x, current.x);\n const minY = Math.min(start.y, current.y);\n const maxX = Math.max(start.x, current.x);\n const maxY = Math.max(start.y, current.y);\n\n const halfStroke = toolStrokeWidth / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const width = maxX - minX;\n const height = maxY - minY;\n const dw = width + toolStrokeWidth;\n const dh = height + toolStrokeWidth;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n <rect\n x={halfStroke}\n y={halfStroke}\n width={width}\n height={height}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray.join(','),\n }),\n }}\n />\n </svg>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolylineAnnoObject,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { patching } from '@embedpdf/plugin-annotation';\nimport { Polyline } from './polyline';\n\ninterface PolylinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const PolylinePaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolylinePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYLINE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolLineEndings = activeTool.defaults.lineEndings;\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'polyline', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state – vertices & current pointer */\n /* ------------------------------------------------------------------ */\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitPolyline = (pts: { x: number; y: number }[]) => {\n if (pts.length < 2) return; // need at least a line\n\n const rect = patching.lineRectWithEndings(pts, toolStrokeWidth, toolLineEndings);\n\n const anno: PdfPolylineAnnoObject = {\n type: PdfAnnotationSubtype.POLYLINE,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 1 && annotationProvides) {\n commitPolyline(vertices);\n }\n setVertices([]);\n setCurrent(null);\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register with the interaction-manager */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const rect = patching.lineRectWithEndings(allPts, toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor: cursor,\n }}\n >\n <Polyline\n rect={rect}\n vertices={allPts}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n />\n </div>\n );\n};\n","import { useEffect, useState, useMemo } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool, patching } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationSubtype,\n PdfLineAnnoObject,\n LineEndings,\n PdfAnnotationBorderStyle,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\nimport { Line } from './line';\n\ninterface LinePaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n /** Optional preview cursor */\n cursor?: string;\n}\n\nexport const LinePaint = ({ pageIndex, scale, pageWidth, pageHeight, cursor }: LinePaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => {\n if (!annotationProvides) return;\n return annotationProvides.onActiveToolChange(setActiveTool);\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.LINE) return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n const toolLineEndings = activeTool.defaults.lineEndings;\n const intent = activeTool.defaults.intent;\n\n /* ------------------------------------------------------------------ */\n /* interaction manager integration */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: ['line', 'lineArrow'], pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* local state */\n /* ------------------------------------------------------------------ */\n const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n /* ------------------------------------------------------------------ */\n /* commit helper */\n /* ------------------------------------------------------------------ */\n const commitLine = (p1: { x: number; y: number }, p2: { x: number; y: number }) => {\n // ignore tiny lines\n if (Math.abs(p2.x - p1.x) < 1 && Math.abs(p2.y - p1.y) < 1) return;\n\n const rect = patching.lineRectWithEndings([p1, p2], toolStrokeWidth, toolLineEndings);\n\n const anno: PdfLineAnnoObject = {\n type: PdfAnnotationSubtype.LINE,\n rect,\n linePoints: { start: p1, end: p2 },\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n lineEndings: toolLineEndings,\n intent,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setStart({ x, y });\n setCurrent({ x, y });\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!start) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerUp: (_, evt) => {\n if (start && current && annotationProvides) {\n commitLine(start, current);\n }\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n onPointerCancel: (_, evt) => {\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n setStart(null);\n setCurrent(null);\n },\n }),\n [start, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n /* register */\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!start || !current) return null;\n\n const rect = patching.lineRectWithEndings([start, current], toolStrokeWidth, toolLineEndings);\n\n return (\n <div\n style={{\n position: 'absolute',\n left: rect.origin.x * scale,\n top: rect.origin.y * scale,\n width: rect.size.width * scale,\n height: rect.size.height * scale,\n pointerEvents: 'none',\n zIndex: 2,\n overflow: 'visible',\n cursor,\n }}\n >\n <Line\n rect={rect}\n linePoints={{ start, end: current }}\n strokeWidth={toolStrokeWidth}\n scale={scale}\n isSelected={false}\n color={toolColor}\n strokeColor={toolStrokeColor}\n opacity={toolOpacity}\n lineEndings={toolLineEndings}\n strokeStyle={toolStrokeStyle}\n strokeDashArray={toolStrokeDashArray}\n />\n </div>\n );\n};\n","import { useEffect, useMemo, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport {\n PdfAnnotationBorderStyle,\n PdfAnnotationSubtype,\n PdfPolygonAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface PolygonPaintProps {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n cursor?: string;\n}\n\nconst HANDLE_SIZE_PX = 14; // visual square size on screen\n\nexport const PolygonPaint = ({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n cursor,\n}: PolygonPaintProps) => {\n const { provides: annotationProvides } = useAnnotationCapability();\n\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n useEffect(() => annotationProvides?.onActiveToolChange(setActiveTool), [annotationProvides]);\n\n if (!activeTool.defaults || activeTool.defaults.subtype !== PdfAnnotationSubtype.POLYGON)\n return null;\n\n const toolColor = activeTool.defaults.color ?? '#000000';\n const toolOpacity = activeTool.defaults.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults.strokeWidth ?? 2;\n const toolStrokeColor = activeTool.defaults.strokeColor ?? '#000000';\n const toolStrokeStyle = activeTool.defaults.strokeStyle ?? PdfAnnotationBorderStyle.SOLID;\n const toolStrokeDashArray = activeTool.defaults.strokeDashArray;\n\n const { register } = usePointerHandlers({ modeId: 'polygon', pageIndex });\n\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n const [vertices, setVertices] = useState<{ x: number; y: number }[]>([]);\n const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n const commitPolygon = (pts: { x: number; y: number }[]) => {\n const xs = pts.map((p) => p.x),\n ys = pts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n if (maxX - minX < 1 || maxY - minY < 1) return;\n\n const half = toolStrokeWidth / 2;\n const rect: Rect = {\n origin: { x: minX - half, y: minY - half },\n size: { width: maxX - minX + toolStrokeWidth, height: maxY - minY + toolStrokeWidth },\n };\n\n const anno: PdfPolygonAnnoObject = {\n type: PdfAnnotationSubtype.POLYGON,\n rect,\n vertices: pts,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n strokeColor: toolStrokeColor,\n strokeStyle: toolStrokeStyle,\n strokeDashArray: toolStrokeDashArray,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides!.createAnnotation(pageIndex, anno);\n annotationProvides!.setActiveVariant(null);\n annotationProvides!.selectAnnotation(pageIndex, anno.id);\n };\n\n // Square hit-test in PDF units\n const isInsideStartHandle = (x: number, y: number) => {\n if (vertices.length < 2) return false;\n const sizePDF = HANDLE_SIZE_PX / scale;\n const half = sizePDF / 2;\n const v0 = vertices[0];\n return x >= v0.x - half && x <= v0.x + half && y >= v0.y - half && y <= v0.y + half;\n };\n\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onClick: (pos) => {\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n\n // Click on start-handle ⇒ close polygon\n if (isInsideStartHandle(x, y) && vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n return;\n }\n\n // Normal vertex add\n setVertices((prev) => [...prev, { x, y }]);\n setCurrent({ x, y });\n },\n onDoubleClick: () => {\n if (vertices.length >= 3 && annotationProvides) {\n commitPolygon(vertices);\n setVertices([]);\n setCurrent(null);\n } else {\n setVertices([]);\n setCurrent(null);\n }\n },\n onPointerMove: (pos) => {\n if (!vertices.length) return;\n const x = clamp(pos.x, 0, pageWidthPDF);\n const y = clamp(pos.y, 0, pageHeightPDF);\n setCurrent({ x, y });\n },\n onPointerCancel: () => {\n setVertices([]);\n setCurrent(null);\n },\n }),\n [vertices, current, annotationProvides, pageWidthPDF, pageHeightPDF],\n );\n\n useEffect(() => (register ? register(handlers) : undefined), [register, handlers]);\n\n // ---------- preview ----------\n if (!vertices.length || !current) return null;\n\n const allPts = [...vertices, current];\n const xs = allPts.map((p) => p.x),\n ys = allPts.map((p) => p.y);\n const minX = Math.min(...xs),\n minY = Math.min(...ys);\n const maxX = Math.max(...xs),\n maxY = Math.max(...ys);\n\n const half = toolStrokeWidth / 2;\n const svgMinX = minX - half;\n const svgMinY = minY - half;\n const svgMaxX = maxX + half;\n const svgMaxY = maxY + half;\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const mainPath = useMemo(() => {\n let d = '';\n allPts.forEach(({ x, y }, i) => {\n d += (i === 0 ? 'M' : 'L') + (x - svgMinX) + ' ' + (y - svgMinY) + ' ';\n });\n return d.trim();\n }, [allPts, svgMinX, svgMinY]);\n\n const dottedPath =\n vertices.length >= 2\n ? (() => {\n const curLx = current.x - svgMinX;\n const curLy = current.y - svgMinY;\n const firstLx = vertices[0].x - svgMinX;\n const firstLy = vertices[0].y - svgMinY;\n return `M ${curLx} ${curLy} L ${firstLx} ${firstLy}`;\n })()\n : null;\n\n // Start-handle rect (screen px converted to pdf units, then to local svg coords)\n const handleSizePDF = HANDLE_SIZE_PX / scale;\n const hHalf = handleSizePDF / 2;\n const hx = vertices[0].x - hHalf - svgMinX;\n const hy = vertices[0].y - hHalf - svgMinY;\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none', // we handle clicks at the page layer\n zIndex: 2,\n overflow: 'visible',\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {/* solid preview edges */}\n <path\n d={mainPath}\n fill={toolColor}\n opacity={toolOpacity}\n style={{\n cursor,\n stroke: toolStrokeColor,\n strokeWidth: toolStrokeWidth,\n ...(toolStrokeStyle === PdfAnnotationBorderStyle.DASHED && {\n strokeDasharray: toolStrokeDashArray?.join(','),\n }),\n }}\n />\n\n {/* dotted closing helper */}\n {dottedPath && (\n <path\n d={dottedPath}\n fill=\"none\"\n style={{ stroke: toolStrokeColor, strokeWidth: toolStrokeWidth, strokeDasharray: '4,4' }}\n />\n )}\n\n {/* clickable start-handle (visual only; hit-test done in handler) */}\n {vertices.length >= 3 && (\n <rect\n x={hx}\n y={hy}\n width={handleSizePDF}\n height={handleSizePDF}\n fill={toolStrokeColor}\n opacity={0.4}\n stroke={toolStrokeColor}\n strokeWidth={toolStrokeWidth / 2}\n style={{ pointerEvents: 'none' }}\n />\n )}\n </svg>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\nimport { SelectionMenu } from '../types';\nimport { CirclePaint } from './annotations/circle-paint';\nimport { SquarePaint } from './annotations/square-paint';\nimport { PolylinePaint } from './annotations/polyline-paint';\nimport { LinePaint } from './annotations/line-paint';\nimport { PolygonPaint } from './annotations/polygon-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n selectionMenu?: SelectionMenu;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n selectionMenu,\n style,\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 />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n <CirclePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <SquarePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolygonPaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <PolylinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n <LinePaint\n pageIndex={pageIndex}\n scale={scale}\n pageWidth={pageWidth}\n pageHeight={pageHeight}\n />\n </div>\n );\n}\n"],"names":["useAnnotationCapability","useCapability","AnnotationPlugin","id","CounterRotate","children","props","rect","rotation","matrix","width","height","w","h","size","getCounterRotation","menuWrapperProps","style","position","left","origin","x","top","y","transform","transformOrigin","pointerEvents","zIndex","onPointerDown","e","stopPropagation","Fragment","VertexEditor","scale","vertices","onEdit","onCommit","handleSize","dragIdx","setDragIdx","useState","startScreen","useRef","startVerts","applyDelta","deltaScreen","deltaPdf","restoreOffset","next","current","handleMove","deltaRaw","clientX","clientY","handleUp","target","releasePointerCapture","pointerId","map","v","i","jsxRuntime","jsx","borderRadius","background","cursor","idx","preventDefault","setPointerCapture","onPointerMove","onPointerUp","useDragResize","pageWidth","pageHeight","tracked","isSelected","isDraggable","isResizable","computePatch","computeVertices","currentRect","setCurrentRect","setCurrentVertices","setPreviewObject","commit","drag","dir","startPos","startRect","clamp","min","max","Math","pageW","pageH","useEffect","rootHandlers","currentTarget","disp","nextRect","dx","dy","ox","oy","includes","patch","object","direction","usedDir","startResize","ResizeHandles","outlineOffset","o","jsxs","right","bottom","AnnotationContainer","pageIndex","trackedAnnotation","selectionMenu","provides","annotationProvides","currentVertices","previewObject","updateAnnotation","localId","useLayoutEffect","rectEquals","prev","currentObject","outline","length","annotation","selected","Highlight","color","opacity","rects","onClick","b","onMouseDown","Underline","thickness","r","Strikeout","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","svgWidth","svgHeight","DASHED","strokeDasharray","join","Circle","cx","cy","rx","ry","innerW","innerH","patchInk","original","ctx","type","PdfAnnotationSubtype","INK","Error","oldRect","scaleX","scaleY","uniform","minScale","newInkList","p","avgScale","newStrokeWidth","round","Line","linePoints","lineEndings","x1","y1","x2","y2","start","end","endings","angle","atan2","patching","createEnding","PI","filled","Polyline","localPts","pathData","first","rest","toAngle","a","startRad","endRad","Polygon","patchLine","orig","lineRectWithEndings","patchPolyline","moved","patchPolygon","pad","expandRect","rectFromPoints","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","onStateChange","state","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","deselectAnnotation","handleClick","useCallback","selectAnnotation","clear","isInk","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","obj","isSquare","isCircle","isUnderline","segmentRects","isStrikeout","isSquiggly","isHighlight","Multiply","isLine","isPolyline","isPolygon","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","variantKey","defaults","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","makeVariantKey","UNDERLINE","_a","inset","_b","_c","HIGHLIGHT","_d","_e","_f","STRIKEOUT","_g","_h","_i","SQUIGGLY","_j","_k","_l","InkPaint","subtype","toolColor","toolOpacity","toolStrokeWidth","toolBlendMode","intent","modeId","currentStrokes","setCurrentStrokes","isDrawing","setIsDrawing","timerRef","pageWidthPDF","pageHeightPDF","pos","evt","curX","curY","clearTimeout","call","newLast","slice","setTimeout","allPoints","flatMap","s","anno","Date","now","random","createAnnotation","setActiveVariant","onPointerCancel","CirclePaint","CIRCLE","toolStrokeColor","toolStrokeStyle","toolStrokeDashArray","setStart","setCurrent","minX","minY","maxX","maxY","halfStroke","flags","svgMinX","svgMinY","dw","dh","SquarePaint","SQUARE","PolylinePaint","POLYLINE","toolLineEndings","setVertices","onDoubleClick","pts","commitPolyline","allPts","LinePaint","LINE","p1","p2","abs","commitLine","PolygonPaint","POLYGON","commitPolygon","xs","ys","half","v0","isInsideStartHandle","mainPath","dottedPath","handleSizePDF","hHalf","hx","hy","usePlugin"],"mappings":"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"}